From 3c05943f9fa282a840152446e8744b86f5f699e8 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 3 May 2021 16:15:00 +0200 Subject: [PATCH 001/402] Implement plus_seconds via plus_nanos --- packages/std/src/timestamp.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index 643df0cff..eabf797d2 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -24,8 +24,7 @@ impl Timestamp { } pub const fn plus_seconds(&self, addition: u64) -> Timestamp { - let nanos = Uint64::new(self.0.u64() + addition * 1_000_000_000); - Timestamp(nanos) + self.plus_nanos(addition * 1_000_000_000) } pub const fn plus_nanos(&self, addition: u64) -> Timestamp { From 002e6fe81dc6db4323fef700429f4dbb42975beb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 3 May 2021 16:41:34 +0200 Subject: [PATCH 002/402] Add Timestamp::minus_seconds and ::minus_nanos --- CHANGELOG.md | 4 ++++ packages/std/src/timestamp.rs | 41 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f329187da..b70590832 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Add `Timestamp::minus_seconds` and `::minus_nanos`. + ## [0.14.0] - 2021-05-03 ### Added diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index eabf797d2..81f792e31 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -32,6 +32,15 @@ impl Timestamp { Timestamp(nanos) } + pub const fn minus_seconds(&self, subtrahend: u64) -> Timestamp { + self.minus_nanos(subtrahend * 1_000_000_000) + } + + pub const fn minus_nanos(&self, subtrahend: u64) -> Timestamp { + let nanos = Uint64::new(self.0.u64() - subtrahend); + Timestamp(nanos) + } + /// Returns nanoseconds since epoch pub fn nanos(&self) -> u64 { self.0.u64() @@ -82,6 +91,38 @@ mod tests { assert_eq!(sum.0.u64(), 123); } + #[test] + fn timestamp_minus_seconds() { + let earlier = Timestamp::from_seconds(123).minus_seconds(0); + assert_eq!(earlier.0.u64(), 123_000_000_000); + let earlier = Timestamp::from_seconds(123).minus_seconds(3); + assert_eq!(earlier.0.u64(), 120_000_000_000); + let earlier = Timestamp::from_seconds(123).minus_seconds(123); + assert_eq!(earlier.0.u64(), 0); + } + + #[test] + #[should_panic(expected = "attempt to subtract with overflow")] + fn timestamp_minus_seconds_panics_on_overflow() { + let _earlier = Timestamp::from_seconds(100).minus_seconds(101); + } + + #[test] + fn timestamp_minus_nanos() { + let earlier = Timestamp::from_seconds(123).minus_nanos(0); + assert_eq!(earlier.0.u64(), 123_000_000_000); + let earlier = Timestamp::from_seconds(123).minus_nanos(3); + assert_eq!(earlier.0.u64(), 122_999_999_997); + let earlier = Timestamp::from_seconds(123).minus_nanos(123_000_000_000); + assert_eq!(earlier.0.u64(), 0); + } + + #[test] + #[should_panic(expected = "attempt to subtract with overflow")] + fn timestamp_minus_nanos_panics_on_overflow() { + let _earlier = Timestamp::from_nanos(100).minus_nanos(101); + } + #[test] fn timestamp_nanos() { let sum = Timestamp::from_nanos(123); From 31de6c722a7fe0468472069eca451edbfbc5ea6f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 25 May 2021 11:33:17 +0200 Subject: [PATCH 003/402] Add references to ticket #920 in comments --- packages/std/src/math/uint128.rs | 4 +++- packages/std/src/math/uint64.rs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 6d9899ab0..63c21b508 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -232,7 +232,7 @@ impl Uint128 { if denominator == 0 { panic!("Denominator must not be zero"); } - // TODO: minimize rounding that takes place (using gcd algorithm) + // TODO: avoid overflow in multiplication (https://github.com/CosmWasm/cosmwasm/issues/920) let val = self.u128() * numerator / denominator; Uint128::from(val) } @@ -414,6 +414,8 @@ mod tests { assert_eq!(base.multiply_ratio(1u128, 1u128), Uint128(500)); assert_eq!(base.multiply_ratio(3u128, 3u128), Uint128(500)); assert_eq!(base.multiply_ratio(654321u128, 654321u128), Uint128(500)); + // Reactivate after https://github.com/CosmWasm/cosmwasm/issues/920 + // assert_eq!(base.multiply_ratio(u128::MAX, u128::MAX), Uint128(500)); // factor 3/2 assert_eq!(base.multiply_ratio(3u128, 2u128), Uint128(750)); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 4d8db1065..4136b376a 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -221,7 +221,7 @@ impl Uint64 { if denominator == 0 { panic!("Denominator must not be zero"); } - // TODO: minimize rounding that takes place (using gcd algorithm) + // TODO: avoid overflow in multiplication (https://github.com/CosmWasm/cosmwasm/issues/920) let val = self.u64() * numerator / denominator; Uint64::from(val) } @@ -400,6 +400,8 @@ mod tests { assert_eq!(base.multiply_ratio(1u64, 1u64), Uint64(500)); assert_eq!(base.multiply_ratio(3u64, 3u64), Uint64(500)); assert_eq!(base.multiply_ratio(654321u64, 654321u64), Uint64(500)); + // Reactivate after https://github.com/CosmWasm/cosmwasm/issues/920 + // assert_eq!(base.multiply_ratio(u64::MAX, u64::MAX), Uint64(500)); // factor 3/2 assert_eq!(base.multiply_ratio(3u64, 2u64), Uint64(750)); From faf074c3365212fffa8f3d66ecf74556f10df428 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 31 May 2021 16:03:53 +0200 Subject: [PATCH 004/402] Streamline result limits in calls --- packages/vm/src/calls.rs | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 41300d858..5db73c269 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -11,12 +11,18 @@ use crate::errors::{VmError, VmResult}; use crate::instance::Instance; use crate::serde::{from_slice, to_vec}; -const MAX_LENGTH_INIT: usize = 100_000; -const MAX_LENGTH_EXECUTE: usize = 100_000; -const MAX_LENGTH_MIGRATE: usize = 100_000; -const MAX_LENGTH_SUDO: usize = 100_000; -const MAX_LENGTH_SUBCALL_RESPONSE: usize = 100_000; -const MAX_LENGTH_QUERY: usize = 100_000; +/// Max length (in bytes) of the result data from an instantiate call. +const RESULT_LIMIT_INSTANTIATE: usize = 100_000; +/// Max length (in bytes) of the result data from an execute call. +const RESULT_LIMIT_EXECUTE: usize = 100_000; +/// Max length (in bytes) of the result data from a migrate call. +const RESULT_LIMIT_MIGRATE: usize = 100_000; +/// Max length (in bytes) of the result data from a sudo call. +const RESULT_LIMIT_SUDO: usize = 100_000; +/// Max length (in bytes) of the result data from a reply call. +const RESULT_LIMIT_REPLY: usize = 100_000; +/// Max length (in bytes) of the result data from a query call. +const RESULT_LIMIT_QUERY: usize = 100_000; pub fn call_instantiate( instance: &mut Instance, @@ -145,7 +151,12 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "instantiate", &[env, info, msg], MAX_LENGTH_INIT) + call_raw( + instance, + "instantiate", + &[env, info, msg], + RESULT_LIMIT_INSTANTIATE, + ) } /// Calls Wasm export "execute" and returns raw data from the contract. @@ -162,7 +173,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "execute", &[env, info, msg], MAX_LENGTH_EXECUTE) + call_raw(instance, "execute", &[env, info, msg], RESULT_LIMIT_EXECUTE) } /// Calls Wasm export "migrate" and returns raw data from the contract. @@ -178,7 +189,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "migrate", &[env, msg], MAX_LENGTH_MIGRATE) + call_raw(instance, "migrate", &[env, msg], RESULT_LIMIT_MIGRATE) } /// Calls Wasm export "sudo" and returns raw data from the contract. @@ -194,7 +205,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "sudo", &[env, msg], MAX_LENGTH_SUDO) + call_raw(instance, "sudo", &[env, msg], RESULT_LIMIT_SUDO) } /// Calls Wasm export "reply" and returns raw data from the contract. @@ -210,7 +221,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "reply", &[env, msg], MAX_LENGTH_SUBCALL_RESPONSE) + call_raw(instance, "reply", &[env, msg], RESULT_LIMIT_REPLY) } /// Calls Wasm export "query" and returns raw data from the contract. @@ -226,7 +237,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(true); - call_raw(instance, "query", &[env, msg], MAX_LENGTH_QUERY) + call_raw(instance, "query", &[env, msg], RESULT_LIMIT_QUERY) } /// Calls a function with the given arguments. From c7cef9816496ae1443c07e5e2af991b8c6a73800 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 1 Jun 2021 08:20:01 +0200 Subject: [PATCH 005/402] Move IBC calls to calls --- packages/vm/src/calls.rs | 338 ++++++++++++++++++++++++++ packages/vm/src/ibc_calls.rs | 349 --------------------------- packages/vm/src/lib.rs | 17 +- packages/vm/src/testing/calls.rs | 116 +++++++++ packages/vm/src/testing/ibc_calls.rs | 117 --------- packages/vm/src/testing/mod.rs | 3 +- 6 files changed, 462 insertions(+), 478 deletions(-) delete mode 100644 packages/vm/src/ibc_calls.rs delete mode 100644 packages/vm/src/testing/ibc_calls.rs diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 5db73c269..27b97e7dc 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -4,6 +4,10 @@ use std::fmt; use wasmer::Val; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; +#[cfg(feature = "stargate")] +use cosmwasm_std::{ + IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, +}; use crate::backend::{BackendApi, Querier, Storage}; use crate::conversion::ref_to_u32; @@ -24,6 +28,9 @@ const RESULT_LIMIT_REPLY: usize = 100_000; /// Max length (in bytes) of the result data from a query call. const RESULT_LIMIT_QUERY: usize = 100_000; +#[cfg(feature = "stargate")] +const MAX_LENGTH_IBC: usize = 100_000; + pub fn call_instantiate( instance: &mut Instance, env: &Env, @@ -137,6 +144,119 @@ where Ok(result) } +#[cfg(feature = "stargate")] +pub fn call_ibc_channel_open( + instance: &mut Instance, + env: &Env, + channel: &IbcChannel, +) -> VmResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + let env = to_vec(env)?; + let channel = to_vec(channel)?; + let data = call_ibc_channel_open_raw(instance, &env, &channel)?; + let result: ContractResult<()> = from_slice(&data)?; + Ok(result) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_channel_connect( + instance: &mut Instance, + env: &Env, + channel: &IbcChannel, +) -> VmResult>> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, +{ + let env = to_vec(env)?; + let channel = to_vec(channel)?; + let data = call_ibc_channel_connect_raw(instance, &env, &channel)?; + let result = from_slice(&data)?; + Ok(result) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_channel_close( + instance: &mut Instance, + env: &Env, + channel: &IbcChannel, +) -> VmResult>> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, +{ + let env = to_vec(env)?; + let channel = to_vec(channel)?; + let data = call_ibc_channel_close_raw(instance, &env, &channel)?; + let result = from_slice(&data)?; + Ok(result) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_packet_receive( + instance: &mut Instance, + env: &Env, + packet: &IbcPacket, +) -> VmResult>> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, +{ + let env = to_vec(env)?; + let packet = to_vec(packet)?; + let data = call_ibc_packet_receive_raw(instance, &env, &packet)?; + let result = from_slice(&data)?; + Ok(result) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_packet_ack( + instance: &mut Instance, + env: &Env, + ack: &IbcAcknowledgement, +) -> VmResult>> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, +{ + let env = to_vec(env)?; + let ack = to_vec(ack)?; + let data = call_ibc_packet_ack_raw(instance, &env, &ack)?; + let result = from_slice(&data)?; + Ok(result) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_packet_timeout( + instance: &mut Instance, + env: &Env, + packet: &IbcPacket, +) -> VmResult>> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, +{ + let env = to_vec(env)?; + let packet = to_vec(packet)?; + let data = call_ibc_packet_timeout_raw(instance, &env, &packet)?; + let result = from_slice(&data)?; + Ok(result) +} + /// Calls Wasm export "instantiate" and returns raw data from the contract. /// The result is length limited to prevent abuse but otherwise unchecked. pub fn call_instantiate_raw( @@ -240,6 +360,121 @@ where call_raw(instance, "query", &[env, msg], RESULT_LIMIT_QUERY) } +#[cfg(feature = "stargate")] +pub fn call_ibc_channel_open_raw( + instance: &mut Instance, + env: &[u8], + channel: &[u8], +) -> VmResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + instance.set_storage_readonly(false); + call_raw( + instance, + "ibc_channel_open", + &[env, channel], + MAX_LENGTH_IBC, + ) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_channel_connect_raw( + instance: &mut Instance, + env: &[u8], + channel: &[u8], +) -> VmResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + instance.set_storage_readonly(false); + call_raw( + instance, + "ibc_channel_connect", + &[env, channel], + MAX_LENGTH_IBC, + ) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_channel_close_raw( + instance: &mut Instance, + env: &[u8], + channel: &[u8], +) -> VmResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + instance.set_storage_readonly(false); + call_raw( + instance, + "ibc_channel_close", + &[env, channel], + MAX_LENGTH_IBC, + ) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_packet_receive_raw( + instance: &mut Instance, + env: &[u8], + packet: &[u8], +) -> VmResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + instance.set_storage_readonly(false); + call_raw( + instance, + "ibc_packet_receive", + &[env, packet], + MAX_LENGTH_IBC, + ) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_packet_ack_raw( + instance: &mut Instance, + env: &[u8], + ack: &[u8], +) -> VmResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + instance.set_storage_readonly(false); + call_raw(instance, "ibc_packet_ack", &[env, ack], MAX_LENGTH_IBC) +} + +#[cfg(feature = "stargate")] +pub fn call_ibc_packet_timeout_raw( + instance: &mut Instance, + env: &[u8], + packet: &[u8], +) -> VmResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + instance.set_storage_readonly(false); + call_raw( + instance, + "ibc_packet_timeout", + &[env, packet], + MAX_LENGTH_IBC, + ) +} + /// Calls a function with the given arguments. /// The exported function must return exactly one result (an offset to the result Region). pub(crate) fn call_raw( @@ -348,4 +583,107 @@ mod tests { let query_response = contract_result.unwrap(); assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); } + + #[cfg(feature = "stargate")] + mod ibc { + use super::*; + use crate::calls::{call_instantiate, call_reply}; + use crate::testing::{ + mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, + }; + use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; + use cosmwasm_std::{attr, Empty, Event, IbcOrder, Reply, SubcallResponse}; + static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); + const IBC_VERSION: &str = "ibc-reflect-v1"; + fn setup( + instance: &mut Instance, + channel_id: &str, + account: &str, + ) { + // init + let info = mock_info("creator", &[]); + let msg = br#"{"reflect_code_id":77}"#; + call_instantiate::<_, _, _, Empty>(instance, &mock_env(), &info, msg) + .unwrap() + .unwrap(); + // first we try to open with a valid handshake + let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + handshake_open.counterparty_version = None; + call_ibc_channel_open(instance, &mock_env(), &handshake_open) + .unwrap() + .unwrap(); + // then we connect (with counter-party version set) + let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let res: IbcBasicResponse = call_ibc_channel_connect::<_, _, _, Empty>( + instance, + &mock_env(), + &handshake_connect, + ) + .unwrap() + .unwrap(); + assert_eq!(1, res.submessages.len()); + let id = res.submessages[0].id; + let event = Event { + kind: "message".into(), + attributes: vec![attr("contract_address", &account)], + }; + // which creates a reflect account. here we get the callback + let response = Reply { + id, + result: ContractResult::Ok(SubcallResponse { + events: vec![event], + data: None, + }), + }; + call_reply::<_, _, _, Empty>(instance, &mock_env(), &response).unwrap(); + } + const CHANNEL_ID: &str = "channel-123"; + const ACCOUNT: &str = "account-456"; + #[test] + fn call_ibc_channel_open_and_connect_works() { + let mut instance = mock_instance(&CONTRACT, &[]); + setup(&mut instance, CHANNEL_ID, ACCOUNT); + } + #[test] + fn call_ibc_channel_close_works() { + let mut instance = mock_instance(&CONTRACT, &[]); + setup(&mut instance, CHANNEL_ID, ACCOUNT); + let handshake_close = mock_ibc_channel(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); + call_ibc_channel_close::<_, _, _, Empty>(&mut instance, &mock_env(), &handshake_close) + .unwrap() + .unwrap(); + } + #[test] + fn call_ibc_packet_ack_works() { + let mut instance = mock_instance(&CONTRACT, &[]); + setup(&mut instance, CHANNEL_ID, ACCOUNT); + let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); + let ack = IbcAcknowledgement { + acknowledgement: br#"{}"#.into(), + original_packet: packet, + }; + call_ibc_packet_ack::<_, _, _, Empty>(&mut instance, &mock_env(), &ack) + .unwrap() + .unwrap(); + } + #[test] + fn call_ibc_packet_timeout_works() { + let mut instance = mock_instance(&CONTRACT, &[]); + setup(&mut instance, CHANNEL_ID, ACCOUNT); + let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); + call_ibc_packet_timeout::<_, _, _, Empty>(&mut instance, &mock_env(), &packet) + .unwrap() + .unwrap(); + } + #[test] + fn call_ibc_packet_receive_works() { + let mut instance = mock_instance(&CONTRACT, &[]); + setup(&mut instance, CHANNEL_ID, ACCOUNT); + let who_am_i = br#"{"who_am_i":{}}"#; + let packet = mock_ibc_packet_ack(CHANNEL_ID, who_am_i).unwrap(); + call_ibc_packet_receive::<_, _, _, Empty>(&mut instance, &mock_env(), &packet) + .unwrap() + .unwrap(); + } + } } diff --git a/packages/vm/src/ibc_calls.rs b/packages/vm/src/ibc_calls.rs deleted file mode 100644 index 3c1cf1d21..000000000 --- a/packages/vm/src/ibc_calls.rs +++ /dev/null @@ -1,349 +0,0 @@ -#![cfg(feature = "stargate")] - -use cosmwasm_std::{ - ContractResult, Env, IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcPacket, - IbcReceiveResponse, -}; -use schemars::JsonSchema; -use serde::de::DeserializeOwned; -use std::fmt; - -use crate::backend::{BackendApi, Querier, Storage}; -use crate::calls::call_raw; -use crate::errors::VmResult; -use crate::instance::Instance; -use crate::serde::{from_slice, to_vec}; - -const MAX_LENGTH_IBC: usize = 100_000; - -pub fn call_ibc_channel_open( - instance: &mut Instance, - env: &Env, - channel: &IbcChannel, -) -> VmResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - let env = to_vec(env)?; - let channel = to_vec(channel)?; - let data = call_ibc_channel_open_raw(instance, &env, &channel)?; - let result: ContractResult<()> = from_slice(&data)?; - Ok(result) -} - -pub fn call_ibc_channel_connect( - instance: &mut Instance, - env: &Env, - channel: &IbcChannel, -) -> VmResult>> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, -{ - let env = to_vec(env)?; - let channel = to_vec(channel)?; - let data = call_ibc_channel_connect_raw(instance, &env, &channel)?; - let result = from_slice(&data)?; - Ok(result) -} - -pub fn call_ibc_channel_close( - instance: &mut Instance, - env: &Env, - channel: &IbcChannel, -) -> VmResult>> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, -{ - let env = to_vec(env)?; - let channel = to_vec(channel)?; - let data = call_ibc_channel_close_raw(instance, &env, &channel)?; - let result = from_slice(&data)?; - Ok(result) -} - -pub fn call_ibc_packet_receive( - instance: &mut Instance, - env: &Env, - packet: &IbcPacket, -) -> VmResult>> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, -{ - let env = to_vec(env)?; - let packet = to_vec(packet)?; - let data = call_ibc_packet_receive_raw(instance, &env, &packet)?; - let result = from_slice(&data)?; - Ok(result) -} - -pub fn call_ibc_packet_ack( - instance: &mut Instance, - env: &Env, - ack: &IbcAcknowledgement, -) -> VmResult>> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, -{ - let env = to_vec(env)?; - let ack = to_vec(ack)?; - let data = call_ibc_packet_ack_raw(instance, &env, &ack)?; - let result = from_slice(&data)?; - Ok(result) -} - -pub fn call_ibc_packet_timeout( - instance: &mut Instance, - env: &Env, - packet: &IbcPacket, -) -> VmResult>> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, -{ - let env = to_vec(env)?; - let packet = to_vec(packet)?; - let data = call_ibc_packet_timeout_raw(instance, &env, &packet)?; - let result = from_slice(&data)?; - Ok(result) -} - -pub fn call_ibc_channel_open_raw( - instance: &mut Instance, - env: &[u8], - channel: &[u8], -) -> VmResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - instance.set_storage_readonly(false); - call_raw( - instance, - "ibc_channel_open", - &[env, channel], - MAX_LENGTH_IBC, - ) -} - -pub fn call_ibc_channel_connect_raw( - instance: &mut Instance, - env: &[u8], - channel: &[u8], -) -> VmResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - instance.set_storage_readonly(false); - call_raw( - instance, - "ibc_channel_connect", - &[env, channel], - MAX_LENGTH_IBC, - ) -} - -pub fn call_ibc_channel_close_raw( - instance: &mut Instance, - env: &[u8], - channel: &[u8], -) -> VmResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - instance.set_storage_readonly(false); - call_raw( - instance, - "ibc_channel_close", - &[env, channel], - MAX_LENGTH_IBC, - ) -} - -pub fn call_ibc_packet_receive_raw( - instance: &mut Instance, - env: &[u8], - packet: &[u8], -) -> VmResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - instance.set_storage_readonly(false); - call_raw( - instance, - "ibc_packet_receive", - &[env, packet], - MAX_LENGTH_IBC, - ) -} - -pub fn call_ibc_packet_ack_raw( - instance: &mut Instance, - env: &[u8], - ack: &[u8], -) -> VmResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - instance.set_storage_readonly(false); - call_raw(instance, "ibc_packet_ack", &[env, ack], MAX_LENGTH_IBC) -} - -pub fn call_ibc_packet_timeout_raw( - instance: &mut Instance, - env: &[u8], - packet: &[u8], -) -> VmResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - instance.set_storage_readonly(false); - call_raw( - instance, - "ibc_packet_timeout", - &[env, packet], - MAX_LENGTH_IBC, - ) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::calls::{call_instantiate, call_reply}; - use crate::testing::{mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage}; - use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; - use cosmwasm_std::{attr, Empty, Event, IbcOrder, Reply, SubcallResponse}; - - static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); - const IBC_VERSION: &str = "ibc-reflect-v1"; - - fn setup( - instance: &mut Instance, - channel_id: &str, - account: &str, - ) { - // init - let info = mock_info("creator", &[]); - let msg = br#"{"reflect_code_id":77}"#; - call_instantiate::<_, _, _, Empty>(instance, &mock_env(), &info, msg) - .unwrap() - .unwrap(); - - // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; - call_ibc_channel_open(instance, &mock_env(), &handshake_open) - .unwrap() - .unwrap(); - - // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - let res: IbcBasicResponse = - call_ibc_channel_connect::<_, _, _, Empty>(instance, &mock_env(), &handshake_connect) - .unwrap() - .unwrap(); - assert_eq!(1, res.submessages.len()); - let id = res.submessages[0].id; - - let event = Event { - kind: "message".into(), - attributes: vec![attr("contract_address", &account)], - }; - // which creates a reflect account. here we get the callback - let response = Reply { - id, - result: ContractResult::Ok(SubcallResponse { - events: vec![event], - data: None, - }), - }; - call_reply::<_, _, _, Empty>(instance, &mock_env(), &response).unwrap(); - } - - const CHANNEL_ID: &str = "channel-123"; - const ACCOUNT: &str = "account-456"; - - #[test] - fn call_ibc_channel_open_and_connect_works() { - let mut instance = mock_instance(&CONTRACT, &[]); - - setup(&mut instance, CHANNEL_ID, ACCOUNT); - } - - #[test] - fn call_ibc_channel_close_works() { - let mut instance = mock_instance(&CONTRACT, &[]); - setup(&mut instance, CHANNEL_ID, ACCOUNT); - - let handshake_close = mock_ibc_channel(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); - call_ibc_channel_close::<_, _, _, Empty>(&mut instance, &mock_env(), &handshake_close) - .unwrap() - .unwrap(); - } - - #[test] - fn call_ibc_packet_ack_works() { - let mut instance = mock_instance(&CONTRACT, &[]); - setup(&mut instance, CHANNEL_ID, ACCOUNT); - - let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); - let ack = IbcAcknowledgement { - acknowledgement: br#"{}"#.into(), - original_packet: packet, - }; - call_ibc_packet_ack::<_, _, _, Empty>(&mut instance, &mock_env(), &ack) - .unwrap() - .unwrap(); - } - - #[test] - fn call_ibc_packet_timeout_works() { - let mut instance = mock_instance(&CONTRACT, &[]); - setup(&mut instance, CHANNEL_ID, ACCOUNT); - - let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); - call_ibc_packet_timeout::<_, _, _, Empty>(&mut instance, &mock_env(), &packet) - .unwrap() - .unwrap(); - } - - #[test] - fn call_ibc_packet_receive_works() { - let mut instance = mock_instance(&CONTRACT, &[]); - - setup(&mut instance, CHANNEL_ID, ACCOUNT); - - let who_am_i = br#"{"who_am_i":{}}"#; - let packet = mock_ibc_packet_ack(CHANNEL_ID, who_am_i).unwrap(); - - call_ibc_packet_receive::<_, _, _, Empty>(&mut instance, &mock_env(), &packet) - .unwrap() - .unwrap(); - } -} diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index 3f72cb8ab..ef65dff6c 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -9,8 +9,6 @@ mod conversion; mod environment; mod errors; mod features; -#[cfg(feature = "stargate")] -mod ibc_calls; mod imports; mod instance; mod limited; @@ -33,20 +31,19 @@ pub use crate::calls::{ call_migrate_raw, call_query, call_query_raw, call_reply, call_reply_raw, call_sudo, call_sudo_raw, }; -pub use crate::checksum::Checksum; - -pub use crate::errors::{ - CommunicationError, CommunicationResult, RegionValidationError, RegionValidationResult, - VmError, VmResult, -}; -pub use crate::features::features_from_csv; #[cfg(feature = "stargate")] -pub use crate::ibc_calls::{ +pub use crate::calls::{ call_ibc_channel_close, call_ibc_channel_close_raw, call_ibc_channel_connect, call_ibc_channel_connect_raw, call_ibc_channel_open, call_ibc_channel_open_raw, call_ibc_packet_ack, call_ibc_packet_ack_raw, call_ibc_packet_receive, call_ibc_packet_receive_raw, call_ibc_packet_timeout, call_ibc_packet_timeout_raw, }; +pub use crate::checksum::Checksum; +pub use crate::errors::{ + CommunicationError, CommunicationResult, RegionValidationError, RegionValidationResult, + VmError, VmResult, +}; +pub use crate::features::features_from_csv; pub use crate::instance::{GasReport, Instance, InstanceOptions}; pub use crate::serde::{from_slice, to_vec}; pub use crate::size::Size; diff --git a/packages/vm/src/testing/calls.rs b/packages/vm/src/testing/calls.rs index 37c8bfaf3..443afbf76 100644 --- a/packages/vm/src/testing/calls.rs +++ b/packages/vm/src/testing/calls.rs @@ -6,10 +6,19 @@ use serde::{de::DeserializeOwned, Serialize}; use std::fmt; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; +#[cfg(feature = "stargate")] +use cosmwasm_std::{ + IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, +}; use crate::calls::{ call_execute, call_instantiate, call_migrate, call_query, call_reply, call_sudo, }; +#[cfg(feature = "stargate")] +use crate::calls::{ + call_ibc_channel_close, call_ibc_channel_connect, call_ibc_channel_open, call_ibc_packet_ack, + call_ibc_packet_receive, call_ibc_packet_timeout, +}; use crate::instance::Instance; use crate::serde::to_vec; use crate::{BackendApi, Querier, Storage}; @@ -126,3 +135,110 @@ where let serialized_msg = to_vec(&msg).expect("Testing error: Could not seralize request message"); call_query(instance, &env, &serialized_msg).expect("VM error") } + +// ibc_channel_open mimicks the call signature of the smart contracts. +// thus it moves env and channel rather than take them as reference. +// this is inefficient here, but only used in test code +#[cfg(feature = "stargate")] +pub fn ibc_channel_open( + instance: &mut Instance, + env: Env, + channel: IbcChannel, +) -> ContractResult<()> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, +{ + call_ibc_channel_open(instance, &env, &channel).expect("VM error") +} + +// ibc_channel_connect mimicks the call signature of the smart contracts. +// thus it moves env and channel rather than take them as reference. +// this is inefficient here, but only used in test code +#[cfg(feature = "stargate")] +pub fn ibc_channel_connect( + instance: &mut Instance, + env: Env, + channel: IbcChannel, +) -> ContractResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, +{ + call_ibc_channel_connect(instance, &env, &channel).expect("VM error") +} + +// ibc_channel_close mimicks the call signature of the smart contracts. +// thus it moves env and channel rather than take them as reference. +// this is inefficient here, but only used in test code +#[cfg(feature = "stargate")] +pub fn ibc_channel_close( + instance: &mut Instance, + env: Env, + channel: IbcChannel, +) -> ContractResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, +{ + call_ibc_channel_close(instance, &env, &channel).expect("VM error") +} + +// ibc_packet_receive mimicks the call signature of the smart contracts. +// thus it moves env and packet rather than take them as reference. +// this is inefficient here, but only used in test code +#[cfg(feature = "stargate")] +pub fn ibc_packet_receive( + instance: &mut Instance, + env: Env, + packet: IbcPacket, +) -> ContractResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, +{ + call_ibc_packet_receive(instance, &env, &packet).expect("VM error") +} + +// ibc_packet_ack mimicks the call signature of the smart contracts. +// thus it moves env and acknowledgement rather than take them as reference. +// this is inefficient here, but only used in test code +#[cfg(feature = "stargate")] +pub fn ibc_packet_ack( + instance: &mut Instance, + env: Env, + ack: IbcAcknowledgement, +) -> ContractResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, +{ + call_ibc_packet_ack(instance, &env, &ack).expect("VM error") +} + +// ibc_packet_timeout mimicks the call signature of the smart contracts. +// thus it moves env and packet rather than take them as reference. +// this is inefficient here, but only used in test code +#[cfg(feature = "stargate")] +pub fn ibc_packet_timeout( + instance: &mut Instance, + env: Env, + packet: IbcPacket, +) -> ContractResult> +where + A: BackendApi + 'static, + S: Storage + 'static, + Q: Querier + 'static, + U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, +{ + call_ibc_packet_timeout(instance, &env, &packet).expect("VM error") +} diff --git a/packages/vm/src/testing/ibc_calls.rs b/packages/vm/src/testing/ibc_calls.rs deleted file mode 100644 index 6bedbb8a4..000000000 --- a/packages/vm/src/testing/ibc_calls.rs +++ /dev/null @@ -1,117 +0,0 @@ -#![cfg(feature = "stargate")] -use schemars::JsonSchema; -use serde::de::DeserializeOwned; -use std::fmt; - -use cosmwasm_std::{ - ContractResult, Env, IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcPacket, - IbcReceiveResponse, -}; - -use crate::ibc_calls::{ - call_ibc_channel_close, call_ibc_channel_connect, call_ibc_channel_open, call_ibc_packet_ack, - call_ibc_packet_receive, call_ibc_packet_timeout, -}; -use crate::instance::Instance; -use crate::{BackendApi, Querier, Storage}; - -// ibc_channel_open mimicks the call signature of the smart contracts. -// thus it moves env and channel rather than take them as reference. -// this is inefficient here, but only used in test code -pub fn ibc_channel_open( - instance: &mut Instance, - env: Env, - channel: IbcChannel, -) -> ContractResult<()> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, -{ - call_ibc_channel_open(instance, &env, &channel).expect("VM error") -} - -// ibc_channel_connect mimicks the call signature of the smart contracts. -// thus it moves env and channel rather than take them as reference. -// this is inefficient here, but only used in test code -pub fn ibc_channel_connect( - instance: &mut Instance, - env: Env, - channel: IbcChannel, -) -> ContractResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, -{ - call_ibc_channel_connect(instance, &env, &channel).expect("VM error") -} - -// ibc_channel_close mimicks the call signature of the smart contracts. -// thus it moves env and channel rather than take them as reference. -// this is inefficient here, but only used in test code -pub fn ibc_channel_close( - instance: &mut Instance, - env: Env, - channel: IbcChannel, -) -> ContractResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, -{ - call_ibc_channel_close(instance, &env, &channel).expect("VM error") -} - -// ibc_packet_receive mimicks the call signature of the smart contracts. -// thus it moves env and packet rather than take them as reference. -// this is inefficient here, but only used in test code -pub fn ibc_packet_receive( - instance: &mut Instance, - env: Env, - packet: IbcPacket, -) -> ContractResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, -{ - call_ibc_packet_receive(instance, &env, &packet).expect("VM error") -} - -// ibc_packet_ack mimicks the call signature of the smart contracts. -// thus it moves env and acknowledgement rather than take them as reference. -// this is inefficient here, but only used in test code -pub fn ibc_packet_ack( - instance: &mut Instance, - env: Env, - ack: IbcAcknowledgement, -) -> ContractResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, -{ - call_ibc_packet_ack(instance, &env, &ack).expect("VM error") -} - -// ibc_packet_timeout mimicks the call signature of the smart contracts. -// thus it moves env and packet rather than take them as reference. -// this is inefficient here, but only used in test code -pub fn ibc_packet_timeout( - instance: &mut Instance, - env: Env, - packet: IbcPacket, -) -> ContractResult> -where - A: BackendApi + 'static, - S: Storage + 'static, - Q: Querier + 'static, - U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, -{ - call_ibc_packet_timeout(instance, &env, &packet).expect("VM error") -} diff --git a/packages/vm/src/testing/mod.rs b/packages/vm/src/testing/mod.rs index 600893747..347258973 100644 --- a/packages/vm/src/testing/mod.rs +++ b/packages/vm/src/testing/mod.rs @@ -1,7 +1,6 @@ // The external interface is `use cosmwasm_vm::testing::X` for all integration testing symbols, no matter where they live internally. mod calls; -mod ibc_calls; mod instance; mod mock; mod querier; @@ -9,7 +8,7 @@ mod storage; pub use calls::{execute, instantiate, migrate, query, reply, sudo}; #[cfg(feature = "stargate")] -pub use ibc_calls::{ +pub use calls::{ ibc_channel_close, ibc_channel_connect, ibc_channel_open, ibc_packet_ack, ibc_packet_receive, ibc_packet_timeout, }; From 27fc194e77a81cae763605890aecdfed47141279 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 1 Jun 2021 08:27:00 +0200 Subject: [PATCH 006/402] Use call specific limit constants for IBC calls --- packages/vm/src/calls.rs | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 27b97e7dc..2199f5d95 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -27,9 +27,24 @@ const RESULT_LIMIT_SUDO: usize = 100_000; const RESULT_LIMIT_REPLY: usize = 100_000; /// Max length (in bytes) of the result data from a query call. const RESULT_LIMIT_QUERY: usize = 100_000; - +/// Max length (in bytes) of the result data from a ibc_channel_open call. +#[cfg(feature = "stargate")] +const RESULT_LIMIT_IBC_CHANNEL_OPEN: usize = 100_000; +/// Max length (in bytes) of the result data from a ibc_channel_connect call. +#[cfg(feature = "stargate")] +const RESULT_LIMIT_IBC_CHANNEL_CONNECT: usize = 100_000; +/// Max length (in bytes) of the result data from a ibc_channel_close call. +#[cfg(feature = "stargate")] +const RESULT_LIMIT_IBC_CHANNEL_CLOSE: usize = 100_000; +/// Max length (in bytes) of the result data from a ibc_packet_receive call. +#[cfg(feature = "stargate")] +const RESULT_LIMIT_IBC_PACKET_RECEIVE: usize = 100_000; +/// Max length (in bytes) of the result data from a ibc_packet_ack call. #[cfg(feature = "stargate")] -const MAX_LENGTH_IBC: usize = 100_000; +const RESULT_LIMIT_IBC_PACKET_ACK: usize = 100_000; +/// Max length (in bytes) of the result data from a ibc_packet_timeout call. +#[cfg(feature = "stargate")] +const RESULT_LIMIT_IBC_PACKET_TIMEOUT: usize = 100_000; pub fn call_instantiate( instance: &mut Instance, @@ -376,7 +391,7 @@ where instance, "ibc_channel_open", &[env, channel], - MAX_LENGTH_IBC, + RESULT_LIMIT_IBC_CHANNEL_OPEN, ) } @@ -396,7 +411,7 @@ where instance, "ibc_channel_connect", &[env, channel], - MAX_LENGTH_IBC, + RESULT_LIMIT_IBC_CHANNEL_CONNECT, ) } @@ -416,7 +431,7 @@ where instance, "ibc_channel_close", &[env, channel], - MAX_LENGTH_IBC, + RESULT_LIMIT_IBC_CHANNEL_CLOSE, ) } @@ -436,7 +451,7 @@ where instance, "ibc_packet_receive", &[env, packet], - MAX_LENGTH_IBC, + RESULT_LIMIT_IBC_PACKET_RECEIVE, ) } @@ -452,7 +467,12 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "ibc_packet_ack", &[env, ack], MAX_LENGTH_IBC) + call_raw( + instance, + "ibc_packet_ack", + &[env, ack], + RESULT_LIMIT_IBC_PACKET_ACK, + ) } #[cfg(feature = "stargate")] @@ -471,7 +491,7 @@ where instance, "ibc_packet_timeout", &[env, packet], - MAX_LENGTH_IBC, + RESULT_LIMIT_IBC_PACKET_TIMEOUT, ) } From cc901e393589c23c762c56587e7d75fe16021339 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 7 Jun 2021 13:51:59 +0200 Subject: [PATCH 007/402] Add Addr::as_bytes --- CHANGELOG.md | 1 + packages/std/src/addresses.rs | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b70590832..3f9c9b449 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to ### Added - cosmwasm-std: Add `Timestamp::minus_seconds` and `::minus_nanos`. +- cosmwasm-std: Add `Addr::as_bytes` ## [0.14.0] - 2021-05-03 diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 00e4b5033..fde6176fe 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -52,6 +52,11 @@ impl Addr { pub fn as_str(&self) -> &str { self.0.as_str() } + + #[inline] + pub fn as_bytes(&self) -> &[u8] { + self.0.as_bytes() + } } impl fmt::Display for Addr { @@ -287,6 +292,15 @@ mod tests { assert_eq!(addr.as_str(), "literal-string"); } + #[test] + fn addr_as_bytes_works() { + let addr = Addr::unchecked("literal-string"); + assert_eq!( + addr.as_bytes(), + [108, 105, 116, 101, 114, 97, 108, 45, 115, 116, 114, 105, 110, 103] + ); + } + #[test] fn addr_implements_display() { let addr = Addr::unchecked("cos934gh9034hg04g0h134"); From 27a6e55cfb0be0f17437df47bc7e0b0e1167ab66 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 7 Jun 2021 15:20:03 +0200 Subject: [PATCH 008/402] Add doc comment to Addr::as_bytes --- packages/std/src/addresses.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index fde6176fe..faad8ee73 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -53,6 +53,9 @@ impl Addr { self.0.as_str() } + /// Returns the UTF-8 encoded address string as a byte array. + /// + /// This is equivalent to `address.as_str().as_bytes()`. #[inline] pub fn as_bytes(&self) -> &[u8] { self.0.as_bytes() From 8a208aae901c4671a559707fd67f42e8c3b716e6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 11:48:40 +0200 Subject: [PATCH 009/402] Implement std::ops::Sub for Decimal (closes #922) --- CHANGELOG.md | 1 + packages/std/src/math/decimal.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f9c9b449..e84ef70fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to - cosmwasm-std: Add `Timestamp::minus_seconds` and `::minus_nanos`. - cosmwasm-std: Add `Addr::as_bytes` +- cosmwasm-std: Implement `std::ops::Sub` for `math::Decimal` ## [0.14.0] - 2021-05-03 diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index a08d5ed16..31641f87c 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -150,6 +150,14 @@ impl ops::Add for Decimal { } } +impl ops::Sub for Decimal { + type Output = Self; + + fn sub(self, other: Self) -> Self { + Decimal(self.0 - other.0) + } +} + /// 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). @@ -489,6 +497,24 @@ mod tests { assert_eq!(value.0, DECIMAL_FRACTIONAL * 3 / 2); } + #[test] + #[should_panic(expected = "attempt to add with overflow")] + fn decimal_add_overflow_panics() { + let _value = Decimal::MAX + Decimal::percent(50); + } + + #[test] + fn decimal_sub() { + let value = Decimal::one() - Decimal::percent(50); // 0.5 + assert_eq!(value.0, DECIMAL_FRACTIONAL * 1 / 2); + } + + #[test] + #[should_panic(expected = "attempt to subtract with overflow")] + fn decimal_sub_overflow_panics() { + let _value = Decimal::zero() - Decimal::percent(50); + } + #[test] // in this test the Decimal is on the right fn uint128_decimal_multiply() { From 6afa78b1d18758b0aedaa0b3b313483e7ae6eea1 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 13:03:04 +0200 Subject: [PATCH 010/402] Style --- 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 31641f87c..19c2d44bb 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -506,7 +506,7 @@ mod tests { #[test] fn decimal_sub() { let value = Decimal::one() - Decimal::percent(50); // 0.5 - assert_eq!(value.0, DECIMAL_FRACTIONAL * 1 / 2); + assert_eq!(value.0, DECIMAL_FRACTIONAL / 2); } #[test] From 6fc11dc1be61724c6d2442c508ca122aee052007 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 14:13:41 +0200 Subject: [PATCH 011/402] Implement division for Decimal/Uint128 --- CHANGELOG.md | 1 + packages/std/src/math/decimal.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e84ef70fa..6a3e25d3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to - 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: Implement division for `Decimal / Uint128` ## [0.14.0] - 2021-05-03 diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 19c2d44bb..26cecd6cf 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -182,6 +182,14 @@ impl ops::Mul for Decimal { } } +impl ops::Div for Decimal { + type Output = Self; + + fn div(self, rhs: Uint128) -> Self::Output { + Decimal(self.0 / rhs.u128()) + } +} + /// Serializes as a decimal string impl Serialize for Decimal { fn serialize(&self, serializer: S) -> Result @@ -553,6 +561,28 @@ mod tests { assert_eq!(left * right, Uint128(0)); } + #[test] + // in this test the Decimal is on the left + fn decimal_uint128_division() { + // a/b + let left = Decimal::one() + Decimal::percent(50); // 1.5 + let right = Uint128(3); + assert_eq!(left / right, Decimal::percent(50)); + + // 0/a + let left = Decimal::zero(); + let right = Uint128(300); + assert_eq!(left * right, Uint128(0)); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn decimal_uint128_divide_by_zero() { + let left = Decimal::one() + Decimal::percent(50); // 1.5 + let right = Uint128(0); + let _result = left / right; + } + #[test] fn decimal_to_string() { // Integers From 9506ce20adde621d4e6c54b55cc314fb16680c76 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 16:20:08 +0200 Subject: [PATCH 012/402] Fix Decimal division test --- 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 26cecd6cf..7e05e072c 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -572,7 +572,7 @@ mod tests { // 0/a let left = Decimal::zero(); let right = Uint128(300); - assert_eq!(left * right, Uint128(0)); + assert_eq!(left / right, Decimal::zero()); } #[test] From 98137807053e0eb33e550891a5082016b4327646 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 16:22:16 +0200 Subject: [PATCH 013/402] Style --- packages/std/src/math/decimal.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 7e05e072c..e6d56227d 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -562,10 +562,9 @@ mod tests { } #[test] - // in this test the Decimal is on the left fn decimal_uint128_division() { // a/b - let left = Decimal::one() + Decimal::percent(50); // 1.5 + let left = Decimal::percent(150); // 1.5 let right = Uint128(3); assert_eq!(left / right, Decimal::percent(50)); @@ -578,7 +577,7 @@ mod tests { #[test] #[should_panic(expected = "attempt to divide by zero")] fn decimal_uint128_divide_by_zero() { - let left = Decimal::one() + Decimal::percent(50); // 1.5 + let left = Decimal::percent(150); // 1.5 let right = Uint128(0); let _result = left / right; } From f3ed2d781d604f59819df93d370ef6d76afa1dbb Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 16:28:42 +0200 Subject: [PATCH 014/402] Implement DivAssign for Decimal --- packages/std/src/math/decimal.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index e6d56227d..7a03ce835 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -190,6 +190,12 @@ impl ops::Div for Decimal { } } +impl ops::DivAssign for Decimal { + fn div_assign(&mut self, rhs: Uint128) { + self.0 /= rhs.u128(); + } +} + /// Serializes as a decimal string impl Serialize for Decimal { fn serialize(&self, serializer: S) -> Result @@ -582,6 +588,19 @@ mod tests { let _result = left / right; } + #[test] + fn decimal_uint128_div_assign() { + // a/b + let mut dec = Decimal::percent(150); // 1.5 + dec /= Uint128(3); + assert_eq!(dec, Decimal::percent(50)); + + // 0/a + let mut dec = Decimal::zero(); + dec /= Uint128(300); + assert_eq!(dec, Decimal::zero()); + } + #[test] fn decimal_to_string() { // Integers From e08f82faec44896738ba9f684566e0bbaba8a9d3 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 17:26:27 +0200 Subject: [PATCH 015/402] Add a panic test for Decimal div_assign by zero --- packages/std/src/math/decimal.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 7a03ce835..b797fff9b 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -601,6 +601,14 @@ mod tests { assert_eq!(dec, Decimal::zero()); } + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn decimal_uint128_div_assign_by_zero() { + // a/0 + let mut dec = Decimal::percent(50); + dec /= Uint128(0); + } + #[test] fn decimal_to_string() { // Integers From 9899785ba2f6fda2a0ec3953d348b81f6c197b71 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Mon, 31 May 2021 15:16:20 +0200 Subject: [PATCH 016/402] Add seconds() method to Timestamp --- packages/std/src/timestamp.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index 81f792e31..f7baf3441 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -42,14 +42,21 @@ impl Timestamp { } /// Returns nanoseconds since epoch + #[inline] pub fn nanos(&self) -> u64 { self.0.u64() } + + /// Returns seconds since epoch (truncate nanoseconds) + #[inline] + pub fn seconds(&self) -> u64 { + self.0.u64() / 1_000_000_000 + } } impl fmt::Display for Timestamp { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let whole = self.nanos() / 1_000_000_000; + let whole = self.seconds(); let fractional = self.nanos() % 1_000_000_000; write!(f, "{}.{:09}", whole, fractional) } @@ -131,6 +138,14 @@ mod tests { assert_eq!(sum.nanos(), 0); } + #[test] + fn timestamp_seconds() { + let sum = Timestamp::from_nanos(987654321000); + assert_eq!(sum.seconds(), 987); + let sum = Timestamp::from_seconds(1234567).plus_nanos(8765436); + assert_eq!(sum.seconds(), 1234567); + } + #[test] fn timestamp_implements_display() { let embedded = format!("Time: {}", Timestamp::from_nanos(0)); From 9b11935bd904bed95769817353d676e54b0810cb Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 16:54:17 +0200 Subject: [PATCH 017/402] Add subsec_nanos() method to Timestamp --- packages/std/src/timestamp.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index f7baf3441..d61909556 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -52,6 +52,12 @@ impl Timestamp { pub fn seconds(&self) -> u64 { self.0.u64() / 1_000_000_000 } + + /// Returns seconds since epoch (truncate nanoseconds) + #[inline] + pub fn subsec_nanos(&self) -> u64 { + self.0.u64() % 1_000_000_000 + } } impl fmt::Display for Timestamp { @@ -136,6 +142,8 @@ mod tests { assert_eq!(sum.nanos(), 123); let sum = Timestamp::from_nanos(0); assert_eq!(sum.nanos(), 0); + let sum = Timestamp::from_nanos(987654321000); + assert_eq!(sum.nanos(), 987654321000); } #[test] @@ -146,6 +154,14 @@ mod tests { assert_eq!(sum.seconds(), 1234567); } + #[test] + fn timestamp_subsec_nanos() { + let sum = Timestamp::from_nanos(987654321000); + assert_eq!(sum.subsec_nanos(), 654321000); + let sum = Timestamp::from_seconds(1234567).plus_nanos(8765436); + assert_eq!(sum.subsec_nanos(), 8765436); + } + #[test] fn timestamp_implements_display() { let embedded = format!("Time: {}", Timestamp::from_nanos(0)); From 41af2da8096d8cf07e0e38304bee953d7a4f2c9f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 17:09:12 +0200 Subject: [PATCH 018/402] Doc <3 for Timestamp --- packages/std/src/timestamp.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index d61909556..97d281765 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -7,6 +7,21 @@ use crate::math::Uint64; /// A point in time in nanosecond precision. /// /// This type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z. +/// +/// ## Examples +/// +/// ``` +/// # 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)); +/// +/// let ts = ts.plus_seconds(2); +/// assert_eq!(ts.nanos(), 3_000_000_202); +/// assert_eq!(ts.seconds(), 3); +/// assert_eq!(ts.subsec_nanos(), (202)); +/// ``` #[derive( Serialize, Deserialize, Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema, )] @@ -53,7 +68,8 @@ impl Timestamp { self.0.u64() / 1_000_000_000 } - /// Returns seconds since epoch (truncate nanoseconds) + /// Returns nanoseconds since the last whole second (the remainder truncated + /// by `seconds()`) #[inline] pub fn subsec_nanos(&self) -> u64 { self.0.u64() % 1_000_000_000 From 3e8b818cb15b1592f5751af0168464fff44aebff Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 17:15:42 +0200 Subject: [PATCH 019/402] Style --- packages/std/src/timestamp.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index 97d281765..db37edab3 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -79,7 +79,7 @@ impl Timestamp { impl fmt::Display for Timestamp { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let whole = self.seconds(); - let fractional = self.nanos() % 1_000_000_000; + let fractional = self.subsec_nanos(); write!(f, "{}.{:09}", whole, fractional) } } From 60ea96ae49b72d081d428070be063d0c03405e37 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 17:34:34 +0200 Subject: [PATCH 020/402] Style Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/timestamp.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index db37edab3..fa96fb477 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -15,12 +15,12 @@ use crate::math::Uint64; /// 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)); +/// assert_eq!(ts.subsec_nanos(), 202); /// /// let ts = ts.plus_seconds(2); /// assert_eq!(ts.nanos(), 3_000_000_202); /// assert_eq!(ts.seconds(), 3); -/// assert_eq!(ts.subsec_nanos(), (202)); +/// assert_eq!(ts.subsec_nanos(), 202); /// ``` #[derive( Serialize, Deserialize, Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema, From beec3e382ff63474bccb94b086301295206fef43 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 18:13:53 +0200 Subject: [PATCH 021/402] CHANGELOG entry for new `Timestamp` methods --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e84ef70fa..f2580684d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to - 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`. ## [0.14.0] - 2021-05-03 From d8108f87385018cff644bbb18aeb9e56ce58bd4d Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 18:49:03 +0200 Subject: [PATCH 022/402] Update schemas --- contracts/ibc-reflect-send/schema/account_response.json | 2 +- contracts/ibc-reflect-send/schema/execute_msg.json | 2 +- contracts/ibc-reflect-send/schema/list_accounts_response.json | 2 +- contracts/ibc-reflect-send/schema/packet_msg.json | 2 +- contracts/ibc-reflect/schema/packet_msg.json | 2 +- contracts/reflect/schema/execute_msg.json | 2 +- contracts/reflect/schema/response_for__custom_msg.json | 2 +- packages/std/schema/timestamp.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/account_response.json b/contracts/ibc-reflect-send/schema/account_response.json index 8e57ee5ac..d6e05cc5e 100644 --- a/contracts/ibc-reflect-send/schema/account_response.json +++ b/contracts/ibc-reflect-send/schema/account_response.json @@ -46,7 +46,7 @@ } }, "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.", + "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" diff --git a/contracts/ibc-reflect-send/schema/execute_msg.json b/contracts/ibc-reflect-send/schema/execute_msg.json index 9cdc80374..70eb8de72 100644 --- a/contracts/ibc-reflect-send/schema/execute_msg.json +++ b/contracts/ibc-reflect-send/schema/execute_msg.json @@ -567,7 +567,7 @@ ] }, "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.", + "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" diff --git a/contracts/ibc-reflect-send/schema/list_accounts_response.json b/contracts/ibc-reflect-send/schema/list_accounts_response.json index b648789fb..7c63981f8 100644 --- a/contracts/ibc-reflect-send/schema/list_accounts_response.json +++ b/contracts/ibc-reflect-send/schema/list_accounts_response.json @@ -64,7 +64,7 @@ } }, "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.", + "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" diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 10a883280..5d0efcdd5 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -520,7 +520,7 @@ ] }, "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.", + "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" diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 01be18064..3896bfcd0 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -519,7 +519,7 @@ ] }, "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.", + "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" diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index 1f9c2d87d..283220fec 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -602,7 +602,7 @@ } }, "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.", + "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" diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index ff9dd4a27..1fcc2152c 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -590,7 +590,7 @@ } }, "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.", + "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" diff --git a/packages/std/schema/timestamp.json b/packages/std/schema/timestamp.json index 889461d98..6dd9971a1 100644 --- a/packages/std/schema/timestamp.json +++ b/packages/std/schema/timestamp.json @@ -1,7 +1,7 @@ { "$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.", + "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" From 9d2e5364264841d3926a2fa0c819e39e4f8a6b85 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 10:19:45 +0200 Subject: [PATCH 023/402] Update `types::BlockInfo` docs --- packages/std/src/types.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/types.rs b/packages/std/src/types.rs index 78fb8c13a..2a92bce2a 100644 --- a/packages/std/src/types.rs +++ b/packages/std/src/types.rs @@ -36,8 +36,8 @@ pub struct BlockInfo { /// # }; /// # extern crate chrono; /// use chrono::NaiveDateTime; - /// let seconds = env.block.time.nanos() / 1_000_000_000; - /// let nsecs = env.block.time.nanos() % 1_000_000_000; + /// let seconds = env.block.time.seconds(); + /// let nsecs = env.block.time.subsec_nanos(); /// let dt = NaiveDateTime::from_timestamp(seconds as i64, nsecs as u32); /// ``` /// From 04fe94276ee37016c62f03a56e61d0379a1a705c Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 14:32:07 +0200 Subject: [PATCH 024/402] Fix overflow issue for Uint64 --- packages/std/src/math/uint64.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 4136b376a..adff647dd 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -1,6 +1,6 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::convert::TryFrom; +use std::convert::{TryFrom, TryInto}; use std::fmt::{self}; use std::iter::Sum; use std::ops; @@ -216,13 +216,16 @@ impl Uint64 { numerator: A, denominator: B, ) -> Uint64 { - let numerator: u64 = numerator.into(); - let denominator: u64 = denominator.into(); + let base: u128 = self.u64().into(); + let numerator: u128 = numerator.into().into(); + let denominator: u128 = denominator.into().into(); if denominator == 0 { panic!("Denominator must not be zero"); } - // TODO: avoid overflow in multiplication (https://github.com/CosmWasm/cosmwasm/issues/920) - let val = self.u64() * numerator / denominator; + + let val: u64 = (base * numerator / denominator) + .try_into() + .expect("multiplication overflow"); Uint64::from(val) } } @@ -416,6 +419,23 @@ mod tests { assert_eq!(base.multiply_ratio(100u64, 120u64), Uint64(416)); } + #[test] + fn uint64_multiply_ratio_does_not_overflow_when_result_fits() { + // Almost max value for Uint64. + let base = Uint64(18446744073709551606); + + assert_eq!(base.multiply_ratio(2u64, 2u64), base); + } + + #[test] + #[should_panic] + fn uint64_multiply_ratio_panicks_on_overflow() { + // Almost max value for Uint64. + let base = Uint64(18446744073709551606); + + assert_eq!(base.multiply_ratio(2u64, 1u64), base); + } + #[test] #[should_panic(expected = "Denominator must not be zero")] fn uint64_multiply_ratio_panics_for_zero_denominator() { From f5a6f29300969b8ca1b66f4a31355d1b38e69677 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 14:58:13 +0200 Subject: [PATCH 025/402] Fix overflow issue for Uint128 --- CHANGELOG.md | 2 ++ Cargo.lock | 13 +++++++++++++ packages/std/Cargo.toml | 2 ++ packages/std/src/math/uint128.rs | 25 +++++++++++++++++++++++-- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe62b3c5d..b2dde4f04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to - 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: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` + so that internal multiplication cannot cause an unnecessary overflow. ([#920]) ## [0.14.0] - 2021-05-03 diff --git a/Cargo.lock b/Cargo.lock index 95d5568b1..ce5efe945 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -241,6 +241,8 @@ dependencies = [ "cosmwasm-schema", "hex", "hex-literal", + "num-bigint", + "num-traits", "schemars", "serde", "serde-json-wasm", @@ -904,6 +906,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" +[[package]] +name = "num-bigint" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.44" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 25b2b3912..c64a23dd0 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -34,6 +34,8 @@ serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } thiserror = "1.0" +num-bigint = "0.4.0" +num-traits = "0.2.14" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-crypto = { path = "../crypto", version = "0.14.0" } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 63c21b508..fdb9f5658 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,3 +1,5 @@ +use num_bigint::BigUint; +use num_traits::cast::ToPrimitive; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::convert::TryFrom; @@ -227,13 +229,15 @@ impl Uint128 { numerator: A, denominator: B, ) -> Uint128 { + let base: BigUint = self.u128().into(); let numerator: u128 = numerator.into(); let denominator: u128 = denominator.into(); if denominator == 0 { panic!("Denominator must not be zero"); } - // TODO: avoid overflow in multiplication (https://github.com/CosmWasm/cosmwasm/issues/920) - let val = self.u128() * numerator / denominator; + let val = (base * numerator / denominator) + .to_u128() + .expect("multiplication overflow"); Uint128::from(val) } } @@ -430,6 +434,23 @@ mod tests { assert_eq!(base.multiply_ratio(100u128, 120u128), Uint128(416)); } + #[test] + fn uint128_multiply_ratio_does_not_overflow_when_result_fits() { + // Almost max value for Uint64. + let base = Uint128(340282366920938463463374607431768211446); + + assert_eq!(base.multiply_ratio(2u128, 2u128), base); + } + + #[test] + #[should_panic] + fn uint128_multiply_ratio_panicks_on_overflow() { + // Almost max value for Uint64. + let base = Uint128(340282366920938463463374607431768211446); + + assert_eq!(base.multiply_ratio(2u128, 1u128), base); + } + #[test] #[should_panic(expected = "Denominator must not be zero")] fn uint128_multiply_ratio_panics_for_zero_denominator() { From ffc0e8aed23a0bc0302fa137156d262f2b5e2285 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 15:35:24 +0200 Subject: [PATCH 026/402] Better multiply_ratio implementation for Uint128 We use Parity's `U256` for the result, which should be faster than `num_bigint::BigUint` --- Cargo.lock | 199 ++++++++++++++++++++++++++----- packages/std/Cargo.toml | 3 +- packages/std/src/math/uint128.rs | 13 +- packages/std/src/math/uint64.rs | 12 +- 4 files changed, 185 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce5efe945..77772f8a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "atty" version = "0.2.14" @@ -84,7 +90,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -115,6 +133,12 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -207,7 +231,7 @@ dependencies = [ "hex", "hex-literal", "k256", - "rand_core", + "rand_core 0.5.1", "serde", "serde_json", "sha2", @@ -241,8 +265,7 @@ dependencies = [ "cosmwasm-schema", "hex", "hex-literal", - "num-bigint", - "num-traits", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -442,6 +465,12 @@ 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-mac" version = "0.10.0" @@ -482,7 +511,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -591,7 +620,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -609,13 +638,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -659,11 +688,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -697,6 +738,17 @@ dependencies = [ "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 1.0.0", + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", +] + [[package]] name = "gimli" version = "0.22.0" @@ -721,7 +773,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -774,6 +826,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -906,17 +967,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" -[[package]] -name = "num-bigint" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -968,6 +1018,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -1007,6 +1069,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1055,19 +1128,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -1075,7 +1165,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -1084,7 +1184,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -1093,7 +1202,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1195,6 +1304,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1354,7 +1469,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1369,6 +1484,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.8.0" @@ -1398,6 +1519,12 @@ dependencies = [ "unicode-xid", ] +[[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.11.1" @@ -1412,7 +1539,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1506,6 +1633,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-width" version = "0.1.8" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index c64a23dd0..b8880c9ea 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -30,12 +30,11 @@ stargate = [] [dependencies] base64 = "0.13.0" cosmwasm-derive = { path = "../derive", version = "0.14.0" } +primitive-types = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } thiserror = "1.0" -num-bigint = "0.4.0" -num-traits = "0.2.14" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-crypto = { path = "../crypto", version = "0.14.0" } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index fdb9f5658..2cf6ab863 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,5 +1,4 @@ -use num_bigint::BigUint; -use num_traits::cast::ToPrimitive; +use primitive_types::U256; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::convert::TryFrom; @@ -229,17 +228,19 @@ impl Uint128 { numerator: A, denominator: B, ) -> Uint128 { - let base: BigUint = self.u128().into(); let numerator: u128 = numerator.into(); let denominator: u128 = denominator.into(); if denominator == 0 { panic!("Denominator must not be zero"); } - let val = (base * numerator / denominator) - .to_u128() - .expect("multiplication overflow"); + let val = (self.full_mul(numerator) / denominator).as_u128(); Uint128::from(val) } + + /// Multiplies two u128 values without overflow. + fn full_mul(self, rhs: impl Into) -> U256 { + U256::from(self.u128()) * U256::from(rhs.into()) + } } impl Serialize for Uint128 { diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index adff647dd..57dd56cc5 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -216,18 +216,22 @@ impl Uint64 { numerator: A, denominator: B, ) -> Uint64 { - let base: u128 = self.u64().into(); - let numerator: u128 = numerator.into().into(); - let denominator: u128 = denominator.into().into(); + let numerator = numerator.into(); + let denominator = denominator.into(); if denominator == 0 { panic!("Denominator must not be zero"); } - let val: u64 = (base * numerator / denominator) + let val: u64 = (self.full_mul(numerator) / denominator as u128) .try_into() .expect("multiplication overflow"); Uint64::from(val) } + + /// Multiplies two u64 values without overflow. + fn full_mul(self, rhs: impl Into) -> u128 { + self.u64() as u128 * rhs.into() as u128 + } } impl Serialize for Uint64 { From 9d43a9ae37f6b9579ee9e074b48753a51cf1ef8f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 16:03:49 +0200 Subject: [PATCH 027/402] Fix builds after introducing `primitive-types` --- Cargo.lock | 3 +++ packages/std/Cargo.toml | 1 + 2 files changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 77772f8a3..3bb670c9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -263,6 +263,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-derive", "cosmwasm-schema", + "getrandom 0.2.3", "hex", "hex-literal", "primitive-types", @@ -745,8 +746,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi 0.10.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index b8880c9ea..9847f2a3d 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -30,6 +30,7 @@ stargate = [] [dependencies] base64 = "0.13.0" cosmwasm-derive = { path = "../derive", version = "0.14.0" } +getrandom = { version = "0.2.3", features = ["js"] } primitive-types = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" From 003e017719567c084d1b462ad28448ffc0ab4cf3 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 16:27:54 +0200 Subject: [PATCH 028/402] Update contract dependencies --- contracts/burner/Cargo.lock | 270 ++++++++++++++++++++++++-- contracts/crypto-verify/Cargo.lock | 264 +++++++++++++++++++++++-- contracts/hackatom/Cargo.lock | 270 ++++++++++++++++++++++++-- contracts/ibc-reflect-send/Cargo.lock | 270 ++++++++++++++++++++++++-- contracts/ibc-reflect/Cargo.lock | 270 ++++++++++++++++++++++++-- contracts/queue/Cargo.lock | 270 ++++++++++++++++++++++++-- contracts/reflect/Cargo.lock | 270 ++++++++++++++++++++++++-- contracts/staking/Cargo.lock | 270 ++++++++++++++++++++++++-- 8 files changed, 1994 insertions(+), 160 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 3347bc64f..f034fd7ac 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -77,6 +95,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + [[package]] name = "burner" version = "0.0.0" @@ -88,6 +112,12 @@ dependencies = [ "serde", ] +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -137,7 +167,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -163,6 +193,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -313,6 +345,12 @@ 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-mac" version = "0.10.0" @@ -331,7 +369,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -440,7 +478,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -458,13 +496,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -502,11 +540,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -537,7 +587,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -564,7 +627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -605,6 +668,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -622,6 +694,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -739,6 +820,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -766,6 +859,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -814,19 +918,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -834,7 +955,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -843,7 +974,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -852,7 +992,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -930,6 +1070,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "ryu" version = "1.0.5" @@ -1046,7 +1192,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1061,6 +1207,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.9.3" @@ -1075,15 +1227,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.58" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1098,7 +1256,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1162,6 +1320,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1180,6 +1350,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 87d391d66..84f0c1aad 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -84,6 +102,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -139,7 +169,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -165,6 +195,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -323,6 +355,12 @@ 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-mac" version = "0.10.0" @@ -358,7 +396,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -467,7 +505,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -485,13 +523,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -529,11 +567,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -564,7 +614,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -591,7 +654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -638,6 +701,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -655,6 +727,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -778,6 +859,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -805,6 +898,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -853,19 +957,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -873,7 +994,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -882,7 +1013,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -891,7 +1031,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1113,7 +1253,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1128,6 +1268,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.9.3" @@ -1142,15 +1288,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.57" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1165,7 +1317,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1229,6 +1381,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1247,6 +1411,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 219b7d835..0f2c0fc86 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -77,6 +95,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -126,7 +156,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -152,6 +182,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -310,6 +342,12 @@ 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-mac" version = "0.10.0" @@ -328,7 +366,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -437,7 +475,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -455,13 +493,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -499,11 +537,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -534,7 +584,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -561,7 +624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -616,6 +679,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -633,6 +705,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -750,6 +831,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -777,6 +870,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -825,19 +929,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -845,7 +966,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -854,7 +985,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -863,7 +1003,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -941,6 +1081,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "ryu" version = "1.0.5" @@ -1057,7 +1203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1072,6 +1218,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.9.3" @@ -1086,15 +1238,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.58" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1109,7 +1267,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1173,6 +1331,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1191,6 +1361,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 9bc2ec16c..d4a4d45b7 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -77,6 +95,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -126,7 +156,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -152,6 +182,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -310,6 +342,12 @@ 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-mac" version = "0.10.0" @@ -328,7 +366,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -437,7 +475,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -455,13 +493,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -499,11 +537,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -534,7 +584,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -561,7 +624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -614,6 +677,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -631,6 +703,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -748,6 +829,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -775,6 +868,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -823,19 +927,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -843,7 +964,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -852,7 +983,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -861,7 +1001,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -939,6 +1079,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "ryu" version = "1.0.5" @@ -1055,7 +1201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1070,6 +1216,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.9.3" @@ -1084,15 +1236,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.57" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1107,7 +1265,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1171,6 +1329,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1189,6 +1359,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index e6ea7d84a..83e77c660 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -77,6 +95,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -126,7 +156,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -152,6 +182,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -310,6 +342,12 @@ 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-mac" version = "0.10.0" @@ -328,7 +366,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -437,7 +475,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -455,13 +493,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -499,11 +537,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -534,7 +584,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -561,7 +624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -614,6 +677,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -631,6 +703,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -748,6 +829,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -775,6 +868,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -823,19 +927,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -843,7 +964,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -852,7 +983,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -861,7 +1001,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -939,6 +1079,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "ryu" version = "1.0.5" @@ -1055,7 +1201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1070,6 +1216,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.9.3" @@ -1084,15 +1236,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.57" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1107,7 +1265,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1171,6 +1329,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1189,6 +1359,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 021c39635..23eec87a9 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -77,6 +95,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -126,7 +156,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -152,6 +182,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -302,6 +334,12 @@ 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-mac" version = "0.10.0" @@ -320,7 +358,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -429,7 +467,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -447,13 +485,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -491,11 +529,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -526,7 +576,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -553,7 +616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -594,6 +657,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -611,6 +683,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -728,6 +809,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -755,6 +848,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -814,19 +918,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -834,7 +955,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -843,7 +974,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -852,7 +992,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -930,6 +1070,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "ryu" version = "1.0.5" @@ -1046,7 +1192,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1061,6 +1207,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.9.3" @@ -1075,15 +1227,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.58" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1098,7 +1256,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1162,6 +1320,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1180,6 +1350,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 436e858d4..04cd7065c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -77,6 +95,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -126,7 +156,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -152,6 +182,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -310,6 +342,12 @@ 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-mac" version = "0.10.0" @@ -328,7 +366,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -437,7 +475,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -455,13 +493,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -499,11 +537,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -534,7 +584,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -561,7 +624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -602,6 +665,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -619,6 +691,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -736,6 +817,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -763,6 +856,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -811,19 +915,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -831,7 +952,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -840,7 +971,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -849,7 +989,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -940,6 +1080,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "ryu" version = "1.0.5" @@ -1056,7 +1202,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1071,6 +1217,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.9.3" @@ -1085,15 +1237,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.58" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1108,7 +1266,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1172,6 +1330,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1190,6 +1360,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index ed79517d0..be6ba5de3 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -15,6 +15,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "autocfg" version = "1.0.1" @@ -64,7 +70,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium", + "radium 0.4.1", + "wyz", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty", + "radium 0.6.2", + "tap", "wyz", ] @@ -77,6 +95,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byte-slice-cast" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" + [[package]] name = "byteorder" version = "1.3.4" @@ -126,7 +156,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -152,6 +182,8 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", + "getrandom 0.2.3", + "primitive-types", "schemars", "serde", "serde-json-wasm", @@ -310,6 +342,12 @@ 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-mac" version = "0.10.0" @@ -328,7 +366,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -443,7 +481,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -461,13 +499,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec", + "bitvec 0.18.4", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -505,11 +543,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec", - "rand_core", + "bitvec 0.18.4", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.3", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -540,7 +590,20 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -567,7 +630,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -608,6 +671,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "impl-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "indexmap" version = "1.6.1" @@ -625,6 +697,15 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.7.2" @@ -742,6 +823,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parity-scale-codec" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "serde", +] + [[package]] name = "parity-wasm" version = "0.42.1" @@ -769,6 +862,17 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "primitive-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -817,19 +921,36 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", "rand_hc", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -837,7 +958,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -846,7 +977,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.3", ] [[package]] @@ -855,7 +995,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -933,6 +1073,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "ryu" version = "1.0.5" @@ -1049,7 +1195,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1098,6 +1244,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.9.3" @@ -1112,15 +1264,21 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.58" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[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.11.1" @@ -1135,7 +1293,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi", @@ -1199,6 +1357,18 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -1217,6 +1387,66 @@ 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.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + [[package]] name = "wasmer" version = "1.0.2" From 26c4698f84599514c034bcef9eff9b51e883ae99 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 16:29:06 +0200 Subject: [PATCH 029/402] Style Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/uint128.rs | 8 ++++---- packages/std/src/math/uint64.rs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 2cf6ab863..1a08ba5de 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -437,8 +437,8 @@ mod tests { #[test] fn uint128_multiply_ratio_does_not_overflow_when_result_fits() { - // Almost max value for Uint64. - let base = Uint128(340282366920938463463374607431768211446); + // Almost max value for Uint128. + let base = Uint128(u128::MAX - 9); assert_eq!(base.multiply_ratio(2u128, 2u128), base); } @@ -446,8 +446,8 @@ mod tests { #[test] #[should_panic] fn uint128_multiply_ratio_panicks_on_overflow() { - // Almost max value for Uint64. - let base = Uint128(340282366920938463463374607431768211446); + // Almost max value for Uint128. + let base = Uint128(u128::MAX - 9); assert_eq!(base.multiply_ratio(2u128, 1u128), base); } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 57dd56cc5..abaf2778b 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -426,7 +426,7 @@ mod tests { #[test] fn uint64_multiply_ratio_does_not_overflow_when_result_fits() { // Almost max value for Uint64. - let base = Uint64(18446744073709551606); + let base = Uint64(u64::MAX - 9); assert_eq!(base.multiply_ratio(2u64, 2u64), base); } @@ -435,7 +435,7 @@ mod tests { #[should_panic] fn uint64_multiply_ratio_panicks_on_overflow() { // Almost max value for Uint64. - let base = Uint64(18446744073709551606); + let base = Uint64(u64::MAX - 9); assert_eq!(base.multiply_ratio(2u64, 1u64), base); } From c4fa45268fea21c32b95d45d9506af5a11bd7f71 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 16:36:33 +0200 Subject: [PATCH 030/402] Make U128 overflow panic msg a bit more consistent --- packages/std/src/math/uint128.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 1a08ba5de..35823da19 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,7 +1,7 @@ use primitive_types::U256; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::convert::TryFrom; +use std::convert::{TryFrom, TryInto}; use std::fmt::{self}; use std::iter::Sum; use std::ops; @@ -233,7 +233,9 @@ impl Uint128 { if denominator == 0 { panic!("Denominator must not be zero"); } - let val = (self.full_mul(numerator) / denominator).as_u128(); + let val: u128 = (self.full_mul(numerator) / denominator) + .try_into() + .expect("multiplication overflow"); Uint128::from(val) } From b636e609add1adf05b466ceceabc3ea858f0b063 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 17:04:49 +0200 Subject: [PATCH 031/402] Lighten up the dependencies --- Cargo.lock | 166 ++---------------- contracts/burner/Cargo.lock | 243 ++------------------------ contracts/crypto-verify/Cargo.lock | 237 ++----------------------- contracts/hackatom/Cargo.lock | 243 ++------------------------ contracts/ibc-reflect-send/Cargo.lock | 243 ++------------------------ contracts/ibc-reflect/Cargo.lock | 243 ++------------------------ contracts/queue/Cargo.lock | 243 ++------------------------ contracts/reflect/Cargo.lock | 243 ++------------------------ contracts/staking/Cargo.lock | 243 ++------------------------ packages/std/Cargo.toml | 3 +- packages/std/src/math/uint128.rs | 10 +- 11 files changed, 180 insertions(+), 1937 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3bb670c9c..d2fd95296 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,12 +24,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "atty" version = "0.2.14" @@ -90,19 +84,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -133,12 +115,6 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -231,7 +207,7 @@ dependencies = [ "hex", "hex-literal", "k256", - "rand_core 0.5.1", + "rand_core", "serde", "serde_json", "sha2", @@ -263,14 +239,13 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-derive", "cosmwasm-schema", - "getrandom 0.2.3", "hex", "hex-literal", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -512,7 +487,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -621,7 +596,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -639,13 +614,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -689,23 +664,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -739,19 +702,6 @@ dependencies = [ "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - [[package]] name = "gimli" version = "0.22.0" @@ -776,7 +726,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -829,15 +779,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -1021,18 +962,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -1072,17 +1001,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1131,36 +1049,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -1168,17 +1069,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -1187,16 +1078,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -1205,7 +1087,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1307,12 +1189,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "rustc_version" version = "0.2.3" @@ -1472,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1522,12 +1398,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1542,7 +1412,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index f034fd7ac..9e3644972 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -95,12 +77,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - [[package]] name = "burner" version = "0.0.0" @@ -112,12 +88,6 @@ dependencies = [ "serde", ] -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -167,7 +137,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -193,12 +163,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -369,7 +338,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -478,7 +447,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -496,13 +465,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -540,23 +509,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -587,20 +544,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -627,7 +571,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -668,15 +612,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -694,15 +629,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -820,18 +746,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -859,17 +773,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -918,36 +821,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -955,17 +841,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -974,16 +850,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -992,7 +859,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1070,12 +937,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "ryu" version = "1.0.5" @@ -1192,7 +1053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1236,12 +1097,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1256,7 +1111,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1350,66 +1205,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 84f0c1aad..84274f3de 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -102,18 +84,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -169,7 +139,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -195,12 +165,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -396,7 +365,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -505,7 +474,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -523,13 +492,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -567,23 +536,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -614,20 +571,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -654,7 +598,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -701,15 +645,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -727,15 +662,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -859,18 +785,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -898,17 +812,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -957,36 +860,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -994,17 +880,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -1013,16 +889,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -1031,7 +898,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1253,7 +1120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1297,12 +1164,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1317,7 +1178,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1411,66 +1272,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 0f2c0fc86..25cee79a8 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -95,18 +77,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -156,7 +126,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -182,12 +152,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -366,7 +335,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -475,7 +444,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -493,13 +462,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -537,23 +506,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -584,20 +541,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -624,7 +568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -679,15 +623,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -705,15 +640,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -831,18 +757,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -870,17 +784,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -929,36 +832,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -966,17 +852,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -985,16 +861,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -1003,7 +870,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1081,12 +948,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "ryu" version = "1.0.5" @@ -1203,7 +1064,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1247,12 +1108,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1267,7 +1122,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1361,66 +1216,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index d4a4d45b7..bda9de7b2 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -95,18 +77,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -156,7 +126,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -182,12 +152,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -366,7 +335,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -475,7 +444,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -493,13 +462,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -537,23 +506,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -584,20 +541,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -624,7 +568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -677,15 +621,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -703,15 +638,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -829,18 +755,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -868,17 +782,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -927,36 +830,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -964,17 +850,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -983,16 +859,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -1001,7 +868,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1079,12 +946,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "ryu" version = "1.0.5" @@ -1201,7 +1062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1245,12 +1106,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1265,7 +1120,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1359,66 +1214,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 83e77c660..654250b49 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -95,18 +77,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -156,7 +126,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -182,12 +152,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -366,7 +335,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -475,7 +444,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -493,13 +462,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -537,23 +506,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -584,20 +541,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -624,7 +568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -677,15 +621,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -703,15 +638,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -829,18 +755,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -868,17 +782,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -927,36 +830,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -964,17 +850,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -983,16 +859,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -1001,7 +868,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1079,12 +946,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "ryu" version = "1.0.5" @@ -1201,7 +1062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1245,12 +1106,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1265,7 +1120,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1359,66 +1214,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 23eec87a9..596b58923 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -95,18 +77,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -156,7 +126,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -182,12 +152,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -358,7 +327,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -467,7 +436,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -485,13 +454,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -529,23 +498,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -576,20 +533,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -616,7 +560,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -657,15 +601,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -683,15 +618,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -809,18 +735,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -848,17 +762,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -918,36 +821,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -955,17 +841,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -974,16 +850,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -992,7 +859,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1070,12 +937,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "ryu" version = "1.0.5" @@ -1192,7 +1053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1236,12 +1097,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1256,7 +1111,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1350,66 +1205,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 04cd7065c..b227f1dda 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -95,18 +77,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -156,7 +126,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -182,12 +152,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -366,7 +335,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -475,7 +444,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -493,13 +462,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -537,23 +506,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -584,20 +541,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -624,7 +568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -665,15 +609,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -691,15 +626,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -817,18 +743,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -856,17 +770,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -915,36 +818,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -952,17 +838,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -971,16 +847,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -989,7 +856,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1080,12 +947,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "ryu" version = "1.0.5" @@ -1202,7 +1063,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1246,12 +1107,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1266,7 +1121,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1360,66 +1215,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index be6ba5de3..cd627a728 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -15,12 +15,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" -[[package]] -name = "arrayvec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" - [[package]] name = "autocfg" version = "1.0.1" @@ -70,19 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" dependencies = [ "funty", - "radium 0.4.1", - "wyz", -] - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium 0.6.2", - "tap", + "radium", "wyz", ] @@ -95,18 +77,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-slice-cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c1bf4a04a88c54f589125563643d773f3254b5c38571395e2b591c693bbc81" - [[package]] name = "byteorder" version = "1.3.4" @@ -156,7 +126,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core 0.5.1", + "rand_core", "thiserror", ] @@ -182,12 +152,11 @@ dependencies = [ "base64", "cosmwasm-crypto", "cosmwasm-derive", - "getrandom 0.2.3", - "primitive-types", "schemars", "serde", "serde-json-wasm", "thiserror", + "uint", ] [[package]] @@ -366,7 +335,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -481,7 +450,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core 0.5.1", + "rand_core", "serde", "sha2", "thiserror", @@ -499,13 +468,13 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" dependencies = [ - "bitvec 0.18.4", + "bitvec", "digest", "ff", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core", "subtle", "zeroize", ] @@ -543,23 +512,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ - "bitvec 0.18.4", - "rand_core 0.5.1", + "bitvec", + "rand_core", "subtle", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.3", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fnv" version = "1.0.7" @@ -590,20 +547,7 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "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 1.0.0", - "js-sys", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] @@ -630,7 +574,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core", "subtle", ] @@ -671,15 +615,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "impl-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df170efa359aebdd5cb7fe78edcc67107748e4737bdca8a8fb40d15ea7a877ed" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "indexmap" version = "1.6.1" @@ -697,15 +632,6 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" -[[package]] -name = "js-sys" -version = "0.3.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.7.2" @@ -823,18 +749,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "parity-scale-codec" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f518afaa5a47d0d6386229b0a6e01e86427291d643aa4cabb4992219f504f8" -dependencies = [ - "arrayvec", - "bitvec 0.20.4", - "byte-slice-cast", - "serde", -] - [[package]] name = "parity-wasm" version = "0.42.1" @@ -862,17 +776,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "primitive-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2415937401cb030a2a0a4d922483f945fa068f52a7dbb22ce0fe5f2b6f6adace" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -921,36 +824,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", "rand_hc", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -958,17 +844,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.2", + "rand_core", ] [[package]] @@ -977,16 +853,7 @@ 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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom 0.2.3", + "getrandom", ] [[package]] @@ -995,7 +862,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1073,12 +940,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "ryu" version = "1.0.5" @@ -1195,7 +1056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core", ] [[package]] @@ -1273,12 +1134,6 @@ dependencies = [ "unicode-xid", ] -[[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.11.1" @@ -1293,7 +1148,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1387,66 +1242,6 @@ 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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" - [[package]] name = "wasmer" version = "1.0.2" diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 9847f2a3d..1ca5ff6b9 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -30,8 +30,7 @@ stargate = [] [dependencies] base64 = "0.13.0" cosmwasm-derive = { path = "../derive", version = "0.14.0" } -getrandom = { version = "0.2.3", features = ["js"] } -primitive-types = "0.9.0" +uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 35823da19..c32f561e7 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -1,4 +1,3 @@ -use primitive_types::U256; use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::convert::{TryFrom, TryInto}; @@ -297,6 +296,15 @@ impl<'a> Sum<&'a Uint128> for Uint128 { } } +#[allow(clippy::all)] +mod uints { + uint::construct_uint! { + pub struct U256(4); + } +} + +use uints::U256; + #[cfg(test)] mod tests { use super::*; From bc27c7a6b81643a0331c808065691a6ff35c8fb6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 17:26:27 +0200 Subject: [PATCH 032/402] Extra documentation for Uint128 guts --- packages/std/src/math/uint128.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index c32f561e7..1c67b3a27 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -296,6 +296,8 @@ impl<'a> Sum<&'a Uint128> for Uint128 { } } +/// 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! { @@ -303,6 +305,8 @@ mod uints { } } +/// Only used internally - namely to store the intermediate result of +/// multiplying two 128-bit uints. use uints::U256; #[cfg(test)] From 9fd8288c8cc77d29595b7c46e3bbc1252923e0b5 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 17:37:29 +0200 Subject: [PATCH 033/402] Fix CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2dde4f04..8ee68d0ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,9 +13,14 @@ and this project adheres to - 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` + +### 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 From 5fc162b11366cce1c4d9f5577094d1c4f2c84693 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 18:39:48 +0200 Subject: [PATCH 034/402] Implement integer square root --- packages/std/src/math/isqrt.rs | 53 ++++++++++++++++++++++++++++++++++ packages/std/src/math/mod.rs | 2 ++ 2 files changed, 55 insertions(+) create mode 100644 packages/std/src/math/isqrt.rs diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs new file mode 100644 index 000000000..ef26fad56 --- /dev/null +++ b/packages/std/src/math/isqrt.rs @@ -0,0 +1,53 @@ +use std::{cmp, ops}; + +/// A trait for calculating the +/// [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). + fn isqrt(self) -> Self; +} + +impl< + I: ops::Add + + ops::Div + + ops::Shr + + cmp::PartialOrd + + Copy + + From, + > Isqrt for I +{ + /// Algorithm adapted from + /// [Wikipedia](https://en.wikipedia.org/wiki/Integer_square_root#Example_implementation_in_C). + fn isqrt(self) -> Self { + let mut x0 = self >> 1; + + if x0 > 0.into() { + let mut x1 = (x0 + self / x0) >> 1; + + while x1 < x0 { + x0 = x1; + x1 = (x0 + self / x0) >> 1; + } + + return x0; + } else if x0 < 0.into() { + panic!("attempt to calculate the integer square root of a negative number"); + } + self + } +} + +#[test] +fn uint128_sqrts() { + // Let's check correctness. + assert_eq!(0.isqrt(), 0); + assert_eq!(1.isqrt(), 1); + assert_eq!(24.isqrt(), 4); + assert_eq!(25.isqrt(), 5); + assert_eq!(26.isqrt(), 5); + assert_eq!(36.isqrt(), 6); + + // Let's also check different types. + assert_eq!(26u8.isqrt(), 5); + assert_eq!(26u128.isqrt(), 5); +} diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index e9c5dbe28..53b9818ca 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -1,9 +1,11 @@ mod decimal; mod fraction; +mod isqrt; mod uint128; mod uint64; pub use decimal::Decimal; pub use fraction::Fraction; +pub use isqrt::Isqrt; pub use uint128::Uint128; pub use uint64::Uint64; From 8397e1a5180084fa99cb2390ab55ea1c4daa5a71 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 18:57:57 +0200 Subject: [PATCH 035/402] Implement `Decimal::sqrt` --- CHANGELOG.md | 1 + packages/std/src/math/decimal.rs | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ee68d0ed..d63a46431 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to - 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 diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index b797fff9b..8a096e3ec 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -7,6 +7,7 @@ use std::str::FromStr; use crate::errors::StdError; use super::Fraction; +use super::Isqrt; use super::Uint128; /// A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0 @@ -55,6 +56,12 @@ impl Decimal { pub fn is_zero(&self) -> bool { self.0 == 0 } + + /// Returns the approximate square root as a Decimal. + pub fn sqrt(self) -> Self { + // TODO: Should we have better precision here? + Decimal(self.0.isqrt() * 1_000_000_000) + } } impl Fraction for Decimal { @@ -609,6 +616,14 @@ mod tests { dec /= Uint128(0); } + #[test] + fn decimal_uint128_sqrt() { + assert_eq!(Decimal::percent(900).sqrt(), Decimal::percent(300)); + + assert!(Decimal::percent(316) < Decimal::percent(1000).sqrt()); + assert!(Decimal::percent(1000).sqrt() < Decimal::percent(317)); + } + #[test] fn decimal_to_string() { // Integers From 5d77cea1c3cf09e33f0aa663203433670ef62d98 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 9 Jun 2021 19:10:23 +0200 Subject: [PATCH 036/402] Typo --- packages/std/src/math/isqrt.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index ef26fad56..0458acec2 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -38,7 +38,7 @@ impl< } #[test] -fn uint128_sqrts() { +fn isqrts() { // Let's check correctness. assert_eq!(0.isqrt(), 0); assert_eq!(1.isqrt(), 1); From c997d80b75bfc30124690b3c32ec89bc505e46fa Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 9 Jun 2021 22:59:09 +0200 Subject: [PATCH 037/402] Fix some typos in CHANGELOG --- CHANGELOG.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ee68d0ed..640ef5e20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -171,7 +171,7 @@ and this project adheres to - 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 bahaviour of the Rust primitive types. Thank you + 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`, @@ -345,7 +345,7 @@ and this project adheres to - 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 implementes the new `Storage` trait and has an additional +- `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. @@ -376,7 +376,7 @@ and this project adheres to - 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 espeically useful for creating integers from + fixed-length `u8` array. This is especially useful for creating integers from binary data. ## 0.11.1 (2020-10-12) @@ -436,7 +436,7 @@ and this project adheres to 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 unpredicatable represenation of + `MockApi::human_address` was changed to an unpredictable representation of non-standard length that aims to destroy most of the input structure. **cosmwasm-storage** @@ -459,7 +459,7 @@ and this project adheres to 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 unpredicatable represenation of + `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) @@ -625,7 +625,7 @@ https://github.com/CosmWasm/cosmwasm/issues/451). `humanize_address`. Only invalid inputs should be reported. - Move error cases `VmError::RegionLengthTooBig` and `VmError::RegionTooSmall` into `CommunicationError`. -- In the `canonicalize_address` inplementation, invalid UTF-8 inputs now result +- 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. From 83edc5499e9591e9d2cdd2997333e4c02d2568c7 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 08:23:03 +0200 Subject: [PATCH 038/402] Remove implementation of Isqrt for signed ints --- packages/std/src/math/isqrt.rs | 40 ++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 0458acec2..481225571 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -7,14 +7,15 @@ pub trait Isqrt { fn isqrt(self) -> Self; } -impl< - I: ops::Add - + ops::Div - + ops::Shr - + cmp::PartialOrd - + Copy - + From, - > Isqrt for I +impl Isqrt for I +where + I: Unsigned + + ops::Add + + ops::Div + + ops::Shr + + cmp::PartialOrd + + Copy + + From, { /// Algorithm adapted from /// [Wikipedia](https://en.wikipedia.org/wiki/Integer_square_root#Example_implementation_in_C). @@ -37,17 +38,28 @@ impl< } } +/// Marker trait for types that represent unsigned integers. +pub trait Unsigned {} +impl Unsigned for u8 {} +impl Unsigned for u16 {} +impl Unsigned for u32 {} +impl Unsigned for u64 {} +impl Unsigned for u128 {} + #[test] fn isqrts() { // Let's check correctness. - assert_eq!(0.isqrt(), 0); - assert_eq!(1.isqrt(), 1); - assert_eq!(24.isqrt(), 4); - assert_eq!(25.isqrt(), 5); - assert_eq!(26.isqrt(), 5); - assert_eq!(36.isqrt(), 6); + 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); // 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); } From 14c644ffb79ebb307e6a89cb9780bf4e4fafdcd2 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 08:24:44 +0200 Subject: [PATCH 039/402] Move isqrt tests to their own module --- packages/std/src/math/isqrt.rs | 35 +++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 481225571..8f8b95222 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -46,20 +46,25 @@ impl Unsigned for u32 {} impl Unsigned for u64 {} impl Unsigned for u128 {} -#[test] -fn isqrts() { - // 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); +#[cfg(test)] +mod tests { + use super::*; - // 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); + #[test] + fn isqrts() { + // 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); + + // 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); + } } From e152b46d38c385de3cf76c7be338adf906a0be57 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 10 Jun 2021 11:36:02 +0200 Subject: [PATCH 040/402] Improve doc comments for SubMsg and Reply --- contracts/reflect/schema/execute_msg.json | 3 ++- .../schema/response_for__custom_msg.json | 3 ++- packages/std/src/results/subcall.rs | 18 ++++++++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index 283220fec..c8608f023 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -572,7 +572,7 @@ ] }, "SubMsg_for_CustomMsg": { - "description": "A sub-message that will guarantee a subcall_response callback on success or error Note on error the subcall will revert any partial state changes due to this message, but not revert any state changes in the calling contract (that must be done in the subcall_response entry point)", + "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", @@ -589,6 +589,7 @@ "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 diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 1fcc2152c..651213151 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -560,7 +560,7 @@ ] }, "SubMsg_for_CustomMsg": { - "description": "A sub-message that will guarantee a subcall_response callback on success or error Note on error the subcall will revert any partial state changes due to this message, but not revert any state changes in the calling contract (that must be done in the subcall_response entry point)", + "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", @@ -577,6 +577,7 @@ "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 diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 8447dc0e4..ceec8a54e 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -26,25 +26,31 @@ impl Default for ReplyOn { } } -/// A sub-message that will guarantee a subcall_response callback on success or error -/// Note on error the subcall will revert any partial state changes due to this message, -/// but not revert any state changes in the calling contract (that must be done in the -/// subcall_response entry point) +/// 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. +/// +/// Note: 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. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct SubMsg where T: Clone + fmt::Debug + PartialEq + JsonSchema, { + /// 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, pub msg: CosmosMsg, pub gas_limit: Option, pub reply_on: ReplyOn, } -/// The Result object returned to subcall_response. We always get the same id back -/// and then must handle success and error cases ourselves +/// The result object returned to `reply`. We always get the ID from the submessage +/// back and then must handle success and error cases ourselves. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] 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, pub result: ContractResult, } From d38bad0141f8d993807993ee9daef72c5caf0e4e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 11:51:49 +0200 Subject: [PATCH 041/402] Add a precision test for Decimal::sqrt --- packages/std/src/math/decimal.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 8a096e3ec..31d9804a3 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -624,6 +624,18 @@ mod tests { assert!(Decimal::percent(1000).sqrt() < Decimal::percent(317)); } + /// sqrt(2) is an irrational number, i.e. all 18 decimal places should be used. + /// However due to implementation details the result is truncated after 9 + /// decimal places, so we disable the test for now. + #[test] + #[ignore] + fn decimal_uint128_sqrt_is_precise() { + assert_eq!( + Decimal::from_str("2").unwrap().sqrt(), + Decimal::from_str("1.414213562373095049").unwrap() + ); + } + #[test] fn decimal_to_string() { // Integers From f316e6fba3343f34964f34da825fec17787fcb9b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 11:52:58 +0200 Subject: [PATCH 042/402] Pass &self by ref to Decimal::sqrt --- 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 31d9804a3..a898b1726 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -58,7 +58,7 @@ impl Decimal { } /// Returns the approximate square root as a Decimal. - pub fn sqrt(self) -> Self { + pub fn sqrt(&self) -> Self { // TODO: Should we have better precision here? Decimal(self.0.isqrt() * 1_000_000_000) } From 5440b6010f4f80a49ce882d940d7b93d134a066f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 11:57:55 +0200 Subject: [PATCH 043/402] Remove unnecessary check in math::isqrt --- packages/std/src/math/isqrt.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 8f8b95222..82513044a 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -31,8 +31,6 @@ where } return x0; - } else if x0 < 0.into() { - panic!("attempt to calculate the integer square root of a negative number"); } self } From b0c385ea2450d6a4c937674d220978024b9bdc07 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 11:58:55 +0200 Subject: [PATCH 044/402] Implement math::isqrt::Unsigned for usize Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/isqrt.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 82513044a..4e8c0888c 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -43,6 +43,7 @@ impl Unsigned for u16 {} impl Unsigned for u32 {} impl Unsigned for u64 {} impl Unsigned for u128 {} +impl Unsigned for usize {} #[cfg(test)] mod tests { From 2ac87f7c2a47e5c4896e6527126ddf94b028ba62 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 12:22:08 +0200 Subject: [PATCH 045/402] Fix Decimal::sqrt tests --- packages/std/src/math/decimal.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index a898b1726..ecda57b62 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -632,7 +632,15 @@ mod tests { fn decimal_uint128_sqrt_is_precise() { assert_eq!( Decimal::from_str("2").unwrap().sqrt(), - Decimal::from_str("1.414213562373095049").unwrap() + Decimal::from_str("1.414213562373095048").unwrap() + ); + } + + #[test] + fn decimal_uint128_sqrt_does_not_overflow() { + assert_eq!( + Decimal::from_str("400").unwrap().sqrt(), + Decimal::from_str("20").unwrap() ); } From b291c3ea78211d84b31944d7d3ca9e68acdc59b6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 16:38:11 +0200 Subject: [PATCH 046/402] Decimal - implement choosing precision for sqrt --- packages/std/src/math/decimal.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index ecda57b62..7e21e3d35 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -59,8 +59,14 @@ impl Decimal { /// Returns the approximate square root as a Decimal. pub fn sqrt(&self) -> Self { - // TODO: Should we have better precision here? - Decimal(self.0.isqrt() * 1_000_000_000) + self.sqrt_with_precision(0) + } + + /// Lower precision means more aggressive rounding, but less risk of overflow. + fn sqrt_with_precision(&self, precision: u32) -> Self { + let inner_mul = 100u128.pow(precision); + let outer_mul = 10u128.pow(9 - precision); + Decimal((self.0 * inner_mul).isqrt() * outer_mul) } } From 3cf2c5b7741f156634016f24fa07fae966a5ba98 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 17:05:26 +0200 Subject: [PATCH 047/402] `Decimal::sqrt` - variable precision --- packages/std/src/math/decimal.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 7e21e3d35..ebe18bae1 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -58,15 +58,27 @@ impl Decimal { } /// Returns the approximate square root as a Decimal. + /// + /// This should not overflow or panic. pub fn sqrt(&self) -> Self { - self.sqrt_with_precision(0) + // We start with the highest precision possible and lower it until + // there's no overflow. + (0..=9) + .rev() + .find_map(|i| self.sqrt_with_precision(i)) + .unwrap() } /// Lower precision means more aggressive rounding, but less risk of overflow. - fn sqrt_with_precision(&self, precision: u32) -> Self { + /// Precision *must* be a number between 0 and 9 (inclusive). + /// + /// Returns `None` if the internal multiplication overflows. + fn sqrt_with_precision(&self, precision: u32) -> Option { let inner_mul = 100u128.pow(precision); let outer_mul = 10u128.pow(9 - precision); - Decimal((self.0 * inner_mul).isqrt() * outer_mul) + self.0 + .checked_mul(inner_mul) + .map(|inner| Decimal(inner.isqrt() * outer_mul)) } } From 3c90d956a502a899bba18eebdb0d9125fde5ade8 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 18:24:19 +0200 Subject: [PATCH 048/402] Style stuff (mostly comments) Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/decimal.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index ebe18bae1..7d233704b 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -61,11 +61,13 @@ impl Decimal { /// /// This should not overflow or panic. pub fn sqrt(&self) -> Self { + // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until // there's no overflow. (0..=9) .rev() .find_map(|i| self.sqrt_with_precision(i)) + // The last step (i = 0) is guaranteed to succeed because `isqrt(u128::MAX) * 10^9` does not overflow .unwrap() } @@ -643,14 +645,11 @@ mod tests { } /// sqrt(2) is an irrational number, i.e. all 18 decimal places should be used. - /// However due to implementation details the result is truncated after 9 - /// decimal places, so we disable the test for now. #[test] - #[ignore] fn decimal_uint128_sqrt_is_precise() { assert_eq!( Decimal::from_str("2").unwrap().sqrt(), - Decimal::from_str("1.414213562373095048").unwrap() + Decimal::from_str("1.414213562373095048").unwrap() // https://www.wolframalpha.com/input/?i=sqrt%282%29 ); } From 2f3c19b2360a9abd326d47bad03e0e4a1e443e09 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 18:28:51 +0200 Subject: [PATCH 049/402] Slight perf improvement in `Decimal::sqrt` --- packages/std/src/math/decimal.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 7d233704b..17c50859c 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -77,10 +77,10 @@ impl Decimal { /// Returns `None` if the internal multiplication overflows. fn sqrt_with_precision(&self, precision: u32) -> Option { let inner_mul = 100u128.pow(precision); - let outer_mul = 10u128.pow(9 - precision); - self.0 - .checked_mul(inner_mul) - .map(|inner| Decimal(inner.isqrt() * outer_mul)) + self.0.checked_mul(inner_mul).map(|inner| { + let outer_mul = 10u128.pow(9 - precision); + Decimal(inner.isqrt() * outer_mul) + }) } } From 5bd740a0e42955565b3eb6e9224591c212d67d5c Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 18:45:12 +0200 Subject: [PATCH 050/402] Intermediate precision test for `Decimal::sqrt` --- packages/std/src/math/decimal.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 17c50859c..f642b747f 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -661,6 +661,17 @@ mod tests { ); } + #[test] + fn decimal_uint128_sqrt_intermediate_precision_used() { + assert_eq!( + Decimal::from_str("400001").unwrap().sqrt(), + // The last two digits (27) are truncated below due to the algorithm + // we use. Larger numbers will cause less precision. + // https://www.wolframalpha.com/input/?i=sqrt%28400001%29 + Decimal::from_str("632.456322602596803200").unwrap() + ); + } + #[test] fn decimal_to_string() { // Integers From 9b3c0c4a4c2dcfe68653018cc8fa26cb925acae5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 14 Jun 2021 09:16:34 +0200 Subject: [PATCH 051/402] Set version: 0.14.1 --- CHANGELOG.md | 9 ++++++--- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd5cb988e..279cb6677 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [0.14.1] - 2021-06-14 + ### Added - cosmwasm-std: Add `Timestamp::minus_seconds` and `::minus_nanos`. @@ -17,8 +19,8 @@ and this project adheres to ### Fixed -- cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` - so that internal multiplication cannot cause an unnecessary overflow. ([#920]) +- 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 @@ -910,7 +912,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.14.0...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.14.1...HEAD +[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 diff --git a/Cargo.lock b/Cargo.lock index d2fd95296..1e4f8f5d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -196,7 +196,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "criterion", @@ -216,7 +216,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "syn", @@ -224,7 +224,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -232,7 +232,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "chrono", @@ -250,7 +250,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "serde", @@ -258,7 +258,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 9e3644972..61e99ce9f 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -132,7 +132,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -143,14 +143,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -158,7 +158,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -172,7 +172,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 84274f3de..9ce24ded2 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -134,7 +134,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -145,14 +145,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -160,7 +160,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -174,7 +174,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "serde", @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 25cee79a8..fd855f2c0 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -121,7 +121,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -132,14 +132,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -147,7 +147,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -161,7 +161,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "serde", @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index bda9de7b2..ca2620212 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -121,7 +121,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -132,14 +132,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -147,7 +147,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -161,7 +161,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "serde", @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 654250b49..19415f662 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -121,7 +121,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -132,14 +132,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -147,7 +147,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -161,7 +161,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "serde", @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 596b58923..e9574045f 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -121,7 +121,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -132,14 +132,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -147,7 +147,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -161,7 +161,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index b227f1dda..ba6f3fab8 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -121,7 +121,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -132,14 +132,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -147,7 +147,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -161,7 +161,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "serde", @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index cd627a728..2644e1aab 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -121,7 +121,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" dependencies = [ "digest", "ed25519-zebra", @@ -132,14 +132,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" dependencies = [ "schemars", "serde_json", @@ -147,7 +147,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -161,7 +161,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" dependencies = [ "cosmwasm-std", "serde", @@ -169,7 +169,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 1fd37eedb..fdec37646 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.14.0" +version = "0.14.1" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 8d2b312e7..d35fbdc1d 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.14.0" +version = "0.14.1" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 14474d001..66e234fba 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.14.0" +version = "0.14.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 1ca5ff6b9..32a2b7d5b 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.14.0" +version = "0.14.1" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.14.0" } +cosmwasm-derive = { path = "../derive", version = "0.14.1" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.14.0" } +cosmwasm-crypto = { path = "../crypto", version = "0.14.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index f1493fa5e..c287683e9 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.14.0" +version = "0.14.1" authors = ["Ethan Frey "] edition = "2018" description = "CosmWasm library with useful helpers for Storage patterns" @@ -15,5 +15,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 = "0.14.0" } +cosmwasm-std = { path = "../std", version = "0.14.1" } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index bb320ca9b..ee65438cc 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.14.0" +version = "0.14.1" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.14.0" } -cosmwasm-crypto = { path = "../crypto", version = "0.14.0" } +cosmwasm-std = { path = "../std", version = "0.14.1" } +cosmwasm-crypto = { path = "../crypto", version = "0.14.1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From c5a53cffe8d7fcd4c6e1f21868093928f79bb07b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 18:13:02 +0200 Subject: [PATCH 052/402] Rename `send` to `funds` in `WasmMsg` --- CHANGELOG.md | 5 +++ .../ibc-reflect-send/schema/execute_msg.json | 32 +++++++++---------- .../ibc-reflect-send/schema/packet_msg.json | 32 +++++++++---------- contracts/ibc-reflect/schema/packet_msg.json | 32 +++++++++---------- contracts/ibc-reflect/src/contract.rs | 10 +++--- contracts/ibc-reflect/tests/integration.rs | 8 ++--- contracts/reflect/schema/execute_msg.json | 32 +++++++++---------- .../schema/response_for__custom_msg.json | 32 +++++++++---------- contracts/staking/src/contract.rs | 2 +- packages/std/schema/cosmos_msg.json | 32 +++++++++---------- packages/std/src/results/cosmos_msg.rs | 12 +++---- 11 files changed, 117 insertions(+), 112 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 279cb6677..7f192932c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to ## [Unreleased] +### Changed + +- cosmwasm-std: Rename the `send` function parameter to `funds` in `WasmMsg` + for consistency with the wasmd message types. + ## [0.14.1] - 2021-06-14 ### Added diff --git a/contracts/ibc-reflect-send/schema/execute_msg.json b/contracts/ibc-reflect-send/schema/execute_msg.json index 70eb8de72..6e79476d8 100644 --- a/contracts/ibc-reflect-send/schema/execute_msg.json +++ b/contracts/ibc-reflect-send/schema/execute_msg.json @@ -596,13 +596,19 @@ "type": "object", "required": [ "contract_addr", - "msg", - "send" + "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": [ @@ -610,12 +616,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } @@ -633,9 +633,9 @@ "type": "object", "required": [ "code_id", + "funds", "label", - "msg", - "send" + "msg" ], "properties": { "admin": { @@ -649,6 +649,12 @@ "format": "uint64", "minimum": 0.0 }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, "label": { "description": "A human-readbale label for the contract", "type": "string" @@ -660,12 +666,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 5d0efcdd5..0f4e9f969 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -549,13 +549,19 @@ "type": "object", "required": [ "contract_addr", - "msg", - "send" + "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": [ @@ -563,12 +569,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } @@ -586,9 +586,9 @@ "type": "object", "required": [ "code_id", + "funds", "label", - "msg", - "send" + "msg" ], "properties": { "admin": { @@ -602,6 +602,12 @@ "format": "uint64", "minimum": 0.0 }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, "label": { "description": "A human-readbale label for the contract", "type": "string" @@ -613,12 +619,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 3896bfcd0..df229f239 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -548,13 +548,19 @@ "type": "object", "required": [ "contract_addr", - "msg", - "send" + "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": [ @@ -562,12 +568,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } @@ -585,9 +585,9 @@ "type": "object", "required": [ "code_id", + "funds", "label", - "msg", - "send" + "msg" ], "properties": { "admin": { @@ -601,6 +601,12 @@ "format": "uint64", "minimum": 0.0 }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, "label": { "description": "A human-readbale label for the contract", "type": "string" @@ -612,12 +618,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 88965263e..4af0858cb 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -164,7 +164,7 @@ pub fn ibc_channel_connect( admin: None, code_id: cfg.reflect_code_id, msg: b"{}".into(), - send: vec![], + funds: vec![], label: format!("ibc-reflect-{}", &chan_id), }; let sub_msg = SubMsg { @@ -477,13 +477,13 @@ mod tests { admin, code_id, msg: _, - send, + funds, label, }) = &res.submessages[0].msg { assert_eq!(*admin, None); assert_eq!(*code_id, REFLECT_ID); - assert_eq!(send.len(), 0); + assert_eq!(funds.len(), 0); assert!(label.contains(channel_id)); } else { panic!("invalid return message: {:?}", res.messages[0]); @@ -576,11 +576,11 @@ mod tests { if let CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, - send, + funds, }) = &res.submessages[0].msg { assert_eq!(account, contract_addr.as_str()); - assert_eq!(0, send.len()); + assert_eq!(0, funds.len()); // parse the message - should callback with proper channel_id let rmsg: ReflectExecuteMsg = from_slice(&msg).unwrap(); assert_eq!( diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index f01b1eaf9..54f5da742 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -145,13 +145,13 @@ fn proper_handshake_flow() { admin, code_id, msg: _, - send, + funds, label, }) = &res.submessages[0].msg { assert_eq!(*admin, None); assert_eq!(*code_id, REFLECT_ID); - assert_eq!(send.len(), 0); + assert_eq!(funds.len(), 0); assert!(label.contains(channel_id)); } else { panic!("invalid return message: {:?}", res.messages[0]); @@ -249,11 +249,11 @@ fn handle_dispatch_packet() { if let CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, - send, + funds, }) = &res.submessages[0].msg { assert_eq!(account, contract_addr.as_str()); - assert_eq!(0, send.len()); + assert_eq!(0, funds.len()); // parse the message - should callback with proper channel_id let rmsg: ReflectExecuteMsg = from_slice(&msg).unwrap(); assert_eq!( diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index c8608f023..c93b3084b 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -632,13 +632,19 @@ "type": "object", "required": [ "contract_addr", - "msg", - "send" + "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": [ @@ -646,12 +652,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } @@ -669,9 +669,9 @@ "type": "object", "required": [ "code_id", + "funds", "label", - "msg", - "send" + "msg" ], "properties": { "admin": { @@ -685,6 +685,12 @@ "format": "uint64", "minimum": 0.0 }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, "label": { "description": "A human-readbale label for the contract", "type": "string" @@ -696,12 +702,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 651213151..859982100 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -620,13 +620,19 @@ "type": "object", "required": [ "contract_addr", - "msg", - "send" + "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": [ @@ -634,12 +640,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } @@ -657,9 +657,9 @@ "type": "object", "required": [ "code_id", + "funds", "label", - "msg", - "send" + "msg" ], "properties": { "admin": { @@ -673,6 +673,12 @@ "format": "uint64", "minimum": 0.0 }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, "label": { "description": "A human-readbale label for the contract", "type": "string" @@ -684,12 +690,6 @@ "$ref": "#/definitions/Binary" } ] - }, - "send": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } } } } diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 44224438a..c52bb447d 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -325,7 +325,7 @@ pub fn reinvest(deps: DepsMut, env: Env, _info: MessageInfo) -> StdResult, + funds: Vec, }, /// Instantiates a new contracts from previously uploaded Wasm code. /// @@ -131,7 +131,7 @@ pub enum WasmMsg { code_id: u64, /// msg is the JSON-encoded InstantiateMsg struct (as raw Binary) msg: Binary, - send: Vec, + funds: Vec, /// A human-readbale label for the contract label: String, }, @@ -166,7 +166,7 @@ pub enum WasmMsg { pub fn wasm_instantiate( code_id: u64, msg: &T, - send: Vec, + funds: Vec, label: String, ) -> StdResult where @@ -177,13 +177,13 @@ where admin: None, code_id, msg: payload, - send, + funds, label, }) } /// Shortcut helper as the construction of WasmMsg::Instantiate can be quite verbose in contract code -pub fn wasm_execute(contract_addr: T, msg: &U, send: Vec) -> StdResult +pub fn wasm_execute(contract_addr: T, msg: &U, funds: Vec) -> StdResult where T: Into, U: Serialize, @@ -192,7 +192,7 @@ where Ok(WasmMsg::Execute { contract_addr: contract_addr.into(), msg: payload, - send, + funds, }) } From 1a326ba08fd033cdc85abbbdf0630f00b13313f7 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 14 Jun 2021 11:33:26 +0200 Subject: [PATCH 053/402] Update ibc_reflect_0.14.wasm --- packages/vm/testdata/ibc_reflect_0.14.wasm | Bin 290920 -> 291184 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/ibc_reflect_0.14.wasm b/packages/vm/testdata/ibc_reflect_0.14.wasm index 6851c111e66bbe2974c377aef2396c48509d06e5..e23d346049cc0a6bae15c72b56e245edb351b688 100644 GIT binary patch delta 61070 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�d$sgj; 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 Date: Thu, 10 Jun 2021 17:43:42 +0200 Subject: [PATCH 054/402] Make `Uint128` inner field private --- CHANGELOG.md | 9 +++++-- packages/std/src/coins.rs | 16 ++++++------ packages/std/src/math/decimal.rs | 36 +++++++++++++-------------- packages/std/src/math/uint128.rs | 4 +-- packages/std/src/results/attribute.rs | 2 +- packages/std/src/traits.rs | 2 +- 6 files changed, 36 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 279cb6677..d3eb0ca9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to ## [Unreleased] +### Removed +- cosmwasm-std: Make `Uint128` inner field private ([#905]) + +[#905]: https://github.com/CosmWasm/cosmwasm/issues/905 + ## [0.14.1] - 2021-06-14 ### Added @@ -19,8 +24,8 @@ and this project adheres to ### Fixed -- cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` so - that internal multiplication cannot cause an unnecessary overflow. ([#920]) +- 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 diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index b13f3fd08..735705d07 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -13,7 +13,7 @@ pub struct Coin { impl Coin { pub fn new>(amount: u128, denom: S) -> Self { Coin { - amount: Uint128(amount), + amount: Uint128::new(amount), denom: denom.into(), } } @@ -90,7 +90,7 @@ mod tests { #[test] fn coin_implements_display() { let a = Coin { - amount: Uint128(123), + amount: Uint128::new(123), denom: "ucosm".to_string(), }; @@ -105,7 +105,7 @@ mod tests { assert_eq!( a, Coin { - amount: Uint128(123), + amount: Uint128::new(123), denom: "ucosm".to_string() } ); @@ -114,7 +114,7 @@ mod tests { assert_eq!( zero, Coin { - amount: Uint128(0), + amount: Uint128::new(0), denom: "ucosm".to_string() } ); @@ -123,7 +123,7 @@ mod tests { assert_eq!( string_denom, Coin { - amount: Uint128(42), + amount: Uint128::new(42), denom: "ucosm".to_string() } ); @@ -135,7 +135,7 @@ mod tests { assert_eq!( a, vec![Coin { - amount: Uint128(123), + amount: Uint128::new(123), denom: "ucosm".to_string() }] ); @@ -144,7 +144,7 @@ mod tests { assert_eq!( zero, vec![Coin { - amount: Uint128(0), + amount: Uint128::new(0), denom: "ucosm".to_string() }] ); @@ -153,7 +153,7 @@ mod tests { assert_eq!( string_denom, vec![Coin { - amount: Uint128(42), + amount: Uint128::new(42), denom: "ucosm".to_string() }] ); diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index f642b747f..b4fe188cc 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -560,19 +560,19 @@ mod tests { // in this test the Decimal is on the right fn uint128_decimal_multiply() { // a*b - let left = Uint128(300); + let left = Uint128::new(300); let right = Decimal::one() + Decimal::percent(50); // 1.5 - assert_eq!(left * right, Uint128(450)); + assert_eq!(left * right, Uint128::new(450)); // a*0 - let left = Uint128(300); + let left = Uint128::new(300); let right = Decimal::zero(); - assert_eq!(left * right, Uint128(0)); + assert_eq!(left * right, Uint128::new(0)); // 0*a - let left = Uint128(0); + let left = Uint128::new(0); let right = Decimal::one() + Decimal::percent(50); // 1.5 - assert_eq!(left * right, Uint128(0)); + assert_eq!(left * right, Uint128::new(0)); } #[test] @@ -580,30 +580,30 @@ mod tests { fn decimal_uint128_multiply() { // a*b let left = Decimal::one() + Decimal::percent(50); // 1.5 - let right = Uint128(300); - assert_eq!(left * right, Uint128(450)); + let right = Uint128::new(300); + assert_eq!(left * right, Uint128::new(450)); // 0*a let left = Decimal::zero(); - let right = Uint128(300); - assert_eq!(left * right, Uint128(0)); + 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(0); - assert_eq!(left * right, Uint128(0)); + let right = Uint128::new(0); + assert_eq!(left * right, Uint128::new(0)); } #[test] fn decimal_uint128_division() { // a/b let left = Decimal::percent(150); // 1.5 - let right = Uint128(3); + let right = Uint128::new(3); assert_eq!(left / right, Decimal::percent(50)); // 0/a let left = Decimal::zero(); - let right = Uint128(300); + let right = Uint128::new(300); assert_eq!(left / right, Decimal::zero()); } @@ -611,7 +611,7 @@ mod tests { #[should_panic(expected = "attempt to divide by zero")] fn decimal_uint128_divide_by_zero() { let left = Decimal::percent(150); // 1.5 - let right = Uint128(0); + let right = Uint128::new(0); let _result = left / right; } @@ -619,12 +619,12 @@ mod tests { fn decimal_uint128_div_assign() { // a/b let mut dec = Decimal::percent(150); // 1.5 - dec /= Uint128(3); + dec /= Uint128::new(3); assert_eq!(dec, Decimal::percent(50)); // 0/a let mut dec = Decimal::zero(); - dec /= Uint128(300); + dec /= Uint128::new(300); assert_eq!(dec, Decimal::zero()); } @@ -633,7 +633,7 @@ mod tests { fn decimal_uint128_div_assign_by_zero() { // a/0 let mut dec = Decimal::percent(50); - dec /= Uint128(0); + dec /= Uint128::new(0); } #[test] diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 1c67b3a27..84cd1b726 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -27,9 +27,7 @@ use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdErro /// assert_eq!(c.u128(), 70); /// ``` #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] -pub struct Uint128( - #[schemars(with = "String")] pub u128, // Simon thinks this should be private, but does not want to worry about breaking code right now -); +pub struct Uint128(#[schemars(with = "String")] u128); impl Uint128 { /// Creates a Uint128(value). diff --git a/packages/std/src/results/attribute.rs b/packages/std/src/results/attribute.rs index 619e12bba..d0f343e5a 100644 --- a/packages/std/src/results/attribute.rs +++ b/packages/std/src/results/attribute.rs @@ -31,7 +31,7 @@ mod tests { assert_eq!(attr("foo", "42"), expeceted); assert_eq!(attr("foo".to_string(), "42"), expeceted); assert_eq!(attr("foo", "42".to_string()), expeceted); - assert_eq!(attr("foo", Uint128(42)), expeceted); + assert_eq!(attr("foo", Uint128::new(42)), expeceted); assert_eq!(attr("foo", 42), expeceted); } } diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index d2b752f97..f6b842a98 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -354,6 +354,6 @@ mod tests { .unwrap() .unwrap(); let balance: BalanceResponse = from_slice(&raw).unwrap(); - assert_eq!(balance.amount.amount, Uint128(5)); + assert_eq!(balance.amount.amount, Uint128::new(5)); } } From df039ddf533b697d50e8ca2d86e6aa242968f5b0 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 17:48:52 +0200 Subject: [PATCH 055/402] Fix contracts after changing Uint128 interface --- contracts/crypto-verify/src/contract.rs | 6 ++-- contracts/crypto-verify/tests/integration.rs | 6 ++-- contracts/staking/src/contract.rs | 38 ++++++++++---------- contracts/staking/tests/integration.rs | 10 +++--- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/contracts/crypto-verify/src/contract.rs b/contracts/crypto-verify/src/contract.rs index 3a37d0281..ef5f86bcc 100644 --- a/contracts/crypto-verify/src/contract.rs +++ b/contracts/crypto-verify/src/contract.rs @@ -425,9 +425,9 @@ mod tests { let chain_id = 4; // Rinkeby, see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids let from = "0x0a65766695a712af41b5cfecaad217b1a11cb22a"; let to = "0xe137f5264b6b528244e1643a2d570b37660b7f14"; - let gas_limit = Uint128(0x226c8); - let gas_price = Uint128(0x3b9aca00); - let value = Uint128(0x53177c); + let gas_limit = Uint128::new(0x226c8); + let gas_price = Uint128::new(0x3b9aca00); + let value = Uint128::new(0x53177c); let data = hex!("536561726368207478207465737420302e36353930383639313733393634333335"); let r = hex!("b9299dab50b3cddcaecd64b29bfbd5cd30fac1a1adea1b359a13c4e5171492a6"); let s = hex!("573059c66d894684488f92e7ce1f91b158ca57b0235485625b576a3b98c480ac"); diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index 41b6c984d..494b5e03d 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -225,9 +225,9 @@ fn verify_ethereum_transaction_works() { let chain_id = 4; // Rinkeby, see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids let from = "0x0a65766695a712af41b5cfecaad217b1a11cb22a"; let to = "0xe137f5264b6b528244e1643a2d570b37660b7f14"; - let gas_limit = Uint128(0x226c8); - let gas_price = Uint128(0x3b9aca00); - let value = Uint128(0x53177c); + let gas_limit = Uint128::new(0x226c8); + let gas_price = Uint128::new(0x3b9aca00); + let value = Uint128::new(0x53177c); let data = hex!("536561726368207478207465737420302e36353930383639313733393634333335"); let r = hex!("b9299dab50b3cddcaecd64b29bfbd5cd30fac1a1adea1b359a13c4e5171492a6"); let s = hex!("573059c66d894684488f92e7ce1f91b158ca57b0235485625b576a3b98c480ac"); diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 44224438a..4fbbc5ac1 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -112,10 +112,10 @@ pub fn transfer( fn get_bonded>(querier: &QuerierWrapper, contract_addr: U) -> StdResult { let bonds = querier.query_all_delegations(contract_addr)?; if bonds.is_empty() { - return Ok(Uint128(0)); + return Ok(Uint128::new(0)); } let denom = bonds[0].amount.denom.as_str(); - bonds.iter().fold(Ok(Uint128(0)), |racc, d| { + bonds.iter().fold(Ok(Uint128::new(0)), |racc, d| { let acc = racc?; if d.amount.denom.as_str() != denom { Err(StdError::generic_err(format!( @@ -213,7 +213,7 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St accounts.update(&sender_raw, |balance| -> StdResult<_> { Ok(balance.unwrap_or_default().checked_sub(amount)?) })?; - if tax > Uint128(0) { + if tax > Uint128::new(0) { // add tax to the owner accounts.update(&owner_raw, |balance: Option| -> StdResult<_> { Ok(balance.unwrap_or_default() + tax) @@ -490,7 +490,7 @@ mod tests { decimals: 9, validator: String::from(DEFAULT_VALIDATOR), exit_tax: Decimal::percent(tax_percent), - min_withdrawal: Uint128(min_withdrawal), + min_withdrawal: Uint128::new(min_withdrawal), } } @@ -515,7 +515,7 @@ mod tests { decimals: 9, validator: String::from("my-validator"), exit_tax: Decimal::percent(2), - min_withdrawal: Uint128(50), + min_withdrawal: Uint128::new(50), }; let info = mock_info(&creator, &[]); @@ -549,7 +549,7 @@ mod tests { decimals: 0, validator: String::from("my-validator"), exit_tax: Decimal::percent(2), - min_withdrawal: Uint128(50), + min_withdrawal: Uint128::new(50), }; let info = mock_info(&creator, &[]); @@ -564,9 +564,9 @@ mod tests { assert_eq!(token.decimals, msg.decimals); // no balance - assert_eq!(get_balance(deps.as_ref(), &creator), Uint128(0)); + assert_eq!(get_balance(deps.as_ref(), &creator), Uint128::new(0)); // no claims - assert_eq!(get_claims(deps.as_ref(), &creator), Uint128(0)); + assert_eq!(get_claims(deps.as_ref(), &creator), Uint128::new(0)); // investment info correct let invest = query_investment(deps.as_ref()).unwrap(); @@ -575,7 +575,7 @@ mod tests { assert_eq!(invest.exit_tax, msg.exit_tax); assert_eq!(invest.min_withdrawal, msg.min_withdrawal); - assert_eq!(invest.token_supply, Uint128(0)); + assert_eq!(invest.token_supply, Uint128::new(0)); assert_eq!(invest.staked_tokens, coin(0, "ustake")); assert_eq!(invest.nominal_value, Decimal::one()); } @@ -611,11 +611,11 @@ mod tests { } // bob got 1000 DRV for 1000 stake at a 1.0 ratio - assert_eq!(get_balance(deps.as_ref(), &bob), Uint128(1000)); + assert_eq!(get_balance(deps.as_ref(), &bob), Uint128::new(1000)); // investment info correct (updated supply) let invest = query_investment(deps.as_ref()).unwrap(); - assert_eq!(invest.token_supply, Uint128(1000)); + assert_eq!(invest.token_supply, Uint128::new(1000)); assert_eq!(invest.staked_tokens, coin(1000, "ustake")); assert_eq!(invest.nominal_value, Decimal::one()); } @@ -655,7 +655,7 @@ mod tests { // we should now see 1000 issues and 1500 bonded (and a price of 1.5) let invest = query_investment(deps.as_ref()).unwrap(); - assert_eq!(invest.token_supply, Uint128(1000)); + assert_eq!(invest.token_supply, Uint128::new(1000)); assert_eq!(invest.staked_tokens, coin(1500, "ustake")); let ratio = Decimal::from_str("1.5").unwrap(); assert_eq!(invest.nominal_value, ratio); @@ -671,10 +671,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(2000)); + assert_eq!(get_balance(deps.as_ref(), &alice), Uint128::new(2000)); let invest = query_investment(deps.as_ref()).unwrap(); - assert_eq!(invest.token_supply, Uint128(3000)); + assert_eq!(invest.token_supply, Uint128::new(3000)); assert_eq!(invest.staked_tokens, coin(4500, "ustake")); assert_eq!(invest.nominal_value, ratio); } @@ -744,7 +744,7 @@ mod tests { // creator now tries to unbond these tokens - this must fail let unbond_msg = ExecuteMsg::Unbond { - amount: Uint128(600), + amount: Uint128::new(600), }; let info = mock_info(&creator, &[]); let res = execute(deps.as_mut(), mock_env(), info, unbond_msg); @@ -759,11 +759,11 @@ mod tests { // 60 are taken and send to the owner // 540 are unbonded in exchange for 540 * 1.5 = 810 native tokens let unbond_msg = ExecuteMsg::Unbond { - amount: Uint128(600), + amount: Uint128::new(600), }; - let owner_cut = Uint128(60); - let bobs_claim = Uint128(810); - let bobs_balance = Uint128(400); + let owner_cut = Uint128::new(60); + let bobs_claim = Uint128::new(810); + let bobs_balance = Uint128::new(400); let info = mock_info(&bob, &[]); let res = execute(deps.as_mut(), mock_env(), info, unbond_msg).unwrap(); assert_eq!(1, res.messages.len()); diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index f908d62e1..102eff94f 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -58,7 +58,7 @@ fn initialization_with_missing_validator() { decimals: 9, validator: String::from("my-validator"), exit_tax: Decimal::percent(2), - min_withdrawal: Uint128(50), + min_withdrawal: Uint128::new(50), }; let info = mock_info(&creator, &[]); @@ -96,7 +96,7 @@ fn proper_initialization() { decimals: 9, validator: String::from("my-validator"), exit_tax: Decimal::percent(2), - min_withdrawal: Uint128(50), + min_withdrawal: Uint128::new(50), }; let info = mock_info(&creator, &[]); @@ -121,7 +121,7 @@ fn proper_initialization() { ) .unwrap(); let bal: BalanceResponse = from_binary(&res).unwrap(); - assert_eq!(bal.balance, Uint128(0)); + assert_eq!(bal.balance, Uint128::new(0)); // no claims let res = query( @@ -133,7 +133,7 @@ fn proper_initialization() { ) .unwrap(); let claim: ClaimsResponse = from_binary(&res).unwrap(); - assert_eq!(claim.claims, Uint128(0)); + assert_eq!(claim.claims, Uint128::new(0)); // investment info correct let res = query(&mut deps, mock_env(), QueryMsg::Investment {}).unwrap(); @@ -143,7 +143,7 @@ fn proper_initialization() { assert_eq!(invest.exit_tax, msg.exit_tax); assert_eq!(invest.min_withdrawal, msg.min_withdrawal); - assert_eq!(invest.token_supply, Uint128(0)); + assert_eq!(invest.token_supply, Uint128::new(0)); assert_eq!(invest.staked_tokens, coin(0, "ustake")); assert_eq!(invest.nominal_value, Decimal::one()); } From 079ac4e3f33b7f6193a0edb618aadc8dd9a9ee13 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 17:30:28 +0200 Subject: [PATCH 056/402] Remove deprecated Context --- CHANGELOG.md | 7 +- packages/std/src/lib.rs | 4 +- packages/std/src/results/context.rs | 113 ---------------------------- packages/std/src/results/mod.rs | 3 - 4 files changed, 7 insertions(+), 120 deletions(-) delete mode 100644 packages/std/src/results/context.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 279cb6677..e85a136c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to ## [Unreleased] +### Removed +- cosmwasm-std: Remove `results::Context` - deprecated in previous release + ## [0.14.1] - 2021-06-14 ### Added @@ -19,8 +22,8 @@ and this project adheres to ### Fixed -- cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` so - that internal multiplication cannot cause an unnecessary overflow. ([#920]) +- 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 diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 64ee45cbb..c331d9d7e 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -55,10 +55,10 @@ pub use crate::results::{ attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubcallResponse, SystemResult, WasmMsg, }; -#[allow(deprecated)] -pub use crate::results::{Context, HandleResponse, InitResponse, MigrateResponse}; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; +#[allow(deprecated)] +pub use crate::results::{HandleResponse, InitResponse, MigrateResponse}; pub use crate::serde::{from_binary, from_slice, to_binary, to_vec}; pub use crate::storage::MemoryStorage; pub use crate::timestamp::Timestamp; diff --git a/packages/std/src/results/context.rs b/packages/std/src/results/context.rs deleted file mode 100644 index e75c9b19c..000000000 --- a/packages/std/src/results/context.rs +++ /dev/null @@ -1,113 +0,0 @@ -#![allow(deprecated)] - -use schemars::JsonSchema; -use std::fmt; - -use crate::Binary; - -use super::{attr, Attribute, CosmosMsg, Empty, Response}; - -#[deprecated( - since = "0.14.0", - note = "Use mutating helpers on Response/InitResponse/HandleResponse/MigrateResponse directly." -)] -#[derive(Clone, Debug, PartialEq)] -pub struct Context -where - T: Clone + fmt::Debug + PartialEq + JsonSchema, -{ - messages: Vec>, - /// The attributes that will be emitted as part of a "wasm" event - attributes: Vec, - data: Option, -} - -impl Default for Context -where - T: Clone + fmt::Debug + PartialEq + JsonSchema, -{ - fn default() -> Self { - Context { - messages: vec![], - attributes: vec![], - data: None, - } - } -} - -impl Context -where - T: Clone + fmt::Debug + PartialEq + JsonSchema, -{ - pub fn new() -> Self { - Self::default() - } - - pub fn add_attribute(&mut self, key: K, value: V) { - self.attributes.push(attr(key, value)); - } - - pub fn add_message>>(&mut self, msg: U) { - self.messages.push(msg.into()); - } - - pub fn set_data>(&mut self, data: U) { - self.data = Some(data.into()); - } -} - -impl From> for Response -where - T: Clone + fmt::Debug + PartialEq + JsonSchema, -{ - fn from(ctx: Context) -> Self { - Response { - /// we do not support submessages here, as it was already deprecated when submessages were added - submessages: vec![], - messages: ctx.messages, - attributes: ctx.attributes, - data: ctx.data, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{coins, BankMsg, Response}; - - #[test] - fn empty_context() { - let ctx = Context::new(); - - let init: Response = ctx.into(); - assert_eq!(init, Response::default()); - } - - #[test] - fn full_context() { - let mut ctx = Context::new(); - - // build it up with the builder commands - ctx.add_attribute("sender", &String::from("john")); - ctx.add_attribute("action", "test"); - ctx.add_message(BankMsg::Send { - to_address: String::from("foo"), - amount: coins(128, "uint"), - }); - ctx.set_data(b"banana"); - - // and this is what is should return - let expected_msgs = vec![CosmosMsg::Bank(BankMsg::Send { - to_address: String::from("foo"), - amount: coins(128, "uint"), - })]; - let expected_attributes = vec![attr("sender", "john"), attr("action", "test")]; - let expected_data = Some(Binary::from(b"banana")); - - let response: Response = ctx.into(); - assert_eq!(&response.messages, &expected_msgs); - assert_eq!(&response.attributes, &expected_attributes); - assert_eq!(&response.data, &expected_data); - } -} diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 9b05120d0..7279710e1 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -1,7 +1,6 @@ //! This module contains the messages that are sent from the contract to the VM as an execution result mod attribute; -mod context; mod contract_result; mod cosmos_msg; mod empty; @@ -11,8 +10,6 @@ mod subcall; mod system_result; pub use attribute::{attr, Attribute}; -#[allow(deprecated)] -pub use context::Context; pub use contract_result::ContractResult; pub use cosmos_msg::{wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, WasmMsg}; #[cfg(feature = "staking")] From a0a22158918169c7d26f3872d5fc1d68aaa36ad2 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 14 Jun 2021 12:15:38 +0200 Subject: [PATCH 057/402] Remove deprecated response types Namely: HandleResponse, InitResponse, MigrateResponse --- CHANGELOG.md | 2 ++ packages/std/src/entry_points.rs | 4 ++-- packages/std/src/lib.rs | 2 -- packages/std/src/results/mod.rs | 9 --------- 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e85a136c7..6d6e51937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to ### Removed - cosmwasm-std: Remove `results::Context` - deprecated in previous release +- cosmwasm-std: Remove `HandleResponse`, `InitResponse`, and `MigrateResponse` - + deprecated in previous release ## [0.14.1] - 2021-06-14 diff --git a/packages/std/src/entry_points.rs b/packages/std/src/entry_points.rs index a04893b3b..3f75b9ee0 100644 --- a/packages/std/src/entry_points.rs +++ b/packages/std/src/entry_points.rs @@ -94,14 +94,14 @@ macro_rules! create_entry_points { /// This macro is very similar to the `create_entry_points` macro, except it also requires the `migrate` method: /// ``` /// # use cosmwasm_std::{ -/// # Storage, Api, Querier, DepsMut, Env, StdError, MigrateResponse, MessageInfo, +/// # Storage, Api, Querier, DepsMut, Env, StdError, Response, MessageInfo, /// # }; /// # type MigrateMsg = (); /// pub fn migrate( /// deps: DepsMut, /// _env: Env, /// msg: MigrateMsg, -/// ) -> Result { +/// ) -> Result { /// # Ok(Default::default()) /// } /// ``` diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index c331d9d7e..0cfa80fdb 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -57,8 +57,6 @@ pub use crate::results::{ }; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; -#[allow(deprecated)] -pub use crate::results::{HandleResponse, InitResponse, MigrateResponse}; pub use crate::serde::{from_binary, from_slice, to_binary, to_vec}; pub use crate::storage::MemoryStorage; pub use crate::timestamp::Timestamp; diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 7279710e1..ac2057bef 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -19,12 +19,3 @@ pub use query::QueryResponse; pub use response::Response; pub use subcall::{Event, Reply, ReplyOn, SubMsg, SubcallResponse}; pub use system_result::SystemResult; - -#[deprecated(since = "0.14.0", note = "Renamed to Response.")] -pub type InitResponse = Response; - -#[deprecated(since = "0.14.0", note = "Renamed to Response.")] -pub type HandleResponse = Response; - -#[deprecated(since = "0.14.0", note = "Renamed to Response.")] -pub type MigrateResponse = Response; From eea6d7a399f65120d76df3e196c3e0ccab6e9112 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 14 Jun 2021 12:29:42 +0200 Subject: [PATCH 058/402] CHANGELOG - formatting Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f3306ece..3506df879 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to ### Removed -- cosmwasm-std: Remove `results::Context` - deprecated in previous release +- cosmwasm-std: Remove `Context` - deprecated in previous release - cosmwasm-std: Remove `HandleResponse`, `InitResponse`, and `MigrateResponse` - deprecated in previous release @@ -30,8 +30,8 @@ and this project adheres to ### Fixed -- cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` - so that internal multiplication cannot cause an unnecessary overflow. ([#920]) +- 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 From 0cc7150437f0c907a7b73ed3b9a90453bc0bfc1f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 10 Jun 2021 13:53:22 +0200 Subject: [PATCH 059/402] Explicit Operator enum cases --- packages/vm/src/middleware/deterministic.rs | 408 +++++++++++++++++++- 1 file changed, 405 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/middleware/deterministic.rs b/packages/vm/src/middleware/deterministic.rs index 888a1f0ea..2a392fc5c 100644 --- a/packages/vm/src/middleware/deterministic.rs +++ b/packages/vm/src/middleware/deterministic.rs @@ -138,14 +138,386 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::I64Extend8S | Operator::I64Extend16S | Operator::I64ExtendI32S - | Operator::I64ExtendI32U => { + | Operator::I64Extend32S + | Operator::I64ExtendI32U + | Operator::RefNull { .. } + | Operator::RefIsNull + | Operator::RefFunc { .. } + | Operator::ReturnCall { .. } + | Operator::ReturnCallIndirect { .. } + | Operator::TypedSelect { .. } + | Operator::TableGet { .. } + | Operator::TableSet { .. } + | Operator::TableGrow { .. } + | Operator::TableSize { .. } => { state.push_operator(operator); Ok(()) } - _ => { + Operator::MemoryAtomicNotify { .. } + | Operator::MemoryAtomicWait32 { .. } + | Operator::MemoryAtomicWait64 { .. } + | Operator::AtomicFence { .. } + | Operator::I32AtomicLoad { .. } + | Operator::I64AtomicLoad { .. } + | Operator::I32AtomicLoad8U { .. } + | Operator::I32AtomicLoad16U { .. } + | Operator::I64AtomicLoad8U { .. } + | Operator::I64AtomicLoad16U { .. } + | Operator::I64AtomicLoad32U { .. } + | Operator::I32AtomicStore { .. } + | Operator::I64AtomicStore { .. } + | Operator::I32AtomicStore8 { .. } + | Operator::I32AtomicStore16 { .. } + | Operator::I64AtomicStore8 { .. } + | Operator::I64AtomicStore16 { .. } + | Operator::I64AtomicStore32 { .. } + | Operator::I32AtomicRmwAdd { .. } + | Operator::I64AtomicRmwAdd { .. } + | Operator::I32AtomicRmw8AddU { .. } + | Operator::I32AtomicRmw16AddU { .. } + | Operator::I64AtomicRmw8AddU { .. } + | Operator::I64AtomicRmw16AddU { .. } + | Operator::I64AtomicRmw32AddU { .. } + | Operator::I32AtomicRmwSub { .. } + | Operator::I64AtomicRmwSub { .. } + | Operator::I32AtomicRmw8SubU { .. } + | Operator::I32AtomicRmw16SubU { .. } + | Operator::I64AtomicRmw8SubU { .. } + | Operator::I64AtomicRmw16SubU { .. } + | Operator::I64AtomicRmw32SubU { .. } + | Operator::I32AtomicRmwAnd { .. } + | Operator::I64AtomicRmwAnd { .. } + | Operator::I32AtomicRmw8AndU { .. } + | Operator::I32AtomicRmw16AndU { .. } + | Operator::I64AtomicRmw8AndU { .. } + | Operator::I64AtomicRmw16AndU { .. } + | Operator::I64AtomicRmw32AndU { .. } + | Operator::I32AtomicRmwOr { .. } + | Operator::I64AtomicRmwOr { .. } + | Operator::I32AtomicRmw8OrU { .. } + | Operator::I32AtomicRmw16OrU { .. } + | Operator::I64AtomicRmw8OrU { .. } + | Operator::I64AtomicRmw16OrU { .. } + | Operator::I64AtomicRmw32OrU { .. } + | Operator::I32AtomicRmwXor { .. } + | Operator::I64AtomicRmwXor { .. } + | Operator::I32AtomicRmw8XorU { .. } + | Operator::I32AtomicRmw16XorU { .. } + | Operator::I64AtomicRmw8XorU { .. } + | Operator::I64AtomicRmw16XorU { .. } + | Operator::I64AtomicRmw32XorU { .. } + | Operator::I32AtomicRmwXchg { .. } + | Operator::I64AtomicRmwXchg { .. } + | Operator::I32AtomicRmw8XchgU { .. } + | Operator::I32AtomicRmw16XchgU { .. } + | Operator::I64AtomicRmw8XchgU { .. } + | Operator::I64AtomicRmw16XchgU { .. } + | Operator::I64AtomicRmw32XchgU { .. } + | Operator::I32AtomicRmwCmpxchg { .. } + | Operator::I64AtomicRmwCmpxchg { .. } + | Operator::I32AtomicRmw8CmpxchgU { .. } + | Operator::I32AtomicRmw16CmpxchgU { .. } + | Operator::I64AtomicRmw8CmpxchgU { .. } + | Operator::I64AtomicRmw16CmpxchgU { .. } + | Operator::I64AtomicRmw32CmpxchgU { .. } => { + let msg = format!( + "Threads operator detected: {:?}. The Wasm Threads extension is not supported.", + operator + ); + Err(MiddlewareError::new("Deterministic", msg)) + } + Operator::V128Load { .. } + | Operator::V128Store { .. } + | Operator::V128Const { .. } + | Operator::I8x16Splat + | Operator::I8x16ExtractLaneS { .. } + | Operator::I8x16ExtractLaneU { .. } + | Operator::I8x16ReplaceLane { .. } + | Operator::I16x8Splat + | Operator::I16x8ExtractLaneS { .. } + | Operator::I16x8ExtractLaneU { .. } + | Operator::I16x8ReplaceLane { .. } + | Operator::I32x4Splat + | Operator::I32x4ExtractLane { .. } + | Operator::I32x4ReplaceLane { .. } + | Operator::I64x2Splat + | Operator::I64x2ExtractLane { .. } + | Operator::I64x2ReplaceLane { .. } + | Operator::I8x16Eq + | Operator::I8x16Ne + | Operator::I8x16LtS + | Operator::I8x16LtU + | Operator::I8x16GtS + | Operator::I8x16GtU + | Operator::I8x16LeS + | Operator::I8x16LeU + | Operator::I8x16GeS + | Operator::I8x16GeU + | Operator::I16x8Eq + | Operator::I16x8Ne + | Operator::I16x8LtS + | Operator::I16x8LtU + | Operator::I16x8GtS + | Operator::I16x8GtU + | Operator::I16x8LeS + | Operator::I16x8LeU + | Operator::I16x8GeS + | Operator::I16x8GeU + | Operator::I32x4Eq + | Operator::I32x4Ne + | Operator::I32x4LtS + | Operator::I32x4LtU + | Operator::I32x4GtS + | Operator::I32x4GtU + | Operator::I32x4LeS + | Operator::I32x4LeU + | Operator::I32x4GeS + | Operator::I32x4GeU + | Operator::V128Not + | Operator::V128And + | Operator::V128AndNot + | Operator::V128Or + | Operator::V128Xor + | Operator::V128Bitselect + | Operator::I8x16Abs + | Operator::I8x16Neg + | Operator::I8x16AnyTrue + | Operator::I8x16AllTrue + | Operator::I8x16Bitmask + | Operator::I8x16Shl + | Operator::I8x16ShrS + | Operator::I8x16ShrU + | Operator::I8x16Add + | Operator::I8x16AddSatS + | Operator::I8x16AddSatU + | Operator::I8x16Sub + | Operator::I8x16SubSatS + | Operator::I8x16SubSatU + | Operator::I8x16MinS + | Operator::I8x16MinU + | Operator::I8x16MaxS + | Operator::I8x16MaxU + | Operator::I16x8Abs + | Operator::I16x8Neg + | Operator::I16x8AnyTrue + | Operator::I16x8AllTrue + | Operator::I16x8Bitmask + | Operator::I16x8Shl + | Operator::I16x8ShrS + | Operator::I16x8ShrU + | Operator::I16x8Add + | Operator::I16x8AddSatS + | Operator::I16x8AddSatU + | Operator::I16x8Sub + | Operator::I16x8SubSatS + | Operator::I16x8SubSatU + | Operator::I16x8Mul + | Operator::I16x8MinS + | Operator::I16x8MinU + | Operator::I16x8MaxS + | Operator::I16x8MaxU + | Operator::I32x4Abs + | Operator::I32x4Neg + | Operator::I32x4AnyTrue + | Operator::I32x4AllTrue + | Operator::I32x4Bitmask + | Operator::I32x4Shl + | Operator::I32x4ShrS + | Operator::I32x4ShrU + | Operator::I32x4Add + | Operator::I32x4Sub + | Operator::I32x4Mul + | Operator::I32x4MinS + | Operator::I32x4MinU + | Operator::I32x4MaxS + | Operator::I32x4MaxU + | Operator::I32x4DotI16x8S + | Operator::I64x2Neg + | Operator::I64x2Shl + | Operator::I64x2ShrS + | Operator::I64x2ShrU + | Operator::I64x2Add + | Operator::I64x2Sub + | Operator::I64x2Mul + | Operator::I8x16Swizzle + | Operator::I8x16Shuffle { .. } + | Operator::V128Load8Splat { .. } + | Operator::V128Load16Splat { .. } + | Operator::V128Load32Splat { .. } + | Operator::V128Load32Zero { .. } + | Operator::V128Load64Splat { .. } + | Operator::V128Load64Zero { .. } + | Operator::I8x16NarrowI16x8S + | Operator::I8x16NarrowI16x8U + | Operator::I16x8NarrowI32x4S + | Operator::I16x8NarrowI32x4U + | Operator::I16x8WidenLowI8x16S + | Operator::I16x8WidenHighI8x16S + | Operator::I16x8WidenLowI8x16U + | Operator::I16x8WidenHighI8x16U + | Operator::I32x4WidenLowI16x8S + | Operator::I32x4WidenHighI16x8S + | Operator::I32x4WidenLowI16x8U + | Operator::I32x4WidenHighI16x8U + | Operator::V128Load8x8S { .. } + | Operator::V128Load8x8U { .. } + | Operator::V128Load16x4S { .. } + | Operator::V128Load16x4U { .. } + | Operator::V128Load32x2S { .. } + | Operator::V128Load32x2U { .. } + | Operator::I8x16RoundingAverageU + | Operator::I16x8RoundingAverageU => { + let msg = format!( + "SIMD operator detected: {:?}. The Wasm SIMD extension is not supported.", + operator + ); + Err(MiddlewareError::new("Deterministic", msg)) + } + Operator::F32Load { .. } + | Operator::F64Load { .. } + | Operator::F32Store { .. } + | Operator::F64Store { .. } + | Operator::F32Const { .. } + | Operator::F64Const { .. } + | Operator::F32Eq + | Operator::F32Ne + | Operator::F32Lt + | Operator::F32Gt + | Operator::F32Le + | Operator::F32Ge + | Operator::F64Eq + | Operator::F64Ne + | Operator::F64Lt + | Operator::F64Gt + | Operator::F64Le + | Operator::F64Ge + | Operator::F32Abs + | Operator::F32Neg + | Operator::F32Ceil + | Operator::F32Floor + | Operator::F32Trunc + | Operator::F32Nearest + | Operator::F32Sqrt + | Operator::F32Add + | Operator::F32Sub + | Operator::F32Mul + | Operator::F32Div + | Operator::F32Min + | Operator::F32Max + | Operator::F32Copysign + | Operator::F64Abs + | Operator::F64Neg + | Operator::F64Ceil + | Operator::F64Floor + | Operator::F64Trunc + | Operator::F64Nearest + | Operator::F64Sqrt + | Operator::F64Add + | Operator::F64Sub + | Operator::F64Mul + | Operator::F64Div + | Operator::F64Min + | Operator::F64Max + | Operator::F64Copysign + | Operator::I32TruncF32S + | Operator::I32TruncF32U + | Operator::I32TruncF64S + | Operator::I32TruncF64U + | Operator::I64TruncF32S + | Operator::I64TruncF32U + | Operator::I64TruncF64S + | Operator::I64TruncF64U + | Operator::F32ConvertI32S + | Operator::F32ConvertI32U + | Operator::F32ConvertI64S + | Operator::F32ConvertI64U + | Operator::F32DemoteF64 + | Operator::F64ConvertI32S + | Operator::F64ConvertI32U + | Operator::F64ConvertI64S + | Operator::F64ConvertI64U + | Operator::F64PromoteF32 + | Operator::I32ReinterpretF32 + | Operator::I64ReinterpretF64 + | Operator::F32ReinterpretI32 + | Operator::F64ReinterpretI64 + | Operator::I32TruncSatF32S + | Operator::I32TruncSatF32U + | Operator::I32TruncSatF64S + | Operator::I32TruncSatF64U + | Operator::I64TruncSatF32S + | Operator::I64TruncSatF32U + | Operator::I64TruncSatF64S + | Operator::I64TruncSatF64U + | Operator::F32x4Splat + | Operator::F32x4ExtractLane { .. } + | Operator::F32x4ReplaceLane { .. } + | Operator::F64x2Splat + | Operator::F64x2ExtractLane { .. } + | Operator::F64x2ReplaceLane { .. } + | Operator::F32x4Eq + | Operator::F32x4Ne + | Operator::F32x4Lt + | Operator::F32x4Gt + | Operator::F32x4Le + | Operator::F32x4Ge + | Operator::F64x2Eq + | Operator::F64x2Ne + | Operator::F64x2Lt + | Operator::F64x2Gt + | Operator::F64x2Le + | Operator::F64x2Ge + | Operator::F32x4Ceil + | Operator::F32x4Floor + | Operator::F32x4Trunc + | Operator::F32x4Nearest + | Operator::F64x2Ceil + | Operator::F64x2Floor + | Operator::F64x2Trunc + | Operator::F64x2Nearest + | Operator::F32x4Abs + | Operator::F32x4Neg + | Operator::F32x4Sqrt + | Operator::F32x4Add + | Operator::F32x4Sub + | Operator::F32x4Mul + | Operator::F32x4Div + | Operator::F32x4Min + | Operator::F32x4Max + | Operator::F32x4PMin + | Operator::F32x4PMax + | Operator::F64x2Abs + | Operator::F64x2Neg + | Operator::F64x2Sqrt + | Operator::F64x2Add + | Operator::F64x2Sub + | Operator::F64x2Mul + | Operator::F64x2Div + | Operator::F64x2Min + | Operator::F64x2Max + | Operator::F64x2PMin + | Operator::F64x2PMax + | Operator::I32x4TruncSatF32x4S + | Operator::I32x4TruncSatF32x4U + | Operator::F32x4ConvertI32x4S + | Operator::F32x4ConvertI32x4U => { let msg = format!("Non-deterministic operator detected: {:?}", operator); Err(MiddlewareError::new("Deterministic", msg)) } + Operator::MemoryInit { .. } + | Operator::DataDrop { .. } + | Operator::MemoryCopy { .. } + | Operator::MemoryFill { .. } + | Operator::TableInit { .. } + | Operator::ElemDrop { .. } + | Operator::TableCopy { .. } + | Operator::TableFill { .. } => { + let msg = format!( + "Bulk memory operation detected: {:?}. Bulk memory operations are not supported.", + operator + ); + Err(MiddlewareError::new("Deterministic", msg)) + } } } } @@ -196,6 +568,36 @@ mod tests { compiler_config.push_middleware(deterministic); let store = Store::new(&JIT::new(compiler_config).engine()); let result = Module::new(&store, &wasm); - assert!(result.is_err()); + assert!(result + .unwrap_err() + .to_string() + .contains("Non-deterministic")); + } + + #[test] + fn bulk_operations_not_supported() { + let wasm = wat::parse_str( + r#" + (module + (memory (export "memory") 1) + (func (param $dst i32) (param $src i32) (param $size i32) (result i32) + local.get $dst + local.get $src + local.get $size + memory.copy + local.get $dst)) + "#, + ) + .unwrap(); + + let deterministic = Arc::new(Deterministic::new()); + let mut compiler_config = Cranelift::default(); + compiler_config.push_middleware(deterministic); + let store = Store::new(&JIT::new(compiler_config).engine()); + let result = Module::new(&store, &wasm); + assert!(result + .unwrap_err() + .to_string() + .contains("Bulk memory operation")); } } From b75e4f2a9e97dd145fa7f8aeaacab414dd5dff54 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 14 Jun 2021 13:40:43 +0200 Subject: [PATCH 060/402] Format CHANGELOG --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb083640a..367cfdd7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,8 @@ and this project adheres to ### Changed -- cosmwasm-std: Rename the `send` function parameter to `funds` in `WasmMsg` - for consistency with the wasmd message types. +- cosmwasm-std: Rename the `send` function parameter to `funds` in `WasmMsg` for + consistency with the wasmd message types. ## [0.14.1] - 2021-06-14 @@ -33,8 +33,8 @@ and this project adheres to ### Fixed -- cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` - so that internal multiplication cannot cause an unnecessary overflow. ([#920]) +- 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 From 1467bf2101d7fe6e4d2db282fbf364fe4895578b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 14 Jun 2021 14:48:52 +0200 Subject: [PATCH 061/402] Pull out read_limits --- packages/vm/src/calls.rs | 102 +++++++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 42 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 2199f5d95..dccc56623 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -15,36 +15,44 @@ use crate::errors::{VmError, VmResult}; use crate::instance::Instance; use crate::serde::{from_slice, to_vec}; -/// Max length (in bytes) of the result data from an instantiate call. -const RESULT_LIMIT_INSTANTIATE: usize = 100_000; -/// Max length (in bytes) of the result data from an execute call. -const RESULT_LIMIT_EXECUTE: usize = 100_000; -/// Max length (in bytes) of the result data from a migrate call. -const RESULT_LIMIT_MIGRATE: usize = 100_000; -/// Max length (in bytes) of the result data from a sudo call. -const RESULT_LIMIT_SUDO: usize = 100_000; -/// Max length (in bytes) of the result data from a reply call. -const RESULT_LIMIT_REPLY: usize = 100_000; -/// Max length (in bytes) of the result data from a query call. -const RESULT_LIMIT_QUERY: usize = 100_000; -/// Max length (in bytes) of the result data from a ibc_channel_open call. -#[cfg(feature = "stargate")] -const RESULT_LIMIT_IBC_CHANNEL_OPEN: usize = 100_000; -/// Max length (in bytes) of the result data from a ibc_channel_connect call. -#[cfg(feature = "stargate")] -const RESULT_LIMIT_IBC_CHANNEL_CONNECT: usize = 100_000; -/// Max length (in bytes) of the result data from a ibc_channel_close call. -#[cfg(feature = "stargate")] -const RESULT_LIMIT_IBC_CHANNEL_CLOSE: usize = 100_000; -/// Max length (in bytes) of the result data from a ibc_packet_receive call. -#[cfg(feature = "stargate")] -const RESULT_LIMIT_IBC_PACKET_RECEIVE: usize = 100_000; -/// Max length (in bytes) of the result data from a ibc_packet_ack call. -#[cfg(feature = "stargate")] -const RESULT_LIMIT_IBC_PACKET_ACK: usize = 100_000; -/// Max length (in bytes) of the result data from a ibc_packet_timeout call. -#[cfg(feature = "stargate")] -const RESULT_LIMIT_IBC_PACKET_TIMEOUT: usize = 100_000; +/// The limits in here protect the host from allocating an unreasonable amount of memory +/// and copying an unreasonable amount of data. +/// +/// A JSON deserializer would want to set the limit to a much smaller value because +/// deserializing JSON is more expensive. As a consequence, any sane contract should hit +/// the deserializer limit before the read limit. +mod read_limits { + /// Max length (in bytes) of the result data from an instantiate call. + pub const RESULT_INSTANTIATE: usize = 100_000; + /// Max length (in bytes) of the result data from an execute call. + pub const RESULT_EXECUTE: usize = 100_000; + /// Max length (in bytes) of the result data from a migrate call. + pub const RESULT_MIGRATE: usize = 100_000; + /// Max length (in bytes) of the result data from a sudo call. + pub const RESULT_SUDO: usize = 100_000; + /// Max length (in bytes) of the result data from a reply call. + pub const RESULT_REPLY: usize = 100_000; + /// Max length (in bytes) of the result data from a query call. + pub const RESULT_QUERY: usize = 100_000; + /// Max length (in bytes) of the result data from a ibc_channel_open call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_CHANNEL_OPEN: usize = 100_000; + /// Max length (in bytes) of the result data from a ibc_channel_connect call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_CHANNEL_CONNECT: usize = 100_000; + /// Max length (in bytes) of the result data from a ibc_channel_close call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_CHANNEL_CLOSE: usize = 100_000; + /// Max length (in bytes) of the result data from a ibc_packet_receive call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_PACKET_RECEIVE: usize = 100_000; + /// Max length (in bytes) of the result data from a ibc_packet_ack call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_PACKET_ACK: usize = 100_000; + /// Max length (in bytes) of the result data from a ibc_packet_timeout call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_PACKET_TIMEOUT: usize = 100_000; +} pub fn call_instantiate( instance: &mut Instance, @@ -290,7 +298,7 @@ where instance, "instantiate", &[env, info, msg], - RESULT_LIMIT_INSTANTIATE, + read_limits::RESULT_INSTANTIATE, ) } @@ -308,7 +316,12 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "execute", &[env, info, msg], RESULT_LIMIT_EXECUTE) + call_raw( + instance, + "execute", + &[env, info, msg], + read_limits::RESULT_EXECUTE, + ) } /// Calls Wasm export "migrate" and returns raw data from the contract. @@ -324,7 +337,12 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "migrate", &[env, msg], RESULT_LIMIT_MIGRATE) + call_raw( + instance, + "migrate", + &[env, msg], + read_limits::RESULT_MIGRATE, + ) } /// Calls Wasm export "sudo" and returns raw data from the contract. @@ -340,7 +358,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "sudo", &[env, msg], RESULT_LIMIT_SUDO) + call_raw(instance, "sudo", &[env, msg], read_limits::RESULT_SUDO) } /// Calls Wasm export "reply" and returns raw data from the contract. @@ -356,7 +374,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(false); - call_raw(instance, "reply", &[env, msg], RESULT_LIMIT_REPLY) + call_raw(instance, "reply", &[env, msg], read_limits::RESULT_REPLY) } /// Calls Wasm export "query" and returns raw data from the contract. @@ -372,7 +390,7 @@ where Q: Querier + 'static, { instance.set_storage_readonly(true); - call_raw(instance, "query", &[env, msg], RESULT_LIMIT_QUERY) + call_raw(instance, "query", &[env, msg], read_limits::RESULT_QUERY) } #[cfg(feature = "stargate")] @@ -391,7 +409,7 @@ where instance, "ibc_channel_open", &[env, channel], - RESULT_LIMIT_IBC_CHANNEL_OPEN, + read_limits::RESULT_IBC_CHANNEL_OPEN, ) } @@ -411,7 +429,7 @@ where instance, "ibc_channel_connect", &[env, channel], - RESULT_LIMIT_IBC_CHANNEL_CONNECT, + read_limits::RESULT_IBC_CHANNEL_CONNECT, ) } @@ -431,7 +449,7 @@ where instance, "ibc_channel_close", &[env, channel], - RESULT_LIMIT_IBC_CHANNEL_CLOSE, + read_limits::RESULT_IBC_CHANNEL_CLOSE, ) } @@ -451,7 +469,7 @@ where instance, "ibc_packet_receive", &[env, packet], - RESULT_LIMIT_IBC_PACKET_RECEIVE, + read_limits::RESULT_IBC_PACKET_RECEIVE, ) } @@ -471,7 +489,7 @@ where instance, "ibc_packet_ack", &[env, ack], - RESULT_LIMIT_IBC_PACKET_ACK, + read_limits::RESULT_IBC_PACKET_ACK, ) } @@ -491,7 +509,7 @@ where instance, "ibc_packet_timeout", &[env, packet], - RESULT_LIMIT_IBC_PACKET_TIMEOUT, + read_limits::RESULT_IBC_PACKET_TIMEOUT, ) } From 490b494c938dd75b86e025ee9b57f713d7f65c41 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 14 Jun 2021 14:56:44 +0200 Subject: [PATCH 062/402] Increase read limit of contract execution results --- CHANGELOG.md | 3 +++ packages/vm/src/calls.rs | 26 ++++++++++++++------------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 367cfdd7d..83abae122 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,9 @@ and this project adheres to - 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. ## [0.14.1] - 2021-06-14 diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index dccc56623..567151daa 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -22,36 +22,38 @@ use crate::serde::{from_slice, to_vec}; /// deserializing JSON is more expensive. As a consequence, any sane contract should hit /// the deserializer limit before the read limit. mod read_limits { + /// A mibi (mega binary) + const MI: usize = 1024 * 1024; /// Max length (in bytes) of the result data from an instantiate call. - pub const RESULT_INSTANTIATE: usize = 100_000; + pub const RESULT_INSTANTIATE: usize = 64 * MI; /// Max length (in bytes) of the result data from an execute call. - pub const RESULT_EXECUTE: usize = 100_000; + pub const RESULT_EXECUTE: usize = 64 * MI; /// Max length (in bytes) of the result data from a migrate call. - pub const RESULT_MIGRATE: usize = 100_000; + pub const RESULT_MIGRATE: usize = 64 * MI; /// Max length (in bytes) of the result data from a sudo call. - pub const RESULT_SUDO: usize = 100_000; + pub const RESULT_SUDO: usize = 64 * MI; /// Max length (in bytes) of the result data from a reply call. - pub const RESULT_REPLY: usize = 100_000; + pub const RESULT_REPLY: usize = 64 * MI; /// Max length (in bytes) of the result data from a query call. - pub const RESULT_QUERY: usize = 100_000; + pub const RESULT_QUERY: usize = 64 * MI; /// Max length (in bytes) of the result data from a ibc_channel_open call. #[cfg(feature = "stargate")] - pub const RESULT_IBC_CHANNEL_OPEN: usize = 100_000; + pub const RESULT_IBC_CHANNEL_OPEN: usize = 64 * MI; /// Max length (in bytes) of the result data from a ibc_channel_connect call. #[cfg(feature = "stargate")] - pub const RESULT_IBC_CHANNEL_CONNECT: usize = 100_000; + pub const RESULT_IBC_CHANNEL_CONNECT: usize = 64 * MI; /// Max length (in bytes) of the result data from a ibc_channel_close call. #[cfg(feature = "stargate")] - pub const RESULT_IBC_CHANNEL_CLOSE: usize = 100_000; + pub const RESULT_IBC_CHANNEL_CLOSE: usize = 64 * MI; /// Max length (in bytes) of the result data from a ibc_packet_receive call. #[cfg(feature = "stargate")] - pub const RESULT_IBC_PACKET_RECEIVE: usize = 100_000; + pub const RESULT_IBC_PACKET_RECEIVE: usize = 64 * MI; /// Max length (in bytes) of the result data from a ibc_packet_ack call. #[cfg(feature = "stargate")] - pub const RESULT_IBC_PACKET_ACK: usize = 100_000; + pub const RESULT_IBC_PACKET_ACK: usize = 64 * MI; /// Max length (in bytes) of the result data from a ibc_packet_timeout call. #[cfg(feature = "stargate")] - pub const RESULT_IBC_PACKET_TIMEOUT: usize = 100_000; + pub const RESULT_IBC_PACKET_TIMEOUT: usize = 64 * MI; } pub fn call_instantiate( From 41b0c554d355cd6e0ddf19ea21f457c0e4e4c55c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 14 Jun 2021 15:02:46 +0200 Subject: [PATCH 063/402] Add some basic serde tests --- packages/vm/src/serde.rs | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/packages/vm/src/serde.rs b/packages/vm/src/serde.rs index 8e1640028..30ddd9326 100644 --- a/packages/vm/src/serde.rs +++ b/packages/vm/src/serde.rs @@ -20,3 +20,84 @@ where { serde_json::to_vec(data).map_err(|e| VmError::serialize_err(type_name::(), e)) } + +#[cfg(test)] +mod tests { + use super::*; + use serde::Deserialize; + + #[derive(Serialize, Deserialize, Debug, PartialEq)] + #[serde(rename_all = "snake_case")] + enum SomeMsg { + Refund {}, + ReleaseAll { + image: String, + amount: u32, + time: u64, + karma: i32, + }, + Cowsay { + text: String, + }, + } + + #[test] + fn from_slice_works() { + let deserialized: SomeMsg = from_slice(br#"{"refund":{}}"#).unwrap(); + assert_eq!(deserialized, SomeMsg::Refund {}); + + let deserialized: SomeMsg = from_slice( + 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 + } + ); + } + + #[test] + fn from_slice_works_for_special_chars() { + let deserialized: SomeMsg = + from_slice(br#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#).unwrap(); + assert_eq!( + deserialized, + SomeMsg::Cowsay { + text: "foo\"bar\\\"bla".to_string(), + } + ); + } + + #[test] + fn to_vec_works() { + let msg = SomeMsg::Refund {}; + let serialized = to_vec(&msg).unwrap(); + assert_eq!(serialized, br#"{"refund":{}}"#); + + let msg = SomeMsg::ReleaseAll { + image: "foo".to_string(), + amount: 42, + time: 9007199254740999, // Number.MAX_SAFE_INTEGER + 7 + karma: -17, + }; + let serialized = String::from_utf8(to_vec(&msg).unwrap()).unwrap(); + assert_eq!( + serialized, + r#"{"release_all":{"image":"foo","amount":42,"time":9007199254740999,"karma":-17}}"# + ); + } + + #[test] + fn to_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(); + assert_eq!(serialized, r#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#); + } +} From 8e4e069ccb25f7dc9d979f77a60fcb266a8d579d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 14 Jun 2021 15:37:35 +0200 Subject: [PATCH 064/402] Create deserialization limit --- CHANGELOG.md | 4 ++ packages/vm/src/calls.rs | 70 +++++++++++++++++++++++++----- packages/vm/src/errors/vm_error.rs | 17 ++++++++ packages/vm/src/serde.rs | 34 +++++++++++++-- 4 files changed, 109 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83abae122..c85c13f0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,10 @@ and this project adheres to - 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. ## [0.14.1] - 2021-06-14 diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 567151daa..a875ca5cd 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -56,6 +56,45 @@ mod read_limits { pub const RESULT_IBC_PACKET_TIMEOUT: usize = 64 * MI; } +/// The limits for the JSON deserialization. +/// +/// Those limits are not used when the Rust JSON deserializer is bypassed by using the +/// public `call_*_raw` functions directly. +mod deserialization_limits { + /// A kibi (kilo binary) + const KI: usize = 1024; + /// Max length (in bytes) of the result data from an instantiate call. + pub const RESULT_INSTANTIATE: usize = 256 * KI; + /// Max length (in bytes) of the result data from an execute call. + pub const RESULT_EXECUTE: usize = 256 * KI; + /// Max length (in bytes) of the result data from a migrate call. + pub const RESULT_MIGRATE: usize = 256 * KI; + /// Max length (in bytes) of the result data from a sudo call. + pub const RESULT_SUDO: usize = 256 * KI; + /// Max length (in bytes) of the result data from a reply call. + pub const RESULT_REPLY: usize = 256 * KI; + /// Max length (in bytes) of the result data from a query call. + pub const RESULT_QUERY: usize = 256 * KI; + /// Max length (in bytes) of the result data from a ibc_channel_open call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_CHANNEL_OPEN: usize = 256 * KI; + /// Max length (in bytes) of the result data from a ibc_channel_connect call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_CHANNEL_CONNECT: usize = 256 * KI; + /// Max length (in bytes) of the result data from a ibc_channel_close call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_CHANNEL_CLOSE: usize = 256 * KI; + /// Max length (in bytes) of the result data from a ibc_packet_receive call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_PACKET_RECEIVE: usize = 256 * KI; + /// Max length (in bytes) of the result data from a ibc_packet_ack call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_PACKET_ACK: usize = 256 * KI; + /// Max length (in bytes) of the result data from a ibc_packet_timeout call. + #[cfg(feature = "stargate")] + pub const RESULT_IBC_PACKET_TIMEOUT: usize = 256 * KI; +} + pub fn call_instantiate( instance: &mut Instance, env: &Env, @@ -71,7 +110,8 @@ where let env = to_vec(env)?; let info = to_vec(info)?; let data = call_instantiate_raw(instance, &env, &info, msg)?; - let result: ContractResult> = from_slice(&data)?; + let result: ContractResult> = + from_slice(&data, deserialization_limits::RESULT_INSTANTIATE)?; Ok(result) } @@ -90,7 +130,8 @@ where let env = to_vec(env)?; let info = to_vec(info)?; let data = call_execute_raw(instance, &env, &info, msg)?; - let result: ContractResult> = from_slice(&data)?; + let result: ContractResult> = + from_slice(&data, deserialization_limits::RESULT_EXECUTE)?; Ok(result) } @@ -107,7 +148,8 @@ where { let env = to_vec(env)?; let data = call_migrate_raw(instance, &env, msg)?; - let result: ContractResult> = from_slice(&data)?; + let result: ContractResult> = + from_slice(&data, deserialization_limits::RESULT_MIGRATE)?; Ok(result) } @@ -124,7 +166,8 @@ where { let env = to_vec(env)?; let data = call_sudo_raw(instance, &env, msg)?; - let result: ContractResult> = from_slice(&data)?; + let result: ContractResult> = + from_slice(&data, deserialization_limits::RESULT_SUDO)?; Ok(result) } @@ -142,7 +185,8 @@ where let env = to_vec(env)?; let msg = to_vec(msg)?; let data = call_reply_raw(instance, &env, &msg)?; - let result: ContractResult> = from_slice(&data)?; + let result: ContractResult> = + from_slice(&data, deserialization_limits::RESULT_REPLY)?; Ok(result) } @@ -158,7 +202,8 @@ where { let env = to_vec(env)?; let data = call_query_raw(instance, &env, msg)?; - let result: ContractResult = from_slice(&data)?; + let result: ContractResult = + 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| { @@ -183,7 +228,8 @@ where let env = to_vec(env)?; let channel = to_vec(channel)?; let data = call_ibc_channel_open_raw(instance, &env, &channel)?; - let result: ContractResult<()> = from_slice(&data)?; + let result: ContractResult<()> = + from_slice(&data, deserialization_limits::RESULT_IBC_CHANNEL_OPEN)?; Ok(result) } @@ -202,7 +248,7 @@ where let env = to_vec(env)?; let channel = to_vec(channel)?; let data = call_ibc_channel_connect_raw(instance, &env, &channel)?; - let result = from_slice(&data)?; + let result = from_slice(&data, deserialization_limits::RESULT_IBC_CHANNEL_CONNECT)?; Ok(result) } @@ -221,7 +267,7 @@ where let env = to_vec(env)?; let channel = to_vec(channel)?; let data = call_ibc_channel_close_raw(instance, &env, &channel)?; - let result = from_slice(&data)?; + let result = from_slice(&data, deserialization_limits::RESULT_IBC_CHANNEL_CLOSE)?; Ok(result) } @@ -240,7 +286,7 @@ where let env = to_vec(env)?; let packet = to_vec(packet)?; let data = call_ibc_packet_receive_raw(instance, &env, &packet)?; - let result = from_slice(&data)?; + let result = from_slice(&data, deserialization_limits::RESULT_IBC_PACKET_RECEIVE)?; Ok(result) } @@ -259,7 +305,7 @@ where let env = to_vec(env)?; let ack = to_vec(ack)?; let data = call_ibc_packet_ack_raw(instance, &env, &ack)?; - let result = from_slice(&data)?; + let result = from_slice(&data, deserialization_limits::RESULT_IBC_PACKET_ACK)?; Ok(result) } @@ -278,7 +324,7 @@ where let env = to_vec(env)?; let packet = to_vec(packet)?; let data = call_ibc_packet_timeout_raw(instance, &env, &packet)?; - let result = from_slice(&data)?; + let result = from_slice(&data, deserialization_limits::RESULT_IBC_PACKET_TIMEOUT)?; Ok(result) } diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index d1d0bea81..b9bb506c7 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -81,6 +81,14 @@ pub enum VmError { #[cfg(feature = "backtraces")] backtrace: Backtrace, }, + #[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, + }, #[error("Error serializing type {source_type}: {msg}")] SerializeErr { /// the source type that was attempted @@ -219,6 +227,15 @@ impl VmError { } } + pub(crate) fn deserialization_limit_exceeded(length: usize, max_length: usize) -> Self { + VmError::DeserializationLimitExceeded { + length, + max_length, + #[cfg(feature = "backtraces")] + backtrace: Backtrace::capture(), + } + } + pub(crate) fn serialize_err, M: Display>(source: S, msg: M) -> Self { VmError::SerializeErr { source_type: source.into(), diff --git a/packages/vm/src/serde.rs b/packages/vm/src/serde.rs index 30ddd9326..c884dd1b8 100644 --- a/packages/vm/src/serde.rs +++ b/packages/vm/src/serde.rs @@ -7,10 +7,20 @@ use std::any::type_name; use crate::errors::{VmError, VmResult}; -pub fn from_slice<'a, T>(value: &'a [u8]) -> VmResult +/// Deserializes JSON data into a document of type `T`. +/// +/// The deserialization limit ensure it is not possible to slow down the execution by +/// providing overly large JSON documents. +pub fn from_slice<'a, T>(value: &'a [u8], deserialization_limit: usize) -> VmResult where T: Deserialize<'a>, { + if value.len() > deserialization_limit { + return Err(VmError::deserialization_limit_exceeded( + value.len(), + deserialization_limit, + )); + } serde_json::from_slice(value).map_err(|e| VmError::parse_err(type_name::(), e)) } @@ -26,6 +36,8 @@ mod tests { use super::*; use serde::Deserialize; + const LIMIT: usize = 20_000; + #[derive(Serialize, Deserialize, Debug, PartialEq)] #[serde(rename_all = "snake_case")] enum SomeMsg { @@ -43,11 +55,11 @@ mod tests { #[test] fn from_slice_works() { - let deserialized: SomeMsg = from_slice(br#"{"refund":{}}"#).unwrap(); + let deserialized: SomeMsg = from_slice(br#"{"refund":{}}"#, LIMIT).unwrap(); assert_eq!(deserialized, SomeMsg::Refund {}); let deserialized: SomeMsg = from_slice( - br#"{"release_all":{"image":"foo","amount":42,"time":18446744073709551615,"karma":-17}}"#, + br#"{"release_all":{"image":"foo","amount":42,"time":18446744073709551615,"karma":-17}}"#, LIMIT ) .unwrap(); assert_eq!( @@ -64,7 +76,7 @@ mod tests { #[test] fn from_slice_works_for_special_chars() { let deserialized: SomeMsg = - from_slice(br#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#).unwrap(); + from_slice(br#"{"cowsay":{"text":"foo\"bar\\\"bla"}}"#, LIMIT).unwrap(); assert_eq!( deserialized, SomeMsg::Cowsay { @@ -73,6 +85,20 @@ mod tests { ); } + #[test] + fn from_slice_errors_when_exceeding_deserialization_limit() { + let result = from_slice::(br#"{"refund":{}}"#, 5); + match result.unwrap_err() { + VmError::DeserializationLimitExceeded { + length, max_length, .. + } => { + assert_eq!(length, 13); + assert_eq!(max_length, 5); + } + err => panic!("Unexpected error: {:?}", err), + } + } + #[test] fn to_vec_works() { let msg = SomeMsg::Refund {}; From 7408b22328c7881cf7a3c9625d62cf6448a2eb52 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 14 Jun 2021 16:02:17 +0200 Subject: [PATCH 065/402] Add DESERIALIZATION_LIMIT to integration tests --- contracts/crypto-verify/tests/integration.rs | 28 ++++++++++--------- contracts/hackatom/tests/integration.rs | 6 ++-- .../ibc-reflect-send/tests/integration.rs | 6 ++-- contracts/ibc-reflect/tests/integration.rs | 19 ++++++++----- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/contracts/crypto-verify/tests/integration.rs b/contracts/crypto-verify/tests/integration.rs index 494b5e03d..4cdf2f374 100644 --- a/contracts/crypto-verify/tests/integration.rs +++ b/contracts/crypto-verify/tests/integration.rs @@ -54,6 +54,8 @@ const ED25519_SIGNATURE2_HEX: &str = "92a009a9f0d4cab8720e820b5f642540a2b27b5416 const ED25519_PUBLIC_KEY2_HEX: &str = "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c"; +const DESERIALIZATION_LIMIT: usize = 20_000; + fn setup() -> Instance { let mut deps = mock_instance(WASM, &[]); let msg = InstantiateMsg {}; @@ -83,7 +85,7 @@ fn cosmos_signature_verify_works() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -105,7 +107,7 @@ fn cosmos_signature_verify_fails() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -144,7 +146,7 @@ fn ethereum_signature_verify_works() { signer_address: signer_address.into(), }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -164,7 +166,7 @@ fn ethereum_signature_verify_fails_for_corrupted_message() { signer_address: signer_address.into(), }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -185,7 +187,7 @@ fn ethereum_signature_verify_fails_for_corrupted_signature() { signer_address: signer_address.into(), }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); // Broken signature @@ -247,7 +249,7 @@ fn verify_ethereum_transaction_works() { v, }; let raw = query(&mut deps, mock_env(), msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -266,7 +268,7 @@ fn tendermint_signature_verify_works() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -288,7 +290,7 @@ fn tendermint_signature_verify_fails() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -337,7 +339,7 @@ fn tendermint_signatures_batch_verify_works() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -370,7 +372,7 @@ fn tendermint_signatures_batch_verify_message_multisig_works() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -403,7 +405,7 @@ fn tendermint_signatures_batch_verify_single_public_key_works() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: true }); } @@ -434,7 +436,7 @@ fn tendermint_signatures_batch_verify_fails() { }; let raw = query(&mut deps, mock_env(), verify_msg).unwrap(); - let res: VerifyResponse = from_slice(&raw).unwrap(); + let res: VerifyResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res, VerifyResponse { verifies: false }); } @@ -476,7 +478,7 @@ fn query_works() { let query_msg = QueryMsg::ListVerificationSchemes {}; let raw = query(&mut deps, mock_env(), query_msg).unwrap(); - let res: ListVerificationsResponse = from_slice(&raw).unwrap(); + let res: ListVerificationsResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!( res, diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 64a353a42..1d535a1a7 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -35,6 +35,8 @@ use hackatom::state::{State, CONFIG_KEY}; static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/hackatom.wasm"); +const DESERIALIZATION_LIMIT: usize = 20_000; + fn make_init_msg() -> (InstantiateMsg, String) { let verifier = String::from("verifies"); let beneficiary = String::from("benefits"); @@ -81,7 +83,7 @@ fn proper_initialization() { .0 .expect("error reading db") .expect("no data stored"); - from_slice(&data) + from_slice(&data, DESERIALIZATION_LIMIT) }) .unwrap(); assert_eq!(state, expected_state); @@ -296,7 +298,7 @@ fn execute_release_fails_for_wrong_sender() { .expect("no data stored")) }) .unwrap(); - let state: State = from_slice(&data).unwrap(); + let state: State = from_slice(&data, DESERIALIZATION_LIMIT).unwrap(); assert_eq!( state, State { diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 60267c994..ff881ddc1 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -38,6 +38,8 @@ static WASM: &[u8] = const CREATOR: &str = "creator"; +const DESERIALIZATION_LIMIT: usize = 20_000; + fn setup() -> Instance { let mut deps = mock_instance(WASM, &[]); let msg = InstantiateMsg {}; @@ -92,7 +94,7 @@ fn who_am_i_response>( fn instantiate_works() { let mut deps = setup(); let r = query(&mut deps, mock_env(), QueryMsg::Admin {}).unwrap(); - let admin: AdminResponse = from_slice(&r).unwrap(); + let admin: AdminResponse = from_slice(&r, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(CREATOR, admin.admin.as_str()); } @@ -118,7 +120,7 @@ fn get_account( channel_id: channel_id.into(), }; let r = query(deps, mock_env(), msg).unwrap(); - from_slice(&r).unwrap() + from_slice(&r, DESERIALIZATION_LIMIT).unwrap() } #[test] diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 54f5da742..c85f3ff92 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -43,6 +43,8 @@ const REFLECT_ID: u64 = 101; // address of first reflect contract instance that we created const REFLECT_ADDR: &str = "reflect-acct-1"; +const DESERIALIZATION_LIMIT: usize = 20_000; + fn setup() -> Instance { let mut deps = mock_instance(WASM, &[]); let msg = InstantiateMsg { @@ -159,7 +161,7 @@ fn proper_handshake_flow() { // no accounts set yet let raw = query(&mut deps, mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(0, res.accounts.len()); // we get the callback from reflect @@ -175,7 +177,7 @@ fn proper_handshake_flow() { // ensure this is now registered let raw = query(&mut deps, mock_env(), QueryMsg::ListAccounts {}).unwrap(); - let res: ListAccountsResponse = from_slice(&raw).unwrap(); + let res: ListAccountsResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(1, res.accounts.len()); assert_eq!( &res.accounts[0], @@ -194,7 +196,7 @@ fn proper_handshake_flow() { }, ) .unwrap(); - let res: AccountResponse = from_slice(&raw).unwrap(); + let res: AccountResponse = from_slice(&raw, DESERIALIZATION_LIMIT).unwrap(); assert_eq!(res.account.unwrap(), REFLECT_ADDR); } @@ -219,7 +221,8 @@ fn handle_dispatch_packet() { // 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_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); assert_eq!( ack.unwrap_err(), "invalid packet: cosmwasm_std::addresses::Addr not found" @@ -237,7 +240,8 @@ fn handle_dispatch_packet() { ); // assert app-level success - let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); + let ack: AcknowledgementMsg = + from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); ack.unwrap(); // and we dispatch the BankMsg @@ -255,7 +259,7 @@ fn handle_dispatch_packet() { 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_slice(&msg, DESERIALIZATION_LIMIT).unwrap(); assert_eq!( rmsg, ReflectExecuteMsg::ReflectMsg { @@ -275,6 +279,7 @@ fn handle_dispatch_packet() { // we didn't dispatch anything assert_eq!(0, res.submessages.len()); // acknowledgement is an error - let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); + 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`"); } From ddd159f1ce3fb2c2a208a8b276a0cb30a587364f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 14 Jun 2021 18:55:41 +0200 Subject: [PATCH 066/402] Better error message for ref type opcodes --- packages/vm/src/middleware/deterministic.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/middleware/deterministic.rs b/packages/vm/src/middleware/deterministic.rs index 2a392fc5c..2c24b4e03 100644 --- a/packages/vm/src/middleware/deterministic.rs +++ b/packages/vm/src/middleware/deterministic.rs @@ -139,8 +139,11 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::I64Extend16S | Operator::I64ExtendI32S | Operator::I64Extend32S - | Operator::I64ExtendI32U - | Operator::RefNull { .. } + | Operator::I64ExtendI32U => { + state.push_operator(operator); + Ok(()) + } + Operator::RefNull { .. } | Operator::RefIsNull | Operator::RefFunc { .. } | Operator::ReturnCall { .. } @@ -150,8 +153,11 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::TableSet { .. } | Operator::TableGrow { .. } | Operator::TableSize { .. } => { - state.push_operator(operator); - Ok(()) + let msg = format!( + "Reference type operation detected: {:?}. Reference types are not supported.", + operator + ); + Err(MiddlewareError::new("Deterministic", msg)) } Operator::MemoryAtomicNotify { .. } | Operator::MemoryAtomicWait32 { .. } From f983ad6c1d54bea490f73d22c6e5f2408cdd7137 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 14 Jun 2021 18:57:23 +0200 Subject: [PATCH 067/402] CHANGELOG update for opcode whitelist changes --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 640ef5e20..3ab824168 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,10 +14,16 @@ and this project adheres to - cosmwasm-std: Add `Timestamp::seconds` and `Timestamp::subsec_nanos`. - cosmwasm-std: Implement division for `Decimal / Uint128` +### Changed + +- cosmwasm-vm: More accurate error messages for op codes related to bulk memory + operations, reference types, SIMD and the Threads extension. + ### Fixed - cosmwasm-std: Fix `Uint64::multiply_ratio` and `Uint128::multiply_ratio` so that internal multiplication cannot cause an unnecessary overflow. ([#920]) +- comswasm-vm: Whitelisted the `i64.extend32_s` operation. [#920]: https://github.com/CosmWasm/cosmwasm/issues/920 From 660039951933df73ea9bed6da2e608ab0df1877d Mon Sep 17 00:00:00 2001 From: loloicci Date: Tue, 15 Jun 2021 17:39:33 +0900 Subject: [PATCH 068/402] fix a dead link in comment --- packages/std/src/imports.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 33aab44a6..e4669a96d 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -24,7 +24,7 @@ const HUMAN_ADDRESS_BUFFER_LENGTH: usize = 90; // This interface will compile into required Wasm imports. // A complete documentation those functions is available in the VM that provides them: -// https://github.com/confio/cosmwasm/blob/0.7/lib/vm/src/instance.rs#L43 +// https://github.com/CosmWasm/cosmwasm/blob/v0.14.1/packages/vm/src/instance.rs#L53 extern "C" { fn db_read(key: u32) -> u32; fn db_write(key: u32, value: u32); From 84cadd909111e71421066847f7ff1a175920063b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 15 Jun 2021 10:47:11 +0200 Subject: [PATCH 069/402] Remove obsolete comments --- packages/vm/src/wasm_backend/compile.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 132640f62..911714b68 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -1,11 +1,9 @@ -// use wasmer_middleware_common::metering; use wasmer::Module; use crate::errors::VmResult; use crate::size::Size; use super::store::make_compile_time_store; -// use crate::middleware::DeterministicMiddleware; /// Compiles a given Wasm bytecode into a module. /// The given memory limit (in bytes) is used when memories are created. From a2dfc02f40c855eff16a10aa188141392b22cc0c Mon Sep 17 00:00:00 2001 From: loloicci Date: Tue, 15 Jun 2021 17:47:57 +0900 Subject: [PATCH 070/402] fix the range of referenced code Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/imports.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index e4669a96d..4fda9039e 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -24,7 +24,7 @@ const HUMAN_ADDRESS_BUFFER_LENGTH: usize = 90; // This interface will compile into required Wasm imports. // A complete documentation those functions is available in the VM that provides them: -// https://github.com/CosmWasm/cosmwasm/blob/v0.14.1/packages/vm/src/instance.rs#L53 +// https://github.com/CosmWasm/cosmwasm/blob/v0.14.1/packages/vm/src/instance.rs#L84-L201 extern "C" { fn db_read(key: u32) -> u32; fn db_write(key: u32, value: u32); From 79467a44cb5e4622424a6a139e56856053664f06 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 15 Jun 2021 10:53:20 +0200 Subject: [PATCH 071/402] Move deterministic middleware into wasm_backend moduke --- packages/vm/src/lib.rs | 1 - packages/vm/src/middleware/mod.rs | 3 --- packages/vm/src/{middleware => wasm_backend}/deterministic.rs | 0 packages/vm/src/wasm_backend/mod.rs | 1 + packages/vm/src/wasm_backend/store.rs | 2 +- 5 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 packages/vm/src/middleware/mod.rs rename packages/vm/src/{middleware => wasm_backend}/deterministic.rs (100%) diff --git a/packages/vm/src/lib.rs b/packages/vm/src/lib.rs index ef65dff6c..82f957ba4 100644 --- a/packages/vm/src/lib.rs +++ b/packages/vm/src/lib.rs @@ -13,7 +13,6 @@ mod imports; mod instance; mod limited; mod memory; -mod middleware; mod modules; mod sections; mod serde; diff --git a/packages/vm/src/middleware/mod.rs b/packages/vm/src/middleware/mod.rs deleted file mode 100644 index 35c05d023..000000000 --- a/packages/vm/src/middleware/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod deterministic; - -pub use deterministic::Deterministic; diff --git a/packages/vm/src/middleware/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs similarity index 100% rename from packages/vm/src/middleware/deterministic.rs rename to packages/vm/src/wasm_backend/deterministic.rs diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 1a53211db..4d474b629 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -1,4 +1,5 @@ mod compile; +mod deterministic; mod limiting_tunables; mod store; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 041e3c7ef..75b73b0e9 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -10,9 +10,9 @@ use wasmer::{ }; use wasmer_middlewares::Metering; -use crate::middleware::Deterministic; use crate::size::Size; +use super::deterministic::Deterministic; use super::limiting_tunables::LimitingTunables; /// WebAssembly linear memory objects have sizes measured in pages. Each page From 8b46cdd4f614383523544842532ca8d3928ec52f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 14 Jun 2021 18:40:10 +0200 Subject: [PATCH 072/402] Update wasmer to 2.0.0-rc1 --- CHANGELOG.md | 3 +- Cargo.lock | 271 ++++++++++------ contracts/burner/Cargo.lock | 289 +++++++++++------- contracts/crypto-verify/Cargo.lock | 289 +++++++++++------- contracts/hackatom/Cargo.lock | 289 +++++++++++------- contracts/ibc-reflect-send/Cargo.lock | 289 +++++++++++------- contracts/ibc-reflect/Cargo.lock | 289 +++++++++++------- contracts/queue/Cargo.lock | 289 +++++++++++------- contracts/reflect/Cargo.lock | 289 +++++++++++------- contracts/staking/Cargo.lock | 289 +++++++++++------- packages/vm/Cargo.toml | 5 +- packages/vm/src/modules/in_memory_cache.rs | 4 +- packages/vm/src/wasm_backend/deterministic.rs | 9 +- .../vm/src/wasm_backend/limiting_tunables.rs | 2 + packages/vm/src/wasm_backend/store.rs | 8 +- 15 files changed, 1584 insertions(+), 1030 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcc720f0d..cafbe5f6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,8 @@ and this project adheres to 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-rc1` + ### Fixed - comswasm-vm: Whitelisted the `i64.extend32_s` operation. diff --git a/Cargo.lock b/Cargo.lock index 1e4f8f5d9..9254ff2b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,7 +51,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -61,16 +61,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -267,6 +257,7 @@ dependencies = [ "criterion", "hex", "hex-literal", + "loupe", "parity-wasm", "schemars", "serde", @@ -287,37 +278,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -325,24 +314,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -704,21 +690,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -845,9 +831,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -862,6 +848,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -945,6 +952,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -1027,13 +1040,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -1177,6 +1210,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -1198,6 +1254,12 @@ dependencies = [ "semver", ] +[[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" @@ -1243,6 +1305,12 @@ 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 = "semver" version = "0.9.0" @@ -1389,9 +1457,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.58" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1400,9 +1468,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1621,12 +1689,13 @@ checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1635,21 +1704,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1662,16 +1732,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1681,17 +1752,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1700,9 +1771,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1712,13 +1783,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1732,50 +1803,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1783,11 +1856,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1795,29 +1868,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1826,9 +1903,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "wast" diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 61e99ce9f..aa2d7e401 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -178,6 +168,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -196,37 +187,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -234,24 +223,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -549,21 +535,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -660,9 +646,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -677,6 +663,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -735,6 +742,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -799,13 +812,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -925,6 +958,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -937,6 +993,12 @@ 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" @@ -973,6 +1035,12 @@ 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 = "serde" version = "1.0.118" @@ -1088,9 +1156,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1099,9 +1167,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1207,12 +1275,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1221,21 +1290,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1248,16 +1318,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1267,17 +1338,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1286,9 +1357,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1298,13 +1369,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1318,50 +1389,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1369,11 +1442,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1381,29 +1454,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1412,27 +1489,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 9ce24ded2..1b92df153 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -188,6 +178,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -206,37 +197,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -244,24 +233,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -576,21 +562,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -699,9 +685,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -716,6 +702,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -774,6 +781,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -838,13 +851,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -964,6 +997,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rlp" version = "0.5.0" @@ -992,6 +1048,12 @@ 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" @@ -1028,6 +1090,12 @@ 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 = "serde" version = "1.0.118" @@ -1155,9 +1223,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1166,9 +1234,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1274,12 +1342,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1288,21 +1357,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1315,16 +1385,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1334,17 +1405,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1353,9 +1424,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1365,13 +1436,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1385,50 +1456,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1436,11 +1509,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1448,29 +1521,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1479,27 +1556,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index fd855f2c0..5688b5f54 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -175,6 +165,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -193,37 +184,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -231,24 +220,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -546,21 +532,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -671,9 +657,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -688,6 +674,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -746,6 +753,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -810,13 +823,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -936,6 +969,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -948,6 +1004,12 @@ 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" @@ -984,6 +1046,12 @@ 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 = "serde" version = "1.0.118" @@ -1099,9 +1167,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1110,9 +1178,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1218,12 +1286,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1232,21 +1301,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1259,16 +1329,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1278,17 +1349,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1297,9 +1368,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1309,13 +1380,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1329,50 +1400,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1380,11 +1453,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1392,29 +1465,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1423,27 +1500,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index ca2620212..03d0d9255 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -175,6 +165,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -193,37 +184,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -231,24 +220,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -546,21 +532,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -669,9 +655,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -686,6 +672,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -744,6 +751,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -808,13 +821,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -934,6 +967,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -946,6 +1002,12 @@ 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" @@ -982,6 +1044,12 @@ 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 = "serde" version = "1.0.118" @@ -1097,9 +1165,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1108,9 +1176,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1216,12 +1284,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1230,21 +1299,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1257,16 +1327,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1276,17 +1347,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1295,9 +1366,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1307,13 +1378,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1327,50 +1398,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1378,11 +1451,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1390,29 +1463,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1421,27 +1498,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 19415f662..4d8ce25ec 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -175,6 +165,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -193,37 +184,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -231,24 +220,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -546,21 +532,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -669,9 +655,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -686,6 +672,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -744,6 +751,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -808,13 +821,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -934,6 +967,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -946,6 +1002,12 @@ 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" @@ -982,6 +1044,12 @@ 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 = "serde" version = "1.0.118" @@ -1097,9 +1165,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1108,9 +1176,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1216,12 +1284,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1230,21 +1299,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1257,16 +1327,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1276,17 +1347,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1295,9 +1366,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1307,13 +1378,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1327,50 +1398,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1378,11 +1451,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1390,29 +1463,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1421,27 +1498,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index e9574045f..717063e6a 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -167,6 +157,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -185,37 +176,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -223,24 +212,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -538,21 +524,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -649,9 +635,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -666,6 +652,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -724,6 +731,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -788,13 +801,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "queue" version = "0.0.0" @@ -925,6 +958,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -937,6 +993,12 @@ 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" @@ -973,6 +1035,12 @@ 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 = "serde" version = "1.0.118" @@ -1088,9 +1156,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1099,9 +1167,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1207,12 +1275,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1221,21 +1290,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1248,16 +1318,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1267,17 +1338,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1286,9 +1357,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1298,13 +1369,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1318,50 +1389,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1369,11 +1442,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1381,29 +1454,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1412,27 +1489,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index ba6f3fab8..54291410d 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -175,6 +165,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -193,37 +184,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -231,24 +220,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -546,21 +532,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -657,9 +643,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -674,6 +660,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -732,6 +739,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -796,13 +809,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -935,6 +968,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -947,6 +1003,12 @@ 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" @@ -983,6 +1045,12 @@ 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 = "serde" version = "1.0.103" @@ -1098,9 +1166,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1109,9 +1177,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1217,12 +1285,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1231,21 +1300,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1258,16 +1328,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1277,17 +1348,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1296,9 +1367,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1308,13 +1379,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1328,50 +1399,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1379,11 +1452,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1391,29 +1464,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1422,27 +1499,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 2644e1aab..bb9dd2391 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.22.0", "rustc-demangle", ] @@ -41,16 +41,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "bitflags" version = "1.2.1" @@ -175,6 +165,7 @@ dependencies = [ "cosmwasm-crypto", "cosmwasm-std", "hex", + "loupe", "parity-wasm", "schemars", "serde", @@ -193,37 +184,35 @@ checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli 0.24.0", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -231,24 +220,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -552,21 +538,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.22.0" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - [[package]] name = "group" version = "0.8.0" @@ -663,9 +649,9 @@ checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -680,6 +666,27 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "mach" version = "0.3.2" @@ -738,6 +745,12 @@ name = "object" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" dependencies = [ "crc32fast", "indexmap", @@ -802,13 +815,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.8" @@ -928,6 +961,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.18" @@ -940,6 +996,12 @@ 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" @@ -976,6 +1038,12 @@ 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 = "serde" version = "1.0.118" @@ -1125,9 +1193,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -1136,9 +1204,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" @@ -1244,12 +1312,13 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70cfae554988d904d64ca17ab0e7cd652ee5c8a0807094819c1ea93eb9d6866" +checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -1258,21 +1327,22 @@ dependencies = [ "wasmer-compiler-singlepass", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", - "wat", "winapi", ] [[package]] name = "wasmer-compiler" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7732a9cab472bd921d5a0c422f45b3d03f62fa2c40a89e0770cef6d47e383e" +checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" dependencies = [ "enumset", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1285,16 +1355,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb9395f094e1d81534f4c5e330ed4cdb424e8df870d29ad585620284f5fddb" +checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli 0.24.0", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1304,17 +1375,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426ae6ef0f606ca815510f3e2ef6f520e217514bfb7a664defe180b9a9e75d07" +checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" dependencies = [ "byteorder", "dynasm", "dynasmrt", "lazy_static", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "wasmer-compiler", "wasmer-types", @@ -1323,9 +1394,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b86dcd2c3efdb8390728a2b56f762db07789aaa5aa872a9dc776ba3a7912ed" +checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1335,13 +1406,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe4667d6bd888f26ae8062a63a9379fa697415b4b4e380f33832e8418fd71b5" +checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1355,50 +1426,52 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.2" +name = "wasmer-engine-dylib" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26770be802888011b4a3072f2a282fc2faa68aa48c71b3db6252a3937a85f3da" +checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.2" +name = "wasmer-engine-universal" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb4083a6c69f2cd4b000b82a80717f37c6cc2e536aee3a8ffe9af3edc276a8b" +checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] name = "wasmer-middlewares" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "547baee2c0733cf436db7d137a8d1f86737a6321fc0fe6cd74caecf6f759c3c4" +checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" dependencies = [ + "loupe", "wasmer", "wasmer-types", "wasmer-vm", @@ -1406,11 +1479,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "1.0.2" +version = "2.0.0-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf8e0c12b82ff81ebecd30d7e118be5fec871d6de885a90eeb105df0a769a7b" +checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" dependencies = [ - "object", + "object 0.24.0", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1418,29 +1491,33 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f4ac28c2951cd792c18332f03da523ed06b170f5cf6bb5b1bdd7e36c2a8218" +checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.2" +version = "2.0.0-rc2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7635ba0b6d2fd325f588d69a950ad9fa04dddbf6ad08b6b2a183146319bf6ae" +checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", @@ -1449,27 +1526,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" - -[[package]] -name = "wast" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" -dependencies = [ - "leb128", -] - -[[package]] -name = "wat" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" -dependencies = [ - "wast", -] +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index ee65438cc..fc582e790 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -45,8 +45,9 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0" sha2 = "0.9.1" thiserror = "1.0" -wasmer = { version = "1.0.2", default-features = false, features = ["jit", "singlepass"] } -wasmer-middlewares = { version = "1.0.2" } +wasmer = { version = "2.0.0-rc1", default-features = false, features = ["cranelift", "universal", "singlepass"] } +wasmer-middlewares = { version = "2.0.0-rc1" } +loupe = "0.1.2" # Wasmer git/local (used for quick local debugging or patching) # wasmer = { git = "https://github.com/wasmerio/wasmer", rev = "1.0.2", default-features = false, features = ["jit", "singlepass"] } diff --git a/packages/vm/src/modules/in_memory_cache.rs b/packages/vm/src/modules/in_memory_cache.rs index 563b9c6de..9f7d9eaa3 100644 --- a/packages/vm/src/modules/in_memory_cache.rs +++ b/packages/vm/src/modules/in_memory_cache.rs @@ -108,12 +108,12 @@ mod tests { let key_size = mem::size_of::(); assert_eq!(key_size, 32); - // A Module consists of a Store (2 Arcs) and an Arc to the Engine. + // 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, 48); + assert_eq!(value_size, 56); // Just in case we want to go that route let boxed_value_size = mem::size_of::>(); diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index 2c24b4e03..806433f86 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -1,3 +1,4 @@ +use loupe::MemoryUsage; use wasmer::wasmparser::Operator; use wasmer::{ FunctionMiddleware, LocalFunctionIndex, MiddlewareError, MiddlewareReaderState, @@ -5,7 +6,7 @@ use wasmer::{ }; /// A middleware that ensures only deterministic operations are used (i.e. no floats) -#[derive(Debug)] +#[derive(Debug, MemoryUsage)] pub struct Deterministic {} impl Deterministic { @@ -532,7 +533,7 @@ impl FunctionMiddleware for FunctionDeterministic { mod tests { use super::*; use std::sync::Arc; - use wasmer::{CompilerConfig, Cranelift, Module, Store, JIT}; + use wasmer::{CompilerConfig, Cranelift, Module, Store, Universal}; #[test] fn valid_wasm_instance_sanity() { @@ -551,7 +552,7 @@ mod tests { let deterministic = Arc::new(Deterministic::new()); let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); - let store = Store::new(&JIT::new(compiler_config).engine()); + let store = Store::new(&Universal::new(compiler_config).engine()); let result = Module::new(&store, &wasm); assert!(result.is_ok()); } @@ -572,7 +573,7 @@ mod tests { let deterministic = Arc::new(Deterministic::new()); let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); - let store = Store::new(&JIT::new(compiler_config).engine()); + let store = Store::new(&Universal::new(compiler_config).engine()); let result = Module::new(&store, &wasm); assert!(result .unwrap_err() diff --git a/packages/vm/src/wasm_backend/limiting_tunables.rs b/packages/vm/src/wasm_backend/limiting_tunables.rs index 4bf3f3ba3..007bc34a4 100644 --- a/packages/vm/src/wasm_backend/limiting_tunables.rs +++ b/packages/vm/src/wasm_backend/limiting_tunables.rs @@ -1,6 +1,7 @@ use std::ptr::NonNull; use std::sync::Arc; +use loupe::MemoryUsage; use wasmer::{ vm::{self, MemoryError, MemoryStyle, TableStyle, VMMemoryDefinition, VMTableDefinition}, MemoryType, Pages, TableType, Tunables, @@ -10,6 +11,7 @@ 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 75b73b0e9..27f91c5ce 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -5,7 +5,7 @@ use wasmer::Cranelift; #[cfg(not(feature = "cranelift"))] use wasmer::Singlepass; use wasmer::{ - wasmparser::Operator, BaseTunables, CompilerConfig, Engine, Pages, Store, Target, JIT, + wasmparser::Operator, BaseTunables, CompilerConfig, Engine, Pages, Store, Target, Universal, WASM_PAGE_SIZE, }; use wasmer_middlewares::Metering; @@ -40,7 +40,7 @@ pub fn make_compile_time_store(memory_limit: Option) -> Store { let mut config = Cranelift::default(); config.push_middleware(deterministic); config.push_middleware(metering); - let engine = JIT::new(config).engine(); + let engine = Universal::new(config).engine(); make_store_with_engine(&engine, memory_limit) } @@ -49,7 +49,7 @@ pub fn make_compile_time_store(memory_limit: Option) -> Store { let mut config = Singlepass::default(); config.push_middleware(deterministic); config.push_middleware(metering); - let engine = JIT::new(config).engine(); + let engine = Universal::new(config).engine(); make_store_with_engine(&engine, memory_limit) } } @@ -57,7 +57,7 @@ pub fn make_compile_time_store(memory_limit: Option) -> Store { /// 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 = JIT::headless().engine(); + let engine = Universal::headless().engine(); make_store_with_engine(&engine, memory_limit) } From 32b0a18150bfcd6554201932cf630f7f307eca47 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 15 Jun 2021 11:36:43 +0200 Subject: [PATCH 073/402] Update WASM operators for wasmparser 0.78 --- packages/vm/src/wasm_backend/deterministic.rs | 82 ++++++++++++++++--- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index 806433f86..deac0a974 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -288,7 +288,7 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::V128Bitselect | Operator::I8x16Abs | Operator::I8x16Neg - | Operator::I8x16AnyTrue + | Operator::V128AnyTrue | Operator::I8x16AllTrue | Operator::I8x16Bitmask | Operator::I8x16Shl @@ -306,7 +306,6 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::I8x16MaxU | Operator::I16x8Abs | Operator::I16x8Neg - | Operator::I16x8AnyTrue | Operator::I16x8AllTrue | Operator::I16x8Bitmask | Operator::I16x8Shl @@ -325,7 +324,6 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::I16x8MaxU | Operator::I32x4Abs | Operator::I32x4Neg - | Operator::I32x4AnyTrue | Operator::I32x4AllTrue | Operator::I32x4Bitmask | Operator::I32x4Shl @@ -358,14 +356,14 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::I8x16NarrowI16x8U | Operator::I16x8NarrowI32x4S | Operator::I16x8NarrowI32x4U - | Operator::I16x8WidenLowI8x16S - | Operator::I16x8WidenHighI8x16S - | Operator::I16x8WidenLowI8x16U - | Operator::I16x8WidenHighI8x16U - | Operator::I32x4WidenLowI16x8S - | Operator::I32x4WidenHighI16x8S - | Operator::I32x4WidenLowI16x8U - | Operator::I32x4WidenHighI16x8U + | Operator::I16x8ExtendLowI8x16S + | Operator::I16x8ExtendHighI8x16S + | Operator::I16x8ExtendLowI8x16U + | Operator::I16x8ExtendHighI8x16U + | Operator::I32x4ExtendLowI16x8S + | Operator::I32x4ExtendHighI16x8S + | Operator::I32x4ExtendLowI16x8U + | Operator::I32x4ExtendHighI16x8U | Operator::V128Load8x8S { .. } | Operator::V128Load8x8U { .. } | Operator::V128Load16x4S { .. } @@ -373,7 +371,52 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::V128Load32x2S { .. } | Operator::V128Load32x2U { .. } | Operator::I8x16RoundingAverageU - | Operator::I16x8RoundingAverageU => { + | Operator::I16x8RoundingAverageU + | Operator::V128Load8Lane { .. } + | Operator::V128Load16Lane { .. } + | Operator::V128Load32Lane { .. } + | Operator::V128Load64Lane { .. } + | Operator::V128Store8Lane { .. } + | Operator::V128Store16Lane { .. } + | Operator::V128Store32Lane { .. } + | Operator::V128Store64Lane { .. } + | Operator::I64x2Eq + | Operator::I64x2Ne + | Operator::I64x2LtS + | Operator::I64x2GtS + | Operator::I64x2LeS + | Operator::I64x2GeS + | Operator::I8x16Popcnt + | Operator::I16x8ExtAddPairwiseI8x16S + | Operator::I16x8ExtAddPairwiseI8x16U + | Operator::I16x8Q15MulrSatS + | Operator::I16x8ExtMulLowI8x16S + | Operator::I16x8ExtMulHighI8x16S + | Operator::I16x8ExtMulLowI8x16U + | Operator::I16x8ExtMulHighI8x16U + | Operator::I32x4ExtAddPairwiseI16x8S + | Operator::I32x4ExtAddPairwiseI16x8U + | Operator::I32x4ExtMulLowI16x8S + | Operator::I32x4ExtMulHighI16x8S + | Operator::I32x4ExtMulLowI16x8U + | Operator::I32x4ExtMulHighI16x8U + | Operator::I64x2Abs + | Operator::I64x2AllTrue + | Operator::I64x2Bitmask + | Operator::I64x2ExtendLowI32x4S + | Operator::I64x2ExtendHighI32x4S + | Operator::I64x2ExtendLowI32x4U + | Operator::I64x2ExtendHighI32x4U + | Operator::I64x2ExtMulLowI32x4S + | Operator::I64x2ExtMulHighI32x4S + | Operator::I64x2ExtMulLowI32x4U + | Operator::I64x2ExtMulHighI32x4U + | Operator::I32x4TruncSatF64x2SZero + | Operator::I32x4TruncSatF64x2UZero + | Operator::F64x2ConvertLowI32x4S + | Operator::F64x2ConvertLowI32x4U + | Operator::F32x4DemoteF64x2Zero + | Operator::F64x2PromoteLowF32x4 => { let msg = format!( "SIMD operator detected: {:?}. The Wasm SIMD extension is not supported.", operator @@ -525,6 +568,19 @@ impl FunctionMiddleware for FunctionDeterministic { ); Err(MiddlewareError::new("Deterministic", msg)) } + Operator::Try { .. } + | Operator::Catch { .. } + | Operator::Throw { .. } + | Operator::Rethrow { .. } + | Operator::Unwind { .. } + | Operator::Delegate { .. } + | Operator::CatchAll => { + let msg = format!( + "Exception handling operation detected: {:?}. Exception handling is not supported.", + operator + ); + Err(MiddlewareError::new("Deterministic", msg)) + } } } } @@ -600,7 +656,7 @@ mod tests { let deterministic = Arc::new(Deterministic::new()); let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); - let store = Store::new(&JIT::new(compiler_config).engine()); + let store = Store::new(&Universal::new(compiler_config).engine()); let result = Module::new(&store, &wasm); assert!(result .unwrap_err() From 0e4f5179ff46f1df52229ddbd587d7ff0a432c27 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 15 Jun 2021 16:04:52 +0200 Subject: [PATCH 074/402] Update `wasmer` to `2.0.0-rc2` --- CHANGELOG.md | 2 +- Cargo.lock | 54 +++++++++++---------------- contracts/burner/Cargo.lock | 54 +++++++++++---------------- contracts/crypto-verify/Cargo.lock | 54 +++++++++++---------------- contracts/hackatom/Cargo.lock | 54 +++++++++++---------------- contracts/ibc-reflect-send/Cargo.lock | 54 +++++++++++---------------- contracts/ibc-reflect/Cargo.lock | 54 +++++++++++---------------- contracts/queue/Cargo.lock | 54 +++++++++++---------------- contracts/reflect/Cargo.lock | 54 +++++++++++---------------- contracts/staking/Cargo.lock | 54 +++++++++++---------------- packages/vm/Cargo.toml | 4 +- 11 files changed, 192 insertions(+), 300 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cafbe5f6a..f1e3d17f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ and this project adheres to 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-rc1` +- cosmwasm-vm: Update `wasmer` to `2.0.0-rc2` ### Fixed diff --git a/Cargo.lock b/Cargo.lock index 9254ff2b6..5fcf4aeab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1689,9 +1689,8 @@ checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1713,9 +1712,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1732,9 +1730,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1752,9 +1749,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1772,8 +1768,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1783,9 +1778,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1804,9 +1798,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1826,9 +1819,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1844,9 +1836,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1856,9 +1847,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1869,8 +1859,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1882,8 +1871,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index aa2d7e401..d084b516a 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1275,9 +1275,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1299,9 +1298,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1318,9 +1316,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1338,9 +1335,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1358,8 +1354,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1369,9 +1364,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1390,9 +1384,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1412,9 +1405,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1430,9 +1422,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1442,9 +1433,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1455,8 +1445,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1468,8 +1457,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 1b92df153..5fe1baa43 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1342,9 +1342,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1366,9 +1365,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1385,9 +1383,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1405,9 +1402,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1425,8 +1421,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1436,9 +1431,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1457,9 +1451,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1479,9 +1472,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1497,9 +1489,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1509,9 +1500,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1522,8 +1512,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1535,8 +1524,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 5688b5f54..2ce905af8 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1286,9 +1286,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1310,9 +1309,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1329,9 +1327,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1349,9 +1346,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1369,8 +1365,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1380,9 +1375,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1401,9 +1395,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1423,9 +1416,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1441,9 +1433,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1453,9 +1444,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1466,8 +1456,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1479,8 +1468,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 03d0d9255..708d3d23c 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1284,9 +1284,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1308,9 +1307,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1327,9 +1325,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1347,9 +1344,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1367,8 +1363,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1378,9 +1373,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1399,9 +1393,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1421,9 +1414,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1439,9 +1431,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1451,9 +1442,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1464,8 +1454,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1477,8 +1466,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 4d8ce25ec..dd326fe36 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1284,9 +1284,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1308,9 +1307,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1327,9 +1325,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1347,9 +1344,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1367,8 +1363,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1378,9 +1373,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1399,9 +1393,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1421,9 +1414,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1439,9 +1431,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1451,9 +1442,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1464,8 +1454,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1477,8 +1466,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 717063e6a..c6b098f75 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1275,9 +1275,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1299,9 +1298,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1318,9 +1316,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1338,9 +1335,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1358,8 +1354,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1369,9 +1364,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1390,9 +1384,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1412,9 +1405,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1430,9 +1422,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1442,9 +1433,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1455,8 +1445,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1468,8 +1457,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 54291410d..28b19e4eb 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1285,9 +1285,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1309,9 +1308,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1328,9 +1326,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1348,9 +1345,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1368,8 +1364,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1379,9 +1374,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1400,9 +1394,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1422,9 +1415,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1440,9 +1432,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1452,9 +1443,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1465,8 +1455,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1478,8 +1467,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index bb9dd2391..e70227058 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1312,9 +1312,8 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0604c9dc953c957e52d27b4a6a0d0d3d71c5fe37a0a8ea7ce015b510c9ca3b0" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1336,9 +1335,8 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2d86e56605f8e886a118beb985d74819bd541cf1999e460b47c37e0beabdc2" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "enumset", "loupe", @@ -1355,9 +1353,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdd132178456b0eaf71948a8ed38a76446d5f5f53cefad9941136117d68308c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1375,9 +1372,8 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9303473d7a53a63e2053379bf05d012eed74fac868bd0d1a0306380f8155" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "byteorder", "dynasm", @@ -1395,8 +1391,7 @@ dependencies = [ [[package]] name = "wasmer-derive" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b089cb0679ab7d4ce8c360f8c27f6b272f79a351e3fcaf55a9105d2dedbda61e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1406,9 +1401,8 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d49c3df208f3003045ccd53bd2f5ca5cc9b2178125fba9a6179c786fb5e7619" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "lazy_static", @@ -1427,9 +1421,8 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d22f85847f5efdf582f9158c5b7a8da07bb6b13636c89948417476da591285" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1449,9 +1442,8 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7f5a2d37cdfa66b3f6f707a43c7eb14176f54a03e81743cfb894744f57ed20" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1467,9 +1459,8 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0af6e9caf2086012c37c7423a42b328d507b940ef60f05eb41c9baf8e97dcce" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "loupe", "wasmer", @@ -1479,9 +1470,8 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46595be7aecd344ec1246434a26aff741b88a3b57689da3404d89b65fa151b9c" +version = "2.0.0-rc2" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "object 0.24.0", "thiserror", @@ -1492,8 +1482,7 @@ dependencies = [ [[package]] name = "wasmer-types" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46161bd0e0808262c3c942f6d2dbc5babf6b9fc7b69a500ad4b098e26e8f9972" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "indexmap", "loupe", @@ -1505,8 +1494,7 @@ dependencies = [ [[package]] name = "wasmer-vm" version = "2.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b1907f8cf140ab47b0c88fb9c930eba006c7caf8dd1e719859b0da8fba6e0e" +source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" dependencies = [ "backtrace", "cc", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index fc582e790..8940d1f51 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -45,8 +45,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0" sha2 = "0.9.1" thiserror = "1.0" -wasmer = { version = "2.0.0-rc1", default-features = false, features = ["cranelift", "universal", "singlepass"] } -wasmer-middlewares = { version = "2.0.0-rc1" } +wasmer = { git = "https://github.com/wasmerio/wasmer", tag = "2.0.0-rc2", default-features = false, features = ["cranelift", "universal", "singlepass"] } +wasmer-middlewares = { git = "https://github.com/wasmerio/wasmer", tag = "2.0.0-rc2" } loupe = "0.1.2" # Wasmer git/local (used for quick local debugging or patching) From 4a3558d6aa4702eb1633b68bfd01a1fbc5dadbfa Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 09:35:08 +0200 Subject: [PATCH 075/402] Move ED25519 msg limits from `crypto` to `vm` --- CHANGELOG.md | 5 +++ packages/crypto/src/ed25519.rs | 36 +----------------- packages/crypto/src/errors.rs | 29 --------------- packages/crypto/src/lib.rs | 4 +- .../std/src/errors/recover_pubkey_error.rs | 1 - packages/std/src/errors/verification_error.rs | 1 - packages/vm/src/imports.rs | 37 +++++++++++-------- 7 files changed, 29 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1e3d17f2..6f7f37ff1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ and this project adheres to - 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 @@ -29,6 +32,8 @@ and this project adheres to - 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-rc2` +- cosmwasm-vm: ED25519 message length and batch length limits are now hardcoded + in `cosmwasm-vm` itself instead of being imported from `cosmwasm-crypto`. ### Fixed diff --git a/packages/crypto/src/ed25519.rs b/packages/crypto/src/ed25519.rs index 8974980dc..404de9b91 100644 --- a/packages/crypto/src/ed25519.rs +++ b/packages/crypto/src/ed25519.rs @@ -5,16 +5,6 @@ use std::convert::TryInto; use crate::errors::{CryptoError, CryptoResult}; -/// Max length of a message for ed25519 verification in bytes. -/// This is an arbitrary value, for performance / memory contraints. If you need to verify larger -/// messages, let us know. -pub const MESSAGE_MAX_LEN: usize = 128 * 1024; - -/// Max number of batch messages / signatures / public_keys. -/// This is an arbitrary value, for performance / memory contraints. If you need to batch-verify a -/// larger number of signatures, let us know. -pub const BATCH_MAX_LEN: usize = 256; - /// Length of a serialized public key pub const EDDSA_PUBKEY_LEN: usize = 32; @@ -30,7 +20,6 @@ pub const EDDSA_PUBKEY_LEN: usize = 32; /// - public key: raw ED25519 public key (32 bytes). pub fn ed25519_verify(message: &[u8], signature: &[u8], public_key: &[u8]) -> CryptoResult { // Validation - check_message_length(message)?; let signature = read_signature(signature)?; let pubkey = read_pubkey(public_key)?; @@ -72,7 +61,7 @@ pub fn ed25519_verify(message: &[u8], signature: &[u8], public_key: &[u8]) -> Cr /// case. /// - The "one-public key, with zero messages and zero signatures" case, is considered the empty /// case. -/// - The empty case (no messages, no signatures and no public keys) returns true. +/// - The empty case (no messages, no signatures a no public keys) returns true. pub fn ed25519_batch_verify( messages: &[&[u8]], signatures: &[&[u8]], @@ -108,7 +97,6 @@ pub fn ed25519_batch_verify( .zip(public_keys.iter()) { // Validation - check_message_length(message)?; let signature = read_signature(signature)?; let pubkey = read_pubkey(public_key)?; @@ -149,28 +137,6 @@ fn read_pubkey(data: &[u8]) -> Result<[u8; 32], InvalidEd25519PubkeyFormat> { data.try_into().map_err(|_| InvalidEd25519PubkeyFormat) } -struct MessageTooLong { - limit: usize, - actual: usize, -} - -impl From for CryptoError { - fn from(original: MessageTooLong) -> Self { - CryptoError::message_too_long(original.limit, original.actual) - } -} - -fn check_message_length(message: &[u8]) -> Result<(), MessageTooLong> { - if message.len() > MESSAGE_MAX_LEN { - Err(MessageTooLong { - limit: MESSAGE_MAX_LEN, - actual: message.len(), - }) - } else { - Ok(()) - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index f340580f6..3244187ef 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -34,13 +34,6 @@ pub enum CryptoError { #[cfg(feature = "backtraces")] backtrace: Backtrace, }, - #[error("Message is longer than supported by this implementation (Limit: {limit}, actual length: {actual})")] - MessageTooLong { - limit: usize, - actual: usize, - #[cfg(feature = "backtraces")] - backtrace: Backtrace, - }, #[error("Invalid recovery parameter. Supported values: 0 and 1.")] InvalidRecoveryParam { #[cfg(feature = "backtraces")] @@ -86,15 +79,6 @@ impl CryptoError { } } - pub fn message_too_long(limit: usize, actual: usize) -> Self { - CryptoError::MessageTooLong { - limit, - actual, - #[cfg(feature = "backtraces")] - backtrace: Backtrace::capture(), - } - } - pub fn invalid_recovery_param() -> Self { CryptoError::InvalidRecoveryParam { #[cfg(feature = "backtraces")] @@ -106,7 +90,6 @@ impl CryptoError { /// contract VM boundary. pub fn code(&self) -> u32 { match self { - CryptoError::MessageTooLong { .. } => 2, CryptoError::InvalidHashFormat { .. } => 3, CryptoError::InvalidSignatureFormat { .. } => 4, CryptoError::InvalidPubkeyFormat { .. } => 5, @@ -162,18 +145,6 @@ mod tests { } } - #[test] - fn message_too_long_works() { - let error = CryptoError::message_too_long(5, 7); - match error { - CryptoError::MessageTooLong { limit, actual, .. } => { - assert_eq!(limit, 5); - assert_eq!(actual, 7); - } - _ => panic!("wrong error type!"), - } - } - #[test] fn invalid_pubkey_format_works() { let error = CryptoError::invalid_pubkey_format(); diff --git a/packages/crypto/src/lib.rs b/packages/crypto/src/lib.rs index ac2d6482c..97bf244c4 100644 --- a/packages/crypto/src/lib.rs +++ b/packages/crypto/src/lib.rs @@ -10,9 +10,9 @@ mod identity_digest; mod secp256k1; #[doc(hidden)] -pub use crate::ed25519::{ed25519_batch_verify, ed25519_verify}; +pub use crate::ed25519::EDDSA_PUBKEY_LEN; #[doc(hidden)] -pub use crate::ed25519::{BATCH_MAX_LEN, EDDSA_PUBKEY_LEN, MESSAGE_MAX_LEN}; +pub use crate::ed25519::{ed25519_batch_verify, ed25519_verify}; #[doc(hidden)] pub use crate::errors::{CryptoError, CryptoResult}; #[doc(hidden)] diff --git a/packages/std/src/errors/recover_pubkey_error.rs b/packages/std/src/errors/recover_pubkey_error.rs index 86e0c4e13..75af03a7c 100644 --- a/packages/std/src/errors/recover_pubkey_error.rs +++ b/packages/std/src/errors/recover_pubkey_error.rs @@ -62,7 +62,6 @@ impl PartialEq for RecoverPubkeyError { impl From for RecoverPubkeyError { fn from(original: CryptoError) -> Self { match original { - CryptoError::MessageTooLong { .. } => panic!("Conversion not supported"), CryptoError::InvalidHashFormat { .. } => RecoverPubkeyError::InvalidHashFormat, CryptoError::InvalidPubkeyFormat { .. } => panic!("Conversion not supported"), CryptoError::InvalidSignatureFormat { .. } => { diff --git a/packages/std/src/errors/verification_error.rs b/packages/std/src/errors/verification_error.rs index da2fc6113..edc1feef7 100644 --- a/packages/std/src/errors/verification_error.rs +++ b/packages/std/src/errors/verification_error.rs @@ -77,7 +77,6 @@ impl PartialEq for VerificationError { impl From for VerificationError { fn from(original: CryptoError) -> Self { match original { - CryptoError::MessageTooLong { .. } => VerificationError::MessageTooLong, CryptoError::InvalidHashFormat { .. } => VerificationError::InvalidHashFormat, CryptoError::InvalidPubkeyFormat { .. } => VerificationError::InvalidPubkeyFormat, CryptoError::InvalidSignatureFormat { .. } => VerificationError::InvalidSignatureFormat, diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 31212133a..45fcd1c98 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -7,8 +7,7 @@ use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, CryptoError, }; use cosmwasm_crypto::{ - BATCH_MAX_LEN, ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, - MESSAGE_HASH_MAX_LEN, MESSAGE_MAX_LEN, + ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, MESSAGE_HASH_MAX_LEN, }; #[cfg(feature = "iterator")] @@ -42,6 +41,14 @@ const MAX_LENGTH_HUMAN_ADDRESS: usize = 90; 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 +/// 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 +/// larger number of signatures, let us know. +const MAX_COUNT_ED25519_BATCH: usize = 256; /// Max length for a debug message const MAX_LENGTH_DEBUG: usize = 2 * MI; @@ -326,9 +333,9 @@ fn do_secp256k1_verify( | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), - CryptoError::BatchErr { .. } - | CryptoError::InvalidRecoveryParam { .. } - | CryptoError::MessageTooLong { .. } => panic!("Error must not happen for this call"), + CryptoError::BatchErr { .. } | CryptoError::InvalidRecoveryParam { .. } => { + panic!("Error must not happen for this call") + } }, |valid| if valid { 0 } else { 1 }, )) @@ -360,9 +367,9 @@ fn do_secp256k1_recover_pubkey( | CryptoError::InvalidSignatureFormat { .. } | CryptoError::InvalidRecoveryParam { .. } | CryptoError::GenericErr { .. } => Ok(to_high_half(err.code())), - CryptoError::BatchErr { .. } - | CryptoError::InvalidPubkeyFormat { .. } - | CryptoError::MessageTooLong { .. } => panic!("Error must not happen for this call"), + CryptoError::BatchErr { .. } | CryptoError::InvalidPubkeyFormat { .. } => { + panic!("Error must not happen for this call") + } }, } } @@ -373,7 +380,7 @@ fn do_ed25519_verify( signature_ptr: u32, pubkey_ptr: u32, ) -> VmResult { - let message = read_region(&env.memory(), message_ptr, MESSAGE_MAX_LEN)?; + 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)?; @@ -382,8 +389,7 @@ fn do_ed25519_verify( process_gas_info::(env, gas_info)?; Ok(result.map_or_else( |err| match err { - CryptoError::MessageTooLong { .. } - | CryptoError::InvalidPubkeyFormat { .. } + CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), CryptoError::BatchErr { .. } @@ -405,17 +411,17 @@ fn do_ed25519_batch_verify( let messages = read_region( &env.memory(), messages_ptr, - (MESSAGE_MAX_LEN + 4) * BATCH_MAX_LEN, + (MAX_LENGTH_ED25519_MESSAGE + 4) * MAX_COUNT_ED25519_BATCH, )?; let signatures = read_region( &env.memory(), signatures_ptr, - (MAX_LENGTH_ED25519_SIGNATURE + 4) * BATCH_MAX_LEN, + (MAX_LENGTH_ED25519_SIGNATURE + 4) * MAX_COUNT_ED25519_BATCH, )?; let public_keys = read_region( &env.memory(), public_keys_ptr, - (EDDSA_PUBKEY_LEN + 4) * BATCH_MAX_LEN, + (EDDSA_PUBKEY_LEN + 4) * MAX_COUNT_ED25519_BATCH, )?; let messages = decode_sections(&messages); @@ -433,7 +439,6 @@ fn do_ed25519_batch_verify( Ok(result.map_or_else( |err| match err { CryptoError::BatchErr { .. } - | CryptoError::MessageTooLong { .. } | CryptoError::InvalidPubkeyFormat { .. } | CryptoError::InvalidSignatureFormat { .. } | CryptoError::GenericErr { .. } => err.code(), @@ -1561,7 +1566,7 @@ mod tests { let mut msg = hex::decode(EDDSA_MSG_HEX).unwrap(); // extend / break msg - msg.extend_from_slice(&[0x00; MESSAGE_MAX_LEN + 1]); + msg.extend_from_slice(&[0x00; MAX_LENGTH_ED25519_MESSAGE + 1]); let msg_ptr = write_data(&env, &msg); let sig = hex::decode(EDDSA_SIG_HEX).unwrap(); let sig_ptr = write_data(&env, &sig); From 566ab76be06c95a7dd43a981f2b59b04a8cd2b5f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 10:39:34 +0200 Subject: [PATCH 076/402] typo --- packages/crypto/src/ed25519.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/ed25519.rs b/packages/crypto/src/ed25519.rs index 404de9b91..3ada6918e 100644 --- a/packages/crypto/src/ed25519.rs +++ b/packages/crypto/src/ed25519.rs @@ -61,7 +61,7 @@ pub fn ed25519_verify(message: &[u8], signature: &[u8], public_key: &[u8]) -> Cr /// case. /// - The "one-public key, with zero messages and zero signatures" case, is considered the empty /// case. -/// - The empty case (no messages, no signatures a no public keys) returns true. +/// - The empty case (no messages, no signatures and no public keys) returns true. pub fn ed25519_batch_verify( messages: &[&[u8]], signatures: &[&[u8]], From 0497f9fc4e6c344a29341ce237acab0f9b316255 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 10:39:40 +0200 Subject: [PATCH 077/402] Remove `VerificationError::MessageTooLong` too --- packages/std/src/errors/verification_error.rs | 3 --- packages/std/src/imports.rs | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/std/src/errors/verification_error.rs b/packages/std/src/errors/verification_error.rs index edc1feef7..26786596e 100644 --- a/packages/std/src/errors/verification_error.rs +++ b/packages/std/src/errors/verification_error.rs @@ -12,8 +12,6 @@ pub enum VerificationError { BatchErr, #[error("Generic error")] GenericErr, - #[error("Message is longer than supported")] - MessageTooLong, #[error("Invalid hash format")] InvalidHashFormat, #[error("Invalid signature format")] @@ -45,7 +43,6 @@ impl PartialEq for VerificationError { match self { VerificationError::BatchErr => matches!(rhs, VerificationError::BatchErr), VerificationError::GenericErr => matches!(rhs, VerificationError::GenericErr), - VerificationError::MessageTooLong => matches!(rhs, VerificationError::MessageTooLong), VerificationError::InvalidHashFormat => { matches!(rhs, VerificationError::InvalidHashFormat) } diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 4fda9039e..fa386b901 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -279,7 +279,7 @@ impl Api for ExternalApi { match result { 0 => Ok(true), 1 => Ok(false), - 2 => Err(VerificationError::MessageTooLong), + 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), 3 => panic!("InvalidHashFormat must not happen. This is a bug in the VM."), 4 => Err(VerificationError::InvalidSignatureFormat), 5 => Err(VerificationError::InvalidPubkeyFormat), @@ -311,7 +311,7 @@ impl Api for ExternalApi { match result { 0 => Ok(true), 1 => Ok(false), - 2 => Err(VerificationError::MessageTooLong), + 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), 3 => panic!("InvalidHashFormat must not happen. This is a bug in the VM."), 4 => Err(VerificationError::InvalidSignatureFormat), 5 => Err(VerificationError::InvalidPubkeyFormat), From 5edb2c012415a851d1b586bae005bffb5d34e635 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 8 Jun 2021 12:03:24 +0200 Subject: [PATCH 078/402] Implement Sub for Uint128 (closes #858) --- CHANGELOG.md | 4 +++ packages/std/src/math/uint128.rs | 47 ++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1e3d17f2..57806e491 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Implement `Sub` and `SubAssign` for `Uint128` + ### Removed - cosmwasm-std: Make `Uint128` inner field private ([#905]) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 84cd1b726..ab7ba7d1e 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -206,6 +206,22 @@ impl<'a> ops::Add<&'a Uint128> for Uint128 { } } +impl ops::Sub for Uint128 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Uint128(self.u128().checked_sub(rhs.u128()).unwrap()) + } +} + +impl<'a> ops::Sub<&'a Uint128> for Uint128 { + type Output = Self; + + fn sub(self, rhs: &'a Uint128) -> Self { + Uint128(self.u128().checked_sub(rhs.u128()).unwrap()) + } +} + impl ops::AddAssign for Uint128 { fn add_assign(&mut self, rhs: Uint128) { self.0 = self.0.checked_add(rhs.u128()).unwrap(); @@ -218,6 +234,18 @@ impl<'a> ops::AddAssign<&'a Uint128> for Uint128 { } } +impl ops::SubAssign for Uint128 { + fn sub_assign(&mut self, rhs: Uint128) { + self.0 = self.0.checked_sub(rhs.u128()).unwrap(); + } +} + +impl<'a> ops::SubAssign<&'a Uint128> for Uint128 { + fn sub_assign(&mut self, rhs: &'a Uint128) { + self.0 = self.0.checked_sub(rhs.u128()).unwrap(); + } +} + impl Uint128 { /// Returns `self * numerator / denominator` pub fn multiply_ratio, B: Into>( @@ -397,7 +425,8 @@ mod tests { assert_eq!(a + &b, Uint128(35801)); // test - with owned and reference right hand side - assert_eq!((b.checked_sub(a)).unwrap(), Uint128(11111)); + assert_eq!(b - a, Uint128(11111)); + assert_eq!(b - &a, Uint128(11111)); // test += with owned and reference right hand side let mut c = Uint128(300000); @@ -407,6 +436,14 @@ mod tests { d += &b; assert_eq!(d, Uint128(323456)); + // test -= with owned and reference right hand side + let mut c = Uint128(300000); + c -= b; + assert_eq!(c, Uint128(276544)); + let mut d = Uint128(300000); + d -= &b; + assert_eq!(d, Uint128(276544)); + // error result on underflow (- would produce negative result) let underflow_result = a.checked_sub(b); let OverflowError { @@ -417,12 +454,18 @@ mod tests { #[test] #[should_panic] - fn uint128_math_overflow_panics() { + fn uint128_add_overflow_panics() { // almost_max is 2^128 - 10 let almost_max = Uint128(340282366920938463463374607431768211446); let _ = almost_max + Uint128(12); } + #[test] + #[should_panic] + fn uint128_sub_overflow_panics() { + let _ = Uint128(1) - Uint128(2); + } + #[test] fn uint128_multiply_ratio_works() { let base = Uint128(500); From f03b8fe134462ff215fa49760f285cb680579931 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 13:29:53 +0200 Subject: [PATCH 079/402] Better error message for obsolete MessageTooLong return code Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/imports.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index fa386b901..d7a2f7cac 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -279,7 +279,7 @@ impl Api for ExternalApi { match result { 0 => Ok(true), 1 => Ok(false), - 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), + 2 => panic!("Error code 2 unused since CosmWasm 0.15. This is a bug in the VM."), 3 => panic!("InvalidHashFormat must not happen. This is a bug in the VM."), 4 => Err(VerificationError::InvalidSignatureFormat), 5 => Err(VerificationError::InvalidPubkeyFormat), @@ -311,7 +311,7 @@ impl Api for ExternalApi { match result { 0 => Ok(true), 1 => Ok(false), - 2 => panic!("MessageTooLong must not happen. This is a bug in the VM."), + 2 => panic!("Error code 2 unused since CosmWasm 0.15. This is a bug in the VM."), 3 => panic!("InvalidHashFormat must not happen. This is a bug in the VM."), 4 => Err(VerificationError::InvalidSignatureFormat), 5 => Err(VerificationError::InvalidPubkeyFormat), From 4258c1c91cda3190671ec0a993e3abca63b5f894 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 15:36:16 +0200 Subject: [PATCH 080/402] Add the `-c` flag to formatting scripts --- devtools/format_md.sh | 11 ++++++++++- devtools/format_sh.sh | 11 ++++++++++- devtools/format_yml.sh | 11 ++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/devtools/format_md.sh b/devtools/format_md.sh index 3fd16120d..963f5cfb2 100755 --- a/devtools/format_md.sh +++ b/devtools/format_md.sh @@ -2,4 +2,13 @@ set -o errexit -o nounset -o pipefail command -v shellcheck >/dev/null && shellcheck "$0" -npx prettier@2.2.1 --write "./**/*.md" +# Running with -c makes the script only validate instead of editing in place. +op="write" +while getopts c option; do + case "${option}" in + + c) op="check" ;; + esac +done + +npx prettier@2.2.1 --$op "./**/*.md" diff --git a/devtools/format_sh.sh b/devtools/format_sh.sh index 8b950a97d..bfdf9d2d1 100755 --- a/devtools/format_sh.sh +++ b/devtools/format_sh.sh @@ -2,4 +2,13 @@ set -o errexit -o nounset -o pipefail command -v shellcheck >/dev/null && shellcheck "$0" -shfmt -w devtools packages +# Running with -c makes the script only validate instead of editing in place. +op="w" +while getopts c option; do + case "${option}" in + + c) op="d" ;; + esac +done + +shfmt -$op devtools packages diff --git a/devtools/format_yml.sh b/devtools/format_yml.sh index 0295f76eb..3423752d9 100755 --- a/devtools/format_yml.sh +++ b/devtools/format_yml.sh @@ -2,4 +2,13 @@ set -o errexit -o nounset -o pipefail command -v shellcheck >/dev/null && shellcheck "$0" -npx prettier@2.2.1 --write "./**/*.yml" +# Running with -c makes the script only validate instead of editing in place. +op="write" +while getopts c option; do + case "${option}" in + + c) op="check" ;; + esac +done + +npx prettier@2.2.1 --$op "./**/*.yml" From 5d305fce5efeca97414e843275bc809299a56083 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 16:16:34 +0200 Subject: [PATCH 081/402] CI: add a job for validating sh, MD, and YAML --- .circleci/config.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index f71b0d45f..2ab2e9164 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,6 +18,7 @@ workflows: - contract_reflect - contract_staking - fmt + - fmt_extra - clippy - benchmarking: requires: @@ -675,6 +676,24 @@ jobs: - target/debug/deps key: cargocache-v2-fmt-rust:1.51.0-{{ checksum "Cargo.lock" }} + fmt_extra: + docker: + - image: node:16.3.0-buster + steps: + - checkout + - run: + name: Install shfmt + command: curl -sS https://webinstall.dev/shfmt | bash + - run: + name: Validate Markdown files + command: devtools/format_md.sh -c + - run: + name: Validate shell scripts + command: PATH="/root/.local/bin:$PATH" devtools/format_sh.sh -c + - run: + name: Validate YAML files + command: devtools/format_yml.sh -c + clippy: docker: # In this job we use the latest Rust stable in order to check against the From c931ac67e001f13d30edbbbed9a952197cdb0274 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 16:44:30 +0200 Subject: [PATCH 082/402] prettier: Only proseWrap markdown files --- .prettierrc.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.prettierrc.json b/.prettierrc.json index 5b5bd9933..6a82f4e8f 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,3 +1,10 @@ { - "proseWrap": "always" + "overrides": [ + { + "files": "*.md", + "options": { + "proseWrap": "always" + } + } + ] } From fdca3d671203f55c998ef7e1b9cf9e72242b00ef Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 16:44:53 +0200 Subject: [PATCH 083/402] Fix .circleci/config.yml formatting --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ab2e9164..180d78800 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -426,7 +426,6 @@ jobs: - target/wasm32-unknown-unknown/release/deps key: cargocache-v2-contract_ibc_reflect-rust:1.51.0-{{ checksum "Cargo.lock" }} - contract_ibc_reflect_send: docker: - image: rust:1.51.0 From 5c0b04df82e3225f5d02ccf1a4d110831d8fd5cb Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 18:03:44 +0200 Subject: [PATCH 084/402] Add `state` and `cache` folders to FS storage --- CHANGELOG.md | 2 ++ packages/vm/src/cache.rs | 32 +++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9d72773f..6f154b633 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,8 @@ and this project adheres to - cosmwasm-vm: Update `wasmer` to `2.0.0-rc2` - 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. ### Fixed diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 279d18c91..310bdf38c 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -15,7 +15,12 @@ use crate::size::Size; use crate::static_analysis::{deserialize_wasm, has_ibc_entry_points}; use crate::wasm_backend::{compile, make_runtime_store}; +const STATE_DIR: &str = "state"; +// Things related to the state of the blockchain. const WASM_DIR: &str = "wasm"; + +const CACHE_DIR: &str = "cache"; +// Cacheable things. const MODULES_DIR: &str = "modules"; #[derive(Debug, Default, Clone, Copy)] @@ -91,11 +96,24 @@ where memory_cache_size, instance_memory_limit, } = options; - let wasm_path = base_dir.join(WASM_DIR); - create_dir_all(&wasm_path) - .map_err(|e| VmError::cache_err(format!("Error creating Wasm dir for cache: {}", e)))?; - let fs_cache = FileSystemCache::new(base_dir.join(MODULES_DIR)) + let state_path = base_dir.join(STATE_DIR); + let cache_path = base_dir.join(CACHE_DIR); + + 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 + )) + })?; + } + + let fs_cache = FileSystemCache::new(cache_path.join(MODULES_DIR)) .map_err(|e| VmError::cache_err(format!("Error file system cache: {}", e)))?; Ok(Cache { supported_features, @@ -494,7 +512,11 @@ mod tests { let checksum = cache.save_wasm(CONTRACT).unwrap(); // Corrupt cache file - let filepath = tmp_dir.path().join(WASM_DIR).join(&checksum.to_hex()); + let filepath = tmp_dir + .path() + .join(STATE_DIR) + .join(WASM_DIR) + .join(&checksum.to_hex()); let mut file = OpenOptions::new().write(true).open(filepath).unwrap(); file.write_all(b"broken data").unwrap(); From 2ad1a7411e5dfdf45a6f2f4ce05125e3626dca11 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 16 Jun 2021 18:54:00 +0200 Subject: [PATCH 085/402] Update `wasmer` to `2.0.0` --- CHANGELOG.md | 2 +- Cargo.lock | 71 +++++++++++++++----------- contracts/burner/Cargo.lock | 73 +++++++++++++++++---------- contracts/crypto-verify/Cargo.lock | 73 +++++++++++++++++---------- contracts/hackatom/Cargo.lock | 73 +++++++++++++++++---------- contracts/ibc-reflect-send/Cargo.lock | 73 +++++++++++++++++---------- contracts/ibc-reflect/Cargo.lock | 73 +++++++++++++++++---------- contracts/queue/Cargo.lock | 73 +++++++++++++++++---------- contracts/reflect/Cargo.lock | 73 +++++++++++++++++---------- contracts/staking/Cargo.lock | 73 +++++++++++++++++---------- packages/vm/Cargo.toml | 4 +- 11 files changed, 413 insertions(+), 248 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9d72773f..854baa508 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,7 @@ and this project adheres to 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-rc2` +- 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`. diff --git a/Cargo.lock b/Cargo.lock index 5fcf4aeab..b425fab46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -880,9 +880,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memmap2" @@ -955,12 +955,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1689,8 +1690,9 @@ checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1712,8 +1714,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1730,8 +1733,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1749,8 +1753,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1767,8 +1772,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1778,8 +1784,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1798,8 +1805,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1819,8 +1827,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1836,8 +1845,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1847,10 +1857,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1858,8 +1869,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1870,8 +1882,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index d084b516a..9b25b0f63 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -693,6 +693,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -745,12 +751,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1275,8 +1282,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1298,8 +1306,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1316,8 +1325,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1335,8 +1345,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1353,8 +1364,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1364,8 +1376,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1384,8 +1397,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1405,8 +1419,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1422,8 +1437,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1433,10 +1449,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1444,8 +1461,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1456,8 +1474,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 5fe1baa43..bdbb6fa51 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -732,6 +732,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -784,12 +790,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1342,8 +1349,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1365,8 +1373,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1383,8 +1392,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1402,8 +1412,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1420,8 +1431,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1431,8 +1443,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1451,8 +1464,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1472,8 +1486,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1489,8 +1504,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1500,10 +1516,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1511,8 +1528,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1523,8 +1541,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 2ce905af8..68dfb8429 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -704,6 +704,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -756,12 +762,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1286,8 +1293,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1309,8 +1317,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1327,8 +1336,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1346,8 +1356,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1364,8 +1375,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1375,8 +1387,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1395,8 +1408,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1416,8 +1430,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1433,8 +1448,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1444,10 +1460,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1455,8 +1472,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1467,8 +1485,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 708d3d23c..ab199e75f 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -702,6 +702,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -754,12 +760,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1284,8 +1291,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1307,8 +1315,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1325,8 +1334,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1344,8 +1354,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1362,8 +1373,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1373,8 +1385,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1393,8 +1406,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1414,8 +1428,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1431,8 +1446,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1442,10 +1458,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1453,8 +1470,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1465,8 +1483,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index dd326fe36..36f76ca74 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -702,6 +702,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -754,12 +760,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1284,8 +1291,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1307,8 +1315,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1325,8 +1334,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1344,8 +1354,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1362,8 +1373,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1373,8 +1385,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1393,8 +1406,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1414,8 +1428,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1431,8 +1446,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1442,10 +1458,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1453,8 +1470,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1465,8 +1483,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index c6b098f75..eddc4aa70 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -682,6 +682,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -734,12 +740,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1275,8 +1282,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1298,8 +1306,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1316,8 +1325,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1335,8 +1345,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1353,8 +1364,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1364,8 +1376,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1384,8 +1397,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1405,8 +1419,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1422,8 +1437,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1433,10 +1449,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1444,8 +1461,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1456,8 +1474,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 28b19e4eb..1d770127c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -690,6 +690,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -742,12 +748,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1285,8 +1292,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1308,8 +1316,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1326,8 +1335,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1345,8 +1355,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1363,8 +1374,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1374,8 +1386,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1394,8 +1407,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1415,8 +1429,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1432,8 +1447,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1443,10 +1459,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1454,8 +1471,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1466,8 +1484,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index e70227058..96b847d73 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -696,6 +696,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + [[package]] name = "memmap2" version = "0.2.0" @@ -748,12 +754,13 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "object" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] @@ -1312,8 +1319,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasmer" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -1335,8 +1343,9 @@ dependencies = [ [[package]] name = "wasmer-compiler" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", "loupe", @@ -1353,8 +1362,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1372,8 +1382,9 @@ dependencies = [ [[package]] name = "wasmer-compiler-singlepass" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" dependencies = [ "byteorder", "dynasm", @@ -1390,8 +1401,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1401,8 +1413,9 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", "lazy_static", @@ -1421,8 +1434,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1442,8 +1456,9 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ "cfg-if 1.0.0", "leb128", @@ -1459,8 +1474,9 @@ dependencies = [ [[package]] name = "wasmer-middlewares" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" dependencies = [ "loupe", "wasmer", @@ -1470,10 +1486,11 @@ dependencies = [ [[package]] name = "wasmer-object" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.24.0", + "object 0.25.3", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1481,8 +1498,9 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ "indexmap", "loupe", @@ -1493,8 +1511,9 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.0.0-rc2" -source = "git+https://github.com/wasmerio/wasmer?tag=2.0.0-rc2#2e89003eaa13a40d9af9137219d8e092e8cc17cc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 8940d1f51..fcd91d5b9 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -45,8 +45,8 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " serde_json = "1.0" sha2 = "0.9.1" thiserror = "1.0" -wasmer = { git = "https://github.com/wasmerio/wasmer", tag = "2.0.0-rc2", default-features = false, features = ["cranelift", "universal", "singlepass"] } -wasmer-middlewares = { git = "https://github.com/wasmerio/wasmer", tag = "2.0.0-rc2" } +wasmer = { version = "2.0.0", default-features = false, features = ["cranelift", "universal", "singlepass"] } +wasmer-middlewares = "2.0.0" loupe = "0.1.2" # Wasmer git/local (used for quick local debugging or patching) From 5ab0f49d75af3476c7fe2dc81277f5c41169f2ce Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 17 Jun 2021 09:19:18 +0200 Subject: [PATCH 086/402] Improve documentation of the Event type --- packages/std/src/results/subcall.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index ceec8a54e..26746d9d0 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -62,9 +62,16 @@ pub struct SubcallResponse { pub data: Option, } -/// a full sdk event +/// A full Cosmos SDK event as documented in +/// https://docs.cosmos.network/v0.42/core/events.html. +/// +/// This version uses string attributes (similar to +/// https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70), +/// which then get magically converted to bytes for Tendermint somewhere between +/// the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct Event { + /// The event type. This is renamed to "kind" because "type" is reserved in Rust. This sucks, we know. #[serde(rename = "type")] pub kind: String, pub attributes: Vec, From b7cdec35813406a53723475b42c32f2336f9bcc2 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 11:24:39 +0200 Subject: [PATCH 087/402] Add helpers around SubMsg construction --- packages/std/src/lib.rs | 5 ++- packages/std/src/results/mod.rs | 4 +- packages/std/src/results/subcall.rs | 68 +++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 0cfa80fdb..867cc79d4 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,8 +52,9 @@ pub use crate::query::{ #[cfg(feature = "stargate")] pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; pub use crate::results::{ - attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, Empty, - Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubcallResponse, SystemResult, WasmMsg, + attr, call, subcall, subcall_with_limit, wasm_execute, wasm_instantiate, Attribute, BankMsg, + ContractResult, CosmosMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, + SubcallResponse, SystemResult, WasmMsg, }; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index ac2057bef..2af2588e8 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -17,5 +17,7 @@ pub use cosmos_msg::{DistributionMsg, StakingMsg}; pub use empty::Empty; pub use query::QueryResponse; pub use response::Response; -pub use subcall::{Event, Reply, ReplyOn, SubMsg, SubcallResponse}; +pub use subcall::{ + call, subcall, subcall_with_limit, Event, Reply, ReplyOn, SubMsg, SubcallResponse, +}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 26746d9d0..ffb9b9734 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -18,6 +18,8 @@ pub enum ReplyOn { Error, /// Only callback if SubMsg was successful, no callback on error case Success, + /// Never make a callback - this is like the original CosmosMsg semantics + Never, } impl Default for ReplyOn { @@ -45,6 +47,72 @@ where pub reply_on: ReplyOn, } +/// This is used for cases when we use ReplyOn::Never and the id doesn't matter +pub const UNUSED_MSG_ID: u64 = 123456789; + +/// We implement thisas a shortcut so all existing code doesn't break. +/// Up to 0.14, we could do something like: +/// let messages = vec![BankMsg::Send { .. }.into()]; +/// In order to construct the response. +/// +/// With 0.15, we move to requiring SubMsg there, but this allows the same +/// `.into()` call to convert the BankMsg into a proper SubMsg with no reply. +impl Into> for CosmosMsg +where + T: Clone + fmt::Debug + PartialEq + JsonSchema, +{ + fn into(self: CosmosMsg) -> SubMsg { + SubMsg { + id: UNUSED_MSG_ID, + msg: self, + reply_on: ReplyOn::Never, + gas_limit: None, + } + } +} + +/// call takes eg. BankMsg::Send{} and wraps it into a SubMsg with normal message sematics (no reply) +pub fn call(msg: M) -> SubMsg +where + M: Into>, + T: Clone + fmt::Debug + PartialEq + JsonSchema, +{ + SubMsg { + id: UNUSED_MSG_ID, + msg: msg.into(), + reply_on: ReplyOn::Never, + gas_limit: None, + } +} + +/// subcall takes eg. BankMsg::Send{} and sets up for a reply. No gas limit is set. +pub fn subcall(msg: M, id: u64, reply_on: ReplyOn) -> SubMsg +where + M: Into>, + T: Clone + fmt::Debug + PartialEq + JsonSchema, +{ + SubMsg { + id, + msg: msg.into(), + reply_on, + gas_limit: None, + } +} + +/// subcall_with_limit is like subcall but allows setting a gas limit +pub fn subcall_with_limit(msg: M, id: u64, reply_on: ReplyOn, gas_limit: u64) -> SubMsg +where + M: Into>, + T: Clone + fmt::Debug + PartialEq + JsonSchema, +{ + SubMsg { + id, + msg: msg.into(), + reply_on, + gas_limit: Some(gas_limit), + } +} + /// The result object returned to `reply`. We always get the ID from the submessage /// back and then must handle success and error cases ourselves. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] From 1f07ad0ac00ac22b7d17414a71741039abf09c82 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 11:31:24 +0200 Subject: [PATCH 088/402] Remove submessages --- packages/std/src/results/contract_result.rs | 5 +- packages/std/src/results/response.rs | 75 +++++++++------------ 2 files changed, 33 insertions(+), 47 deletions(-) diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index eda69703f..7f7c6c690 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -101,7 +101,7 @@ mod tests { let result: ContractResult = ContractResult::Ok(Response::default()); assert_eq!( to_vec(&result).unwrap(), - br#"{"ok":{"submessages":[],"messages":[],"attributes":[],"data":null}}"#.to_vec() + br#"{"ok":{"messages":[],"attributes":[],"data":null}}"#.to_vec() ); let result: ContractResult = ContractResult::Err("broken".to_string()); @@ -117,8 +117,7 @@ mod tests { assert_eq!(result, ContractResult::Ok("foo".to_string())); let result: ContractResult = - from_slice(br#"{"ok":{"submessages":[],"messages":[],"attributes":[],"data":null}}"#) - .unwrap(); + from_slice(br#"{"ok":{"messages":[],"attributes":[],"data":null}}"#).unwrap(); assert_eq!(result, ContractResult::Ok(Response::default())); let result: ContractResult = from_slice(br#"{"error":"broken"}"#).unwrap(); diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 85adfa418..f8c13dc6d 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -2,10 +2,9 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt; -use crate::{Binary, ReplyOn}; +use crate::Binary; -use super::{Attribute, CosmosMsg, Empty}; -use crate::results::SubMsg; +use super::{Attribute, Empty, SubMsg}; /// A response of a contract entry point, such as `instantiate`, `execute` or `migrate`. /// @@ -74,14 +73,11 @@ pub struct Response where T: Clone + fmt::Debug + PartialEq + JsonSchema, { - /// Optional list of "subcalls" to make. These will be executed in order - /// (and this contract's subcall_response entry point invoked) - /// *before* any of the "fire and forget" messages get executed. - pub submessages: Vec>, - /// After any submessages are processed, these are all dispatched in the host blockchain. - /// If they all succeed, then the transaction is committed. If any fail, then the transaction - /// and any local contract state changes are reverted. - pub messages: Vec>, + /// 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". + /// Use `call` or `msg.into()` to create messages with the older "fire and forget" semantics. + pub messages: Vec>, /// The attributes that will be emitted as part of a "wasm" event pub attributes: Vec, pub data: Option, @@ -93,7 +89,6 @@ where { fn default() -> Self { Response { - submessages: vec![], messages: vec![], attributes: vec![], data: None, @@ -116,26 +111,10 @@ where }); } - pub fn add_message>>(&mut self, msg: U) { + pub fn add_message>>(&mut self, msg: U) { self.messages.push(msg.into()); } - pub fn add_submessage>>( - &mut self, - id: u64, - msg: U, - gas_limit: Option, - reply_on: ReplyOn, - ) { - let sub = SubMsg { - id, - msg: msg.into(), - gas_limit, - reply_on, - }; - self.submessages.push(sub); - } - pub fn set_data>(&mut self, data: U) { self.data = Some(data.into()); } @@ -145,26 +124,34 @@ where mod tests { use super::super::BankMsg; use super::*; + use crate::results::subcall::{ReplyOn, UNUSED_MSG_ID}; use crate::{coins, from_slice, to_vec}; #[test] fn can_serialize_and_deserialize_init_response() { let original = Response { - submessages: vec![SubMsg { - id: 12, - msg: BankMsg::Send { - to_address: String::from("checker"), - amount: coins(888, "moon"), - } - .into(), - gas_limit: Some(12345u64), - reply_on: ReplyOn::Always, - }], - messages: vec![BankMsg::Send { - to_address: String::from("you"), - amount: coins(1015, "earth"), - } - .into()], + messages: vec![ + SubMsg { + id: 12, + msg: BankMsg::Send { + to_address: String::from("checker"), + amount: coins(888, "moon"), + } + .into(), + gas_limit: Some(12345u64), + reply_on: ReplyOn::Always, + }, + SubMsg { + id: UNUSED_MSG_ID, + msg: BankMsg::Send { + to_address: String::from("you"), + amount: coins(1015, "earth"), + } + .into(), + gas_limit: None, + reply_on: ReplyOn::Never, + }, + ], attributes: vec![Attribute { key: "action".to_string(), value: "release".to_string(), From 578ad954ca7a8d19235e7cde3528875994438ff5 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 14:32:08 +0200 Subject: [PATCH 089/402] Fix up tests in std --- packages/std/src/coins.rs | 8 ++++---- packages/std/src/results/contract_result.rs | 2 +- packages/std/src/results/response.rs | 1 - packages/std/src/results/subcall.rs | 13 +++++-------- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 735705d07..3ef53f831 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -41,10 +41,10 @@ impl fmt::Display for Coin { /// let tip = coins(123, "ucosm"); /// /// let mut response: Response = Default::default(); -/// response.messages = vec![CosmosMsg::Bank(BankMsg::Send { +/// response.messages = vec![BankMsg::Send { /// to_address: info.sender.into(), /// amount: tip, -/// })]; +/// }.into()]; /// ``` pub fn coins>(amount: u128, denom: S) -> Vec { vec![coin(amount, denom)] @@ -55,7 +55,7 @@ pub fn coins>(amount: u128, denom: S) -> Vec { /// # Examples /// /// ``` -/// # use cosmwasm_std::{coin, BankMsg, CosmosMsg, Response}; +/// # use cosmwasm_std::{call, coin, BankMsg, CosmosMsg, Response}; /// # use cosmwasm_std::testing::{mock_env, mock_info}; /// # let env = mock_env(); /// # let info = mock_info("sender", &[]); @@ -65,7 +65,7 @@ pub fn coins>(amount: u128, denom: S) -> Vec { /// ]; /// /// let mut response: Response = Default::default(); -/// response.messages = vec![CosmosMsg::Bank(BankMsg::Send { +/// response.messages = vec![call(BankMsg::Send { /// to_address: info.sender.into(), /// amount: tip, /// })]; diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index 7f7c6c690..ef0cfdf20 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -18,7 +18,7 @@ use std::fmt; /// # 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":{"submessages":[],"messages":[],"attributes":[],"data":null}}"#.to_vec()); +/// assert_eq!(to_vec(&result).unwrap(), br#"{"ok":{"messages":[],"attributes":[],"data":null}}"#.to_vec()); /// ``` /// /// Failure: diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index f8c13dc6d..3af75ceff 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -31,7 +31,6 @@ use super::{Attribute, Empty, SubMsg}; /// // ... /// /// Ok(Response { -/// submessages: vec![], /// messages: vec![], /// attributes: vec![attr("action", "instantiate")], /// data: None, diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index ffb9b9734..20e209b99 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -57,17 +57,14 @@ pub const UNUSED_MSG_ID: u64 = 123456789; /// /// With 0.15, we move to requiring SubMsg there, but this allows the same /// `.into()` call to convert the BankMsg into a proper SubMsg with no reply. -impl Into> for CosmosMsg +impl From for SubMsg where + M: Into>, T: Clone + fmt::Debug + PartialEq + JsonSchema, { - fn into(self: CosmosMsg) -> SubMsg { - SubMsg { - id: UNUSED_MSG_ID, - msg: self, - reply_on: ReplyOn::Never, - gas_limit: None, - } + #[inline] + fn from(msg: M) -> SubMsg { + call(msg) } } From 7229b8c9611a7bb3b27decde314bb60e8ff6d9dc Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 14:49:01 +0200 Subject: [PATCH 090/402] Update burner and reflect contracts --- contracts/burner/src/contract.rs | 1 - contracts/reflect/schema/execute_msg.json | 3 ++- .../schema/response_for__custom_msg.json | 17 +++++----------- contracts/reflect/src/contract.rs | 20 +++++++++---------- contracts/reflect/tests/integration.rs | 12 +++++------ 5 files changed, 23 insertions(+), 30 deletions(-) diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index 93a15620b..7037d943d 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -39,7 +39,6 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult let data_msg = format!("burnt {} keys", count).into_bytes(); Ok(Response { - submessages: vec![], messages: vec![send.into()], attributes: vec![attr("action", "burn"), attr("payout", msg.payout)], data: Some(data_msg.into()), diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index c93b3084b..4c42b6a50 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -484,7 +484,8 @@ "enum": [ "always", "error", - "success" + "success", + "never" ] }, "StakingMsg": { diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 859982100..07baf833f 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -1,12 +1,11 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Response_for_CustomMsg", - "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response { submessages: vec![], messages: vec![], attributes: vec![attr(\"action\", \"instantiate\")], data: None, }) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new(); // ... response.add_attribute(\"Let the\", \"hacking begin\"); // ... response.add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }); response.add_attribute(\"foo\", \"bar\"); // ... response.set_data(Binary::from(b\"the result data\")); Ok(response) } ```", + "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response { messages: vec![], attributes: vec![attr(\"action\", \"instantiate\")], data: None, }) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new(); // ... response.add_attribute(\"Let the\", \"hacking begin\"); // ... response.add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }); response.add_attribute(\"foo\", \"bar\"); // ... response.set_data(Binary::from(b\"the result data\")); Ok(response) } ```", "type": "object", "required": [ "attributes", - "messages", - "submessages" + "messages" ], "properties": { "attributes": { @@ -27,14 +26,7 @@ ] }, "messages": { - "description": "After any submessages are processed, these are all dispatched in the host blockchain. If they all succeed, then the transaction is committed. If any fail, then the transaction and any local contract state changes are reverted.", - "type": "array", - "items": { - "$ref": "#/definitions/CosmosMsg_for_CustomMsg" - } - }, - "submessages": { - "description": "Optional list of \"subcalls\" to make. These will be executed in order (and this contract's subcall_response entry point invoked) *before* any of the \"fire and forget\" messages get executed.", + "description": "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\". Use `call` or `msg.into()` to create messages with the older \"fire and forget\" semantics.", "type": "array", "items": { "$ref": "#/definitions/SubMsg_for_CustomMsg" @@ -472,7 +464,8 @@ "enum": [ "always", "error", - "success" + "success", + "never" ] }, "StakingMsg": { diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index c40bbc1d3..04b4fda69 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - attr, entry_point, to_binary, to_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Env, - MessageInfo, QueryRequest, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, + attr, call, entry_point, to_binary, to_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, + Env, MessageInfo, QueryRequest, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SystemResult, }; @@ -53,9 +53,9 @@ pub fn try_reflect( if msgs.is_empty() { return Err(ReflectError::MessagesEmpty); } + let messages = msgs.into_iter().map(call).collect(); let res = Response { - submessages: vec![], - messages: msgs, + messages, attributes: vec![attr("action", "reflect")], data: None, }; @@ -80,8 +80,7 @@ pub fn try_reflect_subcall( return Err(ReflectError::MessagesEmpty); } let res = Response { - submessages: msgs, - messages: vec![], + messages: msgs, attributes: vec![attr("action", "reflect_subcall")], data: None, }; @@ -217,6 +216,7 @@ mod tests { }; let info = mock_info("creator", &[]); let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); + let payload: Vec<_> = payload.into_iter().map(call).collect(); assert_eq!(payload, res.messages); } @@ -289,6 +289,7 @@ mod tests { }; let info = mock_info("creator", &[]); let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); + let payload: Vec<_> = payload.into_iter().map(call).collect(); assert_eq!(payload, res.messages); } @@ -420,10 +421,9 @@ mod tests { }; let info = mock_info("creator", &[]); let mut res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - assert_eq!(1, res.submessages.len()); - let submsg = res.submessages.pop().expect("must have a submessage"); - assert_eq!(payload, submsg); + assert_eq!(1, res.messages.len()); + let msg = res.messages.pop().expect("must have a message"); + assert_eq!(payload, msg); } // this mocks out what happens after reflect_subcall diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 63cc8eb85..fca8acede 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -18,8 +18,8 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - attr, coin, coins, from_binary, BankMsg, Binary, Coin, ContractResult, Event, Reply, Response, - StakingMsg, SubMsg, SubcallResponse, SystemResult, + attr, call, coin, coins, from_binary, BankMsg, Binary, Coin, ContractResult, Event, Reply, + Response, StakingMsg, SubMsg, SubcallResponse, SystemResult, }; use cosmwasm_vm::{ testing::{ @@ -103,6 +103,7 @@ fn reflect() { let res: Response = execute(&mut deps, mock_env(), info, msg).unwrap(); // should return payload + let payload: Vec<_> = payload.into_iter().map(call).collect(); assert_eq!(payload, res.messages); } @@ -211,10 +212,9 @@ fn reflect_subcall() { }; let info = mock_info("creator", &[]); let mut res: Response = execute(&mut deps, mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - assert_eq!(1, res.submessages.len()); - let submsg = res.submessages.pop().expect("must have a submessage"); - assert_eq!(payload, submsg); + assert_eq!(1, res.messages.len()); + let msg = res.messages.pop().expect("must have a message"); + assert_eq!(payload, msg); } // this mocks out what happens after reflect_subcall From 241b08afc75ff582fe3ac0462b2a4fc23b976817 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 14:53:58 +0200 Subject: [PATCH 091/402] Remove submessages from Ibc Responses as well --- packages/std/src/ibc.rs | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 9179cc320..73b0f8388 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -9,7 +9,7 @@ use std::fmt; use crate::binary::Binary; use crate::coins::Coin; -use crate::results::{Attribute, CosmosMsg, Empty, SubMsg}; +use crate::results::{Attribute, Empty, SubMsg}; use crate::timestamp::Timestamp; /// These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts @@ -202,14 +202,11 @@ pub struct IbcBasicResponse where T: Clone + fmt::Debug + PartialEq + JsonSchema, { - /// Optional list of "subcalls" to make. These will be executed in order - /// (and this contract's subcall_response entry point invoked) - /// *before* any of the "fire and forget" messages get executed. - pub submessages: Vec>, - /// After any submessages are processed, these are all dispatched in the host blockchain. - /// If they all succeed, then the transaction is committed. If any fail, then the transaction - /// and any local contract state changes are reverted. - pub messages: Vec>, + /// 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". + /// Use `call` or `msg.into()` to create messages with the older "fire and forget" semantics. + pub messages: Vec>, /// The attributes that will be emitted as part of a "wasm" event pub attributes: Vec, } @@ -220,7 +217,6 @@ where { fn default() -> Self { IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![], } @@ -240,14 +236,11 @@ where /// The bytes we return to the contract that sent the packet. /// This may represent a success or error of exection pub acknowledgement: Binary, - /// Optional list of "subcalls" to make. These will be executed in order - /// (and this contract's subcall_response entry point invoked) - /// *before* any of the "fire and forget" messages get executed. - pub submessages: Vec>, - /// After any submessages are processed, these are all dispatched in the host blockchain. - /// If they all succeed, then the transaction is committed. If any fail, then the transaction - /// and any local contract state changes are reverted. - pub messages: Vec>, + /// 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". + /// Use `call` or `msg.into()` to create messages with the older "fire and forget" semantics. + pub messages: Vec>, /// The attributes that will be emitted as part of a "wasm" event pub attributes: Vec, } @@ -259,7 +252,6 @@ where fn default() -> Self { IbcReceiveResponse { acknowledgement: Binary(vec![]), - submessages: vec![], messages: vec![], attributes: vec![], } From 30d2b3b9216cba522aa9688c33149eda11d99900 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 15:11:40 +0200 Subject: [PATCH 092/402] Update ibc-reflect contract --- .../schema/acknowledgement_msg_balances.json | 2 +- .../schema/acknowledgement_msg_dispatch.json | 2 +- .../schema/acknowledgement_msg_who_am_i.json | 2 +- contracts/ibc-reflect/src/contract.rs | 65 ++++++------------- contracts/ibc-reflect/tests/integration.rs | 23 +++---- 5 files changed, 33 insertions(+), 61 deletions(-) diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json b/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json index 3b61ef769..6373205d7 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\":{\"submessages\":[],\"messages\":[],\"attributes\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", + "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\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", "anyOf": [ { "type": "object", diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json b/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json index ae2723da8..45ad1902d 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\":{\"submessages\":[],\"messages\":[],\"attributes\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", + "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\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", "anyOf": [ { "type": "object", 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 ded83faf4..01e4f720f 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\":{\"submessages\":[],\"messages\":[],\"attributes\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", + "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\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", "anyOf": [ { "type": "object", diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 4af0858cb..1634915b1 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,8 +1,8 @@ use cosmwasm_std::{ - attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, - CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, IbcBasicResponse, IbcChannel, - IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, ReplyOn, - Response, StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, + attr, entry_point, from_slice, subcall, to_binary, wasm_execute, BankMsg, Binary, + ContractResult, CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, + IbcBasicResponse, IbcChannel, IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, + QueryResponse, Reply, ReplyOn, Response, StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, }; use crate::msg::{ @@ -29,10 +29,8 @@ pub fn instantiate( config(deps.storage).save(&cfg)?; Ok(Response { - submessages: vec![], - messages: vec![], attributes: vec![attr("action", "instantiate")], - data: None, + ..Response::default() }) } @@ -86,10 +84,8 @@ pub fn handle_init_callback(deps: DepsMut, response: SubcallResponse) -> StdResu })?; Ok(Response { - submessages: vec![], - messages: vec![], attributes: vec![attr("action", "execute_init_callback")], - data: None, + ..Response::default() }) } @@ -167,19 +163,13 @@ pub fn ibc_channel_connect( funds: vec![], label: format!("ibc-reflect-{}", &chan_id), }; - let sub_msg = SubMsg { - id: INIT_CALLBACK_ID, - msg: msg.into(), - gas_limit: None, - reply_on: ReplyOn::Success, - }; + let msg = subcall(msg, INIT_CALLBACK_ID, ReplyOn::Success); // store the channel id for the reply handler pending_channel(deps.storage).save(&chan_id)?; Ok(IbcBasicResponse { - messages: vec![], - submessages: vec![sub_msg], + messages: vec![msg], attributes: vec![attr("action", "ibc_connect"), attr("channel_id", chan_id)], }) } @@ -199,7 +189,7 @@ pub fn ibc_channel_close( // transfer current balance if any (steal the money) let amount = deps.querier.query_all_balances(&reflect_addr)?; - let messages: Vec> = if !amount.is_empty() { + let messages: Vec> = if !amount.is_empty() { let bank_msg = BankMsg::Send { to_address: env.contract.address.into(), amount, @@ -215,7 +205,6 @@ pub fn ibc_channel_close( let steal_funds = !messages.is_empty(); Ok(IbcBasicResponse { - submessages: vec![], messages, attributes: vec![ attr("action", "ibc_close"), @@ -263,7 +252,6 @@ pub fn ibc_packet_receive( let acknowledgement = encode_ibc_error(format!("invalid packet: {}", e)); Ok(IbcReceiveResponse { acknowledgement, - submessages: vec![], messages: vec![], attributes: vec![], }) @@ -280,7 +268,6 @@ fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult StdResult StdResult { Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "ibc_packet_ack")], }) @@ -357,7 +336,6 @@ pub fn ibc_packet_timeout( _packet: IbcPacket, ) -> StdResult { Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "ibc_packet_timeout")], }) @@ -417,8 +395,8 @@ mod tests { // then we connect (with counter-party version set) let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); - assert_eq!(1, res.submessages.len()); - let id = res.submessages[0].id; + assert_eq!(1, res.messages.len()); + let id = res.messages[0].id; // fake a reply and ensure this works let response = Reply { @@ -471,15 +449,15 @@ mod tests { let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.as_mut(), mock_env(), handshake_connect).unwrap(); // and set up a reflect account - assert_eq!(1, res.submessages.len()); - let id = res.submessages[0].id; + assert_eq!(1, res.messages.len()); + let id = res.messages[0].id; if let CosmosMsg::Wasm(WasmMsg::Instantiate { admin, code_id, msg: _, funds, label, - }) = &res.submessages[0].msg + }) = &res.messages[0].msg { assert_eq!(*admin, None); assert_eq!(*code_id, REFLECT_ID); @@ -568,16 +546,15 @@ mod tests { ack.unwrap(); // and we dispatch the BankMsg via submessage - assert_eq!(0, res.messages.len()); - assert_eq!(1, res.submessages.len()); - assert_eq!(RECEIVE_DISPATCH_ID, res.submessages[0].id); + assert_eq!(1, res.messages.len()); + assert_eq!(RECEIVE_DISPATCH_ID, res.messages[0].id); // parse the output, ensuring it matches if let CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, funds, - }) = &res.submessages[0].msg + }) = &res.messages[0].msg { assert_eq!(account, contract_addr.as_str()); assert_eq!(0, funds.len()); @@ -600,7 +577,7 @@ mod tests { let packet = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); let res = ibc_packet_receive(deps.as_mut(), mock_env(), packet).unwrap(); // we didn't dispatch anything - assert_eq!(0, res.submessages.len()); + 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`"); @@ -634,7 +611,7 @@ mod tests { assert_eq!(1, res.messages.len()); if let CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, .. - }) = &res.messages[0] + }) = &res.messages[0].msg { assert_eq!(contract_addr.as_str(), account); let reflect: ReflectExecuteMsg = from_slice(msg).unwrap(); diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index c85f3ff92..6ba171e44 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -85,8 +85,8 @@ fn connect>( // then we connect (with counter-party version set) let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); - assert_eq!(1, res.submessages.len()); - let id = res.submessages[0].id; + assert_eq!(1, res.messages.len()); + let id = res.messages[0].id; // fake a reply and ensure this works let response = Reply { @@ -141,15 +141,15 @@ fn proper_handshake_flow() { let res: IbcBasicResponse = ibc_channel_connect(&mut deps, mock_env(), handshake_connect).unwrap(); // and set up a reflect account - assert_eq!(1, res.submessages.len()); - let id = res.submessages[0].id; + assert_eq!(1, res.messages.len()); + let id = res.messages[0].id; if let CosmosMsg::Wasm(WasmMsg::Instantiate { admin, code_id, msg: _, funds, label, - }) = &res.submessages[0].msg + }) = &res.messages[0].msg { assert_eq!(*admin, None); assert_eq!(*code_id, REFLECT_ID); @@ -234,10 +234,6 @@ fn handle_dispatch_packet() { // receive a packet for an unregistered channel returns app-level error (not Result::Err) let packet = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), packet).unwrap(); - println!( - "{}", - String::from_utf8(res.acknowledgement.0.clone()).unwrap() - ); // assert app-level success let ack: AcknowledgementMsg = @@ -245,16 +241,15 @@ fn handle_dispatch_packet() { ack.unwrap(); // and we dispatch the BankMsg - assert_eq!(0, res.messages.len()); - assert_eq!(1, res.submessages.len()); - assert_eq!(RECEIVE_DISPATCH_ID, res.submessages[0].id); + assert_eq!(1, res.messages.len()); + assert_eq!(RECEIVE_DISPATCH_ID, res.messages[0].id); // parse the output, ensuring it matches if let CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, funds, - }) = &res.submessages[0].msg + }) = &res.messages[0].msg { assert_eq!(account, contract_addr.as_str()); assert_eq!(0, funds.len()); @@ -277,7 +272,7 @@ fn handle_dispatch_packet() { let packet = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), packet).unwrap(); // we didn't dispatch anything - assert_eq!(0, res.submessages.len()); + assert_eq!(0, res.messages.len()); // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); From 6c9cb1ff5e0535d47eec2d2652507197ebb0fd49 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 15:22:23 +0200 Subject: [PATCH 093/402] Replace subcall -> SubMsg::new --- contracts/ibc-reflect/src/contract.rs | 6 ++-- packages/std/src/lib.rs | 6 ++-- packages/std/src/results/mod.rs | 4 +-- packages/std/src/results/subcall.rs | 42 ++++++++++++++------------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 1634915b1..4cca85dba 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - attr, entry_point, from_slice, subcall, to_binary, wasm_execute, BankMsg, Binary, + attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, ReplyOn, Response, StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, @@ -163,7 +163,7 @@ pub fn ibc_channel_connect( funds: vec![], label: format!("ibc-reflect-{}", &chan_id), }; - let msg = subcall(msg, INIT_CALLBACK_ID, ReplyOn::Success); + let msg = SubMsg::new(msg, INIT_CALLBACK_ID, ReplyOn::Success); // store the channel id for the reply handler pending_channel(deps.storage).save(&chan_id)?; @@ -306,7 +306,7 @@ fn receive_dispatch( let wasm_msg = wasm_execute(reflect_addr, &reflect_msg, vec![])?; // we wrap it in a submessage to properly report errors - let msg = subcall(wasm_msg, RECEIVE_DISPATCH_ID, ReplyOn::Error); + let msg = SubMsg::new(wasm_msg, RECEIVE_DISPATCH_ID, ReplyOn::Error); Ok(IbcReceiveResponse { acknowledgement, diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 867cc79d4..cdd208f49 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,9 +52,9 @@ pub use crate::query::{ #[cfg(feature = "stargate")] pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; pub use crate::results::{ - attr, call, subcall, subcall_with_limit, wasm_execute, wasm_instantiate, Attribute, BankMsg, - ContractResult, CosmosMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, - SubcallResponse, SystemResult, WasmMsg, + attr, call, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, + Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubcallResponse, SystemResult, + WasmMsg, }; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 2af2588e8..5bfc8a497 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -17,7 +17,5 @@ pub use cosmos_msg::{DistributionMsg, StakingMsg}; pub use empty::Empty; pub use query::QueryResponse; pub use response::Response; -pub use subcall::{ - call, subcall, subcall_with_limit, Event, Reply, ReplyOn, SubMsg, SubcallResponse, -}; +pub use subcall::{call, Event, Reply, ReplyOn, SubMsg, SubcallResponse}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 20e209b99..b3ae7a5e4 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -82,31 +82,33 @@ where } } -/// subcall takes eg. BankMsg::Send{} and sets up for a reply. No gas limit is set. -pub fn subcall(msg: M, id: u64, reply_on: ReplyOn) -> SubMsg +impl SubMsg where - M: Into>, T: Clone + fmt::Debug + PartialEq + JsonSchema, { - SubMsg { - id, - msg: msg.into(), - reply_on, - gas_limit: None, + /// new takes eg. BankMsg::Send{} and sets up for a reply. No gas limit is set. + pub fn new>>(msg: M, id: u64, reply_on: ReplyOn) -> Self { + SubMsg { + id, + msg: msg.into(), + reply_on, + gas_limit: None, + } } -} -/// subcall_with_limit is like subcall but allows setting a gas limit -pub fn subcall_with_limit(msg: M, id: u64, reply_on: ReplyOn, gas_limit: u64) -> SubMsg -where - M: Into>, - T: Clone + fmt::Debug + PartialEq + JsonSchema, -{ - SubMsg { - id, - msg: msg.into(), - reply_on, - gas_limit: Some(gas_limit), + /// new_with_limit is like new but allows setting a gas limit + pub fn new_with_limit>>( + msg: M, + id: u64, + reply_on: ReplyOn, + gas_limit: u64, + ) -> Self { + SubMsg { + id, + msg: msg.into(), + reply_on, + gas_limit: Some(gas_limit), + } } } From 4863a243db6d57d150f8ae0a78d6330b1c544955 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 15:22:53 +0200 Subject: [PATCH 094/402] Update Response.messages rustdoc --- packages/std/src/results/response.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 3af75ceff..6d0b4c26b 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -73,7 +73,8 @@ where T: Clone + fmt::Debug + PartialEq + JsonSchema, { /// 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 + /// If the ReplyOn variant matches the result (Always, Success on Ok, Error on Err), + /// the runtime will invoke this contract's `reply` entry point /// after execution. Otherwise, they act like "fire and forget". /// Use `call` or `msg.into()` to create messages with the older "fire and forget" semantics. pub messages: Vec>, From 8642a4b3d043eec15e5b8dfa274462a2e1e6ec66 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 15:27:54 +0200 Subject: [PATCH 095/402] Update reflect schema --- contracts/reflect/schema/response_for__custom_msg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 07baf833f..df565b87c 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -26,7 +26,7 @@ ] }, "messages": { - "description": "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\". Use `call` or `msg.into()` to create messages with the older \"fire and forget\" semantics.", + "description": "Optional list of messages to pass. These will be executed in order. If the ReplyOn variant matches the result (Always, Success on Ok, Error on Err), the runtime will invoke this contract's `reply` entry point after execution. Otherwise, they act like \"fire and forget\". Use `call` or `msg.into()` to create messages with the older \"fire and forget\" semantics.", "type": "array", "items": { "$ref": "#/definitions/SubMsg_for_CustomMsg" From e61e7599ccb3cbab8ac56556f9cb66d6b80d0e77 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 15:33:33 +0200 Subject: [PATCH 096/402] Rebuild test contracts for vm package --- packages/vm/README.md | 4 ++-- packages/vm/testdata/hackatom.wasm | 2 +- packages/vm/testdata/hackatom_0.15.wasm | Bin 0 -> 199119 bytes packages/vm/testdata/ibc_reflect.wasm | 2 +- packages/vm/testdata/ibc_reflect_0.15.wasm | Bin 0 -> 289018 bytes 5 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 packages/vm/testdata/hackatom_0.15.wasm create mode 100644 packages/vm/testdata/ibc_reflect_0.15.wasm diff --git a/packages/vm/README.md b/packages/vm/README.md index fc5ce8915..41b4ac962 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -40,13 +40,13 @@ 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.11.0 ./contracts/hackatom \ - && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_0.14.wasm + && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_0.15.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.11.0 ./contracts/ibc-reflect \ - && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_0.14.wasm + && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_0.15.wasm ``` ## Testing diff --git a/packages/vm/testdata/hackatom.wasm b/packages/vm/testdata/hackatom.wasm index e871ad74c..2f104ec42 120000 --- a/packages/vm/testdata/hackatom.wasm +++ b/packages/vm/testdata/hackatom.wasm @@ -1 +1 @@ -hackatom_0.14.wasm \ No newline at end of file +hackatom_0.15.wasm \ No newline at end of file diff --git a/packages/vm/testdata/hackatom_0.15.wasm b/packages/vm/testdata/hackatom_0.15.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e15dd34cb470ea3dd5a8bfbdd8ffc5bb17da5f13 GIT binary patch literal 199119 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%0DTf}`bONl_D@br`!MdlFZjwCyR z8y1n48Rcp2vKhrNtdl^pN{$b(wB)T-OHqRPgf)=&g(8+!yIQOVd+_e=StdbZ_JV!^ z!-js-TWe`LxHsiVThcW-D?EzPQ+KGwKnzoF*VCo8HsOb4> z(W|+niczhQ1Ul0EQDwTbw~G?0tf!4`dl*3}z#!!mRH+4YaF^(@ z8yVeI6PuTEs-yUr zKzU`8zyBh0gx93EzpyvZz8-HGrR0u!|9+In=qcZ2Pcc`nQ~pZ^I9|bRraErN{Hp{N zZ$RIQf#2X)(#4)Zo@D{BL^ue(V(-#PP_as=~uk3Bkzcyt_b<(z|gJoW?H*4U8&f?+LWhmH&Esf!MIMys&AbGjb={NyA6Q;QF!AdHT&29tiOhO@S3S zaEPG1rK2@}i)gWbT=*gU&D~n}s^yL+HUmCScFL(rLLdP#Loc%>ndsfUtv{=CK3@jIF zV>HK3y6zCZvhXS(BmpPJmUE@KZy1#W`tXG|7m?~3+LFjOP+on>BRA4K2(s!FO~G(6 zQ05J5CXryD%_)v%a|5nS(-c$4PVn*Ei{nn1(66saJ(GO>JHGBgfUkY8kup#_saR(^ z*ICRvyOxkPB=@e_Dmy%?um5r9n+w{j-hiiATkA$75qk*yojsjL73dzw#eRzV>uTy&`E3q3)uT2Ip)J*YgmIoTq4L+$2Ykk@9v;x2dt|5O_YJnc>URTt3W>E2JcEBFRHf!*p;;N~RT>d3 zXH7N4IcP-f-Uix}U(Hg0b-AU0IDI<4#Jz9?@M-m?Iv2scc1ZN96O^UPH9tNZj}us= zQO4uwl5y*z$3dq&4o0p4UqBIE$W@)!+9SI@n1PE-$c99)v!6p;g1_w{)?8(~i3!YG zfi^%Oy@50vCcUtb9Lx#(=D^Yv2MsITHRvw%`hz(K=0gc|2R4_K(-7r3vucLIGL_AR7wC%E)kN&5D_%FXW$!$7OZuoilN@{g=FqA zosr3rJO{{G8qdT=m^MvcwFV1KGYDW<@AOjcbk;jPdyDuLc54bKxgY`pustQJdzNQh zp(wF>ifhDWqAGlX6LQxY??s&=#Sh2LkWmjH z;aoZ{&TyMYO%T@RvBu2BSYMUFTx_MoxldZZYKyxrA}1EJlLfjjb%3HyA<@n|lSVAX zqy$p{%oEjhM0M^+U9hTxv-KOw+J2~J#wOrI-t+AQ^$K5=4OBBoPi3(PyW8e0oAEFi z2bD#eH#LrIIqbHLgEG5reqI{~yPJ%IQM1j0EIPAUuvPPFd4KNHR$Cwoxnv96HXElb zEot-NQWzTv46L~w$?X%j1L%%VH{Ua-HKz-#MOK;B!+ z(#PbC=l3!ApaM-?BNmoH07&a4sm5;dk!#Z=wYk=hZfde0P4=<->Yp3lRTiC6hG2oB z2FfEXpy;%7J+QEQ8j`AezLT%4x9Y1_=;lx?7X%ezma{WOWti%msX*5ZQpd^IHW`vx zUzacOW>SAn#Yg9)Dy^#+Gf=Ymok9*Lqdm;KoH9w$t2HvViRB~i)B;_J9RT-)fx~uG z)Zj41`%E@jee-zk=K%wsIHh2Zn`D+(Rnm5(>XI;rR=IJ))IK+uj9~*Snr?K3$&y}D ztV)`JdnSxvwLBQs`;AVv-eb{hEcA|nbDB8y$F}@d?`kKC03(Q>Ob}1TQGoJ+@+Ea( zSVJ6xY7KEiUxRpd%F6n*z6d`_o;oY4DsCXobY&~6A->gi--fv6=T@2Q=fi{_-bu_O z#GIosSSZ1ltOfy<4~py6u}K{B%buv(gwO2J6TpaBjHwJ0J|)xk`x7W+%zW~KJckbV z?9);m1xGTwwCwj<0xiel1t@bsUfAm~@~4wQ$Gf5gn?4r&lonr$mt>nysKU;r4Pht> z!y33#Tk_Le=%C?$5h5B1a^M<^jj-WA!MSMmTBQZi9Cuji)17+W1R)ahub2o>%wuA# zkcxT$7=hp^5b8r{1;ioP;19~CYCuOyBCUz442J;jsQg@2y^-j423DC)ZE|n0>eObe zGS-pT+WMvGSfdW40^_(g6>~niP5g<9Nx%;g3(t0dQbNFFzrR&ekrmqACgGnD?735|JH4tp^i>pk4!+Qq4|(dsirbu zh;gN(9c164r>%o*lHuoKYeO|Ce;126NCN|k)-R9gNS`qGD31?RH8;ASf^|p;^-LC` zgl?=@0GiE5b;((mJX512rVy8eI^snejg(K^-8~JuZ~B)E2>eP%3`y#8oS}!1;O7gFGfxJlQ+K+U14YNYG&L z{5=|I39IqY5d$`OB~~SsaV@=}UGghK3V>G32zI*K-s<5gx}Ub6!0|G_Od>Sw6}H0H zOBpQ^?;r>{j5J;$!ZieG=pxoKnW?zItIWi6${Iw5OAAC+&w$_M6tomoQm=DpQUn)Y zzRMPlB6TktMYSe~wx(JGG#`xO6=AbV1m{7j2Byq)Vm^h|@yN^K!MotKkBf_Aq z+Gf`scVzxWV-T*B>HyXyUUVxz%n-&C?K#-Xde#-xr;7CseG1Do@81s7LQ;)sLTW=R zyR4ZRbrY`GljJzXFQ#oAF5HWO+qT7DQx@j9(IIYv&@&mg3B67Ha5-@ftrs)#i_c9& z@yAf$lB_=;KBp}d@5krlpHH|^7K z#WY#Jah5lR^&LSjk;T~j3lD%X+c)>b9`N<%TeT}zd!V+kvQJ4I?gbAiIaeT>p0;xE zm)@u)mpn&FHX?f^%5(ZsKSw-JLVxO#r(F^$x-v-;=* zPGIMUe)z|J|6XBIUx`N||5yD=_uk?tE0 z_5HRI3$MV#z5K-aDI=~jG69}2go2zFpEA)t4SMm8JT0h_x&*Zxs$@YqS#FswHK0(e zAQ7(D^yZpo`ZOxCH7k!*s+F>e(eOG?wK5ZCP%`F&qe5s}X4AEbSjjknxUQ*29lKPU zD8s4E1GAcB`DsgKQdUXH!o-+Na)~fScK)P3h?RbjjeJMQA^8WwD&=m3`T*x3c4Z~m?7}7IT zGYm~n0m4sY;Zbv!WPgtomT((jEN?}=5(dj^KTe3An3PTlr};C%BlF9T-3@(pmnu+x>SVuG~c1b`PVnYtafxT(vFu<6*?`*9wd^LbGKlfb`Ev>EU_S1~WSk z_nst~dT#zMhWD3M=aa$a|7Y)QpzOM?I?wy@zN%i8>gm(6gmgIVv|l3*Sq)Jd(X$-`|Q2XK6~#I)RfBn zTj;E@o?F%DczWelb)_CAE}Nvm=C|nifl>QR%`@{a3SjQK56QSprJ1k-np{!Y=NRM} zPSm%jsEC9PQ@ZGSqMipmF{+Tr4o`{_bKfGR;4z;!i8c&$D1x6iiGJQB+K3ECarj4P z620s5CehEEM9cG)8iGNUwL@j?MKO^vnFX<_Dbq}%C)SQ%+S&Q{XR@9jZ+kMF<(m8_2!<$I*zijQ@N+*Z+SWl{_MpmGl;oi+2 z-At`q*@mrl-Y!<%_NQpA6+3}g6coxUkrE_nKWK9BOVR8SFxh zwfzmedd%z;n1xDgL5iy2>a188?QzMR3Hh2&Tg`OKoRPIVi#f5HxxDLfc>@^TOR!?K8Ha_1GJr>YM1E-PS{I*pog+5i{<^9s5wx)D#!7`yylD^p$M&}jr@*> ztrmzfq|G;q@zlnFvDiR-H#4C!e77qPJSy6yvDk4D>Qn-M=YChciNjQFQCMy2nCWs$ zxYxoF+P9qzvE^}NygxK^ydJJwW}z}#?n$g=22scxy&r`E86mZ_%k<5iB-_<<#&OqgVv6^kVJGV1{ zyPokfjlyLE^om(znnYDC$>pU)*<54R!;cUupwk0+!MhE3WHG2=uAJ3mlY8SHWeDcNmnnZ%5C8&c?rWyCg)dmH%LSb|DR zz!CxBxfyFfAii5h1M zycAU^5VI?hiua7AXEd3KsBHTIS$uG&h4)cA_Q0$56mUR;*HlFqH$6Nje-M~qiv$@q z^@uoq1`?3b@N8aevGj}^iY-K4)s>#*BSq{`&Dp%FvwYS`cl!jAi9(sag-!}_Y+R%Bo}l#Kir`62b|7P{xoP(yGI(tLoeni{J|?H zbG&GqWX^4%h=T!2>g7T2B?|RY@^;z?q02VkuZ+wsdCQs&%V+7DR}EiWO5WyVPC758 zA0?%xk-5c1`edCT^Oli09;~M48%|Y?=c_d)@*N`bEDq^2L*&-}3r*x!>GLFV`xd=! zjL2_y8pi`A9>1xCo8&@+`8rQlsMiJ$_1fa8VzpEdOBPVSS*!yl19!FzJk4{_tt61F zR>P4s{|o0I-(-0NP%_rUsHLLLY4*X!RPk66P{LDbhxn+hd>T=-*_m}M`+{`qO=I4c zY17h=nv}EKz`PN9b3t;1*3~kRlW;>ce4T&Z6HO}u2U?OuzAih^jSLA*?^!Jy8NxaJ z3fZ$EJ86@@!_-kI5S0z)){$4>;2Y-@&t0CN=D_5r^NCRBas8sSRIt8^yr!Nn6qhR3=2bpaHXy+(<#O4iU5>$cPT0TLr6#k5x~G^F61Fa4uDA$D7N0A zU507`4_1P(4oXHRaOYWcL;Wk-jDDtUg*>F4#Uv>|@hAWHJG&g#JA=oj)^`mL%pPy* zwtj602cNM3R!7!ct(BOR0_Q;;;VO!rbCNmZvPU9=?1D}f4JZ}>H6pv_g^gA^LCC4@ z20e7VKIIRp;JQat7$%lyy8g=Y_bnH*082>#EY_d7pz_?{^J+IS*hZ8`nOAZGIimT+ ze%=6-1xSLX#fqA)Q{W+Y!yb&4bpL3XIgvYj((W z7L=&c>5T)JL(K5O;Pq!#%Q^oT5CPw5x!=(H-sPv|7SM$g{4rQ`=Yq@%Qc<7BFSiu^pHvTKC zN}r>&20&pc88B&3Kk3=jNfD`9Ikj@jW30)te)1T1p8kkzoB+JTG3VOBy`U9$e8 z_8A}!2d;2`;1Y-UHHw)VoMTdpR4e^|g584EW|g)ApxXIIoaWb@udnHyKI;sb=H7fy zvGssDFB}{UO&eT_`r-7Hw-XA`9Y5#+GH}d7ILxWx*(i6o8LlS8tRY zw326SaqI1Y_EWTTHdmkNwIM9pGmmz0{AZOGU*$DPF@Nn~?#3-5S8OR)+qY~)w9Mzt zkB?xpF}?-7c*^9%FOv&dg#bn6Ph&FwAW^K(>Zz1E{hk9Q#NX4u^BoUHdbSf5s^=uP zK`ad2QYP)wu?FHtuxYVs_z@~J2vG`I28w=c9C z0HO2)HfbqjgJdw)4krQ|qyxIpR8j?mNF`OL?PzQkK?xRRL9l2)tv}w}^<;tlbjBB#;`*HhW$$B10N| z3Jf2(j%AxY$Pr5-tp~^O0Z1UsZp<=U<;uM*Y{1f9y4aX;9sJq$1gWoKhjVDm+ zQbI}|F}^6byVb#i%oU4u;$Xqhs;h=q(rRBbrk=eX{d34QJCnuKtj;Xa2c6(&!{je* zG^RY`A*BGXg{d)bqFkW1_Zx5W)>LpyTZEl-$k(d*TUYKqI@xhvbgmP45eG6_c!nF= zX$45jFj{f2lj>2R{_^Axz=}^Nv;eFvmn;*DJK(D=3Fe#4J^tcJSd}n6DZ&3QmPn+M zMi|XccCip3g?&rUZ7=tb)e3{IN<7F423?gLv3Fq5Rd1=!luc?E-$g7`OvBg&iS;V3 zuw7juEUzjsHUU4V3J{C%nFGdWz{j&GOoMOE+m;9EVvT{FOT`&;n2Gtf9gW(BPB;rF=Iro)B&6dq$Nq@ht|(}>r77WYc1v<_A7uHBE^Qez_Yovlp>ZFF#22+FO5wZgO>arR{ za5ZkirVGg}0E)CT|EI|y`%_Tyq;C66K-b6NqMyK-V(ySekNg z9-5^tD2=~T8dr4Z{3Q~J2?xPw5^e|v^J!_otwc18X4ShImgOPJpR)ny`=)28`5;V9o*L&BK2Fu4=d(ilf>Uf)L5^xnL_D<-GGvO;9*Nd`c6 zbR;ZTgI8jUjb>n|&!|37w^$AVNiy)oEOi#`{JlrW;u0pmXXL1P@ zR$ME;JtMH^ijK06h~zOB64p`{9hJ-R<}JLS{g5V~$b%!4W7I3r-bKWpmuR!1i9HyK z^QbozTrMU@y02nGjOrEqm6bomf;7Vy!-#J5Z#qRz1HaL?5hG?121JA>=ah8ZU>OZ~zO81XOV~7Qd#)dum5@WD#LkjIQ&r!g#O z_DwN%VOn6bO_b9xc1;J zFf=3I5PC8+YrUdFU+E$WyDPn-bpA0C4GJMrgZ7DZNhx^Vww&cjhHL+!?uC*l#ddFMGF5Ah#!t2jtprybhw{uIR4YMW}Z$ryv)^OhxWE!@Dx% zdY3EwRs&x7`1{`Tum0o{r~lo5PHq&Ud5=zOf^!9dTzvT1zPupRvXJl6~X+=r(5gG(SZ z2??nbN9}Tyz*`ctezY$w{F!f%<1>D`wlb#F+1cTr{zmBwt*y9HXI|a5gSpN=AJh<0BL))wVnu73P$*&j zQI)LQT(M0W8Lon@ND4CZB3L@hgUp02ueN2JifmFs1ZJAAh#(jwoeWGEgo(sqlI}

~8U4oWp2KjGg{d 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Ά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 literal 0 HcmV?d00001 From a47488c0acfd984b91f309cfdfc45301c6194b68 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 15:39:00 +0200 Subject: [PATCH 097/402] Fix gas prices in vm tests --- packages/vm/src/instance.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 326ca5fdc..8f57811fa 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -606,7 +606,7 @@ mod tests { let report2 = instance.create_gas_report(); assert_eq!(report2.used_externally, 73); - assert_eq!(report2.used_internally, 38804); + assert_eq!(report2.used_internally, 38550); assert_eq!(report2.limit, LIMIT); assert_eq!( report2.remaining, @@ -805,7 +805,7 @@ mod singlepass_tests { .unwrap(); let init_used = orig_gas - instance.get_gas_left(); - assert_eq!(init_used, 38877); + assert_eq!(init_used, 38623); } #[test] @@ -828,7 +828,7 @@ mod singlepass_tests { .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 157981); + assert_eq!(execute_used, 159380); } #[test] From fee113a0094ad26088f15ebb77028aca720d4014 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 16 Jun 2021 15:48:18 +0200 Subject: [PATCH 098/402] More vm fixes --- packages/vm/src/calls.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index a875ca5cd..c2175d22b 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -678,7 +678,7 @@ mod tests { mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; - use cosmwasm_std::{attr, Empty, Event, IbcOrder, Reply, SubcallResponse}; + use cosmwasm_std::{attr, Empty, Event, IbcOrder, Reply, ReplyOn, SubcallResponse}; static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); const IBC_VERSION: &str = "ibc-reflect-v1"; fn setup( @@ -707,8 +707,9 @@ mod tests { ) .unwrap() .unwrap(); - assert_eq!(1, res.submessages.len()); - let id = res.submessages[0].id; + assert_eq!(1, res.messages.len()); + assert_eq!(ReplyOn::Success, res.messages[0].reply_on); + let id = res.messages[0].id; let event = Event { kind: "message".into(), attributes: vec![attr("contract_address", &account)], From 606a41f02b74e427afbe06d4ea279ccdaf0e21df Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 14:36:46 +0200 Subject: [PATCH 099/402] Cleaner SubMsg API --- packages/std/src/coins.rs | 10 ++-- packages/std/src/lib.rs | 5 +- packages/std/src/results/mod.rs | 2 +- packages/std/src/results/response.rs | 6 +-- packages/std/src/results/subcall.rs | 74 +++++++++++----------------- 5 files changed, 40 insertions(+), 57 deletions(-) diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 3ef53f831..2b05d67cd 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -34,17 +34,17 @@ impl fmt::Display for Coin { /// # Examples /// /// ``` -/// # use cosmwasm_std::{coins, BankMsg, CosmosMsg, Response}; +/// # use cosmwasm_std::{coins, BankMsg, CosmosMsg, Response, SubMsg}; /// # use cosmwasm_std::testing::{mock_env, mock_info}; /// # let env = mock_env(); /// # let info = mock_info("sender", &[]); /// let tip = coins(123, "ucosm"); /// /// let mut response: Response = Default::default(); -/// response.messages = vec![BankMsg::Send { +/// response.messages = vec![SubMsg::new(BankMsg::Send { /// to_address: info.sender.into(), /// amount: tip, -/// }.into()]; +/// })]; /// ``` pub fn coins>(amount: u128, denom: S) -> Vec { vec![coin(amount, denom)] @@ -55,7 +55,7 @@ pub fn coins>(amount: u128, denom: S) -> Vec { /// # Examples /// /// ``` -/// # use cosmwasm_std::{call, coin, BankMsg, CosmosMsg, Response}; +/// # use cosmwasm_std::{coin, BankMsg, CosmosMsg, Response, SubMsg}; /// # use cosmwasm_std::testing::{mock_env, mock_info}; /// # let env = mock_env(); /// # let info = mock_info("sender", &[]); @@ -65,7 +65,7 @@ pub fn coins>(amount: u128, denom: S) -> Vec { /// ]; /// /// let mut response: Response = Default::default(); -/// response.messages = vec![call(BankMsg::Send { +/// response.messages = vec![SubMsg::new(BankMsg::Send { /// to_address: info.sender.into(), /// amount: tip, /// })]; diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index cdd208f49..0cfa80fdb 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,9 +52,8 @@ pub use crate::query::{ #[cfg(feature = "stargate")] pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; pub use crate::results::{ - attr, call, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, - Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubcallResponse, SystemResult, - WasmMsg, + attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, Empty, + Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubcallResponse, SystemResult, WasmMsg, }; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 5bfc8a497..ac2057bef 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -17,5 +17,5 @@ pub use cosmos_msg::{DistributionMsg, StakingMsg}; pub use empty::Empty; pub use query::QueryResponse; pub use response::Response; -pub use subcall::{call, Event, Reply, ReplyOn, SubMsg, SubcallResponse}; +pub use subcall::{Event, Reply, ReplyOn, SubMsg, SubcallResponse}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 6d0b4c26b..6f74383e7 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -41,7 +41,7 @@ use super::{Attribute, Empty, SubMsg}; /// Mutating: /// /// ``` -/// # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo}; +/// # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; /// # type InstantiateMsg = (); /// # type MyError = (); /// # @@ -57,10 +57,10 @@ use super::{Attribute, Empty, SubMsg}; /// // ... /// response.add_attribute("Let the", "hacking begin"); /// // ... -/// response.add_message(BankMsg::Send { +/// response.add_message(SubMsg::new(BankMsg::Send { /// to_address: String::from("recipient"), /// amount: coins(128, "uint"), -/// }); +/// })); /// response.add_attribute("foo", "bar"); /// // ... /// response.set_data(Binary::from(b"the result data")); diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index b3ae7a5e4..13cfdcd79 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -50,64 +50,48 @@ where /// This is used for cases when we use ReplyOn::Never and the id doesn't matter pub const UNUSED_MSG_ID: u64 = 123456789; -/// We implement thisas a shortcut so all existing code doesn't break. -/// Up to 0.14, we could do something like: -/// let messages = vec![BankMsg::Send { .. }.into()]; -/// In order to construct the response. -/// -/// With 0.15, we move to requiring SubMsg there, but this allows the same -/// `.into()` call to convert the BankMsg into a proper SubMsg with no reply. -impl From for SubMsg -where - M: Into>, - T: Clone + fmt::Debug + PartialEq + JsonSchema, -{ - #[inline] - fn from(msg: M) -> SubMsg { - call(msg) - } -} - -/// call takes eg. BankMsg::Send{} and wraps it into a SubMsg with normal message sematics (no reply) -pub fn call(msg: M) -> SubMsg -where - M: Into>, - T: Clone + fmt::Debug + PartialEq + JsonSchema, -{ - SubMsg { - id: UNUSED_MSG_ID, - msg: msg.into(), - reply_on: ReplyOn::Never, - gas_limit: None, - } -} - impl SubMsg where T: Clone + fmt::Debug + PartialEq + JsonSchema, { - /// new takes eg. BankMsg::Send{} and sets up for a reply. No gas limit is set. - pub fn new>>(msg: M, id: u64, reply_on: ReplyOn) -> Self { + /// new creates a "fire and forget" message with the pre-0.14 semantics + pub fn new>>(msg: M) -> Self { SubMsg { - id, + id: UNUSED_MSG_ID, msg: msg.into(), - reply_on, + reply_on: ReplyOn::Never, gas_limit: None, } } - /// new_with_limit is like new but allows setting a gas limit - pub fn new_with_limit>>( - msg: M, - id: u64, - reply_on: ReplyOn, - gas_limit: u64, - ) -> Self { + /// create a `SubMsg` that will provide a `reply` with the given id if the message returns `Ok` + pub fn reply_on_success>>(msg: M, 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` + pub fn reply_on_error>>(msg: M, id: u64) -> Self { + Self::reply_on(msg.into(), id, ReplyOn::Error) + } + + /// create a `SubMsg` that will always provide a `reply` with the given id + pub fn reply_always>>(msg: M, id: u64) -> Self { + Self::reply_on(msg.into(), id, ReplyOn::Always) + } + + /// add a gas limit to the message. Usage like: + /// SubMsg::reply_always(msg, 1234).with_gas_limit(60_000) + pub fn with_gas_limit(mut self, limit: u64) -> Self { + self.gas_limit = Some(limit); + self + } + + fn reply_on(msg: CosmosMsg, id: u64, reply_on: ReplyOn) -> Self { SubMsg { id, - msg: msg.into(), + msg, reply_on, - gas_limit: Some(gas_limit), + gas_limit: None, } } } From 989d4b70c1541971c9748efe86deda0b173458a3 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 14:40:53 +0200 Subject: [PATCH 100/402] Update burner contract --- contracts/burner/src/contract.rs | 8 ++++---- contracts/burner/tests/integration.rs | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index 7037d943d..85b06cf3e 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -1,5 +1,6 @@ use cosmwasm_std::{ attr, entry_point, BankMsg, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, + SubMsg, }; use crate::msg::{InstantiateMsg, MigrateMsg}; @@ -39,7 +40,7 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult let data_msg = format!("burnt {} keys", count).into_bytes(); Ok(Response { - messages: vec![send.into()], + messages: vec![SubMsg::new(send)], attributes: vec![attr("action", "burn"), attr("payout", msg.payout)], data: Some(data_msg.into()), }) @@ -89,11 +90,10 @@ mod tests { let msg = res.messages.get(0).expect("no message"); assert_eq!( msg, - &BankMsg::Send { + &SubMsg::new(BankMsg::Send { to_address: payout, amount: coins(123456, "gold"), - } - .into(), + }) ); // check there is no data in storage diff --git a/contracts/burner/tests/integration.rs b/contracts/burner/tests/integration.rs index fdd437e07..8f30c2cca 100644 --- a/contracts/burner/tests/integration.rs +++ b/contracts/burner/tests/integration.rs @@ -17,7 +17,7 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::{coins, BankMsg, ContractResult, Order, Response}; +use cosmwasm_std::{coins, BankMsg, ContractResult, Order, Response, SubMsg}; use cosmwasm_vm::testing::{instantiate, migrate, mock_env, mock_info, mock_instance}; use burner::msg::{InstantiateMsg, MigrateMsg}; @@ -70,11 +70,10 @@ fn migrate_cleans_up_data() { let msg = res.messages.get(0).expect("no message"); assert_eq!( msg, - &BankMsg::Send { + &SubMsg::new(BankMsg::Send { to_address: payout, amount: coins(123456, "gold"), - } - .into(), + }), ); // check there is no data in storage From 2b590e6a631decef9185b2cbfe5b4aa3d603782e Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 14:44:26 +0200 Subject: [PATCH 101/402] Refine add_message / add_submessage helpers --- packages/std/src/results/response.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 6f74383e7..68db182f1 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -4,7 +4,7 @@ use std::fmt; use crate::Binary; -use super::{Attribute, Empty, SubMsg}; +use super::{Attribute, CosmosMsg, Empty, SubMsg}; /// A response of a contract entry point, such as `instantiate`, `execute` or `migrate`. /// @@ -57,10 +57,10 @@ use super::{Attribute, Empty, SubMsg}; /// // ... /// response.add_attribute("Let the", "hacking begin"); /// // ... -/// response.add_message(SubMsg::new(BankMsg::Send { +/// response.add_message(BankMsg::Send { /// to_address: String::from("recipient"), /// amount: coins(128, "uint"), -/// })); +/// }); /// response.add_attribute("foo", "bar"); /// // ... /// response.set_data(Binary::from(b"the result data")); @@ -111,8 +111,16 @@ where }); } - pub fn add_message>>(&mut self, msg: U) { - self.messages.push(msg.into()); + /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, + /// and adds it to the list of messages to process. + pub fn add_message>>(&mut self, msg: U) { + self.messages.push(SubMsg::new(msg)); + } + + /// This takes an explicit SubMsg (creates via eg. `reply_on_error`) + /// and adds it to the list of messages to process. + pub fn add_submessage(&mut self, msg: SubMsg) { + self.messages.push(msg); } pub fn set_data>(&mut self, data: U) { From 6bf24d66e4cea2fea024546dacbc9cb522abf70c Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 14:51:16 +0200 Subject: [PATCH 102/402] Update hackatom contract --- contracts/hackatom/src/contract.rs | 9 ++++----- contracts/hackatom/tests/integration.rs | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index e4421b58e..99763242c 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -285,7 +285,7 @@ mod tests { mock_dependencies, mock_dependencies_with_balances, mock_env, mock_info, MOCK_CONTRACT_ADDR, }; // import trait Storage to get access to read - use cosmwasm_std::{attr, coins, Binary, Storage}; + use cosmwasm_std::{attr, coins, Binary, Storage, SubMsg}; #[test] fn proper_initialization() { @@ -394,7 +394,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"); - assert_eq!(msg, &BankMsg::Send { to_address, amount }.into(),); + assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); } #[test] @@ -446,11 +446,10 @@ mod tests { let msg = execute_res.messages.get(0).expect("no message"); assert_eq!( msg, - &BankMsg::Send { + &SubMsg::new(BankMsg::Send { to_address: beneficiary, amount: coins(1000, "earth"), - } - .into(), + }), ); assert_eq!( execute_res.attributes, diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 1d535a1a7..67c87c75d 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -19,7 +19,7 @@ use cosmwasm_std::{ attr, coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, ContractResult, - Empty, Response, + Empty, Response, SubMsg, }; use cosmwasm_vm::{ call_execute, from_slice, @@ -173,7 +173,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"); - assert_eq!(msg, &BankMsg::Send { to_address, amount }.into(),); + assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); } #[test] @@ -242,11 +242,10 @@ fn execute_release_works() { let msg = execute_res.messages.get(0).expect("no message"); assert_eq!( msg, - &BankMsg::Send { + &SubMsg::new(BankMsg::Send { to_address: beneficiary, amount: coins(1000, "earth"), - } - .into(), + }), ); assert_eq!( execute_res.attributes, From 3dbf7be28ccfb8cf2dea63242b90e722381604eb Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 14:54:43 +0200 Subject: [PATCH 103/402] Update reflect contract --- contracts/reflect/src/contract.rs | 10 +++++----- contracts/reflect/tests/integration.rs | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 04b4fda69..1d8f6ba56 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ - attr, call, entry_point, to_binary, to_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, - Env, MessageInfo, QueryRequest, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, + attr, entry_point, to_binary, to_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Env, + MessageInfo, QueryRequest, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SystemResult, }; @@ -53,7 +53,7 @@ pub fn try_reflect( if msgs.is_empty() { return Err(ReflectError::MessagesEmpty); } - let messages = msgs.into_iter().map(call).collect(); + let messages = msgs.into_iter().map(SubMsg::new).collect(); let res = Response { messages, attributes: vec![attr("action", "reflect")], @@ -216,7 +216,7 @@ mod tests { }; let info = mock_info("creator", &[]); let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); - let payload: Vec<_> = payload.into_iter().map(call).collect(); + let payload: Vec<_> = payload.into_iter().map(SubMsg::new).collect(); assert_eq!(payload, res.messages); } @@ -289,7 +289,7 @@ mod tests { }; let info = mock_info("creator", &[]); let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); - let payload: Vec<_> = payload.into_iter().map(call).collect(); + let payload: Vec<_> = payload.into_iter().map(SubMsg::new).collect(); assert_eq!(payload, res.messages); } diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index fca8acede..6157dd8d1 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -18,8 +18,8 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - attr, call, coin, coins, from_binary, BankMsg, Binary, Coin, ContractResult, Event, Reply, - Response, StakingMsg, SubMsg, SubcallResponse, SystemResult, + attr, coin, coins, from_binary, BankMsg, Binary, Coin, ContractResult, Event, Reply, Response, + StakingMsg, SubMsg, SubcallResponse, SystemResult, }; use cosmwasm_vm::{ testing::{ @@ -103,7 +103,7 @@ fn reflect() { let res: Response = execute(&mut deps, mock_env(), info, msg).unwrap(); // should return payload - let payload: Vec<_> = payload.into_iter().map(call).collect(); + let payload: Vec<_> = payload.into_iter().map(SubMsg::new).collect(); assert_eq!(payload, res.messages); } From 24a1668857836e8c065839781b3ec91995e52a0d Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 14:58:01 +0200 Subject: [PATCH 104/402] Update ibc-reflect contract --- contracts/ibc-reflect/src/contract.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 4cca85dba..100864fd3 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,8 +1,8 @@ use cosmwasm_std::{ - attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, - ContractResult, CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, - IbcBasicResponse, IbcChannel, IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, - QueryResponse, Reply, ReplyOn, Response, StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, + attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, + CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, IbcBasicResponse, IbcChannel, + IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, + Response, StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, }; use crate::msg::{ @@ -163,7 +163,7 @@ pub fn ibc_channel_connect( funds: vec![], label: format!("ibc-reflect-{}", &chan_id), }; - let msg = SubMsg::new(msg, INIT_CALLBACK_ID, ReplyOn::Success); + 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)?; @@ -198,7 +198,7 @@ pub fn ibc_channel_close( msgs: vec![bank_msg.into()], }; let wasm_msg = wasm_execute(reflect_addr, &reflect_msg, vec![])?; - vec![wasm_msg.into()] + vec![SubMsg::new(wasm_msg)] } else { vec![] }; @@ -306,7 +306,7 @@ fn receive_dispatch( let wasm_msg = wasm_execute(reflect_addr, &reflect_msg, vec![])?; // we wrap it in a submessage to properly report errors - let msg = SubMsg::new(wasm_msg, RECEIVE_DISPATCH_ID, ReplyOn::Error); + let msg = SubMsg::reply_on_error(wasm_msg, RECEIVE_DISPATCH_ID); Ok(IbcReceiveResponse { acknowledgement, From 950a3d280262d1d708b1ac280192ac871917e369 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 15:13:31 +0200 Subject: [PATCH 105/402] Update remaining contracts --- contracts/ibc-reflect-send/src/contract.rs | 38 +++----- contracts/ibc-reflect-send/src/ibc.rs | 21 ++--- .../ibc-reflect-send/tests/integration.rs | 6 +- .../schema/response_for__custom_msg.json | 2 +- contracts/staking/src/contract.rs | 92 ++++++++----------- 5 files changed, 61 insertions(+), 98 deletions(-) diff --git a/contracts/ibc-reflect-send/src/contract.rs b/contracts/ibc-reflect-send/src/contract.rs index 266ee6b49..169ae2a46 100644 --- a/contracts/ibc-reflect-send/src/contract.rs +++ b/contracts/ibc-reflect-send/src/contract.rs @@ -23,10 +23,8 @@ pub fn instantiate( config(deps.storage).save(&cfg)?; Ok(Response { - data: None, - submessages: vec![], - messages: vec![], attributes: vec![attr("action", "instantiate")], + ..Response::default() }) } @@ -61,13 +59,11 @@ pub fn handle_update_admin( config(deps.storage).save(&cfg)?; Ok(Response { - submessages: vec![], - messages: vec![], attributes: vec![ attr("action", "handle_update_admin"), attr("new_admin", cfg.admin), ], - data: None, + ..Response::default() }) } @@ -94,12 +90,10 @@ pub fn handle_send_msgs( timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; - Ok(Response { - submessages: vec![], - messages: vec![msg.into()], - attributes: vec![attr("action", "handle_send_msgs")], - data: None, - }) + let mut res = Response::new(); + res.add_message(msg); + res.add_attribute("action", "handle_send_msgs"); + Ok(res) } pub fn handle_check_remote_balance( @@ -124,12 +118,10 @@ pub fn handle_check_remote_balance( timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; - Ok(Response { - submessages: vec![], - messages: vec![msg.into()], - attributes: vec![attr("action", "handle_check_remote_balance")], - data: None, - }) + let mut res = Response::new(); + res.add_message(msg); + res.add_attribute("action", "handle_check_remote_balance"); + Ok(res) } pub fn handle_send_funds( @@ -174,12 +166,10 @@ pub fn handle_send_funds( timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; - Ok(Response { - submessages: vec![], - messages: vec![msg.into()], - attributes: vec![attr("action", "handle_send_funds")], - data: None, - }) + let mut res = Response::new(); + res.add_message(msg); + res.add_attribute("action", "handle_send_funds"); + Ok(res) } #[entry_point] diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 2a6d8f270..a24fdd355 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{ attr, entry_point, from_slice, to_binary, DepsMut, Env, IbcAcknowledgement, IbcBasicResponse, - IbcChannel, IbcMsg, IbcOrder, IbcPacket, IbcReceiveResponse, StdError, StdResult, + IbcChannel, IbcMsg, IbcOrder, IbcPacket, IbcReceiveResponse, StdError, StdResult, SubMsg, }; use crate::ibc_msg::{ @@ -62,8 +62,7 @@ pub fn ibc_channel_connect( }; Ok(IbcBasicResponse { - submessages: vec![], - messages: vec![msg.into()], + messages: vec![SubMsg::new(msg)], attributes: vec![ attr("action", "ibc_connect"), attr("channel_id", channel_id), @@ -83,9 +82,8 @@ pub fn ibc_channel_close( accounts(deps.storage).remove(channel_id.as_bytes()); Ok(IbcBasicResponse { - submessages: vec![], - messages: vec![], attributes: vec![attr("action", "ibc_close"), attr("channel_id", channel_id)], + messages: vec![], }) } @@ -98,7 +96,6 @@ pub fn ibc_packet_receive( ) -> StdResult { Ok(IbcReceiveResponse { acknowledgement: b"{}".into(), - submessages: vec![], messages: vec![], attributes: vec![attr("action", "ibc_packet_ack")], }) @@ -139,7 +136,6 @@ fn acknowledge_dispatch( ) -> StdResult { // TODO: actually handle success/error? Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "acknowledge_dispatch")], }) @@ -157,7 +153,6 @@ fn acknowledge_who_am_i( AcknowledgementMsg::Ok(res) => res, AcknowledgementMsg::Err(e) => { return Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "acknowledge_who_am_i"), attr("error", e)], }) @@ -178,7 +173,6 @@ fn acknowledge_who_am_i( })?; Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "acknowledge_who_am_i")], }) @@ -196,7 +190,6 @@ fn acknowledge_balances( AcknowledgementMsg::Ok(res) => res, AcknowledgementMsg::Err(e) => { return Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "acknowledge_balances"), attr("error", e)], }) @@ -225,7 +218,6 @@ fn acknowledge_balances( })?; Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "acknowledge_balances")], }) @@ -239,7 +231,6 @@ pub fn ibc_packet_timeout( _packet: IbcPacket, ) -> StdResult { Ok(IbcBasicResponse { - submessages: vec![], messages: vec![], attributes: vec![attr("action", "ibc_packet_timeout")], }) @@ -283,7 +274,7 @@ mod tests { // this should send a WhoAmI request, which is received some blocks later assert_eq!(1, res.messages.len()); - match &res.messages[0] { + match &res.messages[0].msg { CosmosMsg::Ibc(IbcMsg::SendPacket { channel_id: packet_channel, .. @@ -376,7 +367,7 @@ mod tests { let info = mock_info(CREATOR, &[]); let mut res = execute(deps.as_mut(), mock_env(), info, handle_msg).unwrap(); assert_eq!(1, res.messages.len()); - let packet = match res.messages.swap_remove(0) { + let packet = match res.messages.swap_remove(0).msg { CosmosMsg::Ibc(IbcMsg::SendPacket { channel_id, data, .. }) => { @@ -435,7 +426,7 @@ mod tests { let info = mock_info(CREATOR, &coins(12344, "utrgd")); let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); assert_eq!(1, res.messages.len()); - match &res.messages[0] { + match &res.messages[0].msg { CosmosMsg::Ibc(IbcMsg::Transfer { channel_id, to_address, diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index ff881ddc1..36115347c 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -64,7 +64,7 @@ fn connect(deps: &mut Instance, channel_id: & // this should send a WhoAmI request, which is received some blocks later assert_eq!(1, res.messages.len()); - match &res.messages[0] { + match &res.messages[0].msg { CosmosMsg::Ibc(IbcMsg::SendPacket { channel_id: packet_channel, .. @@ -172,7 +172,7 @@ fn dispatch_message_send_and_ack() { let info = mock_info(CREATOR, &[]); let mut res: Response = execute(&mut deps, mock_env(), info, execute_msg).unwrap(); assert_eq!(1, res.messages.len()); - let packet = match res.messages.swap_remove(0) { + let packet = match res.messages.swap_remove(0).msg { CosmosMsg::Ibc(IbcMsg::SendPacket { channel_id, data, .. }) => { @@ -231,7 +231,7 @@ fn send_remote_funds() { let info = mock_info(CREATOR, &coins(12344, "utrgd")); let res: Response = execute(&mut deps, mock_env(), info, msg).unwrap(); assert_eq!(1, res.messages.len()); - match &res.messages[0] { + match &res.messages[0].msg { CosmosMsg::Ibc(IbcMsg::Transfer { channel_id, to_address, diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index df565b87c..f2f8f79a1 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Response_for_CustomMsg", - "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response { messages: vec![], attributes: vec![attr(\"action\", \"instantiate\")], data: None, }) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new(); // ... response.add_attribute(\"Let the\", \"hacking begin\"); // ... response.add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }); response.add_attribute(\"foo\", \"bar\"); // ... response.set_data(Binary::from(b\"the result data\")); Ok(response) } ```", + "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response { messages: vec![], attributes: vec![attr(\"action\", \"instantiate\")], data: None, }) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new(); // ... response.add_attribute(\"Let the\", \"hacking begin\"); // ... response.add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }); response.add_attribute(\"foo\", \"bar\"); // ... response.set_data(Binary::from(b\"the result data\")); Ok(response) } ```", "type": "object", "required": [ "attributes", diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 933e55d13..7ab9eff37 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -94,15 +94,13 @@ pub fn transfer( })?; let res = Response { - submessages: vec![], - messages: vec![], attributes: vec![ attr("action", "transfer"), attr("from", info.sender), attr("to", recipient), attr("amount", send), ], - data: None, + ..Response::default() }; Ok(res) } @@ -174,21 +172,19 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { })?; // bond them to the validator - let res = Response { - submessages: vec![], - messages: vec![StakingMsg::Delegate { - validator: invest.validator, - amount: payment.clone(), - } - .into()], + let mut res = Response { attributes: vec![ attr("action", "bond"), attr("from", info.sender), attr("bonded", payment.amount), attr("minted", to_mint), ], - data: None, + ..Response::default() }; + res.add_message(StakingMsg::Delegate { + validator: invest.validator, + amount: payment.clone(), + }); Ok(res) } @@ -242,21 +238,19 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St })?; // unbond them - let res = Response { - submessages: vec![], - messages: vec![StakingMsg::Undelegate { - validator: invest.validator, - amount: coin(unbond.u128(), &invest.bond_denom), - } - .into()], + let mut res = Response { attributes: vec![ attr("action", "unbond"), attr("to", info.sender), attr("unbonded", unbond), attr("burnt", amount), ], - data: None, + ..Response::default() }; + res.add_message(StakingMsg::Undelegate { + validator: invest.validator, + amount: coin(unbond.u128(), &invest.bond_denom), + }); Ok(res) } @@ -289,20 +283,18 @@ pub fn claim(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult // transfer tokens to the sender balance.amount = to_send; - let res = Response { - submessages: vec![], - messages: vec![BankMsg::Send { - to_address: info.sender.clone().into(), - amount: vec![balance], - } - .into()], + let mut res = Response { attributes: vec![ attr("action", "claim"), - attr("from", info.sender), + attr("from", &info.sender), attr("amount", to_send), ], - data: None, + ..Response::default() }; + res.add_message(BankMsg::Send { + to_address: info.sender.into(), + amount: vec![balance], + }); Ok(res) } @@ -315,23 +307,15 @@ pub fn reinvest(deps: DepsMut, env: Env, _info: MessageInfo) -> StdResult { assert_eq!(validator.as_str(), DEFAULT_VALIDATOR); @@ -767,7 +749,7 @@ mod tests { let info = mock_info(&bob, &[]); let res = execute(deps.as_mut(), mock_env(), info, unbond_msg).unwrap(); assert_eq!(1, res.messages.len()); - let delegate = &res.messages[0]; + let delegate = &res.messages[0].msg; match delegate { CosmosMsg::Staking(StakingMsg::Undelegate { validator, amount }) => { assert_eq!(validator.as_str(), DEFAULT_VALIDATOR); From dc11fd91a144d5658931e0893a7db7934abc9c9f Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 15:28:07 +0200 Subject: [PATCH 106/402] [skip ci] Add CHANGELOG entry and make spellcheck happy --- CHANGELOG.md | 4 ++++ devtools/format_md.sh | 1 + 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eebbcf344..5ca739073 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,10 @@ and this project adheres to 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: Merge `messages` and `submessages` into one list, using + `ReplyOn::Never` to model the "fire and forget" semantics ([#961]). + +[#961]: https://github.com/CosmWasm/cosmwasm/issues/961 ### Fixed diff --git a/devtools/format_md.sh b/devtools/format_md.sh index 963f5cfb2..6db7b36e2 100755 --- a/devtools/format_md.sh +++ b/devtools/format_md.sh @@ -8,6 +8,7 @@ while getopts c option; do case "${option}" in c) op="check" ;; + *) ;; esac done From 7813dc18dc84cf607a646e6a5a53d911879ffd8d Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 16:04:16 +0200 Subject: [PATCH 107/402] Cleanup from PR comments --- packages/std/src/ibc.rs | 2 +- packages/std/src/results/response.rs | 2 +- packages/std/src/results/subcall.rs | 22 +++++++++++++--------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 73b0f8388..746c549f1 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -205,7 +205,7 @@ where /// 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". - /// Use `call` or `msg.into()` to create messages with the older "fire and forget" semantics. + /// Use `SubMsg::new` to create messages with the older "fire and forget" semantics. pub messages: Vec>, /// The attributes that will be emitted as part of a "wasm" event pub attributes: Vec, diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 68db182f1..3abeed7f2 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -76,7 +76,7 @@ where /// If the ReplyOn variant matches the result (Always, Success on Ok, Error on Err), /// the runtime will invoke this contract's `reply` entry point /// after execution. Otherwise, they act like "fire and forget". - /// Use `call` or `msg.into()` to create messages with the older "fire and forget" semantics. + /// Use `SubMsg::new` to create messages with the older "fire and forget" semantics. pub messages: Vec>, /// The attributes that will be emitted as part of a "wasm" event pub attributes: Vec, diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 13cfdcd79..549e3f54c 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -22,12 +22,6 @@ pub enum ReplyOn { Never, } -impl Default for ReplyOn { - fn default() -> Self { - ReplyOn::Always - } -} - /// 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. /// @@ -48,7 +42,7 @@ where } /// This is used for cases when we use ReplyOn::Never and the id doesn't matter -pub const UNUSED_MSG_ID: u64 = 123456789; +pub const UNUSED_MSG_ID: u64 = 0; impl SubMsg where @@ -79,8 +73,18 @@ where Self::reply_on(msg.into(), id, ReplyOn::Always) } - /// add a gas limit to the message. Usage like: - /// SubMsg::reply_always(msg, 1234).with_gas_limit(60_000) + /// Add a gas limit to the message. + /// + /// ## Examples + /// + /// ``` + /// # use cosmwasm_std::{coins, BankMsg, 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_gas_limit(60_000); + /// assert_eq!(sub_msg.id, 1234); + /// assert_eq!(sub_msg.gas_limit, Some(60_000)); + /// assert_eq!(sub_msg.reply_on, ReplyOn::Always); + /// ``` pub fn with_gas_limit(mut self, limit: u64) -> Self { self.gas_limit = Some(limit); self From b937b231193635a23c4a0c22b00c145bcc6377b5 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 16:45:35 +0200 Subject: [PATCH 108/402] Fix broken test --- contracts/reflect/src/contract.rs | 15 ++++++--------- contracts/reflect/tests/integration.rs | 13 +++++-------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 1d8f6ba56..186a01b51 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -178,7 +178,7 @@ mod tests { use cosmwasm_std::testing::{mock_env, mock_info, MOCK_CONTRACT_ADDR}; use cosmwasm_std::{ coin, coins, from_binary, AllBalanceResponse, BankMsg, BankQuery, Binary, ContractResult, - Event, ReplyOn, StakingMsg, StdError, SubcallResponse, + Event, StakingMsg, StdError, SubcallResponse, }; #[test] @@ -405,16 +405,13 @@ mod tests { let _res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); let id = 123u64; - let payload = SubMsg { - id, - gas_limit: None, - msg: BankMsg::Send { + let payload = SubMsg::reply_always( + BankMsg::Send { to_address: String::from("friend"), amount: coins(1, "token"), - } - .into(), - reply_on: ReplyOn::default(), - }; + }, + id, + ); let msg = ExecuteMsg::ReflectSubCall { msgs: vec![payload.clone()], diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 6157dd8d1..f2f8f940b 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -196,16 +196,13 @@ fn reflect_subcall() { let _res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); let id = 123u64; - let payload = SubMsg { - id, - gas_limit: None, - msg: BankMsg::Send { + let payload = SubMsg::reply_always( + BankMsg::Send { to_address: String::from("friend"), amount: coins(1, "token"), - } - .into(), - reply_on: Default::default(), - }; + }, + id, + ); let msg = ExecuteMsg::ReflectSubCall { msgs: vec![payload.clone()], From 98d0cb6488015fa1ad383279832350c1926d8e33 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 16:58:26 +0200 Subject: [PATCH 109/402] Update test contracts for vm --- .../schema/response_for__custom_msg.json | 2 +- packages/vm/src/instance.rs | 2 +- packages/vm/testdata/hackatom_0.15.wasm | Bin 199119 -> 199091 bytes packages/vm/testdata/ibc_reflect_0.15.wasm | Bin 289018 -> 288986 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index f2f8f79a1..78164f89f 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -26,7 +26,7 @@ ] }, "messages": { - "description": "Optional list of messages to pass. These will be executed in order. If the ReplyOn variant matches the result (Always, Success on Ok, Error on Err), the runtime will invoke this contract's `reply` entry point after execution. Otherwise, they act like \"fire and forget\". Use `call` or `msg.into()` to create messages with the older \"fire and forget\" semantics.", + "description": "Optional list of messages to pass. These will be executed in order. If the ReplyOn variant matches the result (Always, Success on Ok, Error on Err), the runtime will invoke this contract's `reply` entry point after execution. Otherwise, they act like \"fire and forget\". Use `SubMsg::new` to create messages with the older \"fire and forget\" semantics.", "type": "array", "items": { "$ref": "#/definitions/SubMsg_for_CustomMsg" diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 8f57811fa..b5530be71 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -828,7 +828,7 @@ mod singlepass_tests { .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 159380); + assert_eq!(execute_used, 159004); } #[test] diff --git a/packages/vm/testdata/hackatom_0.15.wasm b/packages/vm/testdata/hackatom_0.15.wasm index e15dd34cb470ea3dd5a8bfbdd8ffc5bb17da5f13..e98bab289fc0e80844aa2c06a7337b0fd1c3b13b 100644 GIT binary patch delta 9972 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 S)Pp%+*@c~2=K#xU%l`rYyN8Sb diff --git a/packages/vm/testdata/ibc_reflect_0.15.wasm b/packages/vm/testdata/ibc_reflect_0.15.wasm index 8e6495a2090ab4d341b6c6adfde7aba941858543..9400cff8de4ee543e69c163886c861c4e95c4876 100644 GIT binary patch delta 9741 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 YZS*8OmL8^lJek@&i3z?XdFl!HKiNPvuK)l5 delta 9841 zcma($4OmrGwrB6P`Mnps{EC2b?#&v!#_#1! zRP@poDZQb|OpS_?yjGN8n&@C+GG&EE6D2cgS{kDH^VT}&-0PK`dVJrxYp!i#CO_#c6Bot&wr!I{jnGr?}XMs_=t6p<`Dw%IF%khgJWs0c4iv%K_ny#fvO&6}U z!f_nax@0dLb}a-a%N&zoh=q|M5>!xdh(`8EvgqhGoZTgRmUM2TQNry}>g`cnZPFQP z$-T9k_@S;-(iv!r|xT5KKKM;~gzDM~j+aQST$F-1-6L zoRgz)JBw8KMMhX6JubzV+!RPXdDw|mB3pq{68Tuu$+ za2l~RF)X+s-Hw9+d{UEvO&4USu$eUhOmUIMDDxApVe1CtA1}(^IL?_)2qnEEu=S$M z3aS>4CnRPsfOx#2OGe>W^)lMgO4*SiSt@Jw9WX^6Y``98<#1WofCj_L28+#04Xt7$bI~>UdDFQH$;S>epX(MGtSV;sKf`($g9N)+(dv!I&{Vw$sDnD zw{Ju*jTkQzSMmCZH>wG^P-qULjtRYu)@@z`U}vOU+xYZr=f;b*I5iqdL>=yphHES^ zKRsdX=zgqqvAdC;k8B!0W(6sFq){rTgJheU(wY5 z>zaCbw`Id_6}*2tjjizc+hCyAJ05NpKFXIfV32q8^^kuBZ~0To>zxRBp~3q&32Y^~ zzhxyh#Z>bC&9FoUds!xw2O5g^OoQE&Z^NgO1Vm4<1v;5!yg znGJElRXl14l9@xi_soX%!M_y8{`qi&Y-_+J`OvfEXan^Oru9yH-zjR--scRr_Krs0 ze|lW1>6AKFSr6=Ukc7BTnAPV+?&JEEK3nZRwDAS=8eIFnxkDyz<`{xy%Z^Q!-VjUg z6PSGuB$Ql9!rm?0xO1Sjp|-WhnZXr}X4pk-dv`ZnHh(3XY{aJm}fmO25lZxA){NmWX_BJ3coL`do3A_I6i^h53*mH&~LA26=ZL z4YI=05E1D2GCVgA?hs9wHy=`>PkdyRZK{VEwB>2WetdjBt@^e-c=JY>#L%?>{!((d zndMRqk28k+YV5SpUe0JnH`-{jGm6nCY&6N~V)Xbvt8a?42cx@fw7)Zw(dTV6)fvI) zzdp2tGo4OG-?z{bV}R4a_+vJEw3%zhfxVXWXfutB7j1Nyc{DN}x6uSACxdaJ$rA2i zo|B9pY}9E6&G^Jdlgu-cQRhcF8Xn`=->lC2H1mXHyl&%T`1B}^u06P~0EWsFd+$aZ01TlJ+1!0naRg&jaKS-3$Fi0PZY=15&o{_kLLf>q0_n zSh3rv#K)IIk?X_(()S_h(?j%7VW{zxH2>Y4NBJi{yKO>^pHRgTZll>xuqE2M z6G{)-I>=UGR59DO9E^HD7EZhqek>@MCQ$BuWgYDuB~`4TiKoTX8b2lotM_AJq@dZ4 zv1FScGnM->?pOM$PbXvLKFqKuQN;v~*9IY6vP9_k8z(+oeuKWN^LL+ny$H4(&)X(EV^GzP&s6YW|ZS^H^Pmw{3tKq zUijul$fgsGu?gZZd=q4d7H&_7Es1b=Ys~AADXMYu>oBmtUm9#_(M_5< zQkONaL-uvmbQxsD8tsTwo83(F zeLWlAgp9Oq=JUaf;!O5?AVN6E7~4&{x{2moi~YC2RSt8eg6CX|)3$&+j+(2vpkMDq|za1~vJ90t< zRS~|4DLtIdHp-|W*K=|R3hLk9p=%lwbU|EQTj((_1(vS(7GfBsrKOx9v=f@)rJvjD zAW7`N-`BzFBzqh#1KiX@ct)&{eg?b?{gOB-X*3ovv)mNm)TPv%_b%KLT*>aO#QJw( zroGN&z&bP6`=!OcxE_*l+Iuj{VGryMqf}b;9=w`t&LWs+0Son@g}Pj*i-n$Gwr4BO z-Uc^J3!IJ~p}SnKOEV7#k~5<8NGexU_8T-pGpT$;>QMxKC3&0h>^7M8|FV00U)%8> zO;=MRgy|)Uj9O@|K%Nj;+N%KuJ<|Xx&YaJc*#9MJv7!M6`aHL*0R~g;IoSY1d)r>o zr9U8MirE1fyB(7H+5wpu0cKq>OaUgEE%Ojpi+|V-nLhn*ZHEk}zn7q1KW&Er_MAmP ztbl5wEcQsdCg#2mhKu{@<`8zwpMD>tU7yKMXQPKtZgsU-^>mBf3lquu} zU2`k51XW?qPUuPH`*%Cxok)%p*DAqvrxo2F&~>{NXMX_mf9{?>$+UYa1BwioNQ1B? z))qlP7bvzve5%Z$*Sl&-+USU3yOD*tX-&X(;^JM<>nhtFx|!GJ%r1AM!)U=xyXbv$ zE4J-|nf-jB52AAf4M_{FfaX6nf+Ox*jXQ95BitBki;@D9F_q%ff_05_3$MkG8!v?= zW;bL^@`r_&lRYalgcrqBnu+8+6)x?mfzjfv2#P&mN9%uf!?@vQ(dHlWtWiSSJI6(f z&|GU|qN9hyTEPL)d}a?kB)g7b$sQO+FE+34;TMtbydN_+3 z>HNdt3!&p)upVM=HRk?9KVzC;ny;|vYNA~^NLp8%*46lO6Wrx6Gs}FlsK$i7FvXXy z1$$wxsKI@EVU~k^soNzW^FzSCE5EDPjKM}T0rTX?burWfoI^IN?K}M8L&z9Y!I{WE z>$aW&o56;~O{d2p_BU~(<8?BbhD6`agq){@3 zLeD6LNKhtlm15LbWs86+p<`atJ{T&>@a#UQqEi`GHq$Ai0)Mj~9%gj^e#j$q*herm zZo_dt>(K$mTuY7^3Y)RPTmBI|t|$lld;*CnD{a;E_Dkp(e;O*UdNcbmHgUB; z= zBakIq&+>>PgYOig#8`vT9pD+b@e~cypZ@7UOORd)8SCxCzF`wAo>A|e)d32k*{sVh zYc06!TX>#~a`#b5IQ%F~x7vwVbrcd@t4@EwBz?U27_qUS;xrr z<@mxeaC<)Kq~W90O#A_Ei9XETsnU~DR;d|ZVD%3agD*QV{G@5f zsFN@|;}nU}+KJM%2$85$tsidKMp4@~iq{NPA-_>yb>i-m&`+M~#1ki>NVa$4-KW4E z`n5Hrz;{zrGHy5pIl*B;#1uCBj^;@JwHOW?CL~E zC%px)$1gh}2LHE{PEU5bsS{$Yc7Go!=`=*!?HD>-1m~82sFminYmdBSh+@O;H}5pW zkkEgghFQLTM^8h%uN~iI>KNEXXSeluQx{D2aca8E0e5y$EY_p*3`~n(Pf;$gRuz@p z@4Cp_$wry?{xfivV&E3!@XMO#$9c}hJiID>V; zYA_{7N3ik`aD=Gd1O^g_Z+YCh&>4xP4&LRnV45GWkMJRHE(YgW)!_}aWrygz4u8#=8 zs&F+@JcaARlulr0m>Mq*VR*P2JKzvWbkk>%F4I?ri^It;ui=_-l||t1;p*O-8Xu-f zm~Sdz{8btz%Fh=@E3e_f#zE%uOM&?|5GehcxPr9zDTk_*w2X#DsvwX@f5K5wiZ7n) zqttU$MaD;~Tg9`uHd>7%@L9B~4t|zOfgXfa(JB_JV$=|#?~PF_E~77uRRb?0yc(-+ zq2!lws&B4UOEjuH{(~I9nKoabl3~8Ya6!F1N;?#(#I&<3my@0ka6EnTT z84$>m#)-=$P0TNO;sPFtQz<=4FB_*6rV8h zP&QWLS1D?&coE&Y@(g{ImZ!n*jrhp-6niBS=cohj4!hK3iprxzFUN z6uC}EcaBPwJ9O{Z9Mwm}b+}!cOVhNQ?$2L(&!WQLXX%9C5<^`T7VB|oJqa6(m4-^` zmqTa*qXZ>EeQ{y2eox_ji|1-ub2RJFwE5U((8w#$m8%9DwIrEL)MkRA1Sc)Nf6k%> zbM@Rg%kncu>dT6kE?7K|2J9d{4>U1j2h_1TIrG-$Rmk0(EeB~+}c%8}!ZznvG@E@+i1=p#9NzT45tq0))2(pdY zHoS!(_rHx`3_;tr-`;oE!u;je7cRYbPVv?EIyA@%%Z9^=0=hSyH&PIDc+C$>}6_*`x?}_H)tEThnsq6yH7HnyS{9 zXbz$klK#=uX7?uHlJS&7cX}(wt7Q;hn(ET-B62_a;^_KLPs)zffK?+@vM9wdH&Dqa z#qt|ep}TaTOPfVfed!CM&xb!mZ4cw9Pa?0nFlUmQ7neH7rOhVlhxCQfC5>K&9d4}2 zP;{Ja#be!Z$!H@dI&3H+jYb`4NQoV1N1)IJ*h- z@Z-33vdYS+8RF6g(SVcgT~fGg*@C+kFlG?-jW=;jouYYX-K zJrOdrEX}1&q0dQQ(=eA-M&A_rnnu!>PTvUnuBLA|eb{5VN;BLU)*2Z?0}ZFPx#|g$ z#hPxzJN3e)`kj~XDMaV>X!7yqQEDvKO;>}&B0Mr(l|-dyS|#CI(vd=9>G=Cw)!$@W zCXSz>3PcIMHiK%_20T7P-JY0ojf-+!(?SVyefV~?HTKcb-nqY1!9v`G3umhIxC-L) zAJ;BlyBs&qRFhq`S=K6SAs9^}_~dOW4zIe6DoB^j8bM??eO+0Ycboc+SdK5>rcM)h z;dV7Ss&<9Ek zL}%l&aBZF%99Bjs2m7zMFHfb5dW2ajJ?s=w6Nws$*|XH2f`2$qYcL)6&!Wr1KW8a^ z=2f#*|2f06U0QDvdxSo&Kt6mqwVCe2AL@n|6V4O#@e8`~^L>1LY_`gb+DXH3F={5r zwpQSQ*=levEypUXkpvZyqY3iNDzN7r>RPw2*LWiLCvpKnuK7y|az0exvO82-R28AT o_PKuW)==f$e1|Fta;IJI(ozYZOdmrZK7-n9M4I=OeDx^&AL=bPn*aa+ From 7a0cc957f2426fd68887cdde92c517beb12fe4fa Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 17 Jun 2021 22:01:28 +0200 Subject: [PATCH 110/402] [skip ci] Add migration instructions --- CHANGELOG.md | 2 ++ MIGRATING.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ca739073..7899fbb8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,8 @@ and this project adheres to and cache. - cosmwasm-std: Merge `messages` and `submessages` into one list, using `ReplyOn::Never` to model the "fire and forget" semantics ([#961]). +- cosmwasm-std: Add helpers to create `SubMsg`. `::new()`, `::reply_on_error()`, + `reply_on_success()`, `reply_always()` ([#961]). [#961]: https://github.com/CosmWasm/cosmwasm/issues/961 diff --git a/MIGRATING.md b/MIGRATING.md index 920650548..330f02d9a 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,7 +4,64 @@ 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. -## 0.13 -> 0.14 (unreleased) +## 0.14 -> 0.15 (unreleased) + +- Combine `messages` and `submessages` on `Response` obj. The new format uses + `messages: Vec>`, so copy `submessages` content, and wrap old + messages using `SubMsg::new`. Here is how to change messages: + + ```rust + let send = BankMsg::Send{ to_address, amount }; + + // before + let res = Response { + messages: vec![send.into()], + ..Response::default() + } + + // after + let res = Response { + messages: vec![SubMsg::new(send)], + ..Response::default() + } + + // alternate approach + let mut res = Response::new(); + res.add_message(send); + ``` + + And here is how to change submessages: + + ```rust + // before + let sub_msg = SubMsg { + id: INIT_CALLBACK_ID, + msg: msg.into(), + gas_limit: None, + reply_on: ReplyOn::Success, + }; + let res = Response { + submessages: vec![sub_msg], + ..Response::default() + }; + + // after + let msg = SubMsg::reply_on_success(msg, INIT_CALLBACK_ID); + let res = Response { + messages: vec![msg], + ..Response::default() + }; + + // alternate approach + let msg = SubMsg::reply_on_success(msg, INIT_CALLBACK_ID); + let mut res = Response::new(); + res.add_submessage(msg); + ``` + + Note that this means you can mix "messages" and "submessages" in any execution + order. You are not restricted to doing "submessages" first. + +## 0.13 -> 0.14 - The minimum Rust supported version for 0.14 is 1.51.0. Verify your Rust version is >= 1.51.0 with: `rustc --version` From 096a9d19de56c4ba60210fba646be395fbf79c36 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 18 Jun 2021 14:25:12 +0200 Subject: [PATCH 111/402] Polish some text --- CHANGELOG.md | 9 ++++++--- MIGRATING.md | 8 ++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7899fbb8e..b52691f78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,12 +40,15 @@ and this project adheres to 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 helpers to create `SubMsg`. `::new()`, `::reply_on_error()`, - `reply_on_success()`, `reply_always()` ([#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]). -[#961]: https://github.com/CosmWasm/cosmwasm/issues/961 +[#961]: https://github.com/CosmWasm/cosmwasm/pull/961 ### Fixed diff --git a/MIGRATING.md b/MIGRATING.md index 330f02d9a..4a95b6f5a 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -6,12 +6,12 @@ major releases of `cosmwasm`. Note that you can also view the ## 0.14 -> 0.15 (unreleased) -- Combine `messages` and `submessages` on `Response` obj. The new format uses - `messages: Vec>`, so copy `submessages` content, and wrap old +- Combine `messages` and `submessages` on the `Response` object. The new format + uses `messages: Vec>`, so copy `submessages` content, and wrap old messages using `SubMsg::new`. Here is how to change messages: ```rust - let send = BankMsg::Send{ to_address, amount }; + let send = BankMsg::Send { to_address, amount }; // before let res = Response { @@ -59,7 +59,7 @@ major releases of `cosmwasm`. Note that you can also view the ``` Note that this means you can mix "messages" and "submessages" in any execution - order. You are not restricted to doing "submessages" first. + order. You are no more restricted to doing "submessages" first. ## 0.13 -> 0.14 From 45472d5b824302b164a47464cb92151fa981b5b2 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Fri, 18 Jun 2021 18:12:29 +0200 Subject: [PATCH 112/402] Add custom events to contract responses --- contracts/burner/src/contract.rs | 1 + .../schema/acknowledgement_msg_balances.json | 2 +- .../schema/acknowledgement_msg_dispatch.json | 2 +- .../schema/acknowledgement_msg_who_am_i.json | 2 +- contracts/ibc-reflect/src/contract.rs | 4 +-- .../schema/response_for__custom_msg.json | 29 ++++++++++++++++++- contracts/reflect/src/contract.rs | 2 ++ packages/std/src/results/contract_result.rs | 7 +++-- packages/std/src/results/response.rs | 13 ++++++++- 9 files changed, 52 insertions(+), 10 deletions(-) diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index 85b06cf3e..3ddebad83 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -42,6 +42,7 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult Ok(Response { messages: vec![SubMsg::new(send)], attributes: vec![attr("action", "burn"), attr("payout", msg.payout)], + events: vec![], data: Some(data_msg.into()), }) } diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json b/contracts/ibc-reflect/schema/acknowledgement_msg_balances.json index 6373205d7..55be66b88 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\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", + "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}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", "anyOf": [ { "type": "object", diff --git a/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json b/contracts/ibc-reflect/schema/acknowledgement_msg_dispatch.json index 45ad1902d..8bbdc8a39 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\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", + "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}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", "anyOf": [ { "type": "object", 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 01e4f720f..8ab6cd727 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\":[],\"data\":null}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", + "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}}\"#.to_vec()); ```\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\"}\"#.to_vec()); ```", "anyOf": [ { "type": "object", diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 100864fd3..834eda140 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,8 +1,8 @@ use cosmwasm_std::{ attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, IbcBasicResponse, IbcChannel, - IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, - Response, StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, + IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, Response, + StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, }; use crate::msg::{ diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 78164f89f..5ed40b1c9 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -1,10 +1,11 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Response_for_CustomMsg", - "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response { messages: vec![], attributes: vec![attr(\"action\", \"instantiate\")], data: None, }) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new(); // ... response.add_attribute(\"Let the\", \"hacking begin\"); // ... response.add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }); response.add_attribute(\"foo\", \"bar\"); // ... response.set_data(Binary::from(b\"the result data\")); Ok(response) } ```", + "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response { messages: vec![], attributes: vec![attr(\"action\", \"instantiate\")], events: vec![], data: None, }) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new(); // ... response.add_attribute(\"Let the\", \"hacking begin\"); // ... response.add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }); response.add_attribute(\"foo\", \"bar\"); // ... response.set_data(Binary::from(b\"the result data\")); Ok(response) } ```", "type": "object", "required": [ "attributes", + "events", "messages" ], "properties": { @@ -25,6 +26,12 @@ } ] }, + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/Event" + } + }, "messages": { "description": "Optional list of messages to pass. These will be executed in order. If the ReplyOn variant matches the result (Always, Success on Ok, Error on Err), the runtime will invoke this contract's `reply` entry point after execution. Otherwise, they act like \"fire and forget\". Use `SubMsg::new` to create messages with the older \"fire and forget\" semantics.", "type": "array", @@ -305,6 +312,26 @@ } ] }, + "Event": { + "description": "A full Cosmos SDK event as documented in https://docs.cosmos.network/v0.42/core/events.html.\n\nThis version uses string attributes (similar to https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70), which then get magically converted to bytes for Tendermint somewhere between the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK.", + "type": "object", + "required": [ + "attributes", + "type" + ], + "properties": { + "attributes": { + "type": "array", + "items": { + "$ref": "#/definitions/Attribute" + } + }, + "type": { + "description": "The event type. This is renamed to \"kind\" because \"type\" is reserved in Rust. This sucks, we know.", + "type": "string" + } + } + }, "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)", "anyOf": [ diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 186a01b51..a7ac744d6 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -57,6 +57,7 @@ pub fn try_reflect( let res = Response { messages, attributes: vec![attr("action", "reflect")], + events: vec![], data: None, }; Ok(res) @@ -82,6 +83,7 @@ pub fn try_reflect_subcall( let res = Response { messages: msgs, attributes: vec![attr("action", "reflect_subcall")], + events: vec![], data: None, }; Ok(res) diff --git a/packages/std/src/results/contract_result.rs b/packages/std/src/results/contract_result.rs index ef0cfdf20..afaaed2ad 100644 --- a/packages/std/src/results/contract_result.rs +++ b/packages/std/src/results/contract_result.rs @@ -18,7 +18,7 @@ use std::fmt; /// # 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":[],"data":null}}"#.to_vec()); +/// assert_eq!(to_vec(&result).unwrap(), br#"{"ok":{"messages":[],"attributes":[],"events":[],"data":null}}"#.to_vec()); /// ``` /// /// Failure: @@ -101,7 +101,7 @@ mod tests { let result: ContractResult = ContractResult::Ok(Response::default()); assert_eq!( to_vec(&result).unwrap(), - br#"{"ok":{"messages":[],"attributes":[],"data":null}}"#.to_vec() + br#"{"ok":{"messages":[],"attributes":[],"events":[],"data":null}}"#.to_vec() ); let result: ContractResult = ContractResult::Err("broken".to_string()); @@ -117,7 +117,8 @@ mod tests { assert_eq!(result, ContractResult::Ok("foo".to_string())); let result: ContractResult = - from_slice(br#"{"ok":{"messages":[],"attributes":[],"data":null}}"#).unwrap(); + from_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(); diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 3abeed7f2..3c9784853 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt; -use crate::Binary; +use crate::{Binary, Event}; use super::{Attribute, CosmosMsg, Empty, SubMsg}; @@ -33,6 +33,7 @@ use super::{Attribute, CosmosMsg, Empty, SubMsg}; /// Ok(Response { /// messages: vec![], /// attributes: vec![attr("action", "instantiate")], +/// events: vec![], /// data: None, /// }) /// } @@ -80,6 +81,7 @@ where pub messages: Vec>, /// The attributes that will be emitted as part of a "wasm" event pub attributes: Vec, + pub events: Vec, pub data: Option, } @@ -91,6 +93,7 @@ where Response { messages: vec![], attributes: vec![], + events: vec![], data: None, } } @@ -104,6 +107,7 @@ where Self::default() } + /// Add an attribute included in the main `wasm` event. pub fn add_attribute, V: Into>(&mut self, key: K, value: V) { self.attributes.push(Attribute { key: key.into(), @@ -123,6 +127,12 @@ where self.messages.push(msg); } + /// Adds an extra event to the response, separate from the main `wasm` event + /// that is always created. + pub fn add_event(&mut self, event: Event) { + self.events.push(event); + } + pub fn set_data>(&mut self, data: U) { self.data = Some(data.into()); } @@ -164,6 +174,7 @@ mod tests { key: "action".to_string(), value: "release".to_string(), }], + events: vec![], data: Some(Binary::from([0xAA, 0xBB])), }; let serialized = to_vec(&original).expect("encode contract result"); From ff67f24a216d469b6637402b2f9e8d12531f3e03 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 10:48:56 +0200 Subject: [PATCH 113/402] API improvements for custom events --- packages/std/src/results/attribute.rs | 2 +- packages/std/src/results/response.rs | 3 +++ packages/std/src/results/subcall.rs | 32 +++++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/std/src/results/attribute.rs b/packages/std/src/results/attribute.rs index d0f343e5a..67b41a3b2 100644 --- a/packages/std/src/results/attribute.rs +++ b/packages/std/src/results/attribute.rs @@ -9,7 +9,7 @@ pub struct Attribute { } /// Creates a new Attribute. -pub fn attr(key: K, value: V) -> Attribute { +pub fn attr(key: impl ToString, value: impl ToString) -> Attribute { Attribute { key: key.to_string(), value: value.to_string(), diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 3c9784853..64272b27e 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -129,6 +129,9 @@ where /// Adds an extra event to the response, separate from the main `wasm` event /// that is always created. + /// + /// The `wasm-` prefix will be appended by the runtime to the provided type + /// of event. pub fn add_event(&mut self, event: Event) { self.events.push(event); } diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 549e3f54c..97e672b62 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -133,10 +133,38 @@ pub struct Event { } impl Event { - pub fn new(kind: &str, attributes: Vec) -> Self { + pub fn new(kind: impl Into, attributes: Vec) -> Self { Event { - kind: kind.to_string(), + kind: kind.into(), attributes, } } + + pub fn empty(kind: impl Into) -> Self { + Self::new(kind, vec![]) + } + + pub fn attr(mut self, key: impl Into, value: impl Into) -> Self { + self.attributes.push(crate::attr(key.into(), value.into())); + self + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::attr; + + #[test] + fn event_builder_test() { + let event = Event::empty("test").attr("foo", "bar").attr("bar", "baz"); + + assert_eq!( + event, + Event { + kind: "test".to_string(), + attributes: vec![attr("foo", "bar"), attr("bar", "baz")], + } + ); + } } From b6ae1cc3f3663fc91253895c1623e79d9c8f6001 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 10:51:42 +0200 Subject: [PATCH 114/402] Changelog entry for custom events --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b52691f78..6738ec25f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to ### Added - cosmwasm-std: Implement `Sub` and `SubAssign` for `Uint128` +- cosmwasm-std: Implement custom events for contract execution results ### Removed From 0cad7ae55715ddc5b93fc6c743585c21318edb03 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 11:15:54 +0200 Subject: [PATCH 115/402] Update compiled Wasm modules for VM tests --- packages/vm/testdata/hackatom_0.15.wasm | Bin 199091 -> 201547 bytes packages/vm/testdata/ibc_reflect_0.15.wasm | Bin 288986 -> 290894 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/hackatom_0.15.wasm b/packages/vm/testdata/hackatom_0.15.wasm index e98bab289fc0e80844aa2c06a7337b0fd1c3b13b..80fcc347ed540023d7ca84bdbf10ebb47f0b7b99 100644 GIT binary patch delta 60037 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 A;s5{u delta 57803 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 Date: Mon, 21 Jun 2021 11:29:49 +0200 Subject: [PATCH 116/402] Update gas prices --- packages/std/src/results/subcall.rs | 10 +++------- packages/vm/src/instance.rs | 6 +++--- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 97e672b62..8e5e5ba42 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -133,17 +133,13 @@ pub struct Event { } impl Event { - pub fn new(kind: impl Into, attributes: Vec) -> Self { + pub fn new(kind: impl Into) -> Self { Event { kind: kind.into(), - attributes, + attributes: Vec::with_capacity(10), } } - pub fn empty(kind: impl Into) -> Self { - Self::new(kind, vec![]) - } - pub fn attr(mut self, key: impl Into, value: impl Into) -> Self { self.attributes.push(crate::attr(key.into(), value.into())); self @@ -157,7 +153,7 @@ mod tests { #[test] fn event_builder_test() { - let event = Event::empty("test").attr("foo", "bar").attr("bar", "baz"); + let event = Event::new("test").attr("foo", "bar").attr("bar", "baz"); assert_eq!( event, diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b5530be71..e2e7e3539 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -606,7 +606,7 @@ mod tests { let report2 = instance.create_gas_report(); assert_eq!(report2.used_externally, 73); - assert_eq!(report2.used_internally, 38550); + assert_eq!(report2.used_internally, 38880); assert_eq!(report2.limit, LIMIT); assert_eq!( report2.remaining, @@ -805,7 +805,7 @@ mod singlepass_tests { .unwrap(); let init_used = orig_gas - instance.get_gas_left(); - assert_eq!(init_used, 38623); + assert_eq!(init_used, 38953); } #[test] @@ -828,7 +828,7 @@ mod singlepass_tests { .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 159004); + assert_eq!(execute_used, 159317); } #[test] From ea6cba49032cb5e0b1b6a0cfdf0cf58680853415 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 11:40:36 +0200 Subject: [PATCH 117/402] Docstrings for events --- packages/std/src/results/subcall.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 8e5e5ba42..d910049cf 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -133,6 +133,7 @@ pub struct Event { } impl Event { + /// Create a new event with the given type and an empty list of attributes. pub fn new(kind: impl Into) -> Self { Event { kind: kind.into(), @@ -140,6 +141,7 @@ impl Event { } } + /// Add an attribute to the event. pub fn attr(mut self, key: impl Into, value: impl Into) -> Self { self.attributes.push(crate::attr(key.into(), value.into())); self From cbf9494465329dd4fa494297c622282018de9e13 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 11:42:12 +0200 Subject: [PATCH 118/402] Refactor test --- packages/std/src/results/subcall.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index d910049cf..fc8a1443b 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -154,15 +154,13 @@ mod tests { use crate::attr; #[test] - fn event_builder_test() { - let event = Event::new("test").attr("foo", "bar").attr("bar", "baz"); - - assert_eq!( - event, - Event { - kind: "test".to_string(), - attributes: vec![attr("foo", "bar"), attr("bar", "baz")], - } - ); + fn event_construction() { + let event_direct = Event { + kind: "test".to_string(), + attributes: vec![attr("foo", "bar"), attr("bar", "baz")], + }; + let event_builder = Event::new("test").attr("foo", "bar").attr("bar", "baz"); + + assert_eq!(event_direct, event_builder); } } From b1b9286d32bc46bc1ad7567db87e65ca8204d385 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 12:00:09 +0200 Subject: [PATCH 119/402] Update contracts --- contracts/reflect/src/contract.rs | 2 +- contracts/reflect/tests/integration.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index a7ac744d6..2ab0f14f7 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -436,7 +436,7 @@ mod tests { let id = 123u64; let data = Binary::from(b"foobar"); - let events = vec![Event::new("message", vec![attr("signer", "caller-addr")])]; + let events = vec![Event::new("message").attr("signer", "caller-addr")]; let result = ContractResult::Ok(SubcallResponse { events: events.clone(), data: Some(data.clone()), diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index f2f8f940b..2f4005f59 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::{ - attr, coin, coins, from_binary, BankMsg, Binary, Coin, ContractResult, Event, Reply, Response, + coin, coins, from_binary, BankMsg, Binary, Coin, ContractResult, Event, Reply, Response, StakingMsg, SubMsg, SubcallResponse, SystemResult, }; use cosmwasm_vm::{ @@ -225,7 +225,7 @@ fn reply_and_query() { let id = 123u64; let data = Binary::from(b"foobar"); - let events = vec![Event::new("message", vec![attr("signer", "caller-addr")])]; + let events = vec![Event::new("message").attr("signer", "caller-addr")]; let result = ContractResult::Ok(SubcallResponse { events: events.clone(), data: Some(data.clone()), From 316d2225f9c8e1d38bcf539701c27d806323b3c5 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 12:06:31 +0200 Subject: [PATCH 120/402] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6738ec25f..39ace045a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,8 @@ and this project adheres to - 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 [#961]: https://github.com/CosmWasm/cosmwasm/pull/961 From 342a1cad848b885be32167cfda640038717ec403 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 12:07:32 +0200 Subject: [PATCH 121/402] Fix unnecessary string clone in `Event:attr` --- packages/std/src/results/subcall.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index fc8a1443b..df073e011 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -143,7 +143,10 @@ impl Event { /// Add an attribute to the event. pub fn attr(mut self, key: impl Into, value: impl Into) -> Self { - self.attributes.push(crate::attr(key.into(), value.into())); + self.attributes.push(Attribute { + key: key.into(), + value: value.into(), + }); self } } From 7d513ced940c6312f15383d39049c261b4c789cd Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 12:15:32 +0200 Subject: [PATCH 122/402] Update hackatom to emit an extra event --- contracts/hackatom/src/contract.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 99763242c..eb1486ce2 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -2,7 +2,7 @@ use sha2::{Digest, Sha256}; use cosmwasm_std::{ entry_point, from_slice, to_binary, to_vec, Addr, AllBalanceResponse, Api, BankMsg, - CanonicalAddr, Deps, DepsMut, Env, MessageInfo, QueryRequest, QueryResponse, Response, + CanonicalAddr, Deps, DepsMut, Env, Event, MessageInfo, QueryRequest, QueryResponse, Response, StdError, StdResult, WasmQuery, }; @@ -93,6 +93,7 @@ fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result Date: Mon, 21 Jun 2021 12:24:19 +0200 Subject: [PATCH 123/402] Format CHANGELOG --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39ace045a..7eda36afa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,8 +48,8 @@ and this project adheres to - 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: Change `Event`'s constructor - it no longer takes a vector of + attributes and instead constructs an empty one [#961]: https://github.com/CosmWasm/cosmwasm/pull/961 From 864ac2d5065c9f409d6c82dd9797275fd8a79c8f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 15:37:58 +0200 Subject: [PATCH 124/402] Add test for contracts with float ops --- contracts/README.md | 5 + contracts/floaty/.cargo/config | 6 + contracts/floaty/Cargo.lock | 1556 +++++++++++++++++ contracts/floaty/Cargo.toml | 42 + contracts/floaty/examples/schema.rs | 27 + contracts/floaty/schema/balance_response.json | 39 + contracts/floaty/schema/execute_msg.json | 107 ++ contracts/floaty/schema/instantiate_msg.json | 17 + contracts/floaty/schema/migrate_msg.json | 14 + contracts/floaty/schema/query_msg.json | 69 + contracts/floaty/schema/state.json | 27 + contracts/floaty/schema/sudo_msg.json | 55 + .../floaty/schema/verifier_response.json | 13 + contracts/floaty/src/contract.rs | 583 ++++++ contracts/floaty/src/errors.rs | 12 + contracts/floaty/src/lib.rs | 7 + contracts/floaty/src/msg.rs | 82 + contracts/floaty/src/state.rs | 13 + contracts/floaty/tests/integration.rs | 486 +++++ packages/vm/src/wasm_backend/compile.rs | 13 + packages/vm/testdata/floaty.wasm | Bin 0 -> 1820257 bytes 21 files changed, 3173 insertions(+) create mode 100644 contracts/floaty/.cargo/config create mode 100644 contracts/floaty/Cargo.lock create mode 100644 contracts/floaty/Cargo.toml create mode 100644 contracts/floaty/examples/schema.rs create mode 100644 contracts/floaty/schema/balance_response.json create mode 100644 contracts/floaty/schema/execute_msg.json create mode 100644 contracts/floaty/schema/instantiate_msg.json create mode 100644 contracts/floaty/schema/migrate_msg.json create mode 100644 contracts/floaty/schema/query_msg.json create mode 100644 contracts/floaty/schema/state.json create mode 100644 contracts/floaty/schema/sudo_msg.json create mode 100644 contracts/floaty/schema/verifier_response.json create mode 100644 contracts/floaty/src/contract.rs create mode 100644 contracts/floaty/src/errors.rs create mode 100644 contracts/floaty/src/lib.rs create mode 100644 contracts/floaty/src/msg.rs create mode 100644 contracts/floaty/src/state.rs create mode 100644 contracts/floaty/tests/integration.rs create mode 100755 packages/vm/testdata/floaty.wasm diff --git a/contracts/README.md b/contracts/README.md index 58344390f..d463d65ae 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -25,6 +25,11 @@ docker run --rm -v "$(pwd)":/code \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/rust-optimizer:0.11.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.11.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 \ diff --git a/contracts/floaty/.cargo/config b/contracts/floaty/.cargo/config new file mode 100644 index 000000000..8d4bc738b --- /dev/null +++ b/contracts/floaty/.cargo/config @@ -0,0 +1,6 @@ +[alias] +wasm = "build --release --target wasm32-unknown-unknown" +wasm-debug = "build --target wasm32-unknown-unknown" +unit-test = "test --lib" +integration-test = "test --test integration" +schema = "run --example schema" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock new file mode 100644 index 000000000..68dfb8429 --- /dev/null +++ b/contracts/floaty/Cargo.lock @@ -0,0 +1,1556 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +dependencies = [ + "gimli 0.23.0", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backtrace" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object 0.22.0", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "bitvec" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" +dependencies = [ + "funty", + "radium", + "wyz", +] + +[[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 = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cc" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[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.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" + +[[package]] +name = "const_fn" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" + +[[package]] +name = "cosmwasm-crypto" +version = "0.14.1" +dependencies = [ + "digest", + "ed25519-zebra", + "k256", + "rand_core", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "0.14.1" +dependencies = [ + "syn", +] + +[[package]] +name = "cosmwasm-schema" +version = "0.14.1" +dependencies = [ + "schemars", + "serde_json", +] + +[[package]] +name = "cosmwasm-std" +version = "0.14.1" +dependencies = [ + "base64", + "cosmwasm-crypto", + "cosmwasm-derive", + "schemars", + "serde", + "serde-json-wasm", + "thiserror", + "uint", +] + +[[package]] +name = "cosmwasm-storage" +version = "0.14.1" +dependencies = [ + "cosmwasm-std", + "serde", +] + +[[package]] +name = "cosmwasm-vm" +version = "0.14.1" +dependencies = [ + "clru", + "cosmwasm-crypto", + "cosmwasm-std", + "hex", + "loupe", + "parity-wasm", + "schemars", + "serde", + "serde_json", + "sha2", + "thiserror", + "wasmer", + "wasmer-middlewares", +] + +[[package]] +name = "cpuid-bool" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" + +[[package]] +name = "cranelift-bforest" +version = "0.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" +dependencies = [ + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "gimli 0.24.0", + "log", + "regalloc", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" +dependencies = [ + "cranelift-codegen-shared", + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" + +[[package]] +name = "cranelift-entity" +version = "0.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" + +[[package]] +name = "cranelift-frontend" +version = "0.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" +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 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +dependencies = [ + "cfg-if 1.0.0", + "const_fn", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "lazy_static", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-mac" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" +dependencies = [ + "byteorder", + "digest", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +dependencies = [ + "const-oid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[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.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7d1242462849390bb2ad38aeed769499f1afc7383affa2ab0c1baa894c0200" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dynasmrt" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dd4d1d5ca12258cef339a57a7643e8b233a42dea9bb849630ddd9dd7726aa9" +dependencies = [ + "byteorder", + "dynasm", + "memmap2", +] + +[[package]] +name = "ecdsa" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +dependencies = [ + "elliptic-curve", + "hmac", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core", + "serde", + "sha2", + "thiserror", +] + +[[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.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +dependencies = [ + "bitvec", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "enumset" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf6167d1be7a76696cadccfbdb89e5cb519244a42bab7da5577994579217dcff" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8a79bce471eb6165aa8ac86ebc8d788543b741eaa15e8b8486591696207d6c" +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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + +[[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 1.0.0", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "gimli" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "group" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hackatom" +version = "0.0.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cosmwasm-vm", + "schemars", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "hermit-abi" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" + +[[package]] +name = "hmac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +dependencies = [ + "crypto-mac", + "digest", +] + +[[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.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +dependencies = [ + "autocfg", + "hashbrown", + "serde", +] + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "k256" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa", + "elliptic-curve", +] + +[[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.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" + +[[package]] +name = "libloading" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "log" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +dependencies = [ + "cfg-if 0.1.10", +] + +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + +[[package]] +name = "memmap2" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e73be3b7d04a0123e933fea1d50d126cc7196bbc0362c0ce426694f777194eee" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +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.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "object" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +dependencies = [ + "crc32fast", + "indexmap", + "memchr", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d17797de36b94bc5f73edad736fd0a77ce5ab64dd622f809c1eead8c91fa6564" + +[[package]] +name = "pin-project-lite" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" + +[[package]] +name = "pkcs8" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +dependencies = [ + "der", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "regalloc" +version = "0.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5" +dependencies = [ + "log", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "region" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" +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 = "rkyv" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb135b3e5e3311f0a254bfb00333f4bac9ef1d89888b84242a89eb8722b09a07" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8f489f6b6d8551bb15904293c1ad58a6abafa7d8390d15f7ed05a2afcd87d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a24475737c47c5a97cd0858d09db5b0c01ade85d671ee569cd1a5a2c0c80a44" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f0ccbfe5a97322d90f8b19604fa5b99dd8223540eb6e36c99a9125303e4c00" +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 = "serde" +version = "1.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50eef3672ec8fa45f3457fd423ba131117786784a895548021976117c1ded449" +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.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" +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.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpuid-bool", + "digest", + "opaque-debug", +] + +[[package]] +name = "signature" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[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.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "subtle" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" + +[[package]] +name = "tempfile" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasmer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" +dependencies = [ + "cfg-if 1.0.0", + "indexmap", + "loupe", + "more-asserts", + "target-lexicon", + "thiserror", + "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-compiler" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" +dependencies = [ + "enumset", + "loupe", + "rkyv", + "serde", + "serde_bytes", + "smallvec", + "target-lexicon", + "thiserror", + "wasmer-types", + "wasmer-vm", + "wasmparser", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.24.0", + "loupe", + "more-asserts", + "rayon", + "smallvec", + "tracing", + "wasmer-compiler", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-compiler-singlepass" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9429b9f7708c582d855b1787f09c7029ff23fb692550d4a1cc351c8ea84c3014" +dependencies = [ + "byteorder", + "dynasm", + "dynasmrt", + "lazy_static", + "loupe", + "more-asserts", + "rayon", + "smallvec", + "wasmer-compiler", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-derive" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "wasmer-engine" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" +dependencies = [ + "backtrace", + "lazy_static", + "loupe", + "memmap2", + "more-asserts", + "rustc-demangle", + "serde", + "serde_bytes", + "target-lexicon", + "thiserror", + "wasmer-compiler", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-engine-dylib" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" +dependencies = [ + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", + "serde", + "tempfile", + "tracing", + "wasmer-compiler", + "wasmer-engine", + "wasmer-object", + "wasmer-types", + "wasmer-vm", + "which", +] + +[[package]] +name = "wasmer-engine-universal" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" +dependencies = [ + "cfg-if 1.0.0", + "leb128", + "loupe", + "region", + "rkyv", + "wasmer-compiler", + "wasmer-engine", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-middlewares" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d2b4722d64c850893f7a7eab3ab76181efbafcd366827801d8bcd64bff525f" +dependencies = [ + "loupe", + "wasmer", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-object" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" +dependencies = [ + "object 0.25.3", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" +dependencies = [ + "indexmap", + "loupe", + "rkyv", + "serde", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" +dependencies = [ + "backtrace", + "cc", + "cfg-if 1.0.0", + "indexmap", + "libc", + "loupe", + "memoffset", + "more-asserts", + "region", + "rkyv", + "serde", + "thiserror", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.78.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" + +[[package]] +name = "which" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c14ef7e1b8b8ecfc75d5eca37949410046e66f15d185c01d70824f1f8111ef" +dependencies = [ + "libc", + "thiserror", +] + +[[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 = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + +[[package]] +name = "zeroize" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" diff --git a/contracts/floaty/Cargo.toml b/contracts/floaty/Cargo.toml new file mode 100644 index 000000000..0ef1a58be --- /dev/null +++ b/contracts/floaty/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "floaty" +version = "0.0.0" +authors = ["Ethan Frey "] +edition = "2018" +publish = false + +# 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] +# Change this to [] if you don't need Windows support and want faster integration tests. +default = ["cranelift"] +# Use cranelift backend instead of singlepass. This is required for development on Windows. +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-std = { path = "../../packages/std" } +schemars = "0.8.1" +serde = { version = "1.0.103", default-features = false, features = ["derive"] } +sha2 = "0.9.1" +thiserror = "1.0" + +[dev-dependencies] +cosmwasm-schema = { path = "../../packages/schema" } +cosmwasm-storage = { path = "../../packages/storage" } +cosmwasm-vm = { path = "../../packages/vm", default-features = false } diff --git a/contracts/floaty/examples/schema.rs b/contracts/floaty/examples/schema.rs new file mode 100644 index 000000000..8adeee986 --- /dev/null +++ b/contracts/floaty/examples/schema.rs @@ -0,0 +1,27 @@ +use std::env::current_dir; +use std::fs::create_dir_all; + +use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; +use cosmwasm_std::BalanceResponse; + +use hackatom::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, SudoMsg, VerifierResponse}; +use hackatom::state::State; + +fn main() { + let mut out_dir = current_dir().unwrap(); + out_dir.push("schema"); + create_dir_all(&out_dir).unwrap(); + remove_schemas(&out_dir).unwrap(); + + // messages + export_schema(&schema_for!(InstantiateMsg), &out_dir); + export_schema(&schema_for!(ExecuteMsg), &out_dir); + export_schema(&schema_for!(MigrateMsg), &out_dir); + export_schema(&schema_for!(SudoMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema(&schema_for!(VerifierResponse), &out_dir); + export_schema(&schema_for!(BalanceResponse), &out_dir); + + // state + export_schema(&schema_for!(State), &out_dir); +} diff --git a/contracts/floaty/schema/balance_response.json b/contracts/floaty/schema/balance_response.json new file mode 100644 index 000000000..4e3b16aa4 --- /dev/null +++ b/contracts/floaty/schema/balance_response.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "BalanceResponse", + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "Always returns a Coin with the requested denom. This may be of 0 amount if no such funds.", + "allOf": [ + { + "$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/execute_msg.json b/contracts/floaty/schema/execute_msg.json new file mode 100644 index 000000000..b98431246 --- /dev/null +++ b/contracts/floaty/schema/execute_msg.json @@ -0,0 +1,107 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "anyOf": [ + { + "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 + }, + { + "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 + }, + { + "description": "Infinite loop making storage calls (to test when their limit hits)", + "type": "object", + "required": [ + "storage_loop" + ], + "properties": { + "storage_loop": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "description": "Infinite loop reading and writing memory", + "type": "object", + "required": [ + "memory_loop" + ], + "properties": { + "memory_loop": { + "type": "object" + } + }, + "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 + }, + { + "description": "Trigger a panic to ensure framework handles gracefully", + "type": "object", + "required": [ + "panic" + ], + "properties": { + "panic": { + "type": "object" + } + }, + "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 + } + ] +} diff --git a/contracts/floaty/schema/instantiate_msg.json b/contracts/floaty/schema/instantiate_msg.json new file mode 100644 index 000000000..7f844a506 --- /dev/null +++ b/contracts/floaty/schema/instantiate_msg.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "beneficiary", + "verifier" + ], + "properties": { + "beneficiary": { + "type": "string" + }, + "verifier": { + "type": "string" + } + } +} diff --git a/contracts/floaty/schema/migrate_msg.json b/contracts/floaty/schema/migrate_msg.json new file mode 100644 index 000000000..dbdad8fec --- /dev/null +++ b/contracts/floaty/schema/migrate_msg.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "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" + } + } +} diff --git a/contracts/floaty/schema/query_msg.json b/contracts/floaty/schema/query_msg.json new file mode 100644 index 000000000..a0b5791ac --- /dev/null +++ b/contracts/floaty/schema/query_msg.json @@ -0,0 +1,69 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "anyOf": [ + { + "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 + }, + { + "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 + }, + { + "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": [ + "recurse" + ], + "properties": { + "recurse": { + "type": "object", + "required": [ + "depth", + "work" + ], + "properties": { + "depth": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "work": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/floaty/schema/state.json b/contracts/floaty/schema/state.json new file mode 100644 index 000000000..8462e9fb3 --- /dev/null +++ b/contracts/floaty/schema/state.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "State", + "type": "object", + "required": [ + "beneficiary", + "funder", + "verifier" + ], + "properties": { + "beneficiary": { + "$ref": "#/definitions/Addr" + }, + "funder": { + "$ref": "#/definitions/Addr" + }, + "verifier": { + "$ref": "#/definitions/Addr" + } + }, + "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" + } + } +} diff --git a/contracts/floaty/schema/sudo_msg.json b/contracts/floaty/schema/sudo_msg.json new file mode 100644 index 000000000..32cea1108 --- /dev/null +++ b/contracts/floaty/schema/sudo_msg.json @@ -0,0 +1,55 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "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", + "anyOf": [ + { + "type": "object", + "required": [ + "steal_funds" + ], + "properties": { + "steal_funds": { + "type": "object", + "required": [ + "amount", + "recipient" + ], + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "recipient": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ], + "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/verifier_response.json b/contracts/floaty/schema/verifier_response.json new file mode 100644 index 000000000..8af8ef368 --- /dev/null +++ b/contracts/floaty/schema/verifier_response.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VerifierResponse", + "type": "object", + "required": [ + "verifier" + ], + "properties": { + "verifier": { + "type": "string" + } + } +} diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs new file mode 100644 index 000000000..0a7fe6041 --- /dev/null +++ b/contracts/floaty/src/contract.rs @@ -0,0 +1,583 @@ +use std::convert::TryInto; + +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, WasmQuery, +}; + +use crate::errors::HackError; +use crate::msg::{ + ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, RecurseResponse, SudoMsg, VerifierResponse, +}; +use crate::state::{State, CONFIG_KEY}; + +pub fn instantiate( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: InstantiateMsg, +) -> Result { + deps.api.debug("here we go 🚀"); + + deps.storage.set( + CONFIG_KEY, + &to_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 + let mut resp = Response::new(); + resp.add_attribute("Let the", "hacking begin"); + Ok(resp) +} + +pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { + let data = deps + .storage + .get(CONFIG_KEY) + .ok_or_else(|| StdError::not_found("State"))?; + let mut config: State = from_slice(&data)?; + config.verifier = deps.api.addr_validate(&msg.verifier)?; + deps.storage.set(CONFIG_KEY, &to_vec(&config)?); + + Ok(Response::default()) +} + +#[entry_point] +pub fn sudo(_deps: DepsMut, _env: Env, msg: SudoMsg) -> Result { + match msg { + SudoMsg::StealFunds { recipient, amount } => { + let msg = BankMsg::Send { + to_address: recipient, + amount, + }; + let mut response = Response::default(); + response.add_message(msg); + Ok(response) + } + } +} + +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> Result { + match msg { + ExecuteMsg::Release {} => do_release(deps, env, info), + ExecuteMsg::CpuLoop {} => do_cpu_loop(), + ExecuteMsg::StorageLoop {} => do_storage_loop(deps), + ExecuteMsg::MemoryLoop {} => do_memory_loop(), + ExecuteMsg::AllocateLargeMemory { pages } => do_allocate_large_memory(pages), + ExecuteMsg::Panic {} => do_panic(), + ExecuteMsg::UserErrorsInApiCalls {} => do_user_errors_in_api_calls(deps.api), + } +} + +fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result { + let data = deps + .storage + .get(CONFIG_KEY) + .ok_or_else(|| StdError::not_found("State"))?; + let state: State = from_slice(&data)?; + + if info.sender == state.verifier { + let to_addr = state.beneficiary; + let balance = deps.querier.query_all_balances(env.contract.address)?; + + let mut foo = balance[0].amount.u128() as f64; + foo *= 0.3; + + let mut resp = Response::new(); + resp.add_attribute("action", "release"); + resp.add_attribute("destination", to_addr.clone()); + resp.add_attribute("foo", foo.to_string()); + resp.add_event(Event::new("hackatom").attr("action", "release")); + resp.add_message(BankMsg::Send { + to_address: to_addr.into(), + amount: balance, + }); + resp.set_data(&[0xF0, 0x0B, 0xAA]); + Ok(resp) + } else { + Err(HackError::Unauthorized {}) + } +} + +fn do_cpu_loop() -> Result { + let mut counter = 0u64; + loop { + counter += 1; + if counter >= 9_000_000_000 { + counter = 0; + } + } +} + +fn do_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 do_memory_loop() -> Result { + let mut data = vec![1usize]; + loop { + // add one element + data.push((*data.last().expect("must not be empty")) + 1); + } +} + +#[allow(unused_variables)] +fn do_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 { + data: Some((old_size as u32).to_be_bytes().into()), + ..Response::default() + }) + } + + #[cfg(not(target_arch = "wasm32"))] + Err(StdError::generic_err("Unsupported architecture").into()) +} + +fn do_panic() -> Result { + panic!("This page intentionally faulted"); +} + +fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { + // Canonicalize + + let empty = ""; + match api.addr_canonicalize(empty).unwrap_err() { + StdError::GenericErr { .. } => {} + err => { + return Err(StdError::generic_err(format!( + "Unexpected error in do_user_errors_in_api_calls: {:?}", + err + )) + .into()) + } + } + + let invalid_bech32 = "bn93hg934hg08q340g8u4jcau3"; + match api.addr_canonicalize(invalid_bech32).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() { + StdError::GenericErr { .. } => {} + err => { + return Err(StdError::generic_err(format!( + "Unexpected error in do_user_errors_in_api_calls: {:?}", + err + )) + .into()) + } + } + + let too_short: CanonicalAddr = vec![0xAA, 0xBB, 0xCC].into(); + match api.addr_humanize(&too_short).unwrap_err() { + StdError::GenericErr { .. } => {} + err => { + return Err(StdError::generic_err(format!( + "Unexpected error in do_user_errors_in_api_calls: {:?}", + err + )) + .into()) + } + } + + let wrong_length: CanonicalAddr = vec![0xA6; 17].into(); + match api.addr_humanize(&wrong_length).unwrap_err() { + StdError::GenericErr { .. } => {} + err => { + return Err(StdError::generic_err(format!( + "Unexpected error in do_user_errors_in_api_calls: {:?}", + err + )) + .into()) + } + } + + Ok(Response::default()) +} + +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::Recurse { depth, work } => { + to_binary(&query_recurse(deps, depth, work, env.contract.address)?) + } + } +} + +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_other_balance(deps: Deps, address: String) -> StdResult { + let amount = deps.querier.query_all_balances(address)?; + Ok(AllBalanceResponse { amount }) +} + +fn query_recurse(deps: Deps, depth: u32, work: u32, contract: Addr) -> StdResult { + // perform all hashes as requested + let mut hashed: Vec = contract.as_str().into(); + for _ in 0..work { + hashed = Sha256::digest(&hashed).to_vec() + } + + // the last contract should return the response + if depth == 0 { + Ok(RecurseResponse { + hashed: hashed.into(), + }) + } else { + // otherwise, we go one level deeper and return the response of the next level + let req = QueryMsg::Recurse { + depth: depth - 1, + work, + }; + let query = QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: contract.into(), + msg: to_binary(&req)?, + }); + deps.querier.query(&query) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use cosmwasm_std::testing::{ + mock_dependencies, mock_dependencies_with_balances, mock_env, mock_info, MOCK_CONTRACT_ADDR, + }; + // import trait Storage to get access to read + use cosmwasm_std::{attr, coins, Binary, 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 migrate_verifier() { + let mut deps = mock_dependencies(&[]); + + let verifier = String::from("verifies"); + let beneficiary = String::from("benefits"); + let creator = String::from("creator"); + let msg = InstantiateMsg { + verifier, + beneficiary, + }; + let info = mock_info(&creator, &[]); + let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // 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\"}"); + + // change the verifier via migrate + let new_verifier = String::from("someone else"); + let msg = MigrateMsg { + verifier: new_verifier.clone(), + }; + let res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // check it is 'someone else' + let query_response = query_verifier(deps.as_ref()).unwrap(); + assert_eq!(query_response.verifier, new_verifier); + } + + #[test] + 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 msg = InstantiateMsg { + verifier, + beneficiary, + }; + let info = mock_info(&creator, &[]); + let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // sudo takes any tax it wants + let to_address = String::from("community-pool"); + let amount = coins(700, "gold"); + let sys_msg = SudoMsg::StealFunds { + recipient: to_address.clone(), + amount: amount.clone(), + }; + 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"); + assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); + } + + #[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")], + ); + 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), + } + ); + } + + #[test] + #[should_panic(expected = "This page intentionally faulted")] + fn execute_panic() { + let mut deps = mock_dependencies(&[]); + + // initialize the store + let verifier = String::from("verifies"); + let beneficiary = String::from("benefits"); + let creator = String::from("creator"); + + let instantiate_msg = InstantiateMsg { + verifier, + beneficiary: beneficiary.clone(), + }; + let init_info = mock_info(&creator, &coins(1000, "earth")); + let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(0, init_res.messages.len()); + + let execute_info = mock_info(&beneficiary, &[]); + // this should panic + let _ = execute( + deps.as_mut(), + mock_env(), + execute_info, + ExecuteMsg::Panic {}, + ); + } + + #[test] + fn execute_user_errors_in_api_calls() { + let mut deps = mock_dependencies(&[]); + + let instantiate_msg = InstantiateMsg { + verifier: String::from("verifies"), + beneficiary: String::from("benefits"), + }; + let init_info = mock_info("creator", &coins(1000, "earth")); + let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(0, init_res.messages.len()); + + let execute_info = mock_info("anyone", &[]); + execute( + deps.as_mut(), + mock_env(), + execute_info, + ExecuteMsg::UserErrorsInApiCalls {}, + ) + .unwrap(); + } + + #[test] + fn query_recursive() { + // the test framework doesn't handle contracts querying contracts yet, + // let's just make sure the last step looks right + + let deps = mock_dependencies(&[]); + let contract = Addr::unchecked("my-contract"); + let bin_contract: &[u8] = b"my-contract"; + + // return the unhashed 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)); + + // let's see if 5 hashes are done right + let mut expected_hash = Sha256::digest(bin_contract); + for _ in 0..4 { + expected_hash = Sha256::digest(&expected_hash); + } + let work_query = query_recurse(deps.as_ref(), 0, 5, contract).unwrap(); + assert_eq!(work_query.hashed, expected_hash.to_vec()); + } +} diff --git a/contracts/floaty/src/errors.rs b/contracts/floaty/src/errors.rs new file mode 100644 index 000000000..7b46b00b6 --- /dev/null +++ b/contracts/floaty/src/errors.rs @@ -0,0 +1,12 @@ +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/lib.rs b/contracts/floaty/src/lib.rs new file mode 100644 index 000000000..1e46dd614 --- /dev/null +++ b/contracts/floaty/src/lib.rs @@ -0,0 +1,7 @@ +pub mod contract; +mod errors; +pub mod msg; +pub mod state; + +#[cfg(target_arch = "wasm32")] +cosmwasm_std::create_entry_points_with_migration!(contract); diff --git a/contracts/floaty/src/msg.rs b/contracts/floaty/src/msg.rs new file mode 100644 index 000000000..6b51d1c85 --- /dev/null +++ b/contracts/floaty/src/msg.rs @@ -0,0 +1,82 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use cosmwasm_std::{Binary, Coin}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct InstantiateMsg { + pub verifier: String, + pub beneficiary: String, +} + +/// 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. +/// +/// Note that the contract doesn't enforce permissions here, this is done +/// by blockchain logic (in the future by blockchain governance) +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct MigrateMsg { + pub verifier: String, +} + +/// 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 +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum SudoMsg { + StealFunds { + recipient: String, + amount: Vec, + }, +} + +// failure modes to help test wasmd, based on this comment +// https://github.com/cosmwasm/wasmd/issues/8#issuecomment-576146751 +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum ExecuteMsg { + /// Releasing all funds in the contract to the beneficiary. This is the only "proper" action of this demo contract. + Release {}, + /// 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 {}, + /// Allocate large amounts of memory without consuming much gas + AllocateLargeMemory { pages: u32 }, + /// Trigger a panic to ensure framework handles gracefully + Panic {}, + /// 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. + UserErrorsInApiCalls {}, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg { + /// returns a human-readable representation of the verifier + /// use to ensure query path works in integration tests + Verifier {}, + /// This returns cosmwasm_std::AllBalanceResponse to demo use of the querier + OtherBalance { address: String }, + /// 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 + Recurse { depth: u32, work: u32 }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct VerifierResponse { + pub verifier: String, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct RecurseResponse { + /// hashed is the result of running sha256 "work+1" times on the contract's human address + pub hashed: Binary, +} diff --git a/contracts/floaty/src/state.rs b/contracts/floaty/src/state.rs new file mode 100644 index 000000000..b1e8196be --- /dev/null +++ b/contracts/floaty/src/state.rs @@ -0,0 +1,13 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use cosmwasm_std::Addr; + +pub const CONFIG_KEY: &[u8] = b"config"; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct State { + pub verifier: Addr, + pub beneficiary: Addr, + pub funder: Addr, +} diff --git a/contracts/floaty/tests/integration.rs b/contracts/floaty/tests/integration.rs new file mode 100644 index 000000000..67c87c75d --- /dev/null +++ b/contracts/floaty/tests/integration.rs @@ -0,0 +1,486 @@ +//! 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 as follows: +//! 1. Copy them over verbatim +//! 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::{ + attr, coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, ContractResult, + Empty, Response, SubMsg, +}; +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, + }, + Storage, VmError, +}; + +use hackatom::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, SudoMsg}; +use hackatom::state::{State, CONFIG_KEY}; + +static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/hackatom.wasm"); + +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"); + ( + InstantiateMsg { + verifier, + beneficiary, + }, + creator, + ) +} + +#[test] +fn proper_initialization() { + let mut deps = mock_instance(WASM, &[]); + assert_eq!(deps.required_features.len(), 0); + + let verifier = String::from("verifies"); + let beneficiary = String::from("benefits"); + let creator = String::from("creator"); + let expected_state = State { + verifier: Addr::unchecked(&verifier), + beneficiary: Addr::unchecked(&beneficiary), + funder: Addr::unchecked(&creator), + }; + + let msg = InstantiateMsg { + verifier, + beneficiary, + }; + let info = mock_info(&creator, &coins(1000, "earth")); + let res: Response = instantiate(&mut deps, 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 state: State = deps + .with_storage(|store| { + let data = store + .get(CONFIG_KEY) + .0 + .expect("error reading db") + .expect("no data stored"); + from_slice(&data, DESERIALIZATION_LIMIT) + }) + .unwrap(); + assert_eq!(state, expected_state); +} + +#[test] +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 msg = InstantiateMsg { + verifier, + beneficiary, + }; + let info = mock_info(&creator, &coins(1000, "earth")); + let res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // now let's query + let query_response = query(&mut deps, mock_env(), QueryMsg::Verifier {}).unwrap(); + assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); + + // bad query returns parse error (pass wrong type - this connection is not enforced) + let qres = query(&mut deps, mock_env(), ExecuteMsg::Release {}); + let msg = qres.unwrap_err(); + assert!(msg.contains("Error parsing")); +} + +#[test] +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 msg = InstantiateMsg { + verifier, + beneficiary, + }; + let info = mock_info(&creator, &[]); + let res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // check it is 'verifies' + let query_response = query(&mut deps, mock_env(), QueryMsg::Verifier {}).unwrap(); + assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); + + // change the verifier via migrate + let msg = MigrateMsg { + verifier: String::from("someone else"), + }; + let res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // 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\"}" + ); +} + +#[test] +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 msg = InstantiateMsg { + verifier, + beneficiary, + }; + let info = mock_info(&creator, &[]); + let res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); + assert_eq!(0, res.messages.len()); + + // sudo takes any tax it wants + let to_address = String::from("community-pool"); + let amount = coins(700, "gold"); + let sys_msg = SudoMsg::StealFunds { + recipient: to_address.clone(), + amount: amount.clone(), + }; + 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"); + assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); +} + +#[test] +fn querier_callbacks_work() { + let rich_addr = String::from("foobar"); + let rich_balance = coins(10000, "gold"); + let mut deps = mock_instance_with_balances(WASM, &[(&rich_addr, &rich_balance)]); + + // 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(); + assert_eq!(bal.amount, rich_balance); + + // querying other accounts gets none + let query_msg = QueryMsg::OtherBalance { + address: String::from("someone else"), + }; + let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); + let bal: AllBalanceResponse = from_binary(&query_response).unwrap(); + assert_eq!(bal.amount, vec![]); +} + +#[test] +fn fails_on_bad_init() { + let mut deps = mock_instance(WASM, &[]); + let info = mock_info("creator", &coins(1000, "earth")); + // bad init returns parse error (pass wrong type - this connection is not enforced) + let res: ContractResult = + instantiate(&mut deps, mock_env(), info, ExecuteMsg::Release {}); + let msg = res.unwrap_err(); + assert!(msg.contains("Error parsing")); +} + +#[test] +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 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: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(init_res.messages.len(), 0); + + // balance changed in init + deps.with_querier(|querier| { + querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); + Ok(()) + }) + .unwrap(); + + // beneficiary can release it + let execute_info = mock_info(&verifier, &[]); + 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"); + 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")], + ); + assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); +} + +#[test] +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 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: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(init_res.messages.len(), 0); + + // balance changed in init + deps.with_querier(|querier| { + querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); + Ok(()) + }) + .unwrap(); + + // beneficiary cannot release it + let execute_info = mock_info(&beneficiary, &[]); + let execute_res: ContractResult = + execute(&mut deps, mock_env(), execute_info, ExecuteMsg::Release {}); + let msg = execute_res.unwrap_err(); + assert!(msg.contains("Unauthorized")); + + // state should not change + let data = deps + .with_storage(|store| { + Ok(store + .get(CONFIG_KEY) + .0 + .expect("error reading db") + .expect("no data stored")) + }) + .unwrap(); + let state: State = from_slice(&data, DESERIALIZATION_LIMIT).unwrap(); + assert_eq!( + state, + State { + verifier: Addr::unchecked(&verifier), + beneficiary: Addr::unchecked(&beneficiary), + funder: Addr::unchecked(&creator), + } + ); +} + +#[test] +fn execute_cpu_loop() { + let mut deps = mock_instance(WASM, &[]); + + let (instantiate_msg, creator) = make_init_msg(); + let init_info = mock_info(creator.as_str(), &[]); + let init_res: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(0, init_res.messages.len()); + + let execute_info = mock_info(creator.as_str(), &[]); + // Note: we need to use the production-call, not the testing call (which unwraps any vm error) + let execute_res = call_execute::<_, _, _, Empty>( + &mut deps, + &mock_env(), + &execute_info, + &to_vec(&ExecuteMsg::CpuLoop {}).unwrap(), + ); + assert!(execute_res.is_err()); + assert_eq!(deps.get_gas_left(), 0); +} + +#[test] +fn execute_storage_loop() { + let mut deps = mock_instance(WASM, &[]); + + let (instantiate_msg, creator) = make_init_msg(); + let init_info = mock_info(creator.as_str(), &[]); + let init_res: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(0, init_res.messages.len()); + + let execute_info = mock_info(creator.as_str(), &[]); + // Note: we need to use the production-call, not the testing call (which unwraps any vm error) + let execute_res = call_execute::<_, _, _, Empty>( + &mut deps, + &mock_env(), + &execute_info, + &to_vec(&ExecuteMsg::StorageLoop {}).unwrap(), + ); + assert!(execute_res.is_err()); + assert_eq!(deps.get_gas_left(), 0); +} + +#[test] +fn execute_memory_loop() { + let mut deps = mock_instance(WASM, &[]); + + let (instantiate_msg, creator) = make_init_msg(); + let init_info = mock_info(creator.as_str(), &[]); + let init_res: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(0, init_res.messages.len()); + + let execute_info = mock_info(creator.as_str(), &[]); + // Note: we need to use the production-call, not the testing call (which unwraps any vm error) + let execute_res = call_execute::<_, _, _, Empty>( + &mut deps, + &mock_env(), + &execute_info, + &to_vec(&ExecuteMsg::MemoryLoop {}).unwrap(), + ); + assert!(execute_res.is_err()); + assert_eq!(deps.get_gas_left(), 0); + + // Ran out of gas before consuming a significant amount of memory + assert!(deps.memory_pages() < 200); +} + +#[test] +fn execute_allocate_large_memory() { + let mut deps = mock_instance(WASM, &[]); + + let (instantiate_msg, creator) = make_init_msg(); + let init_info = mock_info(creator.as_str(), &[]); + let init_res: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(0, init_res.messages.len()); + let mut pages_before = deps.memory_pages(); + assert_eq!(pages_before, 18); + + // Grow by 48 pages (3 MiB) + let execute_info = mock_info(creator.as_str(), &[]); + let gas_before = deps.get_gas_left(); + let execute_res: Response = execute( + &mut deps, + mock_env(), + execute_info, + ExecuteMsg::AllocateLargeMemory { pages: 48 }, + ) + .unwrap(); + assert_eq!( + execute_res.data.unwrap(), + Binary::from((pages_before as u32).to_be_bytes()) + ); + let gas_used = gas_before - deps.get_gas_left(); + // 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 cosmwasm-opt, not integration tests. + let expected = 27880; // +/- 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(); + assert_eq!(used, pages_before + 48, "Memory used: {} pages", used); + pages_before += 48; + + // Grow by 1600 pages (100 MiB) + let execute_info = mock_info(creator.as_str(), &[]); + let gas_before = deps.get_gas_left(); + let result: ContractResult = execute( + &mut deps, + mock_env(), + execute_info, + ExecuteMsg::AllocateLargeMemory { pages: 1600 }, + ); + assert_eq!(result.unwrap_err(), "Generic error: memory.grow failed"); + let gas_used = gas_before - deps.get_gas_left(); + // 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 cosmwasm-opt, not integration tests. + let expected = 31076; // +/- 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(); + assert_eq!(used, pages_before, "Memory used: {} pages", used); +} + +#[test] +fn execute_panic() { + let mut deps = mock_instance(WASM, &[]); + + let (instantiate_msg, creator) = make_init_msg(); + let init_info = mock_info(creator.as_str(), &[]); + let init_res: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + assert_eq!(0, init_res.messages.len()); + + let execute_info = mock_info(creator.as_str(), &[]); + // panic inside contract should not panic out here + // Note: we need to use the production-call, not the testing call (which unwraps any vm error) + let execute_res = call_execute::<_, _, _, Empty>( + &mut deps, + &mock_env(), + &execute_info, + &to_vec(&ExecuteMsg::Panic {}).unwrap(), + ); + match execute_res.unwrap_err() { + VmError::RuntimeErr { .. } => {} + err => panic!("Unexpected error: {:?}", err), + } +} + +#[test] +fn execute_user_errors_in_api_calls() { + let mut deps = mock_instance(WASM, &[]); + + let (instantiate_msg, creator) = make_init_msg(); + let init_info = mock_info(creator.as_str(), &[]); + let _init_res: Response = + instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); + + let execute_info = mock_info(creator.as_str(), &[]); + let _execute_res: Response = execute( + &mut deps, + mock_env(), + execute_info, + ExecuteMsg::UserErrorsInApiCalls {}, + ) + .unwrap(); +} + +#[test] +fn passes_io_tests() { + let mut deps = mock_instance(WASM, &[]); + test_io(&mut deps); +} diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 911714b68..a3a2321ae 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -14,3 +14,16 @@ pub fn compile(code: &[u8], memory_limit: Option) -> VmResult { let module = Module::new(&store, code)?; Ok(module) } + +#[cfg(test)] +mod tests { + use super::*; + + static CONTRACT: &[u8] = include_bytes!("../../testdata/floaty.wasm"); + + #[test] + #[should_panic] + fn contract_with_floats_fails_check() { + compile(CONTRACT, None).unwrap(); + } +} diff --git a/packages/vm/testdata/floaty.wasm b/packages/vm/testdata/floaty.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b7e9e165965effc167519fad796e946690a64fd9 GIT binary patch literal 1820257 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

  • ooI_ zoh$FYmH8LSpIeBuQqVt$54%l+YWyqKK*Y;}Ah|O^763NEw-MJ}EwTKYF80j3P(HVv ze!_3lx$y5g-XZ)d&sVSf6@a%T0Hq)J?Q}_?bTYrnqeS85h7_%VtWGLrxNI_px|(27 zN#BxiWPPGfHQFL|r8sk;^oQ}-`Uw&m+_4DmrmGn}v9a2hqxnXlo&VRvhUGFGXfwF&{zCJ7f=hnd{bRRSp1zM@Lrv_ia(5>k`1COfrNdK0G2))C>XARyM4J5=Q4q5&kC1})sxs@{g$H=*icuIq}b zY*}Pg4+GhjD!R)v8xPjd{J7K+TUO2glx;Ygw?l+#*<_V&Q+W>g3B5FCO1|n5BdidT zl=QP4BEa~vU-*aw_6r{(kaX<_3^b45D2>*?+TETR43S{!D|+%kG@l8J$~O%--9s=5 zs$Jxi=gZqb%L%RBIYlvHG_>r1>+n<)QyB;=&L_ErZgF<#RA&>aWg1U; z?hDEkoAn=0c_6Og3@EBg?#O+WXmSOTz?dW~?PW)9uw$63y^A51Ium!9tCo__m54w( zws56Wl9ErBL;^lrl9JDsL;^ltlAf5C)!_3b`i&n^Kpc4h^~>Uh7|oI{166{}Qb?

    $;A!bgaSd|Lp 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�VzfR~&$$@X8myPr4#oNpYS^ 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

    oFpb;pcvAX$Ws}RzozCjcGz13w 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

    <9{q0q(g%0-T{3O*cZhdL3k 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 literal 0 HcmV?d00001 From 820c038286eef93b64143bd58e0ecca94648718c Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 16:04:57 +0200 Subject: [PATCH 125/402] Rename `Event.kind` to `Event.ty` --- CHANGELOG.md | 1 + contracts/ibc-reflect/src/contract.rs | 4 ++-- contracts/ibc-reflect/tests/integration.rs | 2 +- contracts/reflect/schema/response_for__custom_msg.json | 2 +- packages/std/src/results/subcall.rs | 10 +++++----- packages/vm/src/calls.rs | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eda36afa..d9ce2f7a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ and this project adheres to 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`. [#961]: https://github.com/CosmWasm/cosmwasm/pull/961 diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 834eda140..4733ad3ee 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -50,7 +50,7 @@ pub fn reply(deps: DepsMut, _env: Env, reply: Reply) -> StdResult { fn parse_contract_from_event(events: Vec) -> Option { events .into_iter() - .find(|e| e.kind == "message") + .find(|e| e.ty == "message") .and_then(|ev| { ev.attributes .into_iter() @@ -369,7 +369,7 @@ mod tests { fn fake_events(reflect_addr: &str) -> Vec { let event = Event { - kind: "message".into(), + ty: "message".into(), attributes: vec![ attr("module", "wasm"), attr("signer", MOCK_CONTRACT_ADDR), diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 6ba171e44..59e8f6b6e 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -58,7 +58,7 @@ fn setup() -> Instance { fn fake_events(reflect_addr: &str) -> Vec { let event = Event { - kind: "message".into(), + ty: "message".into(), attributes: vec![ attr("module", "wasm"), attr("signer", MOCK_CONTRACT_ADDR), diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 5ed40b1c9..7cdacab8f 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -327,7 +327,7 @@ } }, "type": { - "description": "The event type. This is renamed to \"kind\" because \"type\" is reserved in Rust. This sucks, we know.", + "description": "The event type. This is renamed to \"ty\" because \"type\" is reserved in Rust. This sucks, we know.", "type": "string" } } diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index df073e011..3b57734a2 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -126,17 +126,17 @@ pub struct SubcallResponse { /// the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct Event { - /// The event type. This is renamed to "kind" because "type" is reserved in Rust. This sucks, we know. + /// The event type. This is renamed to "ty" because "type" is reserved in Rust. This sucks, we know. #[serde(rename = "type")] - pub kind: String, + pub ty: String, pub attributes: Vec, } impl Event { /// Create a new event with the given type and an empty list of attributes. - pub fn new(kind: impl Into) -> Self { + pub fn new(ty: impl Into) -> Self { Event { - kind: kind.into(), + ty: ty.into(), attributes: Vec::with_capacity(10), } } @@ -159,7 +159,7 @@ mod tests { #[test] fn event_construction() { let event_direct = Event { - kind: "test".to_string(), + ty: "test".to_string(), attributes: vec![attr("foo", "bar"), attr("bar", "baz")], }; let event_builder = Event::new("test").attr("foo", "bar").attr("bar", "baz"); diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index c2175d22b..0e55d673d 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -711,7 +711,7 @@ mod tests { assert_eq!(ReplyOn::Success, res.messages[0].reply_on); let id = res.messages[0].id; let event = Event { - kind: "message".into(), + ty: "message".into(), attributes: vec![attr("contract_address", &account)], }; // which creates a reflect account. here we get the callback From 59c4d869a5829b6e1b59fb9d031d3c64385fd126 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 21:49:08 +0200 Subject: [PATCH 126/402] Fix contract_with_floats_fails_check test --- contracts/floaty/Cargo.lock | 390 ++++++++++++------------ contracts/floaty/src/contract.rs | 2 - packages/vm/src/wasm_backend/compile.rs | 6 +- packages/vm/testdata/floaty.wasm | Bin 1820257 -> 223669 bytes 4 files changed, 203 insertions(+), 195 deletions(-) mode change 100755 => 100644 packages/vm/testdata/floaty.wasm diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 68dfb8429..667d5248c 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -2,18 +2,18 @@ # It is not intended for manual editing. [[package]] name = "addr2line" -version = "0.14.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" dependencies = [ - "gimli 0.23.0", + "gimli", ] [[package]] name = "adler" -version = "0.2.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "autocfg" @@ -23,15 +23,16 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.55" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" +checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" dependencies = [ "addr2line", - "cfg-if 1.0.0", + "cc", + "cfg-if", "libc", "miniz_oxide", - "object 0.22.0", + "object", "rustc-demangle", ] @@ -49,9 +50,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "bitvec" -version = "0.18.4" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" +checksum = "98fcd36dda4e17b7d7abc64cb549bf0201f4ab71e00700c798ca7e62ed3761fa" dependencies = [ "funty", "radium", @@ -69,21 +70,15 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.3.4" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" - -[[package]] -name = "cfg-if" -version = "0.1.10" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" [[package]] name = "cfg-if" @@ -103,12 +98,6 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" -[[package]] -name = "const_fn" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" - [[package]] name = "cosmwasm-crypto" version = "0.14.1" @@ -116,7 +105,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -177,10 +166,13 @@ dependencies = [ ] [[package]] -name = "cpuid-bool" -version = "0.1.2" +name = "cpufeatures" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" +checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8" +dependencies = [ + "libc", +] [[package]] name = "cranelift-bforest" @@ -201,7 +193,7 @@ dependencies = [ "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.24.0", + "gimli", "log", "regalloc", "smallvec", @@ -248,16 +240,16 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", ] @@ -267,19 +259,18 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" dependencies = [ - "cfg-if 1.0.0", - "const_fn", + "cfg-if", "crossbeam-utils", "lazy_static", "memoffset", @@ -288,12 +279,11 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ - "autocfg", - "cfg-if 1.0.0", + "cfg-if", "lazy_static", ] @@ -315,22 +305,22 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.0.2" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" +checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] [[package]] name = "darling" -version = "0.10.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" dependencies = [ "darling_core", "darling_macro", @@ -338,9 +328,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.10.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" dependencies = [ "fnv", "ident_case", @@ -352,9 +342,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.10.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" dependencies = [ "darling_core", "quote", @@ -387,9 +377,9 @@ checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" [[package]] name = "dynasm" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7d1242462849390bb2ad38aeed769499f1afc7383affa2ab0c1baa894c0200" +checksum = "cdc2d9a5e44da60059bd38db2d05cbb478619541b8c79890547861ec1e3194f0" dependencies = [ "bitflags", "byteorder", @@ -402,9 +392,9 @@ dependencies = [ [[package]] name = "dynasmrt" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dd4d1d5ca12258cef339a57a7643e8b233a42dea9bb849630ddd9dd7726aa9" +checksum = "42276e3f205fe63887cca255aa9a65a63fb72764c30b9a6252a7c7e46994f689" dependencies = [ "byteorder", "dynasm", @@ -430,7 +420,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -444,35 +434,36 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "f2db227e61a43a34915680bdda462ec0e212095518020a88a1f91acd16092c39" dependencies = [ "bitvec", "digest", "ff", + "funty", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] [[package]] name = "enumset" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6167d1be7a76696cadccfbdb89e5cb519244a42bab7da5577994579217dcff" +checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8a79bce471eb6165aa8ac86ebc8d788543b741eaa15e8b8486591696207d6c" +checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47" dependencies = [ "darling", "proc-macro2", @@ -493,10 +484,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ "bitvec", - "rand_core", + "rand_core 0.5.1", "subtle", ] +[[package]] +name = "floaty" +version = "0.0.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cosmwasm-vm", + "schemars", + "serde", + "sha2", + "thiserror", +] + [[package]] name = "fnv" version = "1.0.7" @@ -525,16 +530,21 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] -name = "gimli" -version = "0.23.0" +name = "getrandom" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] [[package]] name = "gimli" @@ -554,24 +564,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] -[[package]] -name = "hackatom" -version = "0.0.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cosmwasm-storage", - "cosmwasm-vm", - "schemars", - "serde", - "sha2", - "thiserror", -] - [[package]] name = "hashbrown" version = "0.9.1" @@ -580,18 +576,18 @@ checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" [[package]] name = "hermit-abi" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" dependencies = [ "libc", ] [[package]] name = "hex" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hmac" @@ -611,9 +607,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" dependencies = [ "autocfg", "hashbrown", @@ -628,13 +624,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "4476a0808212a9e81ce802eb1a0cfc60e73aea296553bacc0fac7e1268bc572a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -651,9 +648,9 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.81" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" +checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" [[package]] name = "libloading" @@ -661,24 +658,24 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "winapi", ] [[package]] name = "log" -version = "0.4.11" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", ] [[package]] name = "loupe" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ "indexmap", "loupe-derive", @@ -687,9 +684,9 @@ dependencies = [ [[package]] name = "loupe-derive" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" dependencies = [ "quote", "syn", @@ -712,27 +709,27 @@ checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memmap2" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73be3b7d04a0123e933fea1d50d126cc7196bbc0362c0ce426694f777194eee" +checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg", @@ -754,12 +751,6 @@ dependencies = [ "libc", ] -[[package]] -name = "object" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" - [[package]] name = "object" version = "0.25.3" @@ -779,9 +770,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17797de36b94bc5f73edad736fd0a77ce5ab64dd622f809c1eead8c91fa6564" +checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" [[package]] name = "pin-project-lite" @@ -859,40 +850,39 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] [[package]] name = "radium" -version = "0.4.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" [[package]] name = "rand" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ - "getrandom", "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.3", "rand_hc", ] [[package]] name = "rand_chacha" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -901,23 +891,32 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ - "rand_core", + "rand_core 0.6.3", ] [[package]] name = "rayon" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" dependencies = [ "autocfg", "crossbeam-deque", @@ -927,9 +926,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -940,9 +939,12 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +dependencies = [ + "bitflags", +] [[package]] name = "regalloc" @@ -1001,9 +1003,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" [[package]] name = "rustc-hash" @@ -1025,9 +1027,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "schemars" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a24475737c47c5a97cd0858d09db5b0c01ade85d671ee569cd1a5a2c0c80a44" +checksum = "bc6ab463ae35acccb5cba66c0084c985257b797d288b6050cc2f6ac1b266cb78" dependencies = [ "dyn-clone", "schemars_derive", @@ -1037,9 +1039,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f0ccbfe5a97322d90f8b19604fa5b99dd8223540eb6e36c99a9125303e4c00" +checksum = "902fdfbcf871ae8f653bddf4b2c05905ddaabc08f69d32a915787e3be0d31356" dependencies = [ "proc-macro2", "quote", @@ -1061,9 +1063,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.118" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" dependencies = [ "serde_derive", ] @@ -1088,9 +1090,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.118" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", @@ -1110,9 +1112,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -1121,13 +1123,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" dependencies = [ "block-buffer", - "cfg-if 1.0.0", - "cpuid-bool", + "cfg-if", + "cpufeatures", "digest", "opaque-debug", ] @@ -1139,7 +1141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1162,9 +1164,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" @@ -1191,11 +1193,11 @@ checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", "libc", "rand", "redox_syscall", @@ -1205,18 +1207,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" dependencies = [ "proc-macro2", "quote", @@ -1225,11 +1227,11 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.22" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1237,9 +1239,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.11" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", @@ -1248,18 +1250,18 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" dependencies = [ "lazy_static", ] [[package]] name = "typenum" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" [[package]] name = "uint" @@ -1275,15 +1277,15 @@ dependencies = [ [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "wasi" @@ -1291,13 +1293,19 @@ 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 = "wasmer" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "indexmap", "loupe", "more-asserts", @@ -1343,7 +1351,7 @@ dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "gimli 0.24.0", + "gimli", "loupe", "more-asserts", "rayon", @@ -1412,7 +1420,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "leb128", "libloading", "loupe", @@ -1434,7 +1442,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "leb128", "loupe", "region", @@ -1464,7 +1472,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.25.3", + "object", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1491,7 +1499,7 @@ checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", - "cfg-if 1.0.0", + "cfg-if", "indexmap", "libc", "loupe", @@ -1513,12 +1521,12 @@ checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "which" -version = "4.0.2" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c14ef7e1b8b8ecfc75d5eca37949410046e66f15d185c01d70824f1f8111ef" +checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" dependencies = [ + "either", "libc", - "thiserror", ] [[package]] @@ -1551,6 +1559,6 @@ checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" [[package]] name = "zeroize" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 0a7fe6041..971ec3135 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -1,5 +1,3 @@ -use std::convert::TryInto; - use sha2::{Digest, Sha256}; use cosmwasm_std::{ diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index a3a2321ae..194a7b442 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -22,8 +22,10 @@ mod tests { static CONTRACT: &[u8] = include_bytes!("../../testdata/floaty.wasm"); #[test] - #[should_panic] fn contract_with_floats_fails_check() { - compile(CONTRACT, None).unwrap(); + let err = compile(CONTRACT, None).unwrap_err(); + assert!(err + .to_string() + .contains("Non-deterministic operator detected")); } } diff --git a/packages/vm/testdata/floaty.wasm b/packages/vm/testdata/floaty.wasm old mode 100755 new mode 100644 index b7e9e165965effc167519fad796e946690a64fd9..074b611df5068f7b7b44302509fabfbd97855120 GIT binary patch literal 223669 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 literal 1820257 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/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­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Π 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

  • ooI_ zoh$FYmH8LSpIeBuQqVt$54%l+YWyqKK*Y;}Ah|O^763NEw-MJ}EwTKYF80j3P(HVv ze!_3lx$y5g-XZ)d&sVSf6@a%T0Hq)J?Q}_?bTYrnqeS85h7_%VtWGLrxNI_px|(27 zN#BxiWPPGfHQFL|r8sk;^oQ}-`Uw&m+_4DmrmGn}v9a2hqxnXlo&VRvhUGFGXfwF&{zCJ7f=hnd{bRRSp1zM@Lrv_ia(5>k`1COfrNdK0G2))C>XARyM4J5=Q4q5&kC1})sxs@{g$H=*icuIq}b zY*}Pg4+GhjD!R)v8xPjd{J7K+TUO2glx;Ygw?l+#*<_V&Q+W>g3B5FCO1|n5BdidT zl=QP4BEa~vU-*aw_6r{(kaX<_3^b45D2>*?+TETR43S{!D|+%kG@l8J$~O%--9s=5 zs$Jxi=gZqb%L%RBIYlvHG_>r1>+n<)QyB;=&L_ErZgF<#RA&>aWg1U; z?hDEkoAn=0c_6Og3@EBg?#O+WXmSOTz?dW~?PW)9uw$63y^A51Ium!9tCo__m54w( zws56Wl9ErBL;^lrl9JDsL;^ltlAf5C)!_3b`i&n^Kpc4h^~>Uh7|oI{166{}Qb?

    $;A!bgaSd|Lp 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�VzfR~&$$@X8myPr4#oNpYS^ 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

    oFpb;pcvAX$Ws}RzozCjcGz13w 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

    <9{q0q(g%0-T{3O*cZhdL3k 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 From 43d6af233c7fc18e87cc49dd2e9699043e141a47 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Jun 2021 13:40:09 +0200 Subject: [PATCH 127/402] Make the `floaty` contract smaller --- contracts/floaty/examples/schema.rs | 6 +- contracts/floaty/schema/execute_msg.json | 88 ------- contracts/floaty/schema/migrate_msg.json | 14 -- contracts/floaty/schema/sudo_msg.json | 55 ----- contracts/floaty/src/contract.rs | 295 ++--------------------- contracts/floaty/src/lib.rs | 3 - contracts/floaty/src/msg.rs | 39 +-- contracts/floaty/tests/integration.rs | 269 +-------------------- packages/vm/testdata/floaty.wasm | Bin 223669 -> 175659 bytes 9 files changed, 30 insertions(+), 739 deletions(-) delete mode 100644 contracts/floaty/schema/migrate_msg.json delete mode 100644 contracts/floaty/schema/sudo_msg.json diff --git a/contracts/floaty/examples/schema.rs b/contracts/floaty/examples/schema.rs index 8adeee986..928cbd6a2 100644 --- a/contracts/floaty/examples/schema.rs +++ b/contracts/floaty/examples/schema.rs @@ -4,8 +4,8 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; use cosmwasm_std::BalanceResponse; -use hackatom::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, SudoMsg, VerifierResponse}; -use hackatom::state::State; +use floaty::msg::{ExecuteMsg, InstantiateMsg, QueryMsg, VerifierResponse}; +use floaty::state::State; fn main() { let mut out_dir = current_dir().unwrap(); @@ -16,8 +16,6 @@ fn main() { // messages export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(MigrateMsg), &out_dir); - export_schema(&schema_for!(SudoMsg), &out_dir); export_schema(&schema_for!(QueryMsg), &out_dir); export_schema(&schema_for!(VerifierResponse), &out_dir); export_schema(&schema_for!(BalanceResponse), &out_dir); diff --git a/contracts/floaty/schema/execute_msg.json b/contracts/floaty/schema/execute_msg.json index b98431246..0cb9f7b07 100644 --- a/contracts/floaty/schema/execute_msg.json +++ b/contracts/floaty/schema/execute_msg.json @@ -14,94 +14,6 @@ } }, "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 - }, - { - "description": "Infinite loop making storage calls (to test when their limit hits)", - "type": "object", - "required": [ - "storage_loop" - ], - "properties": { - "storage_loop": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "description": "Infinite loop reading and writing memory", - "type": "object", - "required": [ - "memory_loop" - ], - "properties": { - "memory_loop": { - "type": "object" - } - }, - "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 - }, - { - "description": "Trigger a panic to ensure framework handles gracefully", - "type": "object", - "required": [ - "panic" - ], - "properties": { - "panic": { - "type": "object" - } - }, - "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 } ] } diff --git a/contracts/floaty/schema/migrate_msg.json b/contracts/floaty/schema/migrate_msg.json deleted file mode 100644 index dbdad8fec..000000000 --- a/contracts/floaty/schema/migrate_msg.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "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" - } - } -} diff --git a/contracts/floaty/schema/sudo_msg.json b/contracts/floaty/schema/sudo_msg.json deleted file mode 100644 index 32cea1108..000000000 --- a/contracts/floaty/schema/sudo_msg.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "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", - "anyOf": [ - { - "type": "object", - "required": [ - "steal_funds" - ], - "properties": { - "steal_funds": { - "type": "object", - "required": [ - "amount", - "recipient" - ], - "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } - }, - "recipient": { - "type": "string" - } - } - } - }, - "additionalProperties": false - } - ], - "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/src/contract.rs b/contracts/floaty/src/contract.rs index 971ec3135..f474a3596 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -1,17 +1,15 @@ 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, WasmQuery, + entry_point, from_slice, to_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Deps, DepsMut, + Env, Event, MessageInfo, QueryRequest, QueryResponse, Response, StdError, StdResult, WasmQuery, }; use crate::errors::HackError; -use crate::msg::{ - ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, RecurseResponse, SudoMsg, VerifierResponse, -}; +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg, RecurseResponse, VerifierResponse}; use crate::state::{State, CONFIG_KEY}; +#[entry_point] pub fn instantiate( deps: DepsMut, _env: Env, @@ -35,51 +33,13 @@ pub fn instantiate( Ok(resp) } -pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { - let data = deps - .storage - .get(CONFIG_KEY) - .ok_or_else(|| StdError::not_found("State"))?; - let mut config: State = from_slice(&data)?; - config.verifier = deps.api.addr_validate(&msg.verifier)?; - deps.storage.set(CONFIG_KEY, &to_vec(&config)?); - - Ok(Response::default()) -} - #[entry_point] -pub fn sudo(_deps: DepsMut, _env: Env, msg: SudoMsg) -> Result { - match msg { - SudoMsg::StealFunds { recipient, amount } => { - let msg = BankMsg::Send { - to_address: recipient, - amount, - }; - let mut response = Response::default(); - response.add_message(msg); - Ok(response) - } - } -} - pub fn execute( deps: DepsMut, env: Env, info: MessageInfo, - msg: ExecuteMsg, + _msg: ExecuteMsg, ) -> Result { - match msg { - ExecuteMsg::Release {} => do_release(deps, env, info), - ExecuteMsg::CpuLoop {} => do_cpu_loop(), - ExecuteMsg::StorageLoop {} => do_storage_loop(deps), - ExecuteMsg::MemoryLoop {} => do_memory_loop(), - ExecuteMsg::AllocateLargeMemory { pages } => do_allocate_large_memory(pages), - ExecuteMsg::Panic {} => do_panic(), - ExecuteMsg::UserErrorsInApiCalls {} => do_user_errors_in_api_calls(deps.api), - } -} - -fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result { let data = deps .storage .get(CONFIG_KEY) @@ -90,13 +50,13 @@ fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result Result Result { - let mut counter = 0u64; - loop { - counter += 1; - if counter >= 9_000_000_000 { - counter = 0; - } - } -} - -fn do_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 do_memory_loop() -> Result { - let mut data = vec![1usize]; - loop { - // add one element - data.push((*data.last().expect("must not be empty")) + 1); - } -} - -#[allow(unused_variables)] -fn do_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 { - data: Some((old_size as u32).to_be_bytes().into()), - ..Response::default() - }) - } - - #[cfg(not(target_arch = "wasm32"))] - Err(StdError::generic_err("Unsupported architecture").into()) -} - -fn do_panic() -> Result { - panic!("This page intentionally faulted"); -} - -fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { - // Canonicalize - - let empty = ""; - match api.addr_canonicalize(empty).unwrap_err() { - StdError::GenericErr { .. } => {} - err => { - return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err - )) - .into()) - } - } - - let invalid_bech32 = "bn93hg934hg08q340g8u4jcau3"; - match api.addr_canonicalize(invalid_bech32).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() { - StdError::GenericErr { .. } => {} - err => { - return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err - )) - .into()) - } - } - - let too_short: CanonicalAddr = vec![0xAA, 0xBB, 0xCC].into(); - match api.addr_humanize(&too_short).unwrap_err() { - StdError::GenericErr { .. } => {} - err => { - return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err - )) - .into()) - } - } - - let wrong_length: CanonicalAddr = vec![0xA6; 17].into(); - match api.addr_humanize(&wrong_length).unwrap_err() { - StdError::GenericErr { .. } => {} - err => { - return Err(StdError::generic_err(format!( - "Unexpected error in do_user_errors_in_api_calls: {:?}", - err - )) - .into()) - } - } - - Ok(Response::default()) -} - pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::Verifier {} => to_binary(&query_verifier(deps)?), @@ -289,6 +127,7 @@ mod tests { 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, Binary, Storage, SubMsg}; @@ -342,66 +181,6 @@ mod tests { assert_eq!(query_response.verifier, verifier); } - #[test] - fn migrate_verifier() { - let mut deps = mock_dependencies(&[]); - - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); - let msg = InstantiateMsg { - verifier, - beneficiary, - }; - let info = mock_info(&creator, &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // 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\"}"); - - // change the verifier via migrate - let new_verifier = String::from("someone else"); - let msg = MigrateMsg { - verifier: new_verifier.clone(), - }; - let res = migrate(deps.as_mut(), mock_env(), msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // check it is 'someone else' - let query_response = query_verifier(deps.as_ref()).unwrap(); - assert_eq!(query_response.verifier, new_verifier); - } - - #[test] - 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 msg = InstantiateMsg { - verifier, - beneficiary, - }; - let info = mock_info(&creator, &[]); - let res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // sudo takes any tax it wants - let to_address = String::from("community-pool"); - let amount = coins(700, "gold"); - let sys_msg = SudoMsg::StealFunds { - recipient: to_address.clone(), - amount: amount.clone(), - }; - 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"); - assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); - } - #[test] fn querier_callbacks_work() { let rich_addr = String::from("foobar"); @@ -458,7 +237,11 @@ mod tests { ); assert_eq!( execute_res.attributes, - vec![attr("action", "release"), attr("destination", "benefits")], + vec![ + attr("action", "release"), + attr("destination", "benefits"), + attr("foo", "300") + ], ); assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); } @@ -507,56 +290,6 @@ mod tests { ); } - #[test] - #[should_panic(expected = "This page intentionally faulted")] - fn execute_panic() { - let mut deps = mock_dependencies(&[]); - - // initialize the store - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); - - let instantiate_msg = InstantiateMsg { - verifier, - beneficiary: beneficiary.clone(), - }; - let init_info = mock_info(&creator, &coins(1000, "earth")); - let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(0, init_res.messages.len()); - - let execute_info = mock_info(&beneficiary, &[]); - // this should panic - let _ = execute( - deps.as_mut(), - mock_env(), - execute_info, - ExecuteMsg::Panic {}, - ); - } - - #[test] - fn execute_user_errors_in_api_calls() { - let mut deps = mock_dependencies(&[]); - - let instantiate_msg = InstantiateMsg { - verifier: String::from("verifies"), - beneficiary: String::from("benefits"), - }; - let init_info = mock_info("creator", &coins(1000, "earth")); - let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(0, init_res.messages.len()); - - let execute_info = mock_info("anyone", &[]); - execute( - deps.as_mut(), - mock_env(), - execute_info, - ExecuteMsg::UserErrorsInApiCalls {}, - ) - .unwrap(); - } - #[test] fn query_recursive() { // the test framework doesn't handle contracts querying contracts yet, diff --git a/contracts/floaty/src/lib.rs b/contracts/floaty/src/lib.rs index 1e46dd614..0573cc96c 100644 --- a/contracts/floaty/src/lib.rs +++ b/contracts/floaty/src/lib.rs @@ -2,6 +2,3 @@ pub mod contract; mod errors; pub mod msg; pub mod state; - -#[cfg(target_arch = "wasm32")] -cosmwasm_std::create_entry_points_with_migration!(contract); diff --git a/contracts/floaty/src/msg.rs b/contracts/floaty/src/msg.rs index 6b51d1c85..c3297aa7a 100644 --- a/contracts/floaty/src/msg.rs +++ b/contracts/floaty/src/msg.rs @@ -1,7 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use cosmwasm_std::{Binary, Coin}; +use cosmwasm_std::Binary; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct InstantiateMsg { @@ -9,30 +9,6 @@ pub struct InstantiateMsg { pub beneficiary: String, } -/// 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. -/// -/// Note that the contract doesn't enforce permissions here, this is done -/// by blockchain logic (in the future by blockchain governance) -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct MigrateMsg { - pub verifier: String, -} - -/// 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 -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum SudoMsg { - StealFunds { - recipient: String, - amount: Vec, - }, -} - // failure modes to help test wasmd, based on this comment // https://github.com/cosmwasm/wasmd/issues/8#issuecomment-576146751 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] @@ -40,19 +16,6 @@ pub enum SudoMsg { pub enum ExecuteMsg { /// Releasing all funds in the contract to the beneficiary. This is the only "proper" action of this demo contract. Release {}, - /// 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 {}, - /// Allocate large amounts of memory without consuming much gas - AllocateLargeMemory { pages: u32 }, - /// Trigger a panic to ensure framework handles gracefully - Panic {}, - /// 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. - UserErrorsInApiCalls {}, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] diff --git a/contracts/floaty/tests/integration.rs b/contracts/floaty/tests/integration.rs index 67c87c75d..fe8956d4c 100644 --- a/contracts/floaty/tests/integration.rs +++ b/contracts/floaty/tests/integration.rs @@ -18,38 +18,24 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - attr, coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, ContractResult, - Empty, Response, SubMsg, + attr, coins, from_binary, Addr, AllBalanceResponse, BankMsg, ContractResult, Response, SubMsg, }; use cosmwasm_vm::{ - call_execute, from_slice, + from_slice, testing::{ - execute, instantiate, migrate, mock_env, mock_info, mock_instance, - mock_instance_with_balances, query, sudo, test_io, MOCK_CONTRACT_ADDR, + execute, instantiate, mock_env, mock_info, mock_instance, mock_instance_with_balances, + query, test_io, MOCK_CONTRACT_ADDR, }, - Storage, VmError, + Storage, }; -use hackatom::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, SudoMsg}; -use hackatom::state::{State, CONFIG_KEY}; +use floaty::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use floaty::state::{State, CONFIG_KEY}; -static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/hackatom.wasm"); +static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/floaty.wasm"); 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"); - ( - InstantiateMsg { - verifier, - beneficiary, - }, - creator, - ) -} - #[test] fn proper_initialization() { let mut deps = mock_instance(WASM, &[]); @@ -114,68 +100,6 @@ fn instantiate_and_query() { assert!(msg.contains("Error parsing")); } -#[test] -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 msg = InstantiateMsg { - verifier, - beneficiary, - }; - let info = mock_info(&creator, &[]); - let res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // check it is 'verifies' - let query_response = query(&mut deps, mock_env(), QueryMsg::Verifier {}).unwrap(); - assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); - - // change the verifier via migrate - let msg = MigrateMsg { - verifier: String::from("someone else"), - }; - let res: Response = migrate(&mut deps, mock_env(), msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // 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\"}" - ); -} - -#[test] -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 msg = InstantiateMsg { - verifier, - beneficiary, - }; - let info = mock_info(&creator, &[]); - let res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // sudo takes any tax it wants - let to_address = String::from("community-pool"); - let amount = coins(700, "gold"); - let sys_msg = SudoMsg::StealFunds { - recipient: to_address.clone(), - amount: amount.clone(), - }; - 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"); - assert_eq!(msg, &SubMsg::new(BankMsg::Send { to_address, amount })); -} - #[test] fn querier_callbacks_work() { let rich_addr = String::from("foobar"); @@ -249,7 +173,11 @@ fn execute_release_works() { ); assert_eq!( execute_res.attributes, - vec![attr("action", "release"), attr("destination", "benefits")], + vec![ + attr("action", "release"), + attr("destination", "benefits"), + attr("foo", "300") + ], ); assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); } @@ -308,177 +236,6 @@ fn execute_release_fails_for_wrong_sender() { ); } -#[test] -fn execute_cpu_loop() { - let mut deps = mock_instance(WASM, &[]); - - let (instantiate_msg, creator) = make_init_msg(); - let init_info = mock_info(creator.as_str(), &[]); - let init_res: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(0, init_res.messages.len()); - - let execute_info = mock_info(creator.as_str(), &[]); - // Note: we need to use the production-call, not the testing call (which unwraps any vm error) - let execute_res = call_execute::<_, _, _, Empty>( - &mut deps, - &mock_env(), - &execute_info, - &to_vec(&ExecuteMsg::CpuLoop {}).unwrap(), - ); - assert!(execute_res.is_err()); - assert_eq!(deps.get_gas_left(), 0); -} - -#[test] -fn execute_storage_loop() { - let mut deps = mock_instance(WASM, &[]); - - let (instantiate_msg, creator) = make_init_msg(); - let init_info = mock_info(creator.as_str(), &[]); - let init_res: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(0, init_res.messages.len()); - - let execute_info = mock_info(creator.as_str(), &[]); - // Note: we need to use the production-call, not the testing call (which unwraps any vm error) - let execute_res = call_execute::<_, _, _, Empty>( - &mut deps, - &mock_env(), - &execute_info, - &to_vec(&ExecuteMsg::StorageLoop {}).unwrap(), - ); - assert!(execute_res.is_err()); - assert_eq!(deps.get_gas_left(), 0); -} - -#[test] -fn execute_memory_loop() { - let mut deps = mock_instance(WASM, &[]); - - let (instantiate_msg, creator) = make_init_msg(); - let init_info = mock_info(creator.as_str(), &[]); - let init_res: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(0, init_res.messages.len()); - - let execute_info = mock_info(creator.as_str(), &[]); - // Note: we need to use the production-call, not the testing call (which unwraps any vm error) - let execute_res = call_execute::<_, _, _, Empty>( - &mut deps, - &mock_env(), - &execute_info, - &to_vec(&ExecuteMsg::MemoryLoop {}).unwrap(), - ); - assert!(execute_res.is_err()); - assert_eq!(deps.get_gas_left(), 0); - - // Ran out of gas before consuming a significant amount of memory - assert!(deps.memory_pages() < 200); -} - -#[test] -fn execute_allocate_large_memory() { - let mut deps = mock_instance(WASM, &[]); - - let (instantiate_msg, creator) = make_init_msg(); - let init_info = mock_info(creator.as_str(), &[]); - let init_res: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(0, init_res.messages.len()); - let mut pages_before = deps.memory_pages(); - assert_eq!(pages_before, 18); - - // Grow by 48 pages (3 MiB) - let execute_info = mock_info(creator.as_str(), &[]); - let gas_before = deps.get_gas_left(); - let execute_res: Response = execute( - &mut deps, - mock_env(), - execute_info, - ExecuteMsg::AllocateLargeMemory { pages: 48 }, - ) - .unwrap(); - assert_eq!( - execute_res.data.unwrap(), - Binary::from((pages_before as u32).to_be_bytes()) - ); - let gas_used = gas_before - deps.get_gas_left(); - // 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 cosmwasm-opt, not integration tests. - let expected = 27880; // +/- 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(); - assert_eq!(used, pages_before + 48, "Memory used: {} pages", used); - pages_before += 48; - - // Grow by 1600 pages (100 MiB) - let execute_info = mock_info(creator.as_str(), &[]); - let gas_before = deps.get_gas_left(); - let result: ContractResult = execute( - &mut deps, - mock_env(), - execute_info, - ExecuteMsg::AllocateLargeMemory { pages: 1600 }, - ); - assert_eq!(result.unwrap_err(), "Generic error: memory.grow failed"); - let gas_used = gas_before - deps.get_gas_left(); - // 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 cosmwasm-opt, not integration tests. - let expected = 31076; // +/- 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(); - assert_eq!(used, pages_before, "Memory used: {} pages", used); -} - -#[test] -fn execute_panic() { - let mut deps = mock_instance(WASM, &[]); - - let (instantiate_msg, creator) = make_init_msg(); - let init_info = mock_info(creator.as_str(), &[]); - let init_res: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(0, init_res.messages.len()); - - let execute_info = mock_info(creator.as_str(), &[]); - // panic inside contract should not panic out here - // Note: we need to use the production-call, not the testing call (which unwraps any vm error) - let execute_res = call_execute::<_, _, _, Empty>( - &mut deps, - &mock_env(), - &execute_info, - &to_vec(&ExecuteMsg::Panic {}).unwrap(), - ); - match execute_res.unwrap_err() { - VmError::RuntimeErr { .. } => {} - err => panic!("Unexpected error: {:?}", err), - } -} - -#[test] -fn execute_user_errors_in_api_calls() { - let mut deps = mock_instance(WASM, &[]); - - let (instantiate_msg, creator) = make_init_msg(); - let init_info = mock_info(creator.as_str(), &[]); - let _init_res: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - - let execute_info = mock_info(creator.as_str(), &[]); - let _execute_res: Response = execute( - &mut deps, - mock_env(), - execute_info, - ExecuteMsg::UserErrorsInApiCalls {}, - ) - .unwrap(); -} - #[test] fn passes_io_tests() { let mut deps = mock_instance(WASM, &[]); diff --git a/packages/vm/testdata/floaty.wasm b/packages/vm/testdata/floaty.wasm index 074b611df5068f7b7b44302509fabfbd97855120..5173da16ca108c643361bac63bfeee90721540e4 100644 GIT binary patch delta 49081 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 From faba781e156b249b7dcf93da30f157174a8d80c5 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Jun 2021 13:53:12 +0200 Subject: [PATCH 128/402] Test `floaty` in CI --- .circleci/config.yml | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 180d78800..a38b80ab8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -14,6 +14,7 @@ workflows: - contract_hackatom - contract_ibc_reflect - contract_ibc_reflect_send + - contract_floaty - contract_queue - contract_reflect - contract_staking @@ -476,6 +477,56 @@ jobs: - target/wasm32-unknown-unknown/release/deps key: cargocache-v2-contract_ibc_reflect_send-rust:1.51.0-{{ checksum "Cargo.lock" }} + contract_floaty: + docker: + - image: rust:1.51.0 + environment: + RUST_BACKTRACE: 1 + working_directory: ~/cosmwasm/contracts/floaty + steps: + - checkout: + path: ~/cosmwasm + - run: + name: Version information + command: rustc --version; cargo --version; rustup --version + - restore_cache: + keys: + - cargocache-v2-contract_floaty-rust:1.51.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 + - 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_floaty-rust:1.51.0-{{ checksum "Cargo.lock" }} + contract_queue: docker: - image: rust:1.51.0 @@ -655,6 +706,10 @@ jobs: 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 @@ -782,6 +837,13 @@ 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 429301d806528d2db4bb3cfed45eeafa34898750 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Jun 2021 13:56:44 +0200 Subject: [PATCH 129/402] Update .mergify.yml --- .mergify.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.mergify.yml b/.mergify.yml index 9c6073430..bb74879c3 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -18,6 +18,7 @@ pull_request_rules: - "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" From 2d7611cb08ad6bdb0b9cc4a92ba9c452dcc248de Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Jun 2021 14:01:57 +0200 Subject: [PATCH 130/402] Remove integration tests for `floaty` --- .circleci/config.yml | 3 - contracts/floaty/tests/integration.rs | 243 -------------------------- 2 files changed, 246 deletions(-) delete mode 100644 contracts/floaty/tests/integration.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index a38b80ab8..1514877bc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -501,9 +501,6 @@ jobs: - 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 diff --git a/contracts/floaty/tests/integration.rs b/contracts/floaty/tests/integration.rs deleted file mode 100644 index fe8956d4c..000000000 --- a/contracts/floaty/tests/integration.rs +++ /dev/null @@ -1,243 +0,0 @@ -//! 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 as follows: -//! 1. Copy them over verbatim -//! 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::{ - attr, coins, from_binary, Addr, AllBalanceResponse, BankMsg, ContractResult, Response, SubMsg, -}; -use cosmwasm_vm::{ - from_slice, - testing::{ - execute, instantiate, mock_env, mock_info, mock_instance, mock_instance_with_balances, - query, test_io, MOCK_CONTRACT_ADDR, - }, - Storage, -}; - -use floaty::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; -use floaty::state::{State, CONFIG_KEY}; - -static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/floaty.wasm"); - -const DESERIALIZATION_LIMIT: usize = 20_000; - -#[test] -fn proper_initialization() { - let mut deps = mock_instance(WASM, &[]); - assert_eq!(deps.required_features.len(), 0); - - let verifier = String::from("verifies"); - let beneficiary = String::from("benefits"); - let creator = String::from("creator"); - let expected_state = State { - verifier: Addr::unchecked(&verifier), - beneficiary: Addr::unchecked(&beneficiary), - funder: Addr::unchecked(&creator), - }; - - let msg = InstantiateMsg { - verifier, - beneficiary, - }; - let info = mock_info(&creator, &coins(1000, "earth")); - let res: Response = instantiate(&mut deps, 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 state: State = deps - .with_storage(|store| { - let data = store - .get(CONFIG_KEY) - .0 - .expect("error reading db") - .expect("no data stored"); - from_slice(&data, DESERIALIZATION_LIMIT) - }) - .unwrap(); - assert_eq!(state, expected_state); -} - -#[test] -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 msg = InstantiateMsg { - verifier, - beneficiary, - }; - let info = mock_info(&creator, &coins(1000, "earth")); - let res: Response = instantiate(&mut deps, mock_env(), info, msg).unwrap(); - assert_eq!(0, res.messages.len()); - - // now let's query - let query_response = query(&mut deps, mock_env(), QueryMsg::Verifier {}).unwrap(); - assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}"); - - // bad query returns parse error (pass wrong type - this connection is not enforced) - let qres = query(&mut deps, mock_env(), ExecuteMsg::Release {}); - let msg = qres.unwrap_err(); - assert!(msg.contains("Error parsing")); -} - -#[test] -fn querier_callbacks_work() { - let rich_addr = String::from("foobar"); - let rich_balance = coins(10000, "gold"); - let mut deps = mock_instance_with_balances(WASM, &[(&rich_addr, &rich_balance)]); - - // 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(); - assert_eq!(bal.amount, rich_balance); - - // querying other accounts gets none - let query_msg = QueryMsg::OtherBalance { - address: String::from("someone else"), - }; - let query_response = query(&mut deps, mock_env(), query_msg).unwrap(); - let bal: AllBalanceResponse = from_binary(&query_response).unwrap(); - assert_eq!(bal.amount, vec![]); -} - -#[test] -fn fails_on_bad_init() { - let mut deps = mock_instance(WASM, &[]); - let info = mock_info("creator", &coins(1000, "earth")); - // bad init returns parse error (pass wrong type - this connection is not enforced) - let res: ContractResult = - instantiate(&mut deps, mock_env(), info, ExecuteMsg::Release {}); - let msg = res.unwrap_err(); - assert!(msg.contains("Error parsing")); -} - -#[test] -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 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: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(init_res.messages.len(), 0); - - // balance changed in init - deps.with_querier(|querier| { - querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); - Ok(()) - }) - .unwrap(); - - // beneficiary can release it - let execute_info = mock_info(&verifier, &[]); - 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"); - 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_instance(WASM, &[]); - - // 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: Response = - instantiate(&mut deps, mock_env(), init_info, instantiate_msg).unwrap(); - assert_eq!(init_res.messages.len(), 0); - - // balance changed in init - deps.with_querier(|querier| { - querier.update_balance(MOCK_CONTRACT_ADDR, init_amount); - Ok(()) - }) - .unwrap(); - - // beneficiary cannot release it - let execute_info = mock_info(&beneficiary, &[]); - let execute_res: ContractResult = - execute(&mut deps, mock_env(), execute_info, ExecuteMsg::Release {}); - let msg = execute_res.unwrap_err(); - assert!(msg.contains("Unauthorized")); - - // state should not change - let data = deps - .with_storage(|store| { - Ok(store - .get(CONFIG_KEY) - .0 - .expect("error reading db") - .expect("no data stored")) - }) - .unwrap(); - let state: State = from_slice(&data, DESERIALIZATION_LIMIT).unwrap(); - assert_eq!( - state, - State { - verifier: Addr::unchecked(&verifier), - beneficiary: Addr::unchecked(&beneficiary), - funder: Addr::unchecked(&creator), - } - ); -} - -#[test] -fn passes_io_tests() { - let mut deps = mock_instance(WASM, &[]); - test_io(&mut deps); -} From b300a59967d823cc183ef9168557bc6dc8488561 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Jun 2021 15:26:37 +0200 Subject: [PATCH 131/402] Add GovMsg to CosmosMsg --- CHANGELOG.md | 1 + packages/std/src/results/cosmos_msg.rs | 30 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9ce2f7a7..9804af711 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to - 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. ### Removed diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index bb4273080..f547b3381 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -37,6 +37,9 @@ where #[cfg(feature = "stargate")] Ibc(IbcMsg), Wasm(WasmMsg), + /// 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. + #[cfg(feature = "stargate")] + Gov(GovMsg), } /// The message types of the bank module. @@ -160,6 +163,23 @@ pub enum WasmMsg { ClearAdmin { contract_addr: String }, } +#[cfg(feature = "stargate")] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum GovMsg { + Vote { proposal_id: u64, vote: Vote }, +} + +#[cfg(feature = "stargate")] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum Vote { + Yes, + No, + Abstain, + Veto, +} + /// 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. @@ -244,6 +264,16 @@ where } } +#[cfg(feature = "stargate")] +impl From for CosmosMsg +where + T: Clone + fmt::Debug + PartialEq + JsonSchema, +{ + fn from(msg: GovMsg) -> Self { + CosmosMsg::Gov(msg) + } +} + #[cfg(test)] mod tests { use super::*; From f819874eb47502cd03377c98519b2c3ad877f5b7 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 22 Jun 2021 15:41:25 +0200 Subject: [PATCH 132/402] Refactor CosmosMsg::Gov --- .../ibc-reflect-send/schema/execute_msg.json | 52 +++++++++++++++++++ .../ibc-reflect-send/schema/packet_msg.json | 52 +++++++++++++++++++ contracts/ibc-reflect/schema/packet_msg.json | 52 +++++++++++++++++++ contracts/reflect/schema/execute_msg.json | 52 +++++++++++++++++++ .../schema/response_for__custom_msg.json | 52 +++++++++++++++++++ packages/std/src/results/cosmos_msg.rs | 8 +-- 6 files changed, 264 insertions(+), 4 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/execute_msg.json b/contracts/ibc-reflect-send/schema/execute_msg.json index 6e79476d8..8242748da 100644 --- a/contracts/ibc-reflect-send/schema/execute_msg.json +++ b/contracts/ibc-reflect-send/schema/execute_msg.json @@ -273,6 +273,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false } ] }, @@ -329,6 +341,37 @@ "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": { + "anyOf": [ + { + "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)", "anyOf": [ @@ -582,6 +625,15 @@ "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", "anyOf": [ diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 0f4e9f969..528cd2507 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -226,6 +226,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false } ] }, @@ -282,6 +294,37 @@ "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": { + "anyOf": [ + { + "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)", "anyOf": [ @@ -535,6 +578,15 @@ "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", "anyOf": [ diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index df229f239..4ac17df91 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -225,6 +225,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false } ] }, @@ -281,6 +293,37 @@ "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": { + "anyOf": [ + { + "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)", "anyOf": [ @@ -534,6 +577,15 @@ "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", "anyOf": [ diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index 4c42b6a50..e74e8f25f 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -244,6 +244,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false } ] }, @@ -325,6 +337,37 @@ } ] }, + "GovMsg": { + "anyOf": [ + { + "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)", "anyOf": [ @@ -619,6 +662,15 @@ "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", "anyOf": [ diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 7cdacab8f..d822a0649 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -231,6 +231,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "gov" + ], + "properties": { + "gov": { + "$ref": "#/definitions/GovMsg" + } + }, + "additionalProperties": false } ] }, @@ -332,6 +344,37 @@ } } }, + "GovMsg": { + "anyOf": [ + { + "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)", "anyOf": [ @@ -626,6 +669,15 @@ "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", "anyOf": [ diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index f547b3381..da0efe412 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -37,7 +37,6 @@ where #[cfg(feature = "stargate")] Ibc(IbcMsg), Wasm(WasmMsg), - /// 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. #[cfg(feature = "stargate")] Gov(GovMsg), } @@ -167,17 +166,18 @@ pub enum WasmMsg { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum GovMsg { - Vote { proposal_id: u64, vote: Vote }, + /// 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 }, } #[cfg(feature = "stargate")] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] -pub enum Vote { +pub enum VoteOption { Yes, No, Abstain, - Veto, + NoWithVeto, } /// Shortcut helper as the construction of WasmMsg::Instantiate can be quite verbose in contract code. From 8827313a8638b057fb6e200a8d559e4e7ef35d1b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 17:54:59 +0200 Subject: [PATCH 133/402] Rename `SubcallResponse` `SubMsgExecutionResponse` --- CHANGELOG.md | 1 + contracts/ibc-reflect/src/contract.rs | 11 +++++++---- contracts/ibc-reflect/tests/integration.rs | 6 +++--- contracts/reflect/src/contract.rs | 4 ++-- contracts/reflect/tests/integration.rs | 4 ++-- packages/std/src/lib.rs | 3 ++- packages/std/src/results/mod.rs | 2 +- packages/std/src/results/subcall.rs | 4 ++-- packages/vm/src/calls.rs | 4 ++-- 9 files changed, 22 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9ce2f7a7..711ea77b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ and this project adheres to - 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`. [#961]: https://github.com/CosmWasm/cosmwasm/pull/961 diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 4733ad3ee..c282b4f50 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -2,7 +2,7 @@ use cosmwasm_std::{ attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, Response, - StdError, StdResult, SubMsg, SubcallResponse, WasmMsg, + StdError, StdResult, SubMsg, SubMsgExecutionResponse, WasmMsg, }; use crate::msg::{ @@ -59,7 +59,10 @@ fn parse_contract_from_event(events: Vec) -> Option { .map(|a| a.value) } -pub fn handle_init_callback(deps: DepsMut, response: SubcallResponse) -> StdResult { +pub fn handle_init_callback( + deps: DepsMut, + response: SubMsgExecutionResponse, +) -> 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(); @@ -401,7 +404,7 @@ mod tests { // fake a reply and ensure this works let response = Reply { id, - result: ContractResult::Ok(SubcallResponse { + result: ContractResult::Ok(SubMsgExecutionResponse { events: fake_events(&account), data: None, }), @@ -475,7 +478,7 @@ mod tests { // fake a reply and ensure this works let response = Reply { id, - result: ContractResult::Ok(SubcallResponse { + result: ContractResult::Ok(SubMsgExecutionResponse { events: fake_events(&REFLECT_ADDR), data: None, }), diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 59e8f6b6e..e1f3e07ff 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -20,7 +20,7 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_recv}; use cosmwasm_std::{ attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, - IbcReceiveResponse, Reply, Response, SubcallResponse, WasmMsg, + IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, WasmMsg, }; use cosmwasm_vm::testing::{ ibc_channel_connect, ibc_channel_open, ibc_packet_receive, instantiate, mock_env, mock_info, @@ -91,7 +91,7 @@ fn connect>( // fake a reply and ensure this works let response = Reply { id, - result: ContractResult::Ok(SubcallResponse { + result: ContractResult::Ok(SubMsgExecutionResponse { events: fake_events(&account), data: None, }), @@ -167,7 +167,7 @@ fn proper_handshake_flow() { // we get the callback from reflect let response = Reply { id, - result: ContractResult::Ok(SubcallResponse { + result: ContractResult::Ok(SubMsgExecutionResponse { events: fake_events(&REFLECT_ADDR), data: None, }), diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 2ab0f14f7..777e91369 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -180,7 +180,7 @@ mod tests { use cosmwasm_std::testing::{mock_env, mock_info, MOCK_CONTRACT_ADDR}; use cosmwasm_std::{ coin, coins, from_binary, AllBalanceResponse, BankMsg, BankQuery, Binary, ContractResult, - Event, StakingMsg, StdError, SubcallResponse, + Event, StakingMsg, StdError, SubMsgExecutionResponse, }; #[test] @@ -437,7 +437,7 @@ mod tests { let id = 123u64; let data = Binary::from(b"foobar"); let events = vec![Event::new("message").attr("signer", "caller-addr")]; - let result = ContractResult::Ok(SubcallResponse { + let result = ContractResult::Ok(SubMsgExecutionResponse { events: events.clone(), data: Some(data.clone()), }); diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 2f4005f59..3b64b4e5e 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -19,7 +19,7 @@ use cosmwasm_std::{ coin, coins, from_binary, BankMsg, Binary, Coin, ContractResult, Event, Reply, Response, - StakingMsg, SubMsg, SubcallResponse, SystemResult, + StakingMsg, SubMsg, SubMsgExecutionResponse, SystemResult, }; use cosmwasm_vm::{ testing::{ @@ -226,7 +226,7 @@ fn reply_and_query() { let id = 123u64; let data = Binary::from(b"foobar"); let events = vec![Event::new("message").attr("signer", "caller-addr")]; - let result = ContractResult::Ok(SubcallResponse { + let result = ContractResult::Ok(SubMsgExecutionResponse { events: events.clone(), data: Some(data.clone()), }); diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 0cfa80fdb..30a5207e7 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -53,7 +53,8 @@ pub use crate::query::{ pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; pub use crate::results::{ attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, Empty, - Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubcallResponse, SystemResult, WasmMsg, + Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgExecutionResponse, SystemResult, + WasmMsg, }; #[cfg(feature = "staking")] pub use crate::results::{DistributionMsg, StakingMsg}; diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index ac2057bef..601701cff 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -17,5 +17,5 @@ pub use cosmos_msg::{DistributionMsg, StakingMsg}; pub use empty::Empty; pub use query::QueryResponse; pub use response::Response; -pub use subcall::{Event, Reply, ReplyOn, SubMsg, SubcallResponse}; +pub use subcall::{Event, Reply, ReplyOn, SubMsg, SubMsgExecutionResponse}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/subcall.rs index 3b57734a2..e2e6157c0 100644 --- a/packages/std/src/results/subcall.rs +++ b/packages/std/src/results/subcall.rs @@ -107,12 +107,12 @@ 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, - pub result: ContractResult, + pub result: ContractResult, } /// The information we get back from a successful sub-call, with full sdk events #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct SubcallResponse { +pub struct SubMsgExecutionResponse { pub events: Vec, pub data: Option, } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 0e55d673d..a07d70f89 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -678,7 +678,7 @@ mod tests { mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; - use cosmwasm_std::{attr, Empty, Event, IbcOrder, Reply, ReplyOn, SubcallResponse}; + use cosmwasm_std::{attr, Empty, Event, IbcOrder, Reply, ReplyOn, SubMsgExecutionResponse}; static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); const IBC_VERSION: &str = "ibc-reflect-v1"; fn setup( @@ -717,7 +717,7 @@ mod tests { // which creates a reflect account. here we get the callback let response = Reply { id, - result: ContractResult::Ok(SubcallResponse { + result: ContractResult::Ok(SubMsgExecutionResponse { events: vec![event], data: None, }), From 4c4abd2aceec567943ebb9844761e614bb8bab30 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 18:24:46 +0200 Subject: [PATCH 134/402] Rename call -> msg in `reflect` --- CHANGELOG.md | 2 ++ contracts/reflect/schema/execute_msg.json | 4 ++-- contracts/reflect/schema/query_msg.json | 6 +++--- contracts/reflect/src/contract.rs | 10 +++++----- contracts/reflect/src/msg.rs | 6 +++--- contracts/reflect/tests/integration.rs | 6 +++--- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 711ea77b8..5e17a8ca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,8 @@ and this project adheres to 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. [#961]: https://github.com/CosmWasm/cosmwasm/pull/961 diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index 4c42b6a50..6a0515028 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -28,10 +28,10 @@ { "type": "object", "required": [ - "reflect_sub_call" + "reflect_sub_msg" ], "properties": { - "reflect_sub_call": { + "reflect_sub_msg": { "type": "object", "required": [ "msgs" diff --git a/contracts/reflect/schema/query_msg.json b/contracts/reflect/schema/query_msg.json index d8ddf1f7b..7084cacd9 100644 --- a/contracts/reflect/schema/query_msg.json +++ b/contracts/reflect/schema/query_msg.json @@ -82,13 +82,13 @@ "additionalProperties": false }, { - "description": "If there was a previous ReflectSubCall with this ID, returns cosmwasm_std::Reply", + "description": "If there was a previous ReflectSubMsg with this ID, returns cosmwasm_std::Reply", "type": "object", "required": [ - "sub_call_result" + "sub_msg_result" ], "properties": { - "sub_call_result": { + "sub_msg_result": { "type": "object", "required": [ "id" diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 777e91369..fa15f0a78 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -30,7 +30,7 @@ pub fn execute( ) -> Result, ReflectError> { match msg { ExecuteMsg::ReflectMsg { msgs } => try_reflect(deps, env, info, msgs), - ExecuteMsg::ReflectSubCall { msgs } => try_reflect_subcall(deps, env, info, msgs), + ExecuteMsg::ReflectSubMsg { msgs } => try_reflect_subcall(deps, env, info, msgs), ExecuteMsg::ChangeOwner { owner } => try_change_owner(deps, env, info, owner), } } @@ -126,7 +126,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { 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::SubCallResult { id } => to_binary(&query_subcall(deps, id)?), + QueryMsg::SubMsgResult { id } => to_binary(&query_subcall(deps, id)?), } } @@ -415,7 +415,7 @@ mod tests { id, ); - let msg = ExecuteMsg::ReflectSubCall { + let msg = ExecuteMsg::ReflectSubMsg { msgs: vec![payload.clone()], }; let info = mock_info("creator", &[]); @@ -449,12 +449,12 @@ mod tests { let qres = query( deps.as_ref(), mock_env(), - QueryMsg::SubCallResult { id: 65432 }, + QueryMsg::SubMsgResult { id: 65432 }, ); assert!(qres.is_err()); // query for the real id - let raw = query(deps.as_ref(), mock_env(), QueryMsg::SubCallResult { id }).unwrap(); + let raw = query(deps.as_ref(), mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); let qres: Reply = from_binary(&raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); diff --git a/contracts/reflect/src/msg.rs b/contracts/reflect/src/msg.rs index f3c488822..6098e8568 100644 --- a/contracts/reflect/src/msg.rs +++ b/contracts/reflect/src/msg.rs @@ -10,7 +10,7 @@ pub struct InstantiateMsg {} #[serde(rename_all = "snake_case")] pub enum ExecuteMsg { ReflectMsg { msgs: Vec> }, - ReflectSubCall { msgs: Vec> }, + ReflectSubMsg { msgs: Vec> }, ChangeOwner { owner: String }, } @@ -31,8 +31,8 @@ pub enum QueryMsg { contract: String, key: Binary, }, - /// If there was a previous ReflectSubCall with this ID, returns cosmwasm_std::Reply - SubCallResult { + /// If there was a previous ReflectSubMsg with this ID, returns cosmwasm_std::Reply + SubMsgResult { id: u64, }, } diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 3b64b4e5e..8e113c830 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -204,7 +204,7 @@ fn reflect_subcall() { id, ); - let msg = ExecuteMsg::ReflectSubCall { + let msg = ExecuteMsg::ReflectSubMsg { msgs: vec![payload.clone()], }; let info = mock_info("creator", &[]); @@ -235,11 +235,11 @@ fn reply_and_query() { assert_eq!(0, res.messages.len()); // query for a non-existant id - let qres = query(&mut deps, mock_env(), QueryMsg::SubCallResult { id: 65432 }); + let qres = query(&mut deps, mock_env(), QueryMsg::SubMsgResult { id: 65432 }); assert!(qres.is_err()); // query for the real id - let raw = query(&mut deps, mock_env(), QueryMsg::SubCallResult { id }).unwrap(); + let raw = query(&mut deps, mock_env(), QueryMsg::SubMsgResult { id }).unwrap(); let qres: Reply = from_binary(&raw).unwrap(); assert_eq!(qres.id, id); let result = qres.result.unwrap(); From 048dc381493629d947c2254078723cb4439f9e1d Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 21 Jun 2021 18:30:34 +0200 Subject: [PATCH 135/402] Rename module `subcall` -> `submessages` --- CHANGELOG.md | 1 + packages/std/src/results/mod.rs | 4 ++-- packages/std/src/results/response.rs | 2 +- packages/std/src/results/{subcall.rs => submessages.rs} | 0 4 files changed, 4 insertions(+), 3 deletions(-) rename packages/std/src/results/{subcall.rs => submessages.rs} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e17a8ca1..751fb1968 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ and this project adheres to - 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`. [#961]: https://github.com/CosmWasm/cosmwasm/pull/961 diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 601701cff..6321503f7 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -6,7 +6,7 @@ mod cosmos_msg; mod empty; mod query; mod response; -mod subcall; +mod submessages; mod system_result; pub use attribute::{attr, Attribute}; @@ -17,5 +17,5 @@ pub use cosmos_msg::{DistributionMsg, StakingMsg}; pub use empty::Empty; pub use query::QueryResponse; pub use response::Response; -pub use subcall::{Event, Reply, ReplyOn, SubMsg, SubMsgExecutionResponse}; +pub use submessages::{Event, Reply, ReplyOn, SubMsg, SubMsgExecutionResponse}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 64272b27e..d105a4095 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -145,7 +145,7 @@ where mod tests { use super::super::BankMsg; use super::*; - use crate::results::subcall::{ReplyOn, UNUSED_MSG_ID}; + use crate::results::submessages::{ReplyOn, UNUSED_MSG_ID}; use crate::{coins, from_slice, to_vec}; #[test] diff --git a/packages/std/src/results/subcall.rs b/packages/std/src/results/submessages.rs similarity index 100% rename from packages/std/src/results/subcall.rs rename to packages/std/src/results/submessages.rs From d710ef6af374f2667937c132b6dd94dc691fd060 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 22 Jun 2021 17:17:28 +0200 Subject: [PATCH 136/402] Set version: 0.15.0-alpha1 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b425fab46..843a22a0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -186,7 +186,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "criterion", @@ -206,7 +206,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "syn", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "chrono", @@ -240,7 +240,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 9b25b0f63..3633b0472 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -122,7 +122,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -133,14 +133,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -162,7 +162,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index bdbb6fa51..22957efcc 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -124,7 +124,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -135,14 +135,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -164,7 +164,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -172,7 +172,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 667d5248c..f205e319a 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -100,7 +100,7 @@ checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 68dfb8429..6371bcdfb 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index ab199e75f..9de3e59b5 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 36f76ca74..37e028f01 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index eddc4aa70..40abbee4d 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 1d770127c..faafde9af 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 96b847d73..892e4dde1 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index fdec37646..34a5a8939 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.14.1" +version = "0.15.0-alpha1" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index d35fbdc1d..9448ae092 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.14.1" +version = "0.15.0-alpha1" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 66e234fba..9fd560726 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.14.1" +version = "0.15.0-alpha1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 32a2b7d5b..6f1fcd40d 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.14.1" +version = "0.15.0-alpha1" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.14.1" } +cosmwasm-derive = { path = "../derive", version = "0.15.0-alpha1" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.14.1" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index c287683e9..619160764 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.14.1" +version = "0.15.0-alpha1" authors = ["Ethan Frey "] edition = "2018" description = "CosmWasm library with useful helpers for Storage patterns" @@ -15,5 +15,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 = "0.14.1" } +cosmwasm-std = { path = "../std", version = "0.15.0-alpha1" } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index fcd91d5b9..f06064091 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.14.1" +version = "0.15.0-alpha1" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.14.1" } -cosmwasm-crypto = { path = "../crypto", version = "0.14.1" } +cosmwasm-std = { path = "../std", version = "0.15.0-alpha1" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 16b0abc0683fe3f1e84b509c7c5c262c2ab5e435 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 11:18:44 +0200 Subject: [PATCH 137/402] Update Rust optimizer to 0.11.4 --- .circleci/config.yml | 2 +- README.md | 2 +- contracts/README.md | 18 +++++++++--------- packages/vm/README.md | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1514877bc..0229625af 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -951,7 +951,7 @@ jobs: name: Build development contracts command: | echo "Building all contracts under ./contracts" - docker run --volumes-from with_code cosmwasm/rust-optimizer:0.11.0 ./contracts/*/ + docker run --volumes-from with_code cosmwasm/rust-optimizer:0.11.4 ./contracts/*/ - run: name: Check development contracts command: | diff --git a/README.md b/README.md index f2152ed8b..8b18598e6 100644 --- a/README.md +++ b/README.md @@ -293,7 +293,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.11.0 + cosmwasm/rust-optimizer:0.11.4 ``` 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 d463d65ae..4860e1e00 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -18,47 +18,47 @@ 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.11.0 ./contracts/burner + cosmwasm/rust-optimizer:0.11.4 ./contracts/burner docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_burner",target=/code/contracts/crypto-verify/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.11.0 ./contracts/crypto-verify + cosmwasm/rust-optimizer:0.11.4 ./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.11.0 ./contracts/floaty + cosmwasm/rust-optimizer:0.11.4 ./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.11.0 ./contracts/hackatom + cosmwasm/rust-optimizer:0.11.4 ./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.11.0 ./contracts/ibc-reflect + cosmwasm/rust-optimizer:0.11.4 ./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.11.0 ./contracts/ibc-reflect-send + cosmwasm/rust-optimizer:0.11.4 ./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.11.0 ./contracts/queue + cosmwasm/rust-optimizer:0.11.4 ./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.11.0 ./contracts/reflect + cosmwasm/rust-optimizer:0.11.4 ./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.11.0 ./contracts/staking + cosmwasm/rust-optimizer:0.11.4 ./contracts/staking ``` ## Entry points diff --git a/packages/vm/README.md b/packages/vm/README.md index 41b4ac962..f97a932bc 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -39,13 +39,13 @@ To rebuild the test contracts, go to the repo root and do 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.11.0 ./contracts/hackatom \ + cosmwasm/rust-optimizer:0.11.4 ./contracts/hackatom \ && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_0.15.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.11.0 ./contracts/ibc-reflect \ + cosmwasm/rust-optimizer:0.11.4 ./contracts/ibc-reflect \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_0.15.wasm ``` From 117811599729b5f52027fd6686e31b07ee8e8775 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 11:31:37 +0200 Subject: [PATCH 138/402] Exclude floaty.wasm from checks in CI --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0229625af..d4909b4e2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -956,7 +956,8 @@ jobs: name: Check development contracts command: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.51.0 /bin/bash -e -c 'cd ./code/packages/vm; ./examples/check_contract.sh ../../artifacts/*.wasm' + docker run --volumes-from with_code rust:1.51.0 \ + /bin/bash -e -c 'export GLOBIGNORE="../../artifacts/floaty.wasm"; cd ./code/packages/vm; ./examples/check_contract.sh ../../artifacts/*.wasm' docker cp with_code:/code/artifacts . - run: name: Publish artifacts on GitHub From 3487fcc7f560770b6680be97a85aab13614f7cd0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 11:35:20 +0200 Subject: [PATCH 139/402] REVERT ME: Test build_and_upload_devcontracts CI job --- .circleci/config.yml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d4909b4e2..396b00bff 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,6 +21,7 @@ workflows: - fmt - fmt_extra - clippy + - build_and_upload_devcontracts # Testing only. Remove later. - benchmarking: requires: - package_vm @@ -959,15 +960,15 @@ jobs: docker run --volumes-from with_code rust:1.51.0 \ /bin/bash -e -c 'export GLOBIGNORE="../../artifacts/floaty.wasm"; cd ./code/packages/vm; ./examples/check_contract.sh ../../artifacts/*.wasm' docker cp with_code:/code/artifacts . - - run: - name: Publish artifacts on GitHub - 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." - ghr -t "$GITHUB_TOKEN" \ - -u "$CIRCLE_PROJECT_USERNAME" -r "$CIRCLE_PROJECT_REPONAME" \ - -c "$CIRCLE_SHA1" \ - -n "$TITLE" -b "$BODY" \ - -delete \ - "$TAG" ./artifacts/ + # - run: + # name: Publish artifacts on GitHub + # 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." + # ghr -t "$GITHUB_TOKEN" \ + # -u "$CIRCLE_PROJECT_USERNAME" -r "$CIRCLE_PROJECT_REPONAME" \ + # -c "$CIRCLE_SHA1" \ + # -n "$TITLE" -b "$BODY" \ + # -delete \ + # "$TAG" ./artifacts/ From 7e4c412d91c9ff5e4cb6e485954bba80efbff5df Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 11:54:49 +0200 Subject: [PATCH 140/402] Revert "REVERT ME: Test build_and_upload_devcontracts CI job" This reverts commit 3487fcc7f560770b6680be97a85aab13614f7cd0. --- .circleci/config.yml | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 396b00bff..d4909b4e2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,6 @@ workflows: - fmt - fmt_extra - clippy - - build_and_upload_devcontracts # Testing only. Remove later. - benchmarking: requires: - package_vm @@ -960,15 +959,15 @@ jobs: docker run --volumes-from with_code rust:1.51.0 \ /bin/bash -e -c 'export GLOBIGNORE="../../artifacts/floaty.wasm"; cd ./code/packages/vm; ./examples/check_contract.sh ../../artifacts/*.wasm' docker cp with_code:/code/artifacts . - # - run: - # name: Publish artifacts on GitHub - # 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." - # ghr -t "$GITHUB_TOKEN" \ - # -u "$CIRCLE_PROJECT_USERNAME" -r "$CIRCLE_PROJECT_REPONAME" \ - # -c "$CIRCLE_SHA1" \ - # -n "$TITLE" -b "$BODY" \ - # -delete \ - # "$TAG" ./artifacts/ + - run: + name: Publish artifacts on GitHub + 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." + ghr -t "$GITHUB_TOKEN" \ + -u "$CIRCLE_PROJECT_USERNAME" -r "$CIRCLE_PROJECT_REPONAME" \ + -c "$CIRCLE_SHA1" \ + -n "$TITLE" -b "$BODY" \ + -delete \ + "$TAG" ./artifacts/ From b9dc544b9f5effd41164f669522cbd0939430a6f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 09:59:04 +0200 Subject: [PATCH 141/402] Bump marker export to interface_version_6 --- CHANGELOG.md | 2 ++ packages/std/src/entry_points.rs | 2 +- packages/std/src/exports.rs | 4 ++-- packages/vm/README.md | 9 +++++++++ packages/vm/src/compatibility.rs | 10 +++++----- packages/vm/src/environment.rs | 2 +- packages/vm/src/instance.rs | 6 +++--- packages/vm/src/static_analysis.rs | 6 +++--- 8 files changed, 26 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2be12283b..ab6dd540b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,8 @@ and this project adheres to - 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`. [#961]: https://github.com/CosmWasm/cosmwasm/pull/961 diff --git a/packages/std/src/entry_points.rs b/packages/std/src/entry_points.rs index 3f75b9ee0..72130628f 100644 --- a/packages/std/src/entry_points.rs +++ b/packages/std/src/entry_points.rs @@ -81,7 +81,7 @@ macro_rules! create_entry_points { $crate::create_entry_points!(@migration; $contract, $migration); - // Other C externs like interface_version_5, allocate, deallocate are available + // Other C externs like interface_version_6, allocate, deallocate are available // automatically because we `use cosmwasm_std`. } }; diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index d47ca7d62..64079cc66 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -1,6 +1,6 @@ //! exports exposes the public wasm API //! -//! interface_version_5, allocate and deallocate turn into Wasm exports +//! interface_version_6, allocate and deallocate turn into Wasm exports //! as soon as cosmwasm_std is `use`d in the contract, even privately. //! //! `do_execute`, `do_instantiate`, `do_migrate`, `do_query`, `do_reply` @@ -33,7 +33,7 @@ extern "C" fn requires_stargate() -> () {} /// They can be checked by cosmwasm_vm. /// Update this whenever the Wasm VM interface breaks. #[no_mangle] -extern "C" fn interface_version_5() -> () {} +extern "C" fn interface_version_6() -> () {} /// allocate reserves the given number of bytes in wasm memory and returns a pointer /// to a Region defining this data. This space is managed by the calling process diff --git a/packages/vm/README.md b/packages/vm/README.md index f97a932bc..2affbd1da 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -16,6 +16,7 @@ compatibility list: | cosmwasm-vm | Supported interface versions | cosmwasm-std | | ----------- | ---------------------------- | ------------ | +| 0.15 | `interface_version_6` | 0.15 | | 0.14 | `interface_version_5` | 0.14 | | 0.13 | `cosmwasm_vm_version_4` | 0.11-0.13 | | 0.12 | `cosmwasm_vm_version_4` | 0.11-0.13 | @@ -24,6 +25,14 @@ compatibility list: | 0.9 | `cosmwasm_vm_version_2` | 0.9 | | 0.8 | `cosmwasm_vm_version_1` | 0.8 | +### Changes between interface versions + +**interface_version_5 -> interface_version_6** + +- Rename the fields from `send` to `funds` in `WasmMsg::Instantiate` and + `WasmMsg::Execute`. +- Merge messages and sub-messages. + ## Setup There are demo files in `testdata/*.wasm`. Those are compiled and optimized diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 7c744ba39..6c2df82cd 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -32,7 +32,7 @@ const SUPPORTED_IMPORTS: &[&str] = &[ /// Other optional exports exist, e.g. "execute", "migrate" and "query". /// This is unlikely to change much, must be frozen at 1.0 to avoid breaking existing contracts const REQUIRED_EXPORTS: &[&str] = &[ - "interface_version_5", + "interface_version_6", "instantiate", "allocate", "deallocate", @@ -169,7 +169,7 @@ mod tests { fn check_wasm_old_contract() { match check_wasm(CONTRACT_0_7, &default_features()) { Err(VmError::StaticValidationErr { msg, .. }) => assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_5\"" + "Wasm contract doesn't have required export: \"interface_version_6\"" )), Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("This must not succeeed"), @@ -177,7 +177,7 @@ mod tests { match check_wasm(CONTRACT_0_6, &default_features()) { Err(VmError::StaticValidationErr { msg, .. }) => assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_5\"" + "Wasm contract doesn't have required export: \"interface_version_6\"" )), Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("This must not succeeed"), @@ -291,7 +291,7 @@ mod tests { match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_5\"" + "Wasm contract doesn't have required export: \"interface_version_6\"" )); } Err(e) => panic!("Unexpected error {:?}", e), @@ -305,7 +305,7 @@ mod tests { match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_5\"" + "Wasm contract doesn't have required export: \"interface_version_6\"" )); } Err(e) => panic!("Unexpected error {:?}", e), diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index d0e30ad5a..32f374573 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -704,7 +704,7 @@ mod tests { let (env, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - env.call_function0("interface_version_5", &[]).unwrap(); + env.call_function0("interface_version_6", &[]).unwrap(); } #[test] diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index e2e7e3539..3c519fa03 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -391,7 +391,7 @@ mod tests { let instance = mock_instance(&CONTRACT, &[]); instance - .call_function0("interface_version_5", &[]) + .call_function0("interface_version_6", &[]) .expect("error calling function"); } @@ -534,7 +534,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_5" (func 0)) + (export "interface_version_6" (func 0)) (export "instantiate" (func 0)) (export "allocate" (func 0)) (export "deallocate" (func 0)) @@ -552,7 +552,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_5" (func 0)) + (export "interface_version_6" (func 0)) (export "instantiate" (func 0)) (export "allocate" (func 0)) (export "deallocate" (func 0)) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index d2cf7503b..aab8c6c0a 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -124,7 +124,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_5" (func 0)) + (export "interface_version_6" (func 0)) (export "instantiate" (func 0)) (export "allocate" (func 0)) (export "deallocate" (func 0)) @@ -142,7 +142,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_5" (func 0)) + (export "interface_version_6" (func 0)) (export "instantiate" (func 0)) (export "execute" (func 0)) (export "allocate" (func 0)) @@ -167,7 +167,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_5" (func 0)) + (export "interface_version_6" (func 0)) (export "instantiate" (func 0)) (export "execute" (func 0)) (export "allocate" (func 0)) From 6da7177625af1f4a29a4ee4aeaaae901629663ab Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 12:08:17 +0200 Subject: [PATCH 142/402] Add floaty rebuild instruction --- packages/vm/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/vm/README.md b/packages/vm/README.md index 2affbd1da..a8a973633 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -56,6 +56,12 @@ docker run --rm -v "$(pwd)":/code \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ cosmwasm/rust-optimizer:0.11.4 ./contracts/ibc-reflect \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_0.15.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.11.4 ./contracts/floaty \ + && cp artifacts/floaty.wasm packages/vm/testdata/floaty.wasm ``` ## Testing From fa910a33d4a833eb21c3d92a3c2036ab56e1744d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 12:14:50 +0200 Subject: [PATCH 143/402] Rebuild development contracts --- packages/vm/src/instance.rs | 8 ++++---- packages/vm/testdata/floaty.wasm | Bin 175659 -> 153984 bytes packages/vm/testdata/hackatom_0.15.wasm | Bin 201547 -> 177717 bytes packages/vm/testdata/ibc_reflect_0.15.wasm | Bin 290894 -> 260510 bytes 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 3c519fa03..487275811 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -606,7 +606,7 @@ mod tests { let report2 = instance.create_gas_report(); assert_eq!(report2.used_externally, 73); - assert_eq!(report2.used_internally, 38880); + assert_eq!(report2.used_internally, 36378); assert_eq!(report2.limit, LIMIT); assert_eq!( report2.remaining, @@ -805,7 +805,7 @@ mod singlepass_tests { .unwrap(); let init_used = orig_gas - instance.get_gas_left(); - assert_eq!(init_used, 38953); + assert_eq!(init_used, 36451); } #[test] @@ -828,7 +828,7 @@ mod singlepass_tests { .unwrap(); let execute_used = gas_before_execute - instance.get_gas_left(); - assert_eq!(execute_used, 159317); + assert_eq!(execute_used, 159020); } #[test] @@ -862,6 +862,6 @@ mod singlepass_tests { assert_eq!(answer.as_slice(), b"{\"verifier\":\"verifies\"}"); let query_used = gas_before_query - instance.get_gas_left(); - assert_eq!(query_used, 28999); + assert_eq!(query_used, 27629); } } diff --git a/packages/vm/testdata/floaty.wasm b/packages/vm/testdata/floaty.wasm index 5173da16ca108c643361bac63bfeee90721540e4..344e4abe9820cec4f0ad3379208a8e516443436c 100644 GIT binary patch literal 153984 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Ⓢ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 diff --git a/packages/vm/testdata/hackatom_0.15.wasm b/packages/vm/testdata/hackatom_0.15.wasm index 80fcc347ed540023d7ca84bdbf10ebb47f0b7b99..453f016aa2fffa1cb88b883d7f414373359e3a10 100644 GIT binary patch literal 177717 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%0A#yY?M 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 From bbad0261bc878dbb7043830ff1aa8f45e5a892fa Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 12:26:12 +0200 Subject: [PATCH 144/402] Set version: 0.15.0-alpha2 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 843a22a0e..c3563fc36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -186,7 +186,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "criterion", @@ -206,7 +206,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "syn", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "chrono", @@ -240,7 +240,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 3633b0472..3e94911cf 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -122,7 +122,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -133,14 +133,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -162,7 +162,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 22957efcc..01afdafa2 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -124,7 +124,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -135,14 +135,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -164,7 +164,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -172,7 +172,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index f205e319a..4041c66a8 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -100,7 +100,7 @@ checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6371bcdfb..176b96d22 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 9de3e59b5..6bb938326 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 37e028f01..ec5db5319 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 40abbee4d..5ad2307b9 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index faafde9af..56c643962 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 892e4dde1..d7a0c26cc 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 34a5a8939..14069d6f4 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 9448ae092..d03c70959 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 9fd560726..450d0f53a 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 6f1fcd40d..d85c0eafd 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.15.0-alpha1" } +cosmwasm-derive = { path = "../derive", version = "0.15.0-alpha2" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha1" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha2" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 619160764..09fac2b41 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" authors = ["Ethan Frey "] edition = "2018" description = "CosmWasm library with useful helpers for Storage patterns" @@ -15,5 +15,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 = "0.15.0-alpha1" } +cosmwasm-std = { path = "../std", version = "0.15.0-alpha2" } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index f06064091..e2001c1e5 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.15.0-alpha1" +version = "0.15.0-alpha2" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.15.0-alpha1" } -cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha1" } +cosmwasm-std = { path = "../std", version = "0.15.0-alpha2" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha2" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From f9869de22b64d66a8b39d02eb536a2f9eed1e292 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 10:38:41 +0200 Subject: [PATCH 145/402] Update IbcAcknowledgement type --- packages/std/src/ibc.rs | 11 +++++++++-- packages/std/src/ibc_exports.rs | 16 ++++++++++++---- packages/std/src/lib.rs | 4 ++-- packages/vm/src/calls.rs | 6 +++--- packages/vm/src/testing/calls.rs | 4 ++-- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 746c549f1..e15f2e313 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -185,11 +185,18 @@ pub struct IbcPacket { } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct IbcAcknowledgement { - pub acknowledgement: Binary, +pub struct IbcAcknowledgementWithPacket { + pub acknowledgement: IbcAcknowledgement, pub original_packet: IbcPacket, } +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcAcknowledgement { + pub data: Binary, + // we may add more info here in the future (meta-data from the acknowledgement) + // there have been proposals to extend this type in core ibc for future versions +} + /// This is the return value for the majority of the ibc handlers. /// That are able to dispatch messages / events on their own, /// but have no meaningful return value to the calling code. diff --git a/packages/std/src/ibc_exports.rs b/packages/std/src/ibc_exports.rs index 611588aa6..563272b23 100644 --- a/packages/std/src/ibc_exports.rs +++ b/packages/std/src/ibc_exports.rs @@ -12,7 +12,7 @@ use crate::memory::{consume_region, release_buffer, Region}; use crate::results::ContractResult; use crate::serde::{from_slice, to_vec}; use crate::types::Env; -use crate::{IbcAcknowledgement, IbcPacket, IbcReceiveResponse}; +use crate::{IbcAcknowledgementWithPacket, IbcPacket, IbcReceiveResponse}; // TODO: replace with https://doc.rust-lang.org/std/ops/trait.Try.html once stabilized macro_rules! r#try_into_contract_result { @@ -177,7 +177,11 @@ where /// contract_fn is called when this chain receives an IBC Acknowledgement for a packet /// that this contract previously sent pub fn do_ibc_packet_ack( - contract_fn: &dyn Fn(DepsMut, Env, IbcAcknowledgement) -> Result, E>, + contract_fn: &dyn Fn( + DepsMut, + Env, + IbcAcknowledgementWithPacket, + ) -> Result, E>, env_ptr: u32, msg_ptr: u32, ) -> u32 @@ -191,7 +195,11 @@ where } fn _do_ibc_packet_ack( - contract_fn: &dyn Fn(DepsMut, Env, IbcAcknowledgement) -> Result, E>, + contract_fn: &dyn Fn( + DepsMut, + Env, + IbcAcknowledgementWithPacket, + ) -> Result, E>, env_ptr: *mut Region, msg_ptr: *mut Region, ) -> ContractResult> @@ -203,7 +211,7 @@ where let msg: Vec = unsafe { consume_region(msg_ptr) }; let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcAcknowledgement = try_into_contract_result!(from_slice(&msg)); + let msg: IbcAcknowledgementWithPacket = try_into_contract_result!(from_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 30a5207e7..3a073cc66 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -34,8 +34,8 @@ pub use crate::errors::{ }; #[cfg(feature = "stargate")] pub use crate::ibc::{ - IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcEndpoint, IbcMsg, IbcOrder, IbcPacket, - IbcReceiveResponse, IbcTimeout, IbcTimeoutBlock, + IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcEndpoint, IbcMsg, IbcOrder, + IbcPacket, IbcReceiveResponse, IbcTimeout, IbcTimeoutBlock, }; #[cfg(feature = "iterator")] #[allow(deprecated)] diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index a07d70f89..fe0ad8918 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -6,7 +6,7 @@ use wasmer::Val; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, + IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, }; use crate::backend::{BackendApi, Querier, Storage}; @@ -294,7 +294,7 @@ where pub fn call_ibc_packet_ack( instance: &mut Instance, env: &Env, - ack: &IbcAcknowledgement, + ack: &IbcAcknowledgementWithPacket, ) -> VmResult>> where A: BackendApi + 'static, @@ -745,7 +745,7 @@ mod tests { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); - let ack = IbcAcknowledgement { + let ack = IbcAcknowledgementWithPacket { acknowledgement: br#"{}"#.into(), original_packet: packet, }; diff --git a/packages/vm/src/testing/calls.rs b/packages/vm/src/testing/calls.rs index 443afbf76..233300aee 100644 --- a/packages/vm/src/testing/calls.rs +++ b/packages/vm/src/testing/calls.rs @@ -8,7 +8,7 @@ use std::fmt; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, + IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, }; use crate::calls::{ @@ -214,7 +214,7 @@ where pub fn ibc_packet_ack( instance: &mut Instance, env: Env, - ack: IbcAcknowledgement, + ack: IbcAcknowledgementWithPacket, ) -> ContractResult> where A: BackendApi + 'static, From ec634ba1a758b9694272117ee7ef86eca37902cf Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 10:41:18 +0200 Subject: [PATCH 146/402] Update ibc-reflect --- contracts/ibc-reflect/src/contract.rs | 8 ++++---- packages/std/src/lib.rs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index c282b4f50..352211f6d 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,8 +1,8 @@ use cosmwasm_std::{ attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, - CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgement, IbcBasicResponse, IbcChannel, - IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, Response, - StdError, StdResult, SubMsg, SubMsgExecutionResponse, WasmMsg, + CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgementWithPacket, IbcBasicResponse, + IbcChannel, IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, + Response, StdError, StdResult, SubMsg, SubMsgExecutionResponse, WasmMsg, }; use crate::msg::{ @@ -323,7 +323,7 @@ fn receive_dispatch( pub fn ibc_packet_ack( _deps: DepsMut, _env: Env, - _ack: IbcAcknowledgement, + _ack: IbcAcknowledgementWithPacket, ) -> StdResult { Ok(IbcBasicResponse { messages: vec![], diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 3a073cc66..bd3b18b0e 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -34,8 +34,8 @@ pub use crate::errors::{ }; #[cfg(feature = "stargate")] pub use crate::ibc::{ - IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcEndpoint, IbcMsg, IbcOrder, - IbcPacket, IbcReceiveResponse, IbcTimeout, IbcTimeoutBlock, + IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcEndpoint, + IbcMsg, IbcOrder, IbcPacket, IbcReceiveResponse, IbcTimeout, IbcTimeoutBlock, }; #[cfg(feature = "iterator")] #[allow(deprecated)] From fcfebfbbe983519403ea6479496ea50d1174ac01 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 10:50:09 +0200 Subject: [PATCH 147/402] Update ibc-reflect-send --- contracts/ibc-reflect-send/src/ibc.rs | 23 ++++++++++--------- .../ibc-reflect-send/tests/integration.rs | 12 +++++----- packages/std/src/ibc.rs | 10 ++++++++ 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index a24fdd355..a9d03b28f 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,6 +1,7 @@ use cosmwasm_std::{ - attr, entry_point, from_slice, to_binary, DepsMut, Env, IbcAcknowledgement, IbcBasicResponse, - IbcChannel, IbcMsg, IbcOrder, IbcPacket, IbcReceiveResponse, StdError, StdResult, SubMsg, + attr, entry_point, from_slice, to_binary, DepsMut, Env, IbcAcknowledgementWithPacket, + IbcBasicResponse, IbcChannel, IbcMsg, IbcOrder, IbcPacket, IbcReceiveResponse, StdError, + StdResult, SubMsg, }; use crate::ibc_msg::{ @@ -105,7 +106,7 @@ pub fn ibc_packet_receive( pub fn ibc_packet_ack( deps: DepsMut, env: Env, - ack: IbcAcknowledgement, + ack: IbcAcknowledgementWithPacket, ) -> StdResult { // which local channel was this packet send from let caller = ack.original_packet.src.channel_id; @@ -113,15 +114,15 @@ pub fn ibc_packet_ack( let msg: PacketMsg = from_slice(&ack.original_packet.data)?; match msg { PacketMsg::Dispatch { .. } => { - let res: AcknowledgementMsg = from_slice(&ack.acknowledgement)?; + let res: AcknowledgementMsg = from_slice(&ack.acknowledgement.data)?; acknowledge_dispatch(deps, caller, res) } PacketMsg::WhoAmI {} => { - let res: AcknowledgementMsg = from_slice(&ack.acknowledgement)?; + let res: AcknowledgementMsg = from_slice(&ack.acknowledgement.data)?; acknowledge_who_am_i(deps, caller, res) } PacketMsg::Balances {} => { - let res: AcknowledgementMsg = from_slice(&ack.acknowledgement)?; + let res: AcknowledgementMsg = from_slice(&ack.acknowledgement.data)?; acknowledge_balances(deps, env, caller, res) } } @@ -246,7 +247,7 @@ mod tests { mock_dependencies, mock_env, mock_ibc_channel, mock_ibc_packet_ack, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::{coin, coins, BankMsg, CosmosMsg, OwnedDeps}; + use cosmwasm_std::{coin, coins, BankMsg, CosmosMsg, IbcAcknowledgement, OwnedDeps}; const CREATOR: &str = "creator"; @@ -288,8 +289,8 @@ mod tests { let response = AcknowledgementMsg::Ok(WhoAmIResponse { account: account.into(), }); - let ack = IbcAcknowledgement { - acknowledgement: to_binary(&response).unwrap(), + let ack = IbcAcknowledgementWithPacket { + acknowledgement: IbcAcknowledgement::new(&response).unwrap(), original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), }; let res = ibc_packet_ack(deps, mock_env(), ack).unwrap(); @@ -379,8 +380,8 @@ mod tests { }; // and handle the ack - let ack = IbcAcknowledgement { - acknowledgement: to_binary(&AcknowledgementMsg::Ok(())).unwrap(), + let ack = IbcAcknowledgementWithPacket { + acknowledgement: IbcAcknowledgement::new(&AcknowledgementMsg::Ok(())).unwrap(), original_packet: packet, }; let res = ibc_packet_ack(deps.as_mut(), mock_env(), ack).unwrap(); diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 36115347c..fd5b2eb22 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -19,8 +19,8 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; use cosmwasm_std::{ - attr, coin, coins, to_binary, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcBasicResponse, - IbcMsg, IbcOrder, Response, + attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcAcknowledgementWithPacket, + IbcBasicResponse, IbcMsg, IbcOrder, Response, }; use cosmwasm_vm::testing::{ execute, ibc_channel_connect, ibc_channel_open, ibc_packet_ack, instantiate, mock_env, @@ -82,8 +82,8 @@ fn who_am_i_response>( let response = AcknowledgementMsg::Ok(WhoAmIResponse { account: account.into(), }); - let ack = IbcAcknowledgement { - acknowledgement: to_binary(&response).unwrap(), + let ack = IbcAcknowledgementWithPacket { + acknowledgement: IbcAcknowledgement::new(&response).unwrap(), original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), }; let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), ack).unwrap(); @@ -184,8 +184,8 @@ fn dispatch_message_send_and_ack() { }; // and handle the ack - let ack = IbcAcknowledgement { - acknowledgement: to_binary(&AcknowledgementMsg::Ok(())).unwrap(), + let ack = IbcAcknowledgementWithPacket { + acknowledgement: IbcAcknowledgement::new(&AcknowledgementMsg::Ok(())).unwrap(), original_packet: packet, }; let res: IbcBasicResponse = ibc_packet_ack(&mut deps, mock_env(), ack).unwrap(); diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index e15f2e313..c8d804c09 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -9,7 +9,9 @@ use std::fmt; use crate::binary::Binary; use crate::coins::Coin; +use crate::errors::StdResult; use crate::results::{Attribute, Empty, SubMsg}; +use crate::serde::to_binary; use crate::timestamp::Timestamp; /// These are messages in the IBC lifecycle. Only usable by IBC-enabled contracts @@ -197,6 +199,14 @@ pub struct IbcAcknowledgement { // there have been proposals to extend this type in core ibc for future versions } +impl IbcAcknowledgement { + pub fn new(data: &T) -> StdResult { + Ok(IbcAcknowledgement { + data: to_binary(data)?, + }) + } +} + /// This is the return value for the majority of the ibc handlers. /// That are able to dispatch messages / events on their own, /// but have no meaningful return value to the calling code. From 428b0fd912efe46af94eeb7f2d47c2706786e443 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 11:01:02 +0200 Subject: [PATCH 148/402] Update vm with new contracts --- packages/vm/src/calls.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index fe0ad8918..f9f626080 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -678,7 +678,10 @@ mod tests { mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; - use cosmwasm_std::{attr, Empty, Event, IbcOrder, Reply, ReplyOn, SubMsgExecutionResponse}; + use cosmwasm_std::{ + attr, Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, + SubMsgExecutionResponse, + }; static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); const IBC_VERSION: &str = "ibc-reflect-v1"; fn setup( @@ -746,7 +749,9 @@ mod tests { setup(&mut instance, CHANNEL_ID, ACCOUNT); let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); let ack = IbcAcknowledgementWithPacket { - acknowledgement: br#"{}"#.into(), + acknowledgement: IbcAcknowledgement { + data: br#"{}"#.into(), + }, original_packet: packet, }; call_ibc_packet_ack::<_, _, _, Empty>(&mut instance, &mock_env(), &ack) From d19cb44e33ca5f1459b62a616025073c2b370d1a Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 12:55:26 +0200 Subject: [PATCH 149/402] Rename ::new to ::encode_json --- contracts/ibc-reflect-send/src/ibc.rs | 4 ++-- contracts/ibc-reflect-send/tests/integration.rs | 4 ++-- packages/std/src/ibc.rs | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index a9d03b28f..516f14a35 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -290,7 +290,7 @@ mod tests { account: account.into(), }); let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::new(&response).unwrap(), + acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), }; let res = ibc_packet_ack(deps, mock_env(), ack).unwrap(); @@ -381,7 +381,7 @@ mod tests { // and handle the ack let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::new(&AcknowledgementMsg::Ok(())).unwrap(), + acknowledgement: IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(), original_packet: packet, }; let res = ibc_packet_ack(deps.as_mut(), mock_env(), ack).unwrap(); diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index fd5b2eb22..781bc21ae 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -83,7 +83,7 @@ fn who_am_i_response>( account: account.into(), }); let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::new(&response).unwrap(), + acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), }; let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), ack).unwrap(); @@ -185,7 +185,7 @@ fn dispatch_message_send_and_ack() { // and handle the ack let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::new(&AcknowledgementMsg::Ok(())).unwrap(), + acknowledgement: IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(), original_packet: packet, }; let res: IbcBasicResponse = ibc_packet_ack(&mut deps, mock_env(), ack).unwrap(); diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index c8d804c09..4cede60e1 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -200,7 +200,11 @@ pub struct IbcAcknowledgement { } impl IbcAcknowledgement { - pub fn new(data: &T) -> StdResult { + pub fn new>(data: T) -> Self { + IbcAcknowledgement { data: data.into() } + } + + pub fn encode_json(data: &T) -> StdResult { Ok(IbcAcknowledgement { data: to_binary(data)?, }) From 15b6c6027cecfdf5f0e328c71e746b0c28f75f64 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 13:03:10 +0200 Subject: [PATCH 150/402] Rebuild test contracts --- packages/vm/testdata/floaty.wasm | Bin 153984 -> 153984 bytes packages/vm/testdata/hackatom_0.15.wasm | Bin 177717 -> 177717 bytes packages/vm/testdata/ibc_reflect_0.15.wasm | Bin 260510 -> 261466 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/floaty.wasm b/packages/vm/testdata/floaty.wasm index 344e4abe9820cec4f0ad3379208a8e516443436c..8334867cfa52a27ae4dda2f073556d79d8ae332c 100644 GIT binary patch delta 1335 zcmZuveNa?Y6yI~-zFn5L>@K>y#K+ik2jp`DRz(XJHK=8`Q3Ye z=bY=JDi>AtUIBxGQwA$J_7S4+Tf!*_eg)ZtBUB{&ASXU1+Vm%^&Wn03?gGTFF~3+> z|I*7YXn+H75E`Kg+>o4@G;@$MXxH*yf0d-qB7fO;K@X=QHIcWyQZhj@7m$ zH_N^iZ*fmjm-+_4WlX*1#C*keTB!LD;B8u@$pmcSOW-7P(;+}ELJX1Vf~i;e5rBqv zs=gzX(;ZPlA3YXQ9!4gb=^x2IE6MLobULk33G3-DYbv3Z9D4wMS(<=J1w4B512NYT zh}Ob;u@Q85-Vsle3W5n}eJ*Ac@i<=?h;{6@7H$lhY`7w`@}kOGQKj>f7a2zXu^C0J z3+T`y@6g^m!x8GgB*VdDtE0)!*jOCy#{5azNl$$ z*)bkgQRP!_642l~mFX;)syrkQyWPwbP0K`Ly#rOc2dyBa5MSgX)VyUJXiLp&z8#^? zO{`HR&NV=1x26H@*fhjChq^2a-pN#AhfM&rKk{a!;SQVHpL+3PDE|14G4?^MAzSnJNf>Q~;PPWQ(^ z6)lr0rtF8Kxy-IZpKZjSG=09N=|$f9zOQHW`Sv#e*3uQP-`0|^-E{W!7XT4-ysJzO zYcZj_kL7;sj`mSB=LiD~?&*Ye^kUDbnzXxV!=>-#j9>Ao3$TB{fbR`NEEDz!&h&fm z`oGpT89L0&D z6UP6`b`jh&T#o9|B8Ws7OF$eIao4CBrx;R(=CM-{jn~HFnT7EbYWeIiKn$bCqjy|| zc|$wHmxgebEGwlzILqPuuu*DbIPxd05fVkGgue0+N3qa zyrlJ#_F5k-j}|n7S|bPoW9kqxH52e_*v6PZ5<3hs6hEG(6qV(NHDf) zpqI|aR>ZNln(5Endm47Kg@PNJG>}JC*7c0$s)u+YM%AuC`$09%xpZLU%#9tc$dEq^ z+uSQczATz`PyS!5)PLjcQ&?3JSVfmnE^}llY1aKT&D9EE__Boyh7=OBey4C56Onm* z^vAvtpum9*K$kZcM(~V!TMm}mmfBF7`9hVo)=KPiWO0`Ye{;mpC$@RO zhec0C^zgW(weH3)XBH+F$K!y*!mUAnuW>2SBah@O?%@r5_Ki_vvR}tjs$FS<0v{A* zVyAs&sNVzo8=)yOu-y^A^t{%**KJizthCRBh%LYpqHFZ1k*#1iInr)Ut~w zsq*M8(CHMCf}d6b;~vawkYXS4L%PWSV%=EM@IL8}?bpH-dYU)U>6W8_b?)Jnzw-9T2wk-{IsV7FKPy?uPEv#w-;3j8#gIe^;}t;N6DthVG-F}l#_K^5+%y#20`Lo3f?4?Kj1e`{+wod3 zo(@jO0_pCqj)NM^U+{43T6hRAVcVjKW7k3&-Cs;pL5*Lp1QXN*a+Giez!m6KL0uHL y*&?h|gUipYC2%+nQs@03vNV5_$lU%*G3-hIevz5{=^|V2|0;%M27VP;Yr#K!Vu$?z diff --git a/packages/vm/testdata/hackatom_0.15.wasm b/packages/vm/testdata/hackatom_0.15.wasm index 453f016aa2fffa1cb88b883d7f414373359e3a10..92f5db409927b8b9d1ee0faf9d20b66987efe6e9 100644 GIT binary patch delta 2013 zcmY*YeN>cH8s~T4`Cyn42E(@D%Q0|+AYc?75*0^5MvRi|4<$Z?a;0fY<-@^U9YjQh zK(QNM6U(yW>1YcQS9s(2acC3Hp*2?7(o>_)zp~8`j1Th^oeflSM2E`eL!_m9RkPcL)b=kG0g zKFc~T(Uz5Qw?NNx-A-AsSOI%uyL{%ceGEe#Pc&$SjY~2||Eb)Xqs%)b6WiDelg6? z4(onqHs1xS&Hqb$z|6tp38LzVdYth+)dyth<}D_9r12Q|V8aD`#@id`ac4sd_w3w2 zx8s|g9kOHBQ9$sj(8>Hnvyt~S-B5pd3O68^H8(T%7USQGNg}lnHg4W`OMda{uaMWo zO^CW;1j(S+t}>kF|K9&+%$4ij*kK@Wv3;gYeLF!<_tEp0G96CKi|qpnC0dUXi^q2M z5cg`Q2?T!X>PM_bFxs z%QI&g4Byq!{eOgCJC`LN{Kt^Chj%`?!uHn5Z_mv#us!v1>V*--u&16_ks6DaT{=PQ za9l2+X__u40~x&c%SFhLL0>JSMtR8<7qxTvN|=t0pl^5|Sp9bX?Dc%ws;0{!^4#^G zLG>T~pw-9!7!HK-MK>O&Z2XUFrRnB+ZOt|R`c%ih-p&hdQ<*$|n={y&mw-yd6ov{B z7>-1-6!0NT3<6ZGQvA9J^Hi$^pHCn>Y(q9!cb!NL1Br~*sZp$>8VNgTi_ zm2d*a;`i~2rfBVnWciEeLez`Cd_?fty;))1^w`)jZh*rG14 z#hO5}A992mutku4M4h-7MS9XM-;anuYVqY(yf1dOAw;Zd!^2`JdFsJ7FlhUD=m@51 z_QDZt)$GdlG5qSdo$@XswfMFF$ExdH)bxt0J{BmBd0B`USjR%e%t~e#lfBF&lB?Jp zvD3?f#5FH7iq=ZDQ2gX&$zn$(n=C3SDeaSI7*3AC` DcE+c% delta 2000 zcmZux4N#QT8s<6Q{;=#Ki;@WoxC#~oA|M7=LRkS>$v>hRWmx{Qw5>EmSS&AG1PLe< zJ>gOFx5jbOMC3$YPHFUm6GbLgIu_7qb+d+?w0rwiy6?AmwL5danRDL1=Xu|A&U?<+ zHSE_l?ANgmfkwq(RE$JiMd6)@U<&v-%poCdtQmoc@l&2>k!4XWnD#ODBO#8z zrrepl=82Wd%H69H9#4#4eUQ~miJF%53>r{X;VGQ)EGv05`k~@SN{b4XC%%lNLpX@& z#5UH=5_ym=0);$97mdBr;WrC>&}8Iud<*cFII;+<_#s2CEYW=qneI0iu<}O(^Z5ny zPW16=%LxR^H2(&j-0k}!t zh>V?C4%XKs_oephk{Z7cjtdl?>KRqvzcg!{N!fZ3fc&+xFzwrs#7H=$$Tb<**eofQM zeCN5pk{-*k-bm4&lXa7z=lRZLS$MAk*5522n!l5wuXE9J8nI<@ws%hD)?BSZSZ+UU zUjCTdY9y<6X(rXGT{?41z6AlK#LKjN3*%>8u{^FI!2DHhw~yWASmL&7s2I)1dkaRP zqn6dBWz}L%7d73hjkv-oLn?n`sh>A{3~wp?Z!Dw8b_3O1v|?0~;l=B;rD{n|me{=O zh~fUF_l|0^zI3`Tb?|j}fS!#s$lg_l7@;dxXOQ#Q>M{d0DrT+TfMJMD)hxyjceOT0Ipi;b@iByd`LN%~L*s?Gr z%I6@<{}%Ew^I@^C6JcVZ6DBopJ{lonv$5;{uI5c9-p@wyUkW{`+U6nU_8 z@QCHsn`vWe&O)T>@Tu6Ghh$zIk{~YMhZpgwN_HGZ{o{B=Yozv0a(vlE+BOARI0$6#pDYMQSRk zvv^Pa-h*#-*dWfVLm7#JYTPAO{vExj6Die*K%Gi1r=CLl>&V=o_SRt&P^&K8fG5Y0 z{D33GfLcLvsycQDO7xU{%^rk}p)G7VjJL(+b_9v#?UXo=GUzXLC5se$t5}}c?P0fzXb+n&>Z(}SRu40Z^OekB zOsrzz#=MGUs}__m7w>pjlDJyQ;=}`0G^JHBKk>7NO%&@qY_9mJigg9TXY}*EA$97p owd{i4KAY?y8af*3G*W12pN5a5AzG?giU`}!OzIysZ06nn0V89Z&Hw-a diff --git a/packages/vm/testdata/ibc_reflect_0.15.wasm b/packages/vm/testdata/ibc_reflect_0.15.wasm index 2071bab41582f15d84d2e55c52ec0f6966112d1d..e80ecfe4afde08e3a971ffd41bcdd1ece7596355 100644 GIT binary patch delta 28686 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 MBb|}Iif6?C0qdP@DgXcg delta 27937 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 TE*|(! Date: Wed, 23 Jun 2021 13:03:34 +0200 Subject: [PATCH 151/402] Add CHANGELOG entry --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab6dd540b..d9b8b4c9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,8 +58,15 @@ and this project adheres to - 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 From 08ea958f197a6ed8ad9bf290129a9de2e652d50f Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 13:12:40 +0200 Subject: [PATCH 152/402] Add an entry to MIGRATING.md --- MIGRATING.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index 4a95b6f5a..bb303863f 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -61,6 +61,62 @@ major releases of `cosmwasm`. Note that you can also view the Note that this means you can mix "messages" and "submessages" in any execution order. You are no more restricted to doing "submessages" first. +- For IBC-enabled contracts only: You need to adapt to the new + `IbcAcknowledgementWithPacket` structure and use the embedded `data` field: + + ```rust + // before + pub fn ibc_packet_ack( + deps: DepsMut, + env: Env, + ack: IbcAcknowledgement, + ) -> StdResult { + let res: AcknowledgementMsg = from_slice(&ack.acknowledgement)?; + // ... + } + + // after + pub fn ibc_packet_ack( + deps: DepsMut, + env: Env, + ack: IbcAcknowledgementWithPacket, + ) -> StdResult { + let res: AcknowledgementMsg = from_slice(&ack.acknowledgement.data)?; + // ... + } + ``` + + You also need to update the constructors in test code. Below we show how to do + so both for JSON data as well as any custom binary format: + + ```rust + // before (JSON) + let ack = IbcAcknowledgement { + acknowledgement: to_binary(&AcknowledgementMsg::Ok(())).unwrap() + original_packet: packet, + }; + + // after (JSON) + let ack = IbcAcknowledgementWithPacket { + acknowledgement: IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(), + original_packet: packet, + }; + + // before (Custom binary data) + let acknowledgement = vec![12, 56, 78]; + let ack = IbcAcknowledgement { + acknowledgement: Binary(acknowledgement), + original_packet: packet, + }; + + // after (Custom binary data) + let acknowledgement = vec![12, 56, 78]; + let ack = IbcAcknowledgement { + acknowledgement: IbcAcknowledgement::new(acknowledgement), + original_packet: packet, + }; + ``` + ## 0.13 -> 0.14 - The minimum Rust supported version for 0.14 is 1.51.0. Verify your Rust From dfc4e57b59bb9d80c9bf563c9f2c3ddc68ecdf68 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 23 Jun 2021 14:07:16 +0200 Subject: [PATCH 153/402] Update packages/vm/src/calls.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/vm/src/calls.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index f9f626080..121811fa1 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -749,9 +749,7 @@ mod tests { setup(&mut instance, CHANNEL_ID, ACCOUNT); let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement { - data: br#"{}"#.into(), - }, + acknowledgement: IbcAcknowledgement::new(br#"{}"#), original_packet: packet, }; call_ibc_packet_ack::<_, _, _, Empty>(&mut instance, &mock_env(), &ack) From 81198edb2fd93012d4bb58fb2569d5fd4aee993f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 16:37:29 +0200 Subject: [PATCH 154/402] Add #975 to interface_version_6 changes [skip ci] --- packages/vm/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/vm/README.md b/packages/vm/README.md index a8a973633..4d2a08f66 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -32,6 +32,9 @@ compatibility list: - Rename the fields from `send` to `funds` in `WasmMsg::Instantiate` and `WasmMsg::Execute`. - Merge messages and sub-messages. +- Change JSON representation of IBC acknowledgements ([#975]). + +[#975]: https://github.com/CosmWasm/cosmwasm/pull/975 ## Setup From ff66d1bab094cccd72b12fa165e1f817732ed289 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 17:25:01 +0200 Subject: [PATCH 155/402] Set version: 0.15.0-alpha3 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c3563fc36..f62ee275a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -186,7 +186,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "criterion", @@ -206,7 +206,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "syn", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "chrono", @@ -240,7 +240,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 3e94911cf..dbabb18ba 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -122,7 +122,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -133,14 +133,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -162,7 +162,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 01afdafa2..864e35e97 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -124,7 +124,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -135,14 +135,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -164,7 +164,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -172,7 +172,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4041c66a8..68a9c23c2 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -100,7 +100,7 @@ checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 176b96d22..dba24da96 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 6bb938326..ae3ca3a72 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index ec5db5319..a3a8ca356 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 5ad2307b9..a185ee6b0 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 56c643962..c8b8769c6 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index d7a0c26cc..a39df2a70 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 14069d6f4..917a9f1b5 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index d03c70959..104cdb668 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 450d0f53a..da5a742e0 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index d85c0eafd..4ed8758e7 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.15.0-alpha2" } +cosmwasm-derive = { path = "../derive", version = "0.15.0-alpha3" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha2" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha3" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 09fac2b41..60e4e891d 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" authors = ["Ethan Frey "] edition = "2018" description = "CosmWasm library with useful helpers for Storage patterns" @@ -15,5 +15,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 = "0.15.0-alpha2" } +cosmwasm-std = { path = "../std", version = "0.15.0-alpha3" } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index e2001c1e5..a8831c4eb 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.15.0-alpha2" +version = "0.15.0-alpha3" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.15.0-alpha2" } -cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha2" } +cosmwasm-std = { path = "../std", version = "0.15.0-alpha3" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha3" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 84e9ad273ab1bc9c9c7bf52e2ab71227a9629eb9 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 23 Jun 2021 17:38:30 +0200 Subject: [PATCH 156/402] Document the use of data: Some(b"") for clearing data --- SEMANTICS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SEMANTICS.md b/SEMANTICS.md index 53b8950e7..5b4d10c38 100644 --- a/SEMANTICS.md +++ b/SEMANTICS.md @@ -292,7 +292,9 @@ to the caller of `execute` (either the client or another transaction), just as if the original `execute` and returned `data: Some(b"better idea")`. If `reply` returns `data: None`, it will not modify any previously set data state. If there are multiple submessages all setting this, only the last one is used (they all -overwrite any previous `data` value). +overwrite any previous `data` value). As a consequence, you can use +`data: Some(b"")` to clear previously set data. This will be represented as a +JSON string instead of `null` and handled as any other `Some` value. #### Order and Rollback From a231b5bb46989bd4eeddc7b5f9bc6330ef17d269 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 24 Jun 2021 11:41:43 +0200 Subject: [PATCH 157/402] Implement Storage for PrefixedStorage and ReadonlyPrefixedStorage --- CHANGELOG.md | 3 +++ packages/storage/src/prefixed_storage.rs | 24 ++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9b8b4c9d..84878f257 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ and this project adheres to - 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 diff --git a/packages/storage/src/prefixed_storage.rs b/packages/storage/src/prefixed_storage.rs index a9094c76d..53e30b204 100644 --- a/packages/storage/src/prefixed_storage.rs +++ b/packages/storage/src/prefixed_storage.rs @@ -41,23 +41,25 @@ impl<'a> PrefixedStorage<'a> { prefix: to_length_prefixed_nested(namespaces), } } +} - pub fn get(&self, key: &[u8]) -> Option> { +impl<'a> Storage for PrefixedStorage<'a> { + fn get(&self, key: &[u8]) -> Option> { get_with_prefix(self.storage, &self.prefix, key) } - pub fn set(&mut self, key: &[u8], value: &[u8]) { + fn set(&mut self, key: &[u8], value: &[u8]) { set_with_prefix(self.storage, &self.prefix, key, value); } - pub fn remove(&mut self, key: &[u8]) { + 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 - pub fn range<'b>( + fn range<'b>( &'b self, start: Option<&[u8]>, end: Option<&[u8]>, @@ -88,14 +90,24 @@ impl<'a> ReadonlyPrefixedStorage<'a> { prefix: to_length_prefixed_nested(namespaces), } } +} - pub fn get(&self, key: &[u8]) -> Option> { +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 - pub fn range<'b>( + fn range<'b>( &'b self, start: Option<&[u8]>, end: Option<&[u8]>, From 32b1fe64069f746b183394cdf8da7137f2e8e96f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 24 Jun 2021 11:58:32 +0200 Subject: [PATCH 158/402] Set version: 0.15.0 --- CHANGELOG.md | 5 ++++- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 17 files changed, 73 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84878f257..6e6eb2759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [0.15.0] - 2021-06-24 + ### Added - cosmwasm-std: Implement `Sub` and `SubAssign` for `Uint128` @@ -981,7 +983,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.14.1...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.0...HEAD +[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 diff --git a/Cargo.lock b/Cargo.lock index f62ee275a..a199615de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -186,7 +186,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "criterion", @@ -206,7 +206,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "syn", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "chrono", @@ -240,7 +240,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index dbabb18ba..82fd171a4 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -122,7 +122,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -133,14 +133,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -162,7 +162,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 864e35e97..cdde06684 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -124,7 +124,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -135,14 +135,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -164,7 +164,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -172,7 +172,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 68a9c23c2..edc543786 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -100,7 +100,7 @@ checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index dba24da96..a17e182a7 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index ae3ca3a72..6f5502fad 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index a3a8ca356..51268ca57 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index a185ee6b0..3de10e960 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index c8b8769c6..72db8bd6d 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index a39df2a70..c4660f3f9 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 917a9f1b5..76f63816c 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.15.0-alpha3" +version = "0.15.0" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 104cdb668..dfc79c6b2 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.15.0-alpha3" +version = "0.15.0" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index da5a742e0..3f34b0bd3 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.15.0-alpha3" +version = "0.15.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 4ed8758e7..5202270d4 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.15.0-alpha3" +version = "0.15.0" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.15.0-alpha3" } +cosmwasm-derive = { path = "../derive", version = "0.15.0" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha3" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 60e4e891d..0d79f2c96 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.15.0-alpha3" +version = "0.15.0" authors = ["Ethan Frey "] edition = "2018" description = "CosmWasm library with useful helpers for Storage patterns" @@ -15,5 +15,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 = "0.15.0-alpha3" } +cosmwasm-std = { path = "../std", version = "0.15.0" } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index a8831c4eb..4edcc58af 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.15.0-alpha3" +version = "0.15.0" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.15.0-alpha3" } -cosmwasm-crypto = { path = "../crypto", version = "0.15.0-alpha3" } +cosmwasm-std = { path = "../std", version = "0.15.0" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.0" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 65427fb6b8973235a50aaf07b97ad8d3a6fbf7fc Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 1 Jul 2021 11:08:26 +0200 Subject: [PATCH 159/402] Update MIGRATING.md --- MIGRATING.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index bb303863f..8f43953fd 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -61,6 +61,45 @@ major releases of `cosmwasm`. Note that you can also view the Note that this means you can mix "messages" and "submessages" in any execution order. You are no more restricted to doing "submessages" first. +- Rename the `send` field to `funds` whenever constructing a `WasmMsg::Execute` + or `WasmMsg::Instantiate` value. + + ```diff + let exec = WasmMsg::Execute { + contract_addr: coin.address.into(), + msg: to_binary(&msg)?, + - send: vec![], + + funds: vec![], + }; + ``` + +- `Uint128` field can no longer be constructed using a struct literal. Call + `Uint128::new` (or `Uint128::zero`) instead. + + ```diff + - const TOKENS_PER_WEIGHT: Uint128 = Uint128(1_000); + - const MIN_BOND: Uint128 = Uint128(5_000); + + const TOKENS_PER_WEIGHT: Uint128 = Uint128::new(1_000); + + const MIN_BOND: Uint128 = Uint128::new(5_000); + ``` + + ```diff + - assert_eq!(escrow_balance, Uint128(0)); + + assert_eq!(escrow_balance, Uint128::zero()); + ``` + +- If constructing a `Response` using struct literal syntax, add the `events` + field. + + ```diff + Ok(Response { + messages: vec![], + attributes, + + events: vec![], + data: None, + }) + ``` + - For IBC-enabled contracts only: You need to adapt to the new `IbcAcknowledgementWithPacket` structure and use the embedded `data` field: From 9c9f8a527d7165d77388183114c3ecbc276860c7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 5 Jul 2021 13:19:53 +0200 Subject: [PATCH 160/402] Fix 0.14 -> 0.15 headline in MIGRATING [ci skip] --- MIGRATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index 8f43953fd..9c2c0a3b9 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,7 +4,7 @@ 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. -## 0.14 -> 0.15 (unreleased) +## 0.14 -> 0.15 - Combine `messages` and `submessages` on the `Response` object. The new format uses `messages: Vec>`, so copy `submessages` content, and wrap old From d059525d0351676d6db40f5982a846e44c81f117 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 5 Jul 2021 17:50:53 +0200 Subject: [PATCH 161/402] `attr` arguments have to implement `Into` --- CHANGELOG.md | 5 +++++ MIGRATING.md | 16 ++++++++++++++++ contracts/ibc-reflect/src/contract.rs | 2 +- packages/std/src/results/attribute.rs | 18 +++++++++--------- packages/vm/src/calls.rs | 2 +- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e6eb2759..d8a575f53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to ## [Unreleased] +### Changed + +- cosmwasm-std: The `attr` function now accepts types that implement + `Into` rather than `ToString`. + ## [0.15.0] - 2021-06-24 ### Added diff --git a/MIGRATING.md b/MIGRATING.md index 9c2c0a3b9..b45f88e9e 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. +## 0.15 -> 1.0 + +- The `attr` function now accepts arguments that implement `Into` rather + than `ToString`. This means that "stringly" types like `&str` are still + accepted, but others (like numbers or booleans) have to be explicitly + converted to strings; you can use the `to_string` method (from the + `std::string::ToString` trait) for that. + + ```diff + let steal_funds = true; + - attr("steal_funds", steal_funds), + + attr("steal_funds", steal_funds.to_string()), + ``` + + It also means that `&&str` is no longer accepted. + ## 0.14 -> 0.15 - Combine `messages` and `submessages` on the `Response` object. The new format diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 352211f6d..d3db9275f 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -212,7 +212,7 @@ pub fn ibc_channel_close( attributes: vec![ attr("action", "ibc_close"), attr("channel_id", channel_id), - attr("steal_funds", steal_funds), + attr("steal_funds", steal_funds.to_string()), ], }) } diff --git a/packages/std/src/results/attribute.rs b/packages/std/src/results/attribute.rs index 67b41a3b2..eb56522fa 100644 --- a/packages/std/src/results/attribute.rs +++ b/packages/std/src/results/attribute.rs @@ -9,10 +9,10 @@ pub struct Attribute { } /// Creates a new Attribute. -pub fn attr(key: impl ToString, value: impl ToString) -> Attribute { +pub fn attr(key: impl Into, value: impl Into) -> Attribute { Attribute { - key: key.to_string(), - value: value.to_string(), + key: key.into(), + value: value.into(), } } @@ -23,15 +23,15 @@ mod tests { #[test] fn attr_works_for_different_types() { - let expeceted = Attribute { + let expected = Attribute { key: "foo".to_string(), value: "42".to_string(), }; - assert_eq!(attr("foo", "42"), expeceted); - assert_eq!(attr("foo".to_string(), "42"), expeceted); - assert_eq!(attr("foo", "42".to_string()), expeceted); - assert_eq!(attr("foo", Uint128::new(42)), expeceted); - assert_eq!(attr("foo", 42), expeceted); + assert_eq!(attr("foo", "42"), expected); + assert_eq!(attr("foo".to_string(), "42"), expected); + assert_eq!(attr("foo", "42".to_string()), expected); + assert_eq!(attr("foo", Uint128::new(42)), expected); + assert_eq!(attr("foo", 42.to_string()), expected); } } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 121811fa1..c55b03218 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -715,7 +715,7 @@ mod tests { let id = res.messages[0].id; let event = Event { ty: "message".into(), - attributes: vec![attr("contract_address", &account)], + attributes: vec![attr("contract_address", account)], }; // which creates a reflect account. here we get the callback let response = Reply { From 2492d629798b9e29bc58fbd0b3cbc40293fa683d Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 5 Jul 2021 23:02:35 +0200 Subject: [PATCH 162/402] Enable `iterator` feature by default Except for `cosmwasm-vm` --- packages/std/Cargo.toml | 2 +- packages/storage/Cargo.toml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 5202270d4..8025161fa 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -9,7 +9,7 @@ license = "Apache-2.0" readme = "README.md" [features] -default = [] +default = ["iterator"] # 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 diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 0d79f2c96..1a72e9aeb 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -10,6 +10,7 @@ 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"] From 2c9183132087d923f098a53ebc9cab65f0176c25 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 5 Jul 2021 23:05:01 +0200 Subject: [PATCH 163/402] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8a575f53..f3fa7e64f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to - cosmwasm-std: The `attr` function now accepts types that implement `Into` rather than `ToString`. +- cosmwasm-std and cosmwasm-storage: The `iterator` feature is now enabled by + default. ## [0.15.0] - 2021-06-24 From 736785e5dadfe433343657225067197ca4b0ee81 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 6 Jul 2021 08:07:41 +0200 Subject: [PATCH 164/402] Disabl std default features in storage and vm --- packages/storage/Cargo.toml | 2 +- packages/vm/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 1a72e9aeb..3f5308dcb 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -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 = "0.15.0" } +cosmwasm-std = { path = "../std", version = "0.15.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 4edcc58af..40bd3ad36 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -36,7 +36,7 @@ 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 = "0.15.0" } +cosmwasm-std = { path = "../std", version = "0.15.0", default-features = false } cosmwasm-crypto = { path = "../crypto", version = "0.15.0" } hex = "0.4" parity-wasm = "0.42" From d5034f023ffe2997f4d38cc2e430cce8818cf744 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 6 Jul 2021 08:11:55 +0200 Subject: [PATCH 165/402] Disable `iterator` feature from std in contracts --- contracts/hackatom/Cargo.toml | 4 ++-- contracts/reflect/Cargo.toml | 4 ++-- contracts/staking/Cargo.toml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/hackatom/Cargo.toml b/contracts/hackatom/Cargo.toml index cc4911e9c..d6541333b 100644 --- a/contracts/hackatom/Cargo.toml +++ b/contracts/hackatom/Cargo.toml @@ -30,7 +30,7 @@ cranelift = ["cosmwasm-vm/cranelift"] backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] -cosmwasm-std = { path = "../../packages/std" } +cosmwasm-std = { path = "../../packages/std", default-features = false } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } sha2 = "0.9.1" @@ -38,5 +38,5 @@ thiserror = "1.0" [dev-dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-storage = { path = "../../packages/storage" } +cosmwasm-storage = { path = "../../packages/storage", default-features = false } cosmwasm-vm = { path = "../../packages/vm", default-features = false } diff --git a/contracts/reflect/Cargo.toml b/contracts/reflect/Cargo.toml index 3025d4902..e27f769e7 100644 --- a/contracts/reflect/Cargo.toml +++ b/contracts/reflect/Cargo.toml @@ -33,8 +33,8 @@ cranelift = ["cosmwasm-vm/cranelift"] backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] -cosmwasm-std = { path = "../../packages/std", features = ["staking", "stargate"] } -cosmwasm-storage = { path = "../../packages/storage" } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking", "stargate"] } +cosmwasm-storage = { path = "../../packages/storage", default-features = false } schemars = "0.8.1" serde = { version = "=1.0.103", default-features = false, features = ["derive"] } thiserror = "1.0" diff --git a/contracts/staking/Cargo.toml b/contracts/staking/Cargo.toml index 30aa8a5d5..ef30e1f7b 100644 --- a/contracts/staking/Cargo.toml +++ b/contracts/staking/Cargo.toml @@ -31,8 +31,8 @@ cranelift = ["cosmwasm-vm/cranelift"] backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] -cosmwasm-std = { path = "../../packages/std", features = ["staking"] } -cosmwasm-storage = { path = "../../packages/storage" } +cosmwasm-std = { path = "../../packages/std", default-features = false, features = ["staking"] } +cosmwasm-storage = { path = "../../packages/storage", default-features = false } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } snafu = "0.6" From 03fafdb3e1e30a27a693842dc1104764e5cd35ca Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 6 Jul 2021 10:18:52 +0200 Subject: [PATCH 166/402] Update MIGRATING.md --- MIGRATING.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index b45f88e9e..43de82720 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,7 +4,7 @@ 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. -## 0.15 -> 1.0 +## 0.15 -> 1.0 (unreleased) - The `attr` function now accepts arguments that implement `Into` rather than `ToString`. This means that "stringly" types like `&str` are still @@ -20,6 +20,18 @@ major releases of `cosmwasm`. Note that you can also view the It also means that `&&str` is no longer accepted. +- The `iterator` feature in `cosmwasm-std` and `cosmwasm-storage` (but not + `cosmwasm-vm`) is now enabled by default. If you want to use it, you don't + have to explicitly enable it anymore. + + If you don't want to use it, you **have to** disable default features when + depending on `cosmwasm-std`. Example: + + ```diff + - cosmwasm-std = { version = "0.15.0" } + + cosmwasm-std = { version = "0.15.0", default-features = false } + ``` + ## 0.14 -> 0.15 - Combine `messages` and `submessages` on the `Response` object. The new format From fbe9588ac53c933b75f87f140b4ba53e1329bb0a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 6 Jul 2021 11:18:02 +0200 Subject: [PATCH 167/402] vm: Enable the `iterator` feature by default --- CHANGELOG.md | 2 +- MIGRATING.md | 3 +-- packages/vm/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3fa7e64f..8b509399d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to - cosmwasm-std: The `attr` function now accepts types that implement `Into` rather than `ToString`. -- cosmwasm-std and cosmwasm-storage: The `iterator` feature is now enabled by +- cosmwasm-std, cosmwasm-vm, cosmwasm-storage: The `iterator` feature is now enabled by default. ## [0.15.0] - 2021-06-24 diff --git a/MIGRATING.md b/MIGRATING.md index 43de82720..f693960fa 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -20,8 +20,7 @@ major releases of `cosmwasm`. Note that you can also view the It also means that `&&str` is no longer accepted. -- The `iterator` feature in `cosmwasm-std` and `cosmwasm-storage` (but not - `cosmwasm-vm`) is now enabled by default. If you want to use it, you don't +- The `iterator` feature in `cosmwasm-std`, `cosmwasm-vm` and `cosmwasm-storage` is now enabled by default. If you want to use it, you don't have to explicitly enable it anymore. If you don't want to use it, you **have to** disable default features when diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 40bd3ad36..a10d539f8 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/vm" license = "Apache-2.0" [features] -default = ["staking"] +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. From bb266ab8f1adaa09aeb9a39f2667f09dad185002 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 6 Jul 2021 11:20:26 +0200 Subject: [PATCH 168/402] Format markdown --- CHANGELOG.md | 4 ++-- MIGRATING.md | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b509399d..9ed9ea481 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,8 @@ and this project adheres to - 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, cosmwasm-vm, cosmwasm-storage: The `iterator` feature is now + enabled by default. ## [0.15.0] - 2021-06-24 diff --git a/MIGRATING.md b/MIGRATING.md index f693960fa..1287fa80d 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -20,8 +20,9 @@ major releases of `cosmwasm`. Note that you can also view the It also means that `&&str` is no longer accepted. -- The `iterator` feature in `cosmwasm-std`, `cosmwasm-vm` and `cosmwasm-storage` is now enabled by default. If you want to use it, you don't - have to explicitly enable it anymore. +- The `iterator` feature in `cosmwasm-std`, `cosmwasm-vm` and `cosmwasm-storage` + is now enabled by default. If you want to use it, you don't have to explicitly + enable it anymore. If you don't want to use it, you **have to** disable default features when depending on `cosmwasm-std`. Example: From 9c84ce38dc0df74bc5ad504fcaa09d326e2c6511 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 5 Jul 2021 19:52:17 +0200 Subject: [PATCH 169/402] List number of shuffles in docs --- packages/std/src/mock.rs | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index cf076fe3c..df949391a 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -508,6 +508,49 @@ impl StakingQuerier { /// /// 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, From f13c9a5e14c77d547743231baa280e323e08b22c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 6 Jul 2021 17:50:23 +0200 Subject: [PATCH 170/402] Make MockApi::canonical_length private --- CHANGELOG.md | 2 ++ packages/std/src/mock.rs | 16 ++++++++++++---- packages/vm/src/imports.rs | 12 ++++++------ packages/vm/src/testing/mock.rs | 21 +++++++++++++++++---- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ed9ea481..03ee47b30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to `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. ## [0.15.0] - 2021-06-24 diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index df949391a..2a34126b0 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -55,6 +55,14 @@ 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 +/// what this value is. +/// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. +const CANONICAL_LENGTH: usize = 24; + +const SHUFFLES_ENCODE: usize = 18; +const SHUFFLES_DECODE: usize = 2; + // MockPrecompiles 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) @@ -62,13 +70,13 @@ pub type MockStorage = MemoryStorage; pub struct MockApi { /// Length of canonical addresses created with this API. Contracts should not make any assumtions /// what this value is. - pub canonical_length: usize, + canonical_length: usize, } impl Default for MockApi { fn default() -> Self { MockApi { - canonical_length: 24, + canonical_length: CANONICAL_LENGTH, } } } @@ -100,7 +108,7 @@ impl Api for MockApi { // 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..18 { + for _ in 0..SHUFFLES_ENCODE { out = riffle_shuffle(&out); } Ok(out.into()) @@ -115,7 +123,7 @@ impl Api for MockApi { 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..2 { + for _ in 0..SHUFFLES_DECODE { tmp = riffle_shuffle(&tmp); } // Rotate back diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 45fcd1c98..84c0fbfa7 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1021,7 +1021,7 @@ mod tests { 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 dest_ptr = create_empty(&mut instance, api.canonical_length() as u32); leave_default_data(&env); @@ -1029,7 +1029,7 @@ mod tests { let res = do_addr_canonicalize(&env, source_ptr, dest_ptr).unwrap(); assert_eq!(res, 0); let data = force_read(&env, dest_ptr); - assert_eq!(data.len(), api.canonical_length); + assert_eq!(data.len(), api.canonical_length()); } #[test] @@ -1125,7 +1125,7 @@ mod tests { .. } => { assert_eq!(size, 7); - assert_eq!(required, api.canonical_length); + assert_eq!(required, api.canonical_length()); } err => panic!("Incorrect error returned: {:?}", err), } @@ -1137,7 +1137,7 @@ mod tests { let (env, mut instance) = make_instance(api); let api = MockApi::default(); - let source_data = vec![0x22; api.canonical_length]; + let source_data = vec![0x22; api.canonical_length()]; let source_ptr = write_data(&env, &source_data); let dest_ptr = create_empty(&mut instance, 50); @@ -1216,7 +1216,7 @@ mod tests { let (env, mut instance) = make_instance(api); let api = MockApi::default(); - let source_data = vec![0x22; api.canonical_length]; + let source_data = vec![0x22; api.canonical_length()]; let source_ptr = write_data(&env, &source_data); let dest_ptr = create_empty(&mut instance, 2); @@ -1229,7 +1229,7 @@ mod tests { .. } => { assert_eq!(size, 2); - assert_eq!(required, api.canonical_length); + assert_eq!(required, api.canonical_length()); } err => panic!("Incorrect error returned: {:?}", err), } diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index d0d8f85d5..8966417f2 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -31,6 +31,14 @@ pub fn mock_backend_with_balances( } } +/// Length of canonical addresses created with this API. Contracts should not make any assumtions +/// what this value is. +/// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. +const CANONICAL_LENGTH: usize = 24; + +const SHUFFLES_ENCODE: usize = 18; +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). @@ -38,12 +46,17 @@ pub fn mock_backend_with_balances( pub struct MockApi { /// Length of canonical addresses created with this API. Contracts should not make any assumtions /// what this value is. - pub canonical_length: usize, + canonical_length: usize, /// When set, all calls to the API fail with BackendError::Unknown containing this message backend_error: Option<&'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), @@ -55,7 +68,7 @@ impl MockApi { impl Default for MockApi { fn default() -> Self { MockApi { - canonical_length: 24, + canonical_length: CANONICAL_LENGTH, backend_error: None, } } @@ -94,7 +107,7 @@ impl BackendApi for MockApi { // 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..18 { + for _ in 0..SHUFFLES_ENCODE { out = riffle_shuffle(&out); } (Ok(out), gas_info) @@ -118,7 +131,7 @@ impl BackendApi for MockApi { 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..2 { + for _ in 0..SHUFFLES_DECODE { tmp = riffle_shuffle(&tmp); } // Rotate back From 6bc0af27c0cb93f40130ea75812e9fe94b69c89b Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Tue, 6 Jul 2021 17:27:03 -0500 Subject: [PATCH 171/402] Canonical address length bumped to 54 --- packages/std/src/mock.rs | 4 ++-- packages/vm/src/imports.rs | 2 +- packages/vm/src/testing/mock.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 2a34126b0..c83aac19e 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -58,7 +58,7 @@ pub type MockStorage = MemoryStorage; /// Length of canonical addresses created with this API. Contracts should not make any assumtions /// what this value is. /// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. -const CANONICAL_LENGTH: usize = 24; +const CANONICAL_LENGTH: usize = 54; const SHUFFLES_ENCODE: usize = 18; const SHUFFLES_DECODE: usize = 2; @@ -633,7 +633,7 @@ mod tests { #[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"); + let human = String::from("some-extremely-long-address-not-supported-by-this-api-longer-than-54"); let _ = api.addr_canonicalize(&human).unwrap(); } diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 84c0fbfa7..9c74d3867 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -35,7 +35,7 @@ const MAX_LENGTH_DB_KEY: usize = 64 * KI; /// Max key length for db_write (i.e. when VM reads from Wasm memory) const MAX_LENGTH_DB_VALUE: usize = 128 * KI; /// Typically 20 (Cosmos SDK, Ethereum) or 32 (Nano, Substrate) -const MAX_LENGTH_CANONICAL_ADDRESS: usize = 32; +const MAX_LENGTH_CANONICAL_ADDRESS: usize = 64; /// The maximum allowed size for bech32 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32) const MAX_LENGTH_HUMAN_ADDRESS: usize = 90; const MAX_LENGTH_QUERY_CHAIN_REQUEST: usize = 64 * KI; diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index 8966417f2..e71094df7 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -34,7 +34,7 @@ pub fn mock_backend_with_balances( /// Length of canonical addresses created with this API. Contracts should not make any assumtions /// what this value is. /// The value here must be restorable with `SHUFFLES_ENCODE` + `SHUFFLES_DECODE` in-shuffles. -const CANONICAL_LENGTH: usize = 24; +const CANONICAL_LENGTH: usize = 54; const SHUFFLES_ENCODE: usize = 18; const SHUFFLES_DECODE: usize = 2; @@ -230,7 +230,7 @@ mod tests { #[test] fn canonical_address_max_input_length() { let api = MockApi::default(); - let human = "longer-than-the-address-length-supported-by-this-api"; + let human = "longer-than-the-address-length-supported-by-this-api-longer-than-54"; match api.canonical_address(human).0.unwrap_err() { BackendError::UserErr { .. } => {} err => panic!("Unexpected error: {:?}", err), From 803edac584b736780a1c3f29295391986b5a5298 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Wed, 7 Jul 2021 10:49:41 -0500 Subject: [PATCH 172/402] Fixed inadequate memory allocation in create_empty function --- packages/vm/src/imports.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 9c74d3867..d76686c85 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1139,7 +1139,7 @@ mod tests { let source_data = vec![0x22; api.canonical_length()]; let source_ptr = write_data(&env, &source_data); - let dest_ptr = create_empty(&mut instance, 50); + let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); @@ -1154,7 +1154,7 @@ mod tests { let (env, mut instance) = make_instance(api); let source_ptr = write_data(&env, b"foo"); // too short - let dest_ptr = create_empty(&mut instance, 50); + let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); @@ -1170,7 +1170,7 @@ mod tests { let (env, mut instance) = make_instance(api); let source_ptr = write_data(&env, b"foo\0\0\0\0\0"); - let dest_ptr = create_empty(&mut instance, 50); + let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); @@ -1190,7 +1190,7 @@ mod tests { let (env, mut instance) = make_instance(api); let source_ptr = write_data(&env, &[61; 33]); - let dest_ptr = create_empty(&mut instance, 50); + let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); From 15ad2436c6e4ecfa9e30a93d70ac69fff6ff9427 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Wed, 7 Jul 2021 11:23:07 -0500 Subject: [PATCH 173/402] Re formatted root and all contracts --- packages/schema/src/remove.rs | 2 +- packages/std/src/mock.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/schema/src/remove.rs b/packages/schema/src/remove.rs index 19c530c9f..f2d3957d0 100644 --- a/packages/schema/src/remove.rs +++ b/packages/schema/src/remove.rs @@ -37,7 +37,7 @@ pub fn remove_schemas(schemas_dir: &path::Path) -> Result<(), io::Error> { #[cfg(test)] mod tests { use super::*; - use std::ffi::OsStr; + // use std::ffi::OsStr; use std::path::Path; #[test] diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index c83aac19e..1fb58c66d 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -633,7 +633,8 @@ mod tests { #[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 human = + String::from("some-extremely-long-address-not-supported-by-this-api-longer-than-54"); let _ = api.addr_canonicalize(&human).unwrap(); } From 6abdd2f0f67042c68e848c68743394484805db74 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Wed, 7 Jul 2021 13:44:47 -0500 Subject: [PATCH 174/402] Revert and modified tests in imports --- packages/schema/src/remove.rs | 2 +- packages/vm/src/imports.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/schema/src/remove.rs b/packages/schema/src/remove.rs index f2d3957d0..19c530c9f 100644 --- a/packages/schema/src/remove.rs +++ b/packages/schema/src/remove.rs @@ -37,7 +37,7 @@ pub fn remove_schemas(schemas_dir: &path::Path) -> Result<(), io::Error> { #[cfg(test)] mod tests { use super::*; - // use std::ffi::OsStr; + use std::ffi::OsStr; use std::path::Path; #[test] diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index d76686c85..739e68ae1 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -948,7 +948,7 @@ mod tests { 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"addressexceedingaddressspace"); // too long + let source_ptr3 = write_data(&env, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long leave_default_data(&env); @@ -1039,8 +1039,8 @@ mod tests { 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"addressexceedingaddressspace"); // too long - let dest_ptr = create_empty(&mut instance, 8); + let source_ptr3 = write_data(&env, b"addressexceedingaddressspacesuperlongreallylongiamensuringthatitislongerthaneverything"); // too long + let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); From aa5feee3ac78b3672f14ddbed7f84f9d220eee5f Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Sat, 10 Jul 2021 23:48:45 -0500 Subject: [PATCH 175/402] Attempted fix to package_vm and contract_hackatom testing errors --- contracts/hackatom/src/contract.rs | 2 +- packages/vm/src/imports.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index eb1486ce2..f9421ca06 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -174,7 +174,7 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { } } - let invalid_bech32 = "bn93hg934hg08q340g8u4jcau3"; + let invalid_bech32 = "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnjfqtxghvhpeqhekzvwapcdjytt"; match api.addr_canonicalize(invalid_bech32).unwrap_err() { StdError::GenericErr { .. } => {} err => { diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 739e68ae1..56f634020 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1189,7 +1189,7 @@ mod tests { let api = MockApi::default(); let (env, mut instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 33]); + let source_ptr = write_data(&env, &[61; 100]); let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); From 8f67cee153a50655354e7a19c4ec98c265ad7227 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Sat, 10 Jul 2021 23:58:22 -0500 Subject: [PATCH 176/402] Reverted attempted VM test fix and fixed hackatom contract test --- contracts/hackatom/src/contract.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index f9421ca06..6a8e33d2a 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -174,7 +174,7 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { } } - let invalid_bech32 = "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnjfqtxghvhpeqhekzvwapcdjytt"; + let invalid_bech32 = "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnj219a"; match api.addr_canonicalize(invalid_bech32).unwrap_err() { StdError::GenericErr { .. } => {} err => { From b1d5754420c08fbade8dc9985c8f016555e4456f Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Sun, 11 Jul 2021 00:06:27 -0500 Subject: [PATCH 177/402] Actual revert to 33 length --- 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 56f634020..648df93bc 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -994,7 +994,7 @@ mod tests { let api = MockApi::default(); let (env, _instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 100]); + let source_ptr = write_data(&env, &[61; 33]); leave_default_data(&env); @@ -1087,7 +1087,7 @@ mod tests { let api = MockApi::default(); let (env, mut instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 100]); + let source_ptr = write_data(&env, &[61; 33]); let dest_ptr = create_empty(&mut instance, 8); leave_default_data(&env); @@ -1189,7 +1189,7 @@ mod tests { let api = MockApi::default(); let (env, mut instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 100]); + let source_ptr = write_data(&env, &[61; 33]); let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); From cf14490d7d741f7293cbce30f127f2633e356e72 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Sun, 11 Jul 2021 15:41:50 -0500 Subject: [PATCH 178/402] cargo fmt --- 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 648df93bc..8847ae3a3 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -1189,7 +1189,7 @@ mod tests { let api = MockApi::default(); let (env, mut instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 33]); + let source_ptr = write_data(&env, &[61; 33]); let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); From 3a378d461975b6292c46ac420ff3531ed509798e Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Sun, 11 Jul 2021 23:47:50 -0500 Subject: [PATCH 179/402] Formatting in hackatom --- contracts/hackatom/src/contract.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 6a8e33d2a..141a324ac 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -174,7 +174,8 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result { } } - let invalid_bech32 = "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnj219a"; + let invalid_bech32 = + "bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnj219a"; match api.addr_canonicalize(invalid_bech32).unwrap_err() { StdError::GenericErr { .. } => {} err => { From 378b029707ebaed4505b3666c620bed69ff9a682 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 07:32:28 +0200 Subject: [PATCH 180/402] Extend IBC entry points --- contracts/ibc-reflect-send/src/ibc.rs | 59 ++++++++++----- .../ibc-reflect-send/tests/integration.rs | 25 +++++-- contracts/ibc-reflect/src/contract.rs | 64 +++++++++++------ contracts/ibc-reflect/tests/integration.rs | 39 +++++++--- packages/std/src/ibc.rs | 72 +++++++++++++++++++ packages/std/src/ibc_exports.rs | 50 ++++++------- packages/std/src/lib.rs | 6 +- packages/vm/src/calls.rs | 53 ++++++++------ packages/vm/src/testing/calls.rs | 15 ++-- 9 files changed, 268 insertions(+), 115 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 516f14a35..bf179c1f8 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,7 +1,7 @@ use cosmwasm_std::{ - attr, entry_point, from_slice, to_binary, DepsMut, Env, IbcAcknowledgementWithPacket, - IbcBasicResponse, IbcChannel, IbcMsg, IbcOrder, IbcPacket, IbcReceiveResponse, StdError, - StdResult, SubMsg, + attr, entry_point, from_slice, to_binary, DepsMut, Env, IbcBasicResponse, IbcChannelCloseMsg, + IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, StdError, StdResult, SubMsg, }; use crate::ibc_msg::{ @@ -17,7 +17,9 @@ pub const PACKET_LIFETIME: u64 = 60 * 60; #[entry_point] /// enforces ordering and versioing constraints -pub fn ibc_channel_open(_deps: DepsMut, _env: Env, channel: IbcChannel) -> StdResult<()> { +pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> StdResult<()> { + let channel = msg.channel; + if channel.order != IbcOrder::Ordered { return Err(StdError::generic_err("Only supports ordered channels")); } @@ -46,8 +48,10 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, channel: IbcChannel) -> StdRe pub fn ibc_channel_connect( deps: DepsMut, env: Env, - channel: IbcChannel, + msg: IbcChannelConnectMsg, ) -> StdResult { + let channel = msg.channel; + let channel_id = channel.endpoint.channel_id; // create an account holder the channel exists (not found if not registered) @@ -76,8 +80,10 @@ pub fn ibc_channel_connect( pub fn ibc_channel_close( deps: DepsMut, _env: Env, - channel: IbcChannel, + msg: IbcChannelCloseMsg, ) -> StdResult { + let channel = msg.channel; + // remove the channel let channel_id = channel.endpoint.channel_id; accounts(deps.storage).remove(channel_id.as_bytes()); @@ -93,7 +99,7 @@ pub fn ibc_channel_close( pub fn ibc_packet_receive( _deps: DepsMut, _env: Env, - _packet: IbcPacket, + _packet: IbcPacketReceiveMsg, ) -> StdResult { Ok(IbcReceiveResponse { acknowledgement: b"{}".into(), @@ -106,8 +112,9 @@ pub fn ibc_packet_receive( pub fn ibc_packet_ack( deps: DepsMut, env: Env, - ack: IbcAcknowledgementWithPacket, + msg: IbcPacketAckMsg, ) -> StdResult { + let ack = msg.ack; // which local channel was this packet send from let caller = ack.original_packet.src.channel_id; // we need to parse the ack based on our request @@ -229,7 +236,7 @@ fn acknowledge_balances( pub fn ibc_packet_timeout( _deps: DepsMut, _env: Env, - _packet: IbcPacket, + _msg: IbcPacketTimeoutMsg, ) -> StdResult { Ok(IbcBasicResponse { messages: vec![], @@ -247,7 +254,10 @@ mod tests { mock_dependencies, mock_env, mock_ibc_channel, mock_ibc_packet_ack, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::{coin, coins, BankMsg, CosmosMsg, IbcAcknowledgement, OwnedDeps}; + use cosmwasm_std::{ + coin, coins, BankMsg, CosmosMsg, IbcAcknowledgement, IbcAcknowledgementWithPacket, + OwnedDeps, + }; const CREATOR: &str = "creator"; @@ -264,13 +274,15 @@ mod tests { // save the account (tested in detail in `proper_handshake_flow`) fn connect(mut deps: DepsMut, channel_id: &str) { // open packet has no counterparty version, connect does - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let mut handshake_open = + IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + handshake_open.channel.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); // this should send a WhoAmI request, which is received some blocks later @@ -293,7 +305,8 @@ mod tests { acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), }; - let res = ibc_packet_ack(deps, mock_env(), ack).unwrap(); + let msg = IbcPacketAckMsg::new(ack); + let res = ibc_packet_ack(deps, mock_env(), msg).unwrap(); assert_eq!(0, res.messages.len()); } @@ -301,13 +314,22 @@ mod tests { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel("channel-12", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-12", + IbcOrder::Unordered, + IBC_VERSION, + )); ibc_channel_open(deps.as_mut(), mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect"); + let wrong_version = + IbcChannelOpenMsg::new(mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect")); ibc_channel_open(deps.as_mut(), mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel("channel-12", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-12", + IbcOrder::Ordered, + IBC_VERSION, + )); ibc_channel_open(deps.as_mut(), mock_env(), valid_handshake).unwrap(); } @@ -384,7 +406,8 @@ mod tests { acknowledgement: IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(), original_packet: packet, }; - let res = ibc_packet_ack(deps.as_mut(), mock_env(), ack).unwrap(); + let msg = IbcPacketAckMsg::new(ack); + 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 assert_eq!(0, res.messages.len()); assert_eq!(vec![attr("action", "acknowledge_dispatch")], res.attributes) diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 781bc21ae..d2c5cb0f7 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -20,7 +20,7 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; use cosmwasm_std::{ attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcAcknowledgementWithPacket, - IbcBasicResponse, IbcMsg, IbcOrder, Response, + IbcBasicResponse, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, Response, }; use cosmwasm_vm::testing::{ execute, ibc_channel_connect, ibc_channel_open, ibc_packet_ack, instantiate, mock_env, @@ -53,13 +53,15 @@ fn setup() -> Instance { // save the account (tested in detail in `proper_handshake_flow`) fn connect(deps: &mut Instance, channel_id: &str) { // open packet has no counterparty version, connect does - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let mut handshake_open = + IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + handshake_open.channel.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); // this should send a WhoAmI request, which is received some blocks later @@ -102,13 +104,22 @@ fn instantiate_works() { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel("channel-12", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-12", + IbcOrder::Unordered, + IBC_VERSION, + )); ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect"); + let wrong_version = + IbcChannelOpenMsg::new(mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect")); ibc_channel_open(&mut deps, mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel("channel-12", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-12", + IbcOrder::Ordered, + IBC_VERSION, + )); ibc_channel_open(&mut deps, mock_env(), valid_handshake).unwrap(); } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index d3db9275f..d40ef1a8f 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,8 +1,9 @@ use cosmwasm_std::{ attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, - CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcAcknowledgementWithPacket, IbcBasicResponse, - IbcChannel, IbcOrder, IbcPacket, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, - Response, StdError, StdResult, SubMsg, SubMsgExecutionResponse, WasmMsg, + CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcBasicResponse, IbcChannelCloseMsg, + IbcChannelConnectMsg, IbcChannelOpenMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, + IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, Response, + StdError, StdResult, SubMsg, SubMsgExecutionResponse, WasmMsg, }; use crate::msg::{ @@ -125,7 +126,9 @@ pub fn query_list_accounts(deps: Deps) -> StdResult { #[entry_point] /// enforces ordering and versioing constraints -pub fn ibc_channel_open(_deps: DepsMut, _env: Env, channel: IbcChannel) -> StdResult<()> { +pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> StdResult<()> { + let channel = msg.channel; + if channel.order != IbcOrder::Ordered { return Err(StdError::generic_err("Only supports ordered channels")); } @@ -154,8 +157,9 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, channel: IbcChannel) -> StdRe pub fn ibc_channel_connect( deps: DepsMut, _env: Env, - channel: IbcChannel, + msg: IbcChannelConnectMsg, ) -> StdResult { + let channel = msg.channel; let cfg = config(deps.storage).load()?; let chan_id = channel.endpoint.channel_id; @@ -183,8 +187,9 @@ pub fn ibc_channel_connect( pub fn ibc_channel_close( deps: DepsMut, env: Env, - channel: IbcChannel, + msg: IbcChannelCloseMsg, ) -> StdResult { + 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())?; @@ -236,10 +241,11 @@ fn encode_ibc_error>(msg: T) -> Binary { pub fn ibc_packet_receive( deps: DepsMut, _env: Env, - packet: IbcPacket, + msg: IbcPacketReceiveMsg, ) -> StdResult { // put this in a closure so we can convert all error responses into acknowledgements (|| { + 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)?; @@ -323,7 +329,7 @@ fn receive_dispatch( pub fn ibc_packet_ack( _deps: DepsMut, _env: Env, - _ack: IbcAcknowledgementWithPacket, + _msg: IbcPacketAckMsg, ) -> StdResult { Ok(IbcBasicResponse { messages: vec![], @@ -336,7 +342,7 @@ pub fn ibc_packet_ack( pub fn ibc_packet_timeout( _deps: DepsMut, _env: Env, - _packet: IbcPacket, + _msg: IbcPacketTimeoutMsg, ) -> StdResult { Ok(IbcBasicResponse { messages: vec![], @@ -390,13 +396,15 @@ mod tests { // open packet has no counterparty versin, connect does // TODO: validate this with alpe - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let mut handshake_open = + IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + handshake_open.channel.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); let id = res.messages[0].id; @@ -428,13 +436,22 @@ mod tests { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel("channel-12", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-12", + IbcOrder::Unordered, + IBC_VERSION, + )); ibc_channel_open(deps.as_mut(), mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect"); + let wrong_version = + IbcChannelOpenMsg::new(mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect")); ibc_channel_open(deps.as_mut(), mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel("channel-12", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-12", + IbcOrder::Ordered, + IBC_VERSION, + )); ibc_channel_open(deps.as_mut(), mock_env(), valid_handshake).unwrap(); } @@ -444,12 +461,14 @@ mod tests { let channel_id = "channel-1234"; // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let mut handshake_open = + IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + handshake_open.channel.counterparty_version = None; ibc_channel_open(deps.as_mut(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); let res = ibc_channel_connect(deps.as_mut(), mock_env(), handshake_connect).unwrap(); // and set up a reflect account assert_eq!(1, res.messages.len()); @@ -526,7 +545,7 @@ mod tests { let ibc_msg = PacketMsg::Dispatch { msgs: msgs_to_dispatch.clone(), }; - let packet = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); + let packet = IbcPacketReceiveMsg::new(mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap()); let res = ibc_packet_receive(deps.as_mut(), mock_env(), packet).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); @@ -541,7 +560,7 @@ mod tests { connect(deps.as_mut(), channel_id, account); // receive a packet for an unregistered channel returns app-level error (not Result::Err) - let packet = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); + let packet = IbcPacketReceiveMsg::new(mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap()); let res = ibc_packet_receive(deps.as_mut(), mock_env(), packet).unwrap(); // assert app-level success @@ -577,7 +596,7 @@ mod tests { let bad_data = InstantiateMsg { reflect_code_id: 12345, }; - let packet = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); + let packet = IbcPacketReceiveMsg::new(mock_ibc_packet_recv(channel_id, &bad_data).unwrap()); let res = ibc_packet_receive(deps.as_mut(), mock_env(), packet).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); @@ -607,7 +626,8 @@ mod tests { assert_eq!(funds, balance); // close the channel - let channel = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let channel = + IbcChannelCloseMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); let res = ibc_channel_close(deps.as_mut(), mock_env(), channel).unwrap(); // it pulls out all money from the reflect contract diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index e1f3e07ff..d07deddc0 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -19,8 +19,9 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_recv}; use cosmwasm_std::{ - attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, - IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, WasmMsg, + attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcOrder, IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, + WasmMsg, }; use cosmwasm_vm::testing::{ ibc_channel_connect, ibc_channel_open, ibc_packet_receive, instantiate, mock_env, mock_info, @@ -78,12 +79,14 @@ fn connect>( ) { let account: String = account.into(); // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let mut handshake_open = + IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + handshake_open.channel.counterparty_version = None; ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); let id = res.messages[0].id; @@ -116,13 +119,25 @@ fn instantiate_works() { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel("channel-1234", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-1234", + IbcOrder::Unordered, + IBC_VERSION, + )); ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel("channel-1234", IbcOrder::Ordered, "reflect"); + let wrong_version = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-1234", + IbcOrder::Ordered, + "reflect", + )); ibc_channel_open(&mut deps, mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel("channel-1234", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( + "channel-1234", + IbcOrder::Ordered, + IBC_VERSION, + )); ibc_channel_open(&mut deps, mock_env(), valid_handshake).unwrap(); } @@ -132,12 +147,14 @@ fn proper_handshake_flow() { let channel_id = "channel-432"; // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let mut handshake_open = + IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + handshake_open.channel.counterparty_version = None; ibc_channel_open(&mut deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); let res: IbcBasicResponse = ibc_channel_connect(&mut deps, mock_env(), handshake_connect).unwrap(); // and set up a reflect account diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 4cede60e1..7b9ddfae5 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -211,6 +211,78 @@ impl IbcAcknowledgement { } } +/// The message that is passed into `ibc_channel_open` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcChannelOpenMsg { + pub channel: IbcChannel, +} + +impl IbcChannelOpenMsg { + pub fn new(channel: IbcChannel) -> Self { + Self { channel } + } +} + +/// The message that is passed into `ibc_channel_connect` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcChannelConnectMsg { + pub channel: IbcChannel, +} + +impl IbcChannelConnectMsg { + pub fn new(channel: IbcChannel) -> Self { + Self { channel } + } +} + +/// The message that is passed into `ibc_channel_close` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcChannelCloseMsg { + pub channel: IbcChannel, +} + +impl IbcChannelCloseMsg { + pub fn new(channel: IbcChannel) -> Self { + Self { channel } + } +} + +/// The message that is passed into `ibc_packet_receive` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcPacketReceiveMsg { + pub packet: IbcPacket, +} + +impl IbcPacketReceiveMsg { + pub fn new(packet: IbcPacket) -> Self { + Self { packet } + } +} + +/// The message that is passed into `ibc_packet_ack` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcPacketAckMsg { + pub ack: IbcAcknowledgementWithPacket, +} + +impl IbcPacketAckMsg { + pub fn new(ack: IbcAcknowledgementWithPacket) -> Self { + Self { ack } + } +} + +/// The message that is passed into `ibc_packet_timeout` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcPacketTimeoutMsg { + pub packet: IbcPacket, +} + +impl IbcPacketTimeoutMsg { + pub fn new(packet: IbcPacket) -> Self { + Self { packet } + } +} + /// This is the return value for the majority of the ibc handlers. /// That are able to dispatch messages / events on their own, /// but have no meaningful return value to the calling code. diff --git a/packages/std/src/ibc_exports.rs b/packages/std/src/ibc_exports.rs index 563272b23..ca3762f42 100644 --- a/packages/std/src/ibc_exports.rs +++ b/packages/std/src/ibc_exports.rs @@ -7,12 +7,14 @@ use serde::Serialize; use crate::deps::DepsMut; use crate::exports::make_dependencies; -use crate::ibc::{IbcBasicResponse, IbcChannel}; +use crate::ibc::{ + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcPacketAckMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, +}; use crate::memory::{consume_region, release_buffer, Region}; use crate::results::ContractResult; use crate::serde::{from_slice, to_vec}; use crate::types::Env; -use crate::{IbcAcknowledgementWithPacket, IbcPacket, IbcReceiveResponse}; // TODO: replace with https://doc.rust-lang.org/std/ops/trait.Try.html once stabilized macro_rules! r#try_into_contract_result { @@ -33,7 +35,7 @@ macro_rules! r#try_into_contract_result { /// /// contract_fn does the protocol version negotiation during channel handshake phase pub fn do_ibc_channel_open( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannel) -> Result<(), E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelOpenMsg) -> Result<(), E>, env_ptr: u32, msg_ptr: u32, ) -> u32 @@ -46,7 +48,7 @@ where } fn _do_ibc_channel_open( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannel) -> Result<(), E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelOpenMsg) -> Result<(), E>, env_ptr: *mut Region, msg_ptr: *mut Region, ) -> ContractResult<()> @@ -57,7 +59,7 @@ where let msg: Vec = unsafe { consume_region(msg_ptr) }; let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcChannel = try_into_contract_result!(from_slice(&msg)); + let msg: IbcChannelOpenMsg = try_into_contract_result!(from_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -67,7 +69,7 @@ where /// /// contract_fn is a callback when a IBC channel is established (after both sides agree in open) pub fn do_ibc_channel_connect( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannel) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelConnectMsg) -> Result, E>, env_ptr: u32, msg_ptr: u32, ) -> u32 @@ -81,7 +83,7 @@ where } fn _do_ibc_channel_connect( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannel) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelConnectMsg) -> Result, E>, env_ptr: *mut Region, msg_ptr: *mut Region, ) -> ContractResult> @@ -93,7 +95,7 @@ where let msg: Vec = unsafe { consume_region(msg_ptr) }; let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcChannel = try_into_contract_result!(from_slice(&msg)); + let msg: IbcChannelConnectMsg = try_into_contract_result!(from_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -103,7 +105,7 @@ where /// /// contract_fn is a callback when a IBC channel belonging to this contract is closed pub fn do_ibc_channel_close( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannel) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelCloseMsg) -> Result, E>, env_ptr: u32, msg_ptr: u32, ) -> u32 @@ -117,7 +119,7 @@ where } fn _do_ibc_channel_close( - contract_fn: &dyn Fn(DepsMut, Env, IbcChannel) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcChannelCloseMsg) -> Result, E>, env_ptr: *mut Region, msg_ptr: *mut Region, ) -> ContractResult> @@ -129,7 +131,7 @@ where let msg: Vec = unsafe { consume_region(msg_ptr) }; let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcChannel = try_into_contract_result!(from_slice(&msg)); + let msg: IbcChannelCloseMsg = try_into_contract_result!(from_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -140,7 +142,7 @@ where /// contract_fn is called when this chain receives an IBC Packet on a channel belonging /// to this contract pub fn do_ibc_packet_receive( - contract_fn: &dyn Fn(DepsMut, Env, IbcPacket) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcPacketReceiveMsg) -> Result, E>, env_ptr: u32, msg_ptr: u32, ) -> u32 @@ -154,7 +156,7 @@ where } fn _do_ibc_packet_receive( - contract_fn: &dyn Fn(DepsMut, Env, IbcPacket) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcPacketReceiveMsg) -> Result, E>, env_ptr: *mut Region, msg_ptr: *mut Region, ) -> ContractResult> @@ -166,7 +168,7 @@ where let msg: Vec = unsafe { consume_region(msg_ptr) }; let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcPacket = try_into_contract_result!(from_slice(&msg)); + let msg: IbcPacketReceiveMsg = try_into_contract_result!(from_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -177,11 +179,7 @@ where /// contract_fn is called when this chain receives an IBC Acknowledgement for a packet /// that this contract previously sent pub fn do_ibc_packet_ack( - contract_fn: &dyn Fn( - DepsMut, - Env, - IbcAcknowledgementWithPacket, - ) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcPacketAckMsg) -> Result, E>, env_ptr: u32, msg_ptr: u32, ) -> u32 @@ -195,11 +193,7 @@ where } fn _do_ibc_packet_ack( - contract_fn: &dyn Fn( - DepsMut, - Env, - IbcAcknowledgementWithPacket, - ) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcPacketAckMsg) -> Result, E>, env_ptr: *mut Region, msg_ptr: *mut Region, ) -> ContractResult> @@ -211,7 +205,7 @@ where let msg: Vec = unsafe { consume_region(msg_ptr) }; let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcAcknowledgementWithPacket = try_into_contract_result!(from_slice(&msg)); + let msg: IbcPacketAckMsg = try_into_contract_result!(from_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() @@ -223,7 +217,7 @@ where /// timedout and will never be relayed to the calling chain. This generally behaves /// like ick_ack_fn upon an acknowledgement containing an error. pub fn do_ibc_packet_timeout( - contract_fn: &dyn Fn(DepsMut, Env, IbcPacket) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcPacketTimeoutMsg) -> Result, E>, env_ptr: u32, msg_ptr: u32, ) -> u32 @@ -237,7 +231,7 @@ where } fn _do_ibc_packet_timeout( - contract_fn: &dyn Fn(DepsMut, Env, IbcPacket) -> Result, E>, + contract_fn: &dyn Fn(DepsMut, Env, IbcPacketTimeoutMsg) -> Result, E>, env_ptr: *mut Region, msg_ptr: *mut Region, ) -> ContractResult> @@ -249,7 +243,7 @@ where let msg: Vec = unsafe { consume_region(msg_ptr) }; let env: Env = try_into_contract_result!(from_slice(&env)); - let msg: IbcPacket = try_into_contract_result!(from_slice(&msg)); + let msg: IbcPacketTimeoutMsg = try_into_contract_result!(from_slice(&msg)); let mut deps = make_dependencies(); contract_fn(deps.as_mut(), env, msg).into() diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index bd3b18b0e..ecfa4f66c 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -34,8 +34,10 @@ pub use crate::errors::{ }; #[cfg(feature = "stargate")] pub use crate::ibc::{ - IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcEndpoint, - IbcMsg, IbcOrder, IbcPacket, IbcReceiveResponse, IbcTimeout, IbcTimeoutBlock, + IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, + IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcMsg, IbcOrder, + IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, + IbcTimeout, IbcTimeoutBlock, }; #[cfg(feature = "iterator")] #[allow(deprecated)] diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index c55b03218..20f91118c 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -6,7 +6,8 @@ use wasmer::Val; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, + IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcPacket, IbcReceiveResponse, }; use crate::backend::{BackendApi, Querier, Storage}; @@ -218,7 +219,7 @@ where pub fn call_ibc_channel_open( instance: &mut Instance, env: &Env, - channel: &IbcChannel, + msg: &IbcChannelOpenMsg, ) -> VmResult> where A: BackendApi + 'static, @@ -226,8 +227,8 @@ where Q: Querier + 'static, { let env = to_vec(env)?; - let channel = to_vec(channel)?; - let data = call_ibc_channel_open_raw(instance, &env, &channel)?; + let msg = to_vec(msg)?; + let data = call_ibc_channel_open_raw(instance, &env, &msg)?; let result: ContractResult<()> = from_slice(&data, deserialization_limits::RESULT_IBC_CHANNEL_OPEN)?; Ok(result) @@ -237,7 +238,7 @@ where pub fn call_ibc_channel_connect( instance: &mut Instance, env: &Env, - channel: &IbcChannel, + msg: &IbcChannelConnectMsg, ) -> VmResult>> where A: BackendApi + 'static, @@ -246,8 +247,8 @@ where U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, { let env = to_vec(env)?; - let channel = to_vec(channel)?; - let data = call_ibc_channel_connect_raw(instance, &env, &channel)?; + let msg = to_vec(msg)?; + let data = call_ibc_channel_connect_raw(instance, &env, &msg)?; let result = from_slice(&data, deserialization_limits::RESULT_IBC_CHANNEL_CONNECT)?; Ok(result) } @@ -256,7 +257,7 @@ where pub fn call_ibc_channel_close( instance: &mut Instance, env: &Env, - channel: &IbcChannel, + msg: &IbcChannelCloseMsg, ) -> VmResult>> where A: BackendApi + 'static, @@ -265,8 +266,8 @@ where U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, { let env = to_vec(env)?; - let channel = to_vec(channel)?; - let data = call_ibc_channel_close_raw(instance, &env, &channel)?; + let msg = to_vec(msg)?; + let data = call_ibc_channel_close_raw(instance, &env, &msg)?; let result = from_slice(&data, deserialization_limits::RESULT_IBC_CHANNEL_CLOSE)?; Ok(result) } @@ -445,7 +446,7 @@ where pub fn call_ibc_channel_open_raw( instance: &mut Instance, env: &[u8], - channel: &[u8], + msg: &[u8], ) -> VmResult> where A: BackendApi + 'static, @@ -456,7 +457,7 @@ where call_raw( instance, "ibc_channel_open", - &[env, channel], + &[env, msg], read_limits::RESULT_IBC_CHANNEL_OPEN, ) } @@ -465,7 +466,7 @@ where pub fn call_ibc_channel_connect_raw( instance: &mut Instance, env: &[u8], - channel: &[u8], + msg: &[u8], ) -> VmResult> where A: BackendApi + 'static, @@ -476,7 +477,7 @@ where call_raw( instance, "ibc_channel_connect", - &[env, channel], + &[env, msg], read_limits::RESULT_IBC_CHANNEL_CONNECT, ) } @@ -485,7 +486,7 @@ where pub fn call_ibc_channel_close_raw( instance: &mut Instance, env: &[u8], - channel: &[u8], + msg: &[u8], ) -> VmResult> where A: BackendApi + 'static, @@ -496,7 +497,7 @@ where call_raw( instance, "ibc_channel_close", - &[env, channel], + &[env, msg], read_limits::RESULT_IBC_CHANNEL_CLOSE, ) } @@ -696,13 +697,21 @@ mod tests { .unwrap() .unwrap(); // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let mut handshake_open = IbcChannelOpenMsg::new(mock_ibc_channel( + channel_id, + IbcOrder::Ordered, + IBC_VERSION, + )); + handshake_open.channel.counterparty_version = None; call_ibc_channel_open(instance, &mock_env(), &handshake_open) .unwrap() .unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = IbcChannelConnectMsg::new(mock_ibc_channel( + channel_id, + IbcOrder::Ordered, + IBC_VERSION, + )); let res: IbcBasicResponse = call_ibc_channel_connect::<_, _, _, Empty>( instance, &mock_env(), @@ -738,7 +747,11 @@ mod tests { fn call_ibc_channel_close_works() { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); - let handshake_close = mock_ibc_channel(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); + let handshake_close = IbcChannelCloseMsg::new(mock_ibc_channel( + CHANNEL_ID, + IbcOrder::Ordered, + IBC_VERSION, + )); call_ibc_channel_close::<_, _, _, Empty>(&mut instance, &mock_env(), &handshake_close) .unwrap() .unwrap(); diff --git a/packages/vm/src/testing/calls.rs b/packages/vm/src/testing/calls.rs index 233300aee..ecc331adf 100644 --- a/packages/vm/src/testing/calls.rs +++ b/packages/vm/src/testing/calls.rs @@ -8,7 +8,8 @@ use std::fmt; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, IbcPacket, IbcReceiveResponse, + IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcPacket, IbcReceiveResponse, }; use crate::calls::{ @@ -143,14 +144,14 @@ where pub fn ibc_channel_open( instance: &mut Instance, env: Env, - channel: IbcChannel, + msg: IbcChannelOpenMsg, ) -> ContractResult<()> where A: BackendApi + 'static, S: Storage + 'static, Q: Querier + 'static, { - call_ibc_channel_open(instance, &env, &channel).expect("VM error") + call_ibc_channel_open(instance, &env, &msg).expect("VM error") } // ibc_channel_connect mimicks the call signature of the smart contracts. @@ -160,7 +161,7 @@ where pub fn ibc_channel_connect( instance: &mut Instance, env: Env, - channel: IbcChannel, + msg: IbcChannelConnectMsg, ) -> ContractResult> where A: BackendApi + 'static, @@ -168,7 +169,7 @@ where Q: Querier + 'static, U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, { - call_ibc_channel_connect(instance, &env, &channel).expect("VM error") + call_ibc_channel_connect(instance, &env, &msg).expect("VM error") } // ibc_channel_close mimicks the call signature of the smart contracts. @@ -178,7 +179,7 @@ where pub fn ibc_channel_close( instance: &mut Instance, env: Env, - channel: IbcChannel, + msg: IbcChannelCloseMsg, ) -> ContractResult> where A: BackendApi + 'static, @@ -186,7 +187,7 @@ where Q: Querier + 'static, U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, { - call_ibc_channel_close(instance, &env, &channel).expect("VM error") + call_ibc_channel_close(instance, &env, &msg).expect("VM error") } // ibc_packet_receive mimicks the call signature of the smart contracts. From 5e52d6cb2a9722599eb2bd68fa1eadc89f0e5fac Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 07:59:23 +0200 Subject: [PATCH 181/402] Update IBC calls in vm --- .../ibc-reflect-send/tests/integration.rs | 9 +++-- contracts/ibc-reflect/tests/integration.rs | 13 ++++--- packages/vm/src/calls.rs | 35 ++++++++++--------- packages/vm/src/testing/calls.rs | 17 ++++----- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index d2c5cb0f7..c12ca1e71 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -20,7 +20,8 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; use cosmwasm_std::{ attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcAcknowledgementWithPacket, - IbcBasicResponse, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, Response, + IbcBasicResponse, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcPacketAckMsg, IbcMsg, IbcOrder, + Response, }; use cosmwasm_vm::testing::{ execute, ibc_channel_connect, ibc_channel_open, ibc_packet_ack, instantiate, mock_env, @@ -88,7 +89,8 @@ fn who_am_i_response>( acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), }; - let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), ack).unwrap(); + let msg = IbcPacketAckMsg::new(ack); + let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), msg).unwrap(); assert_eq!(0, res.messages.len()); } @@ -199,7 +201,8 @@ fn dispatch_message_send_and_ack() { acknowledgement: IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(), original_packet: packet, }; - let res: IbcBasicResponse = ibc_packet_ack(&mut deps, mock_env(), ack).unwrap(); + let msg = IbcPacketAckMsg::new(ack); + 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 assert_eq!(0, res.messages.len()); assert_eq!(vec![attr("action", "acknowledge_dispatch")], res.attributes) diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index d07deddc0..aa5e25939 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -20,8 +20,8 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_recv}; use cosmwasm_std::{ attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcChannelConnectMsg, - IbcChannelOpenMsg, IbcOrder, IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, - WasmMsg, + IbcChannelOpenMsg, IbcOrder, IbcPacketReceiveMsg, IbcReceiveResponse, Reply, Response, + SubMsgExecutionResponse, WasmMsg, }; use cosmwasm_vm::testing::{ ibc_channel_connect, ibc_channel_open, ibc_packet_receive, instantiate, mock_env, mock_info, @@ -234,7 +234,8 @@ fn handle_dispatch_packet() { msgs: msgs_to_dispatch.clone(), }; let packet = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); - let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), packet).unwrap(); + let msg = IbcPacketReceiveMsg::new(packet); + let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error @@ -250,7 +251,8 @@ fn handle_dispatch_packet() { // receive a packet for an unregistered channel returns app-level error (not Result::Err) let packet = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); - let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), packet).unwrap(); + let msg = IbcPacketReceiveMsg::new(packet); + let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); // assert app-level success let ack: AcknowledgementMsg = @@ -287,7 +289,8 @@ fn handle_dispatch_packet() { reflect_code_id: 12345, }; let packet = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); - let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), packet).unwrap(); + let msg = IbcPacketReceiveMsg::new(packet); + let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 20f91118c..2a00b1565 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -6,8 +6,9 @@ use wasmer::Val; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, - IbcChannelOpenMsg, IbcPacket, IbcReceiveResponse, + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, + IbcReceiveResponse, }; use crate::backend::{BackendApi, Querier, Storage}; @@ -276,7 +277,7 @@ where pub fn call_ibc_packet_receive( instance: &mut Instance, env: &Env, - packet: &IbcPacket, + msg: &IbcPacketReceiveMsg, ) -> VmResult>> where A: BackendApi + 'static, @@ -285,8 +286,8 @@ where U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, { let env = to_vec(env)?; - let packet = to_vec(packet)?; - let data = call_ibc_packet_receive_raw(instance, &env, &packet)?; + let msg = to_vec(msg)?; + let data = call_ibc_packet_receive_raw(instance, &env, &msg)?; let result = from_slice(&data, deserialization_limits::RESULT_IBC_PACKET_RECEIVE)?; Ok(result) } @@ -295,7 +296,7 @@ where pub fn call_ibc_packet_ack( instance: &mut Instance, env: &Env, - ack: &IbcAcknowledgementWithPacket, + msg: &IbcPacketAckMsg, ) -> VmResult>> where A: BackendApi + 'static, @@ -304,8 +305,8 @@ where U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, { let env = to_vec(env)?; - let ack = to_vec(ack)?; - let data = call_ibc_packet_ack_raw(instance, &env, &ack)?; + let msg = to_vec(msg)?; + let data = call_ibc_packet_ack_raw(instance, &env, &msg)?; let result = from_slice(&data, deserialization_limits::RESULT_IBC_PACKET_ACK)?; Ok(result) } @@ -314,7 +315,7 @@ where pub fn call_ibc_packet_timeout( instance: &mut Instance, env: &Env, - packet: &IbcPacket, + msg: &IbcPacketTimeoutMsg, ) -> VmResult>> where A: BackendApi + 'static, @@ -323,8 +324,8 @@ where U: DeserializeOwned + Clone + fmt::Debug + JsonSchema + PartialEq, { let env = to_vec(env)?; - let packet = to_vec(packet)?; - let data = call_ibc_packet_timeout_raw(instance, &env, &packet)?; + let msg = to_vec(msg)?; + let data = call_ibc_packet_timeout_raw(instance, &env, &msg)?; let result = from_slice(&data, deserialization_limits::RESULT_IBC_PACKET_TIMEOUT)?; Ok(result) } @@ -506,7 +507,7 @@ where pub fn call_ibc_packet_receive_raw( instance: &mut Instance, env: &[u8], - packet: &[u8], + msg: &[u8], ) -> VmResult> where A: BackendApi + 'static, @@ -517,7 +518,7 @@ where call_raw( instance, "ibc_packet_receive", - &[env, packet], + &[env, msg], read_limits::RESULT_IBC_PACKET_RECEIVE, ) } @@ -526,7 +527,7 @@ where pub fn call_ibc_packet_ack_raw( instance: &mut Instance, env: &[u8], - ack: &[u8], + msg: &[u8], ) -> VmResult> where A: BackendApi + 'static, @@ -537,7 +538,7 @@ where call_raw( instance, "ibc_packet_ack", - &[env, ack], + &[env, msg], read_limits::RESULT_IBC_PACKET_ACK, ) } @@ -546,7 +547,7 @@ where pub fn call_ibc_packet_timeout_raw( instance: &mut Instance, env: &[u8], - packet: &[u8], + msg: &[u8], ) -> VmResult> where A: BackendApi + 'static, @@ -557,7 +558,7 @@ where call_raw( instance, "ibc_packet_timeout", - &[env, packet], + &[env, msg], read_limits::RESULT_IBC_PACKET_TIMEOUT, ) } diff --git a/packages/vm/src/testing/calls.rs b/packages/vm/src/testing/calls.rs index ecc331adf..4c5854a48 100644 --- a/packages/vm/src/testing/calls.rs +++ b/packages/vm/src/testing/calls.rs @@ -8,8 +8,9 @@ use std::fmt; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, - IbcChannelOpenMsg, IbcPacket, IbcReceiveResponse, + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, + IbcReceiveResponse, }; use crate::calls::{ @@ -197,7 +198,7 @@ where pub fn ibc_packet_receive( instance: &mut Instance, env: Env, - packet: IbcPacket, + msg: IbcPacketReceiveMsg, ) -> ContractResult> where A: BackendApi + 'static, @@ -205,7 +206,7 @@ where Q: Querier + 'static, U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, { - call_ibc_packet_receive(instance, &env, &packet).expect("VM error") + call_ibc_packet_receive(instance, &env, &msg).expect("VM error") } // ibc_packet_ack mimicks the call signature of the smart contracts. @@ -215,7 +216,7 @@ where pub fn ibc_packet_ack( instance: &mut Instance, env: Env, - ack: IbcAcknowledgementWithPacket, + msg: IbcPacketAckMsg, ) -> ContractResult> where A: BackendApi + 'static, @@ -223,7 +224,7 @@ where Q: Querier + 'static, U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, { - call_ibc_packet_ack(instance, &env, &ack).expect("VM error") + call_ibc_packet_ack(instance, &env, &msg).expect("VM error") } // ibc_packet_timeout mimicks the call signature of the smart contracts. @@ -233,7 +234,7 @@ where pub fn ibc_packet_timeout( instance: &mut Instance, env: Env, - packet: IbcPacket, + msg: IbcPacketTimeoutMsg, ) -> ContractResult> where A: BackendApi + 'static, @@ -241,5 +242,5 @@ where Q: Querier + 'static, U: DeserializeOwned + Clone + PartialEq + JsonSchema + fmt::Debug, { - call_ibc_packet_timeout(instance, &env, &packet).expect("VM error") + call_ibc_packet_timeout(instance, &env, &msg).expect("VM error") } From 6996022f775333c3b050ba0a50d5ad54af5d17d0 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 08:04:39 +0200 Subject: [PATCH 182/402] Fix vm tests --- packages/vm/src/calls.rs | 18 ++++++++++-------- packages/vm/src/testing/calls.rs | 5 ++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 2a00b1565..5358374f7 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -6,9 +6,8 @@ use wasmer::Val; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, - IbcChannelOpenMsg, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, - IbcReceiveResponse, + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcPacketAckMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, }; use crate::backend::{BackendApi, Querier, Storage}; @@ -681,8 +680,8 @@ mod tests { }; use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; use cosmwasm_std::{ - attr, Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, - SubMsgExecutionResponse, + attr, Empty, Event, IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcOrder, Reply, + ReplyOn, SubMsgExecutionResponse, }; static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); const IBC_VERSION: &str = "ibc-reflect-v1"; @@ -766,7 +765,8 @@ mod tests { acknowledgement: IbcAcknowledgement::new(br#"{}"#), original_packet: packet, }; - call_ibc_packet_ack::<_, _, _, Empty>(&mut instance, &mock_env(), &ack) + let msg = IbcPacketAckMsg::new(ack); + call_ibc_packet_ack::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap(); } @@ -775,7 +775,8 @@ mod tests { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); - call_ibc_packet_timeout::<_, _, _, Empty>(&mut instance, &mock_env(), &packet) + let msg = IbcPacketTimeoutMsg::new(packet); + call_ibc_packet_timeout::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap(); } @@ -785,7 +786,8 @@ mod tests { setup(&mut instance, CHANNEL_ID, ACCOUNT); let who_am_i = br#"{"who_am_i":{}}"#; let packet = mock_ibc_packet_ack(CHANNEL_ID, who_am_i).unwrap(); - call_ibc_packet_receive::<_, _, _, Empty>(&mut instance, &mock_env(), &packet) + let msg = IbcPacketReceiveMsg::new(packet); + call_ibc_packet_receive::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap(); } diff --git a/packages/vm/src/testing/calls.rs b/packages/vm/src/testing/calls.rs index 4c5854a48..55df5a196 100644 --- a/packages/vm/src/testing/calls.rs +++ b/packages/vm/src/testing/calls.rs @@ -8,9 +8,8 @@ use std::fmt; use cosmwasm_std::{ContractResult, Env, MessageInfo, QueryResponse, Reply, Response}; #[cfg(feature = "stargate")] use cosmwasm_std::{ - IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, - IbcChannelOpenMsg, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, - IbcReceiveResponse, + IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcPacketAckMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, }; use crate::calls::{ From a2690da121ebf2185ad8cce8c0098ab614ac382e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 08:04:54 +0200 Subject: [PATCH 183/402] fmt --- contracts/ibc-reflect-send/tests/integration.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index c12ca1e71..9c7179639 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -20,7 +20,7 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; use cosmwasm_std::{ attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcAcknowledgementWithPacket, - IbcBasicResponse, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcPacketAckMsg, IbcMsg, IbcOrder, + IbcBasicResponse, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, Response, }; use cosmwasm_vm::testing::{ From d84abf386b50a5edbf36ff8d69a7e2a1bcbc5f9f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 08:51:14 +0200 Subject: [PATCH 184/402] Update vm testdata --- packages/vm/testdata/ibc_reflect.wasm | 2 +- packages/vm/testdata/ibc_reflect_1.0.wasm | Bin 0 -> 268213 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/vm/testdata/ibc_reflect_1.0.wasm diff --git a/packages/vm/testdata/ibc_reflect.wasm b/packages/vm/testdata/ibc_reflect.wasm index ba719aa98..c5b6708f3 120000 --- a/packages/vm/testdata/ibc_reflect.wasm +++ b/packages/vm/testdata/ibc_reflect.wasm @@ -1 +1 @@ -ibc_reflect_0.15.wasm \ No newline at end of file +ibc_reflect_1.0.wasm \ No newline at end of file diff --git a/packages/vm/testdata/ibc_reflect_1.0.wasm b/packages/vm/testdata/ibc_reflect_1.0.wasm new file mode 100644 index 0000000000000000000000000000000000000000..96a1feeeda26ad573ed8cc4ab3b6eacc7ba0b8b7 GIT binary patch literal 268213 zcmeFa4U}D1b?13M-dEMDS9&GMwy+(zui`Z+ujN`O-HxRgCatSRw&^&H!+2)g8CKiI zR>zi&!NM@mO9k1PjRTYT>(V4i(w|E&x+UAU zFWskqlUwqA@n1?(3Q|34QOb2&Kl~=iEnU0RO)p&eyZ8IM)UlWEkCiA;)9L-Ubo_nm z${yd(AMWnAmU%C`UtQ++>nHp1Y&PG0&zrlqzxL+6yKlWcY3r`X-T%J#&ii&Jscxt2 z;p<-i=G{pvzWm19ZoMbTG-*TT<9o%~R?R#&2^R0K^dHb!@x8~-oj0&&6=g!-B z@=tdsiE8@0cf9F!x875g4d1x?wm1Bp@4D))@4WfVyZ7GtPu}XCY^jU)?!FC3_TK!4 zH@)_*-EU1csHNH6xBs2*`mXQ%?y)+XW8rIWz3;X=#vZkA-~HM*{h*JgfA5=i?|tjd zx7~5;o%aCm59LewAj^_0>vp?omZq&F?PM7jY06J0WmdB^X>~H)W?g@hw)86h>M?&> z_J?MYoErWoHjxhUPSQy-{_iAq!D};Vzt!rs)LJ$*J?v&_t3~m|KP|eZn_S(~A2sYh z6*_cTyVdJ-v#Cxeo1U7U&N^)XZuNNDVlCv>D81 zMv>06TQ-EG?SE7g$ij^Pq}!fg05MsXgAt1IB3~ox1FcST<1mkzO-CgI+pbJCFTB~{b>E${g>Is&g*u+ z?)7`$nkD@^?|I{Wx88H#og%z@+Ix4u;qJF4Z)n@}CVPi>zV*W2~+&D z*+wCcl7HTO>%Kc*xBK;Px-Z$+yY=q7Uw@lg`Mq@d_TAOpiF9u7?t9;K=ic3KyqN*) z{XxC*$#mE(yz9<;evq+iYwDvGCXz8P-2_2%98+@7cX zn{U2j_pNWZ`L(ycad)0g{VDTOru}!ObC)i@>U*zvf4cRz)8Ea0Ec=Jof8ULtN`F87 zf72(@|CoL{J(+$c{ZHv<(5ryA zl)h+x`i}H{=`W?fkRDF2|JUgU(?`;uPG9xC|0?~1Z1Lgr->2Wmw*JE#e4(x^PLHIA()Xr6mHrG;@#oW5{b73JAE$rB(^vgo_Vw&l@62v| zSN2f$_Vj168-L)Y1KCex|1vw2y)XNP?9uecDZcRsK9c=E*{^0F&i;M&>FiV4pJ%_B zoy=~0BKvIiN7)}|`}5P;7qb7F{Yd_!`SkDqcdMZz? zep&3fEb0Fmq9n{vepy00X^{z(^p%5ziZ(a%X_?+P-(nd2|Gk$m%$^|r-b+TADriRY z5}=0aHZQmADXoWG9c?c1BC)QAJfm958^b-r|BW9*(ujhEtTh5hyjG^yh(2}=0Ha8U zzlKZ!;7kAu7zaH!&^Ppl$9Vk7LDt%r-w%q=ctYxK>sBF#c7?m~Kanc9?07#^=&Ru0k#LD3&wM+Oo<=LuQ@@lq1{_Gw05W)!Kzez35-Jx#50^B-NwzQB zp}(4;n|y|H2$31&#j>>*`mn||OHBIZ8C17fw2(2=(BPY9V{gJdO885R;0g zXy;V2XE8}kGz1oEX{u7d)>P?r<`BNGrz*8lrfR+wL_%xNyco0?uNuc))wT%|#89+Q zttQ$6-715(mS!adZ*8X%N1Am#-!4D-L)ENEbd|r)J+Mo*g!bA75_A}c5~f0<(NqL% zH3k%>q6w5q0Z=}*Gkvx3*H)%v_?O1nVS<>Qu^D-JV@ASs+l+`Cw=yv;o0uz&No^Xg z%C4h0V*l#odY@7LJ6#e|h$rZP}I7Qa>&NL_prkZ>g0| z(S0_pFl49&7#EZ4hhH<;>RXb|7;(A!&Jo9`D_}{V>RNP(iL0Oi z1%Z=!SUgo4XWV(N(r z7%phv=$OG#I!U>$xgDeGW;-U4Ayxyx=yYB^&ZFGgQMq*>a21+K7nR!=Yh|X|<)3i> z(!`7*YagKjjerBSmWTEOI_FzKqH44v^HAOxaG-QOh+^LDsH>=vs8D4HywcV`xg-*tjNmj|JV3n9SglbKtf{yE4SV0&XrZ_-CSIX4H zbg*8S`c`dRJ4i0(zHUSv(L{gL zHtV#242;04#!&3cjnkG-m0)D{jkbWH6m1C%gU6N&5aT&$E7;ghTk3p;%^qn>fQq&< zNF;XP0}iyM2jjGrOJH6BUMqpQfUp7K5~A3!FE`+GcS3D=w(=e zmP8%-7QG6^xWJU`6Mh^piM1{Boo#uqu+@Z9QPHVsY9?#QG?DVSOoPHR6QvTmn0qWe zeltk6t#{3LmP8*gQ7d@p&9u-d(#-U;%b-MwUQdiuL4O>`$};;c+boBeF)r6`Pb>ayX^T^ zshd%r@6e3gD?;(f3hNd(Zhf-!#3oCW7bYvU_oF#sW6+XaN_9cXC6WuAi}p!mqpuju zLX<&LyKbh-H3D6avN8qAR(T6Tc98T-Ca2RE@MUuC@Xux7LeCQwH_jrbYx!z=e(0DM{+U1VBpzy=B4feNgtcFTlmm3Sj8huMLySB5Zh zOHY&vug%P*3930JO(@Eu?HFa?UWAR85|Y&AJ+H;R;o% z1<~V`DwVZ^mNs(N3s+jB@|JDgGe1xVQ|3sa=>>Dvsgo;4)A;Q2qAjmi7hx@;&7eHJ zuPa;aj%K*pZtYDM1F33L-t>rO-j**EZ8%u9`!Ehx2X`$K{5^&;46`(4`87-^R~n@VEx6#UD6D6-g{I#7n`yxu0~i#W7Y_{W9%P zJl`!Z!0%~`T1mLj618z87TK=7=2sFfXtWC^ST`mbN3gNY`Gc#2K>&W4=(*OFY6q{8 zz!SPO0Q9ZB&8%NV^Jd&_0e>vd_y3>R-Wtr7J;N7Qt36YYn?bQi(EeedL+G&o&Q3Pt zD}*Dd)2f7QAi(C^PPLiQExNSKuF>jO3tn7jhH9oe(=u{2&9AQ_jBYO5V??uM&!{V^ z%lTjQwizVxGsGE(bhp;v4H0~KFx_Lk39K40=rU41z^s)^Jj==h>7L=objt+}^49Qc zW>O!(MJ&&)$T52lOa7nZ9bxUDetTC@#xGPvQ-W5_d_v7I4c7^prBv1`j~22A?Lt<| zj46Y&vTw`%sU~E8;BY~E)R^6tzoF=B=B&71%!(eZ-&?%f*Lbftsom@6TY?bAVwQ~E ztu2^}`<^qcYP+`DI>X#c7%ZO)HD&XFoymF0jaeJprtiKS2iBh}DN?X1iRsH6)rf6G_zsY_)D%T3eVr(U12TIm`M4 z8zxqQ#FB7J6fH18aU_+X_-d9C2!}kE|1IPPnVs$tIPDRXY^`p+rc&&E*s6B(fy-`aNAvD;UY4_om#zT!GJcN@?wkA$TPP!T;;6lZa#d@k{ zG#sjm|E&Wp~Hauy*9o@nt)DfA&`8UCrRwz%}<$_6%4S*2lvw1JHzepsidEeX~jkWJVM z*QRWw8?BFW-}Qq`cOXbXC*bRdXf@;%nFhearF6ctYXBW%00YZIIRdq@U{#ymx^*WO zXM!~dBn=S&2La6&KtS^aeMdz}esqIHovgDEoiZJop&Ov&k7sEf)`o;QRi8 z0SiY;{+OUONKyEx8sJ1H0x9tUIS^(rdMgJ)uYlbZMI!w>+sg_pKdc3E&9v`}sGw2JB!7Zg7mvR%hV#V90Pp7&hABR^WT z$RzMYC59%JE;lPu7(8_IP`@jBV+0yDHffm|9RhYB!~=WL1uB4+c?%wYNw#rc%Yu3+ zM>ig%aD*wd9?%B#DJ}9$S|r*10%kGU4+-2W%4m%`q6&)Mk(PgvC@MM|imVdUnwvuN zHonO1V)9_h6y&AU4Fg+B=cmL3%vZKUfAz{+)V@Zzn7q{~?%t6^G@@E-sm)v-_sfmB zRr0F#Z$rQpt@%NDg;;1%{$(N-=xSvHbx#2$9BQ`!J@nftu~$xjb59|d)cqR_5|q_q za<8!f0M5{0pT;6Q<>NnmjF}x4lptuC61X8RAMs1Qht^T4*;)^4y*0OMu(6nt>fI>I z$H!$cFQQ?qv?DIESNT^naz-uFiFHN~APRgQf-~JtlcM68S$w>@kkNBi%mKVQMv3nl z%oTmXFgMgdbpU}=`}^26oiQe?OY;A zLC%qMWY+#85^>xgPDOEsG#pUEt6N?Jp%en{f=f((T7x2b&`>t&ITb=||7_1}i(H?S zMZ*0=F1m4Me=NUb)PrNnw7ef{CP{Yw!RJ2wi|_yClOK8}`F$RxTXnlYN7Ihk##7;*}CXp-yE!GragNs;nlzcTs z;LrH5arBzm&uicY!ZzI0)g=RL0+{f~HMmkL`QZ5f&W3oXCjfGo8cHg#PQ$7uBC(iU zLEZW8)yY#7Yh`qbUo8lx;mB-XX{=ZnSK{X8{n04hnT#&bgz$Ue3VGl{B^BcnRyJwS zHffMM`w!A`YGy{Zp*%LC8U@nLvHp~;VWwRwK%4?WU9v*rO@rh`zT&$e2KE9cdpLGA zPNwxJ5yaFNF01^6#7S$7m1nf-^7(G9=0A7aJR}Xll7HEOGN8lnTSLxZ+1X?lJHGr{&zjY1=B1a%N+Nb3? zsl|U&!<#@%g;-vI7Ki!;-=;@UwllJJDSBAz*R{ZG@5>l~(jE6G;q$PinbdKFm#I6S zFZmmYKGo*PiOL*V$il3d0|tv*at*0x0u2|IxQ`{ny>bWR%;^Y`?P6wNOAs5PJUliq zFvS>`X)>F&enrZ`I$GC>BN~k^+i~)F# z!Q3KwjR2_4)mt0t2m?0Q1Ne4=K3Ys(BYh+Xn+AH*{05;Y8?~ZHQL{IMX7L^dEBO1- z9MhDJdZ4r4R7I|9mYbu!${cNpjO^CTQM=vXl236*b+0b3Q{c zRfO?C#RA-`Z z@c}B&Cr4@01|nTCHC!%97l7G0Xp|p_ipgi+#_>%+zP5bc0JJY@vNvv4Sz4wj`_a1S8Diubg zh|~=25le{a51HH_d3lV4GcDHeD#*bBgA}@iSy4<*w2)iWb1m@HJcnEhdRvic z0ryr3Ta%I-Jf9|pKnlig!4WyMHfs%Ok{|!jx>51e-&j<93JZ5%CLhlZaP4J@XD!I$}46M5h*-`@%;9L-C|Ohr!z7CwNXAEJKjTM z*@L{iVb7yG|2lp9sGZZX782?3&j3n5%<&L7tfTL9xWej!mMq?4Zn(A@j6IPYurt{? zy)zlU6QY-U-Ton^eP{COORy~3H)#3O0Ft(bdm7D=qGQcBl7 zNA`dx@v0C?W%fPLI7&qXS0MWMS#UpcTTL6ziA#M~kt?25hmkZFBh8NCq<^(<&+NCeR7}tHrX0O8R$y9R4U4>iFRHWznWWAHMdr@VLlnmnGjVlYQPzziB>0iS3j|OA(!iBZP~cinm4ERFJDsaf;MSecs226kq}MMipA=JnsnqlXW3n#Bg4O3+!_u z95&Bf{7WYZFOv15ME4-o*rvaLZ6^af9Zq_u+g;6)=r8OdcRH8$U zd0p-hQzgQ<=5FN@86JVgiJBhyN`t z>it2=aj4Q-hEm^z`jkgzp~0NEk7er)S^3dE@xMJRceQf{zA|}={Wj!f*x0I+55DVI zLKZF=Lzd`Z1_4_OoT!b%vfH=iBoIK`QIafVx2zL}tIq*~HrZqdYNaw;%WiUzJxeig zvSey*ep1b=$_|IxlR#D$Cg1rev7e4`S<|{^Rsj){0}cL zZ5>Vhq55eOJsyFI=tT)e^nba6=mV6rXHjy`x;CU^>WRV|LF}T9lrIxY*fMp*y5jxA ztnbG3#9fet+_X_-Y_F~7;p<7AJin&Bwrgo;m2~Q{jUtKzYNJRuZWQT(DHU3#sWjJ~ zonQLx-}%{}e)==N@~5^B%JQ=%qBJ9#83HHu?f~7#?0tr0+4~`*voXSuy{`vgM7@M< zk4%m7X5B}p#+@?KW;QPNF2Y43AXiqHy}L{TAc9Q-Tnz{Z8BDvmW&<8^vq)?+6L(gAiK!%^EniuYKS(~(*;eNcG-@l=`z@KQ!trpWh> zGFaIPGs8AG+s!~A*LN~lyjk@t-bQ*}%2unAg}0|Yhn)XsQUGhs@C8PlMgu1Gi@5rP@;rMFkYLUUUF z8TUa@2jMeaTMbP!L~Oaf!xDlO;`>R>YQUFm5xLc^h8xDL2JF#uTMbC=#l!-i!D_e> zubr%h7A(94qe1%+lon!!g&PhsA-v&HN2_l)9L)057Ng2=kncg-)h$0*O(s{+uFVZ_ zqG{SAn|LX!m>GHuLxG}$;UMA6v_wX#42PR4!{J6Z9MqZ{4*$2pdF}>gRc(mjLBc9+1cq1B-Y5)jmRf`18QpbelK7Ty*nZOM z>tK6Q5DdnGa9+jrasYo*IUj8X=RcS?PkNF0tR=zNW-nh7=!qH3BIme52eoc@d0a-$ z)H29sR_6-6(AcD%^k@Lkit|GbrZsnJOY#YQ%KCG|TuuS&R;G2et5IUtPQ`gPo%*sY zap!rnbMsP3z~UE|fHlqNPPm#tO#-iYLAn<6Qq*S&!be}Y1YyE)-!cip#84BT`6T89 zn*g$mbdT__Hz)Yx8?)ZB4KoNexyULfR3T5h{6Ji64-O$)?}(C}0=0U8Qu#U8p7w@U zDlDUDQE}UB%q2y(tJ(@lKUzhY1L9$VMf+1h5n|k0;H;_N+7q>`TXRFz**>=C%t2bF zNU-rtEWd)MJMQA4T=lkSdKjw3!%R7$T(ry83HwjNpiH#71L_cKFZXe=t&JBvp{Y5x zY`pD86SW6w-L0TkbaF&be#OP)My&}$PPw1wv!;VB!r=p%mL@kUSD|jh4j*VX;-1tS zboc=MvV04N4^XETbYq5yUR!bafC_8x!hEazZzC+FL8Uj#bzX~nhd^S%n@+^y8UNF+E!+z&<*52tKLYMT+l zjv|bZsiLzB^kuSaY0TcGcU|_dKsXmit_v1>GAhTmfcud-dV_cAM&)nurop5@(XP2gAa|GQYE|^6 zwmjGZ!~#m*KG=->n!jaRb~hq`B}lZFim7OejP0k6zG#m;#QF+L;oS`(2YJVgP&Mnz zxU?-F0Bb0-EyHUzx#Ey8xu&mcUw|SGLWzkYv4S6tbe@*XpX9MSyZq!nG1AxxGg|7|fSM=F zq%v&qglUC=*cTw~)DrdP!K+|wQgn1&gOjy|NA{;U1;Fot)S?^<*}Lq}4&Pp8)S~AT zq;UQgRf|OD3PDiBnbXYIf?7$o+U^j{5pl=m=%{UE*JKzbQBTNwk7LKl&Q`!Efkva* zE4JlZ)$b0YI+qj$B+Dq}jmO2QZkjbNBgU>8h1albUj%{;I;dbsn3>|8rnj%*BdNF*%kJ;Hc&gUA}N119GhO-E?3nZ*5(6eAIW3_Hx{AD&2%#1Y$R7zVJh=OLI6wO zkNxzqr2IUUB&Zad2$2GEvRMXvg%fVwjH>p?SN0RMTUk(|B_m>q@AJ;qM1#pfLCp}} zcDT$j-N12^rj*1eIyiralPo3m2eZ+`c{|c#WNjU-q(jRG7c-5qTXVuaIA(m2u8A*l zuW_z6S0|zc$Lb0iDm0y9l!+vy(B0So3Z*I-0e$Vg5YW}2amQU2+LAVnVK=pBk}@z} zYg=AWtLD2_GdP7^3CY!4O~0NtZvJc9|1U4j22PAidEDnm9o%Hu@HY@DJ4w@8f*n|u zmrI#Nn~}czGtTVd_rc6`j-CLZWQaXPH<^&8IE0tYrrXae2xXGXw6i`aj9ABk$aZ*x*GI=t4bo2uq?zFZHb(0Z zt{`PTLbnXI>~W2VIXRxW1bFJX~Y&5GeN4 zY!sWFI3{@4*GrfTH5JY;GtbYnZtl47gk}WF#pK~^c-GI%eBlRUUf`9zYw3T`&eXLz zY|h@}P}Tw9WN!p$TR&a7Y(imQ1z~EA#2bOiofaTwlL1l`B4)bV#+(8Y1asI=8sP@Y zZ@>k$H($~KPKN=|UgJet+LoWnit31tdiKw{A#3J{b$p6f&uCE$kV{#0G}(i8sH2-Z zMq-G5_Tbu{kP7HCXg3Y8WUt6PSyn#@-XnvThy*Yg9`5z{{WsBQ(( zCH$gn<%)U_qZXj7qBSt=JorfkN9}ojCOki;+wyD{@&vhNk#48caJj@ocU7vUmI!(I z7-LbiLM6B%`1d1?l7m+Au`w)aN#n~5n-At-$Y_O^{WhuQN(RBqFJOk~QrT#5K??y%2iwv) zeRZNeEXrmlGcU&)MwZ#88tyzxF6?X>jpX8FhPA@gvBhWna!^bw-&f<0e_4It=4C62 z?d#Mwlxs-NnpUCqb+S2gS_f0fg|9s*$!MD9SO-00!LLrWvr~`=3Z*hvJ3CuiE3&nh zDiY;p-Wd=3F6CV3tvsI5XiL3Bi0xQJ;%h~y1`R=O&`=N!VrErKsm2}#A3!VarP1NV z+Dp@6FHP#3|L_4v@Nn;jy)?e1Eatee>)r~&fIuBpd|&g?Y-D?A9%J*8Cgn)xo|s26 z5u$5ab68jl5wH5yF$zG*;WTAOZ?xmcd@l{kA6uE&U)W2-A(2{^uY3#1VQ$briy)vjvJ9g7)QPjOnut+h~Z0{ zgY^kjq`#UNPtOSRqUl`7K$-o5GTRFc%6cyDAxIE>nO-{MuxkEAB$aT9iU7&OYpMNP&+kxeOjlp53l+#p3k z68B&wNYPsOAvuL@sU*oIO%Kv1)4Sv4VLgt;hpT zFl^*cv+0~&X1aeQo98r<#4LLKiug74jE~CFwvt!O5qG+_wD_qtSJqaXSee8lah7s# zV!z$cFYZA-3L8%iB+{I$OLi*gk?k5j2?BJ22#ty~&3WVU%W_chxk!E?;syx_H)*FW zYJES!u*U%?qfFu!qyKGjc!`-gh5{RUh8#ykRObiE1J>dMruKc><5cu^?bSXf?Y9$} zoSr0r1Q7tc40;?HMK^Xyu`7a$;Any*QmDRBj)cKTv> zCG1mSeQzhHOihNJqv4QWfWDWkPCFsapmrf5fc#{Pa{}bE^*n? zMu)gISUMOoVGo%m{b8hxzXBB)%B0LXb$v|-*z~jK44a`LH6pR1R!pYILi!<@f{Rp< z=+Loi^IEUi^h`D~0eC~0bj&K_bYP8~{v3^~B7>$7Yhh^}T#6E3Z^78g?+`! z5C|09IAZK|da8}g9d#PX%$)f7E(CZlWCf^C(E z;$lYS%#xiAOBKVPjYjaN>TWSf%qBy@8&I}$hTLdDq_K2|?26DX91CDhnEPVd&d=x+ z(>gzcuC`0s37=>gKPSt8GNJ_?;V4LEuNBCs1Fv-?_oPmd*-0)!N`lPxbK`hb^3OA_ zMe-wBFK>Y{Z4*(Hd)nNvcYsKRbwve9+`tEQY0Hjq)(FfqwPO&q9U|L;q}>gA)hONg z(a*h-9Vhi;`C5I^o~8#ARq*8+h7KD`Z44w#!ZRUN+Xm8RfMa7p?=hNrVl&zdMO#;( zgej8{ucRh`V=OcP2YdbRFipm2V3h&m~1d5Bf(M_|LNbd-&p+F=qx|{ja?; z+fLePmTTh>gQAXl)<^~5UL-9JFT0jr5-h&@4rkEGR$zY!Y;+>D z1kj10i_Wrj!JpRf+ZwKJx@ve$xL@AR!V(N}zQqCxycBnd@dSL-&m0StJ7b5MKfFhUUG}{m?=d@m2>X>g3fPOiESAIw%`e3uh{}Y#T)*y$}g&R_IMMw^hxP z1FDmD6KN{7M2LkiI1y$N?_&~(yoA?er?~+WOF%Z()C+`?LJ(d$4P6is3E@oUXz;1G zobN$;M2A2=#bM;&^ikio!16i0p z{J^Br%Q85+RKRXB*CLGTYhCkeNX*%~(JihwG)r&T*_o>9Q~fGU5AMC%M#c6Yx~z021@y7+o%rgRocJu!cYeoyCQh-Ewf)k zO#!cxN7|k+ArW9gXgQaAIxF9yG~nE0cd$&}IEY;?ZUvTY2_v-baG&&=dtDh{4xN5k zowh8d#;E*292%F>%(bmiuZh7Ltc^p%2!aIwvLz@?AjFFvKLvwu0YO(M99yEX*=De> zswcc4zO`z+k2)}VntN3g11Z1! zPG(`I+Nxq@Z-0ogyxOT^We=zrN)C_G>m(Yr@9u~`Sz8$iY3w#m zc@DPtCxwh|#^kPISc(9d>ldU{2hN0L8TumkvofRsE)-D6FWfIukhvt0I%{;Ljk6|+ z76i*?EvslW>?vtB8n>3r@QyJQHlfdk?*sERay_xkNG_PlbFlFbgQXCHN0ClOk^v?j zU=_ILK36cYrdl)xgwC)`T~_|YI}CsaK)(x$fe>W8Jekix#)7-Wt^Q9gtKX0X=cylL zfY$WpyfGPoPv2z#xjdhL0MMq5$UPvw7BMgeo~(cne4v@ldxjT;QLY_I(G8dZ%Ee@+ z8Ba%itq!`r!d1G&UuU1jK+F0R`D#6F6SItHje$h8Qk=lKCbcq_>~Fpltvwi!sM;tW z&TA~qmEq$3>R`Gxce6U#zg=YCaqR`!Yh){^CGQ!<2C`hw@K%t%6P3O{H%8^yIHI=6 z8Y|x-DxWL{A~L|12^L^{1y`=feE*EKy+XuPvo+x0cv9Z1jUom2fdJwvt~}#DcI)~6u%*ABCf+S zVV#1)4%r4g2@2}-`4Z05GdZ|631Rh@ajQ<)H6fOjpVFA8*E?p_e*woF!F#r2w))G* zj0Yx+`IncEc|gSYyu&%FT7zdZg|TOo^&gMTFq4*&wPr$VHUk)ZCSZM(VD*<{W%hYt z;P=WFp82LR@JbuuH+~cVUR0B@QVP~%BRr}4o9p^(<1K~x&Pz8T0Z(@AIw#zsh|4ET z+V{MDR^n#eeg1b=?yKsYsL!HkU_XVF#xiLweZ{(RnPJe-+$Q+~`WA%9pb@W5v_La4 ziz)vuk+V+lXpK+V+M2JLd5@YQ>WVQx0sXHLD7CiI15Yi zHQ4ej9AvMpW&N-&Mf(}qp3A20{M@Ruwa-iWAC4CJx)rS*-5nHdZP>3{N;jK%Hd1<7 zeGImt9bUX20@-5_p1K_;y!|B8uE7qA$|(kI!(4&8I{tKsIweBvkxB;V1owgIH&)G#ESL292|20*36WvTijogAP9^4t*b5Skv=Z7 zh%c_W&s79LT-uw}O=L80*`{m5>mO)=-fiHucGj&}a+xE|R?rQSWX;l$}KCx@CB{!r#-_ynoDgV0pt`xh0ddq*y z_!p8yfkHVk%MWvJ&Kf%QpktfY)Lsl6#*@g@+GrQ~+=ri(S~YYrw{e$}wGUg4tpLEpU)!X<*IG@|mOf{-W- z9^!S*=U6k(em<=k$6zg7?C>_j;0FX>-0-w!Geq@YKnzCk41;2SBc63zYu3#2p({aF z8YC-!-lnEOJfzUPkfXAmmxH5(s)?@tATIRLnRCB@_Bi(o@X)zmfJE#C(#Xc0t`P=9 zn!RhLBhH^`k$Zdn-Z<=^{kVKhsWoO1_FGCD+HC6L<=qVNx@- zcS+9tuxANZ((ZflRiQF3J3< zdbDp2@byL8i`22bNDAF*FOt4EnOA#}NR%D=ZL7-HjXlR5NC5pJ-Vx%|7m$;oks;0I z^}~U~?zs0P;_KtVzw?}duJBBv^o#Ar<9^J(<+Vf_l$7vO&rM?}mv<^|K;pzp+kn(# z15$2>+9-q>p{q9_ZS%*SU!3>>~4% zynE74!Ijbh&D0_RmLYKBG20So)=|*%JnGXl-pGq0Bi`b(x9I)rA_ADA%kx{5t)j0( z(*U&`V}9a1sktpS@K9yDRU!FNxi&UX@=t+P3Ca}K`*Xx9jU)E$2zSb2MmG_8O%I*; zfM3o>X-II+M#f?!yCDx6b74j-&J*&MFlW^a=`@h`JF^KNaUoQxWME{gCIhq%|0>IN z$Vg&B%<9zj+||i<@CHk*xTEn&E~jNJ=R4W!qNIltKc~Gy*jF0KjnaW)DLXfg%kSXo zCM(q0zZ`mMAxUy~e7lfQzZKf9aeZ=SyTB0VScVZ-S18XVWSvUcIT8AnB_l#F}qme>$C3%26;DtW|e^ z_~g6a{y(7hBa(_Etp=qweL$a3S<5XHIOU2DWo` zBfn3>o(`FIM8AfTL+=uM-ehkfM6b&3pb%kSKK3(AY1@(&KdF70;VVg2vh1VIAcG)! z+hvi)O~r~2?JG&`AZs2;lje*Y+1}3wOtKVW%|)>Z!nexJsirV3LuL*Wg;ZNMq3KJL zr2O*d$Zg4eUc%&tES)g9MlUw0#z)?Y(?gitLk}I3Ypa^vgV{1@9d_sxc`%)%Q(4}g znwn~%)6z0H$OW=!KcukHw^BU$x~zS+(L~38`SlNfwj-TscVGMU-}z#P@;2o*H0->z4B<4&g(jnCw1Eqo(?9%^Uwh=>ul`}e=Ms4+61OaX zvR#pVXBDzPY+;QWGympaXW5p0J$>Wp*i77ebZkmS!~Y0+9-rd)K0_Ay%Ztgesh~4Z zn*Fhk z1#+dH?t81J`~4Ao9yfv*p&Myl?76i_e3jAP7!fYpYN2Pic9iJYLEvX;f-K6)L#iE& zwL|zK!yff~Msd)^%M)`Oc9H$vNy|5kI014Kn^~hJw)#s;3ij(>HdsAag z{m#_O(i7UFrMWUEZ9u8aR|DC;WaltP@6yCcaCm=rHFzIyz`LNSV#*dW;BFh{%7aw2 zuQ)TRgH61$Hl^sjJ;$nzkRtnVW>y}sT3=*QzzN*6cfigURE77bjrp0YlSim8nR-}r zu%Gv%Nx9#8fiHRc9X**`sw!V-l9}^-U#Oau%}F7>yf^AE?BKg4XBnJDp0(bJOEVUii`aabDIy~D?M?PjsB68 zP8b78 zvw2si2W-B$++9gzt2p?JAsE;f&w6AxmIGDRQqClh?4fhjMZpc19r3DXX zr%ZV|@yDj-fkI5LG{L!x;ZL>=%h2_?!8Oabm3wJse-f+`eFME0(N$R``UZMW#+zlI z${J&eKu_E(Tz&qW&0*u8Kkr%xEi4oMNFFpAAE2?AsPC`v9A;@G zQVe_sXEDbsSuh(W&&DbVsSnV@vh6*IWe?IirdxfaQRh@(DcG01TQ6+-;;i-yi-xsB}yZHt^z#P^4aK zLG682-M+0pBOYAWi5P+gl?EW{`DTuY$ZLdpqH`0OUpPN9wMb}UW(`%qjF4GjW(`$X zSqPc7x)w5am4Q0`Cb7g3LGVA2Wp>_LI9o6oOxd2tYk zg1H-K7b8D2SfF2rVq1O^+E#y0^qkL7A5^?dM0=ta3==gdec$*H0h_eUae#c5aw|{Q zOo+T&Ouo?d_5W!Tn;fqOskRmqj(ZU+K`IQtl%nlYs3jo)y%a6}vJ@qIvF++ji;LOS z>&>5_d08w>RLdFqM9t+LAcrm|{uL~r>@p7L{XE(;9oN{R&2(rI!Xy>USshJd(9iFzSwMmwGSGdM@yomhzsI*&i+u3d3-F8RlT-~b6BisIvooO+cY@Kr>@tX^^!pDOfBT@Ufr{OHx8fC!QK!ED&phW1tV4K7~~Q(wAYV^AN5 zwX`%RJ2#K?ga);Lgbh5;FdcTjnSSZu>AuO(0OGefgxd6@CAPR<7DGj%fdc|pu;;kX zhoc;|*y=W(nK1bVk}0^uJsWRq&xY&XRR`-ZV9_E(k(CF-q+?x}WPGnABjkP12ml2q z^I@ggD5U|VyD~)W38}ztBEz&?kn=`Z2O<|4;~X%dXm+eLoH~1VQ?yeQSZcr3bJ6}T zgR5Mkh+*&V&d<1L?>HH$l_hIfF#?un($gNH$s2UW%atp^?U3(}x5YDlw?@U&8FU_@KCS`G`I+Jcg!ww^G>^O#>sl|qpL zpMiij>>3RD3Kqc+vSK-R5yIH$N&(GL3~RkHUF!|j-hLyw;i^SyvQEtAf*3&`>o}Mon$$ zVk8#I1a5qFARSp)U zshlZPPREypryGoPS~zl*<4>`+J5l9WN#H&S-%7tW0J~SR!o@_TXR`8~%&1XC1RlbxKNBqQLo*E} z^ze-M_VWDj%<{>eEfCj^e#fNgAR)?~9`&p?(Q4n?cF_dE%$i!T=cd^~yQw9l#jMYK zg)8Z`>1vFjc*Ky`Fvent)7{pu%f`vqtHY{qm2noDaI3j&jP7fjJVs&6hgc79W1uQK zN1x$MyY}{0-M~PK*6_Hzl(eM`@~d<4t6nbgsJ|MK}gAjSxiov z9vf53pXoGKT(w$0VfD@HaocHG{ZLRl? zTVJlJKcO)UM(u1zKCY_`C#?|G0^91 zA82!Kc@oV(wbDMAB5eSL)wB<$T!)R@2k`(_(}ivy;H<25o!bXfO?@c)puehpFca+q zJIxjC4UDo6X3k+B^ee6Z{MZK|+3W+5Z1%y?zMeHNE zk%#RDWe^1?m%w0 zuxBjBbSMZ_SOz(I$dvk+J@dZF_RK-6XZDPt^I%72nA-R`wV^<@*)yDLXZFki-q+!) z-p_&9PsY>&FV)`NL5j?b!Xm?kM{V3-gUPo%Q!P)85y zSI!fKfjOY72SRVzGe58cx;E`9HrZLAywkUL`n!au(M81tI_G~gWzJ4#F%zQmg3A}V zbLD9+FZ4?-yfJeVWCkwzVvApDeZI*raotC=OcvTjUMdUi0>6}n7K}2t(Ch?6x6s_P zqga4hXe7owXA8}OTHk6G+UzP8+Uz&OLaUK%78*!43vDR~6LHg$7|gA+2fih(vlMg8 zd~-xO@!num@_$Hes){^-TCaSgmP2tyk6*R^r8?%_w2o`n(Z4g|2#d`RgY=qp#|(}f zvet1Oj4tB;sbbcoS;rF)&bD1n3WaCoi`81D71pviOG7L|fk|a~__|CQzgrt^mN|rT z$DG}$@u=@Ax39Z+a0VcaJEqH}n5K%s@b9zmMb_w8cazJdKbRf6xylo8mUrCXL;bjkN|X!jD+Dg7t#DfTAWV(TX%^sn5l#bhJ3)wl`jxvJ1uA%IrV5nW7 zUr@GLgVq-ne8Ch{=*T&yM#W1FqTsx2n!A$?L;CDn5YHZO34Lw~efEWcxvI~gbc2Z< z@dDkG0Km7q&W#&qCC5r*eUPf^a;z|1Bcmfd+!~S({C|<5)xdmF0MkAI%e!-q1P3S@ zmd0f+mnO`UuX2tswF6hDxY1%D9XDEVgDCv=@Qjne8Z2bZP#|5=GSZ?v9heY2Bav`S zw>7fGobIAWC+cyVhCNZ3j?sA?>Cx_ElbGMz=mCWF~rS`v1K?w z@0SAoRL91 zM2F;u+f~rA`6S2(Y0gcxeQTD-1Y2#nQ?k(#!eg>yGR>oF@_dfTAa0g9CW8pE(sei{ z+tblCIl(cBxC^tf(lNQIc1+g3r_~&1jVzZ<&&n~mA)v6~oFr;B=0w|Inm-C-cTTSK z54vYkR*DADFq_sg2W5oLBICb>o8FrtPsqVjMU z4NhkHIBV~4G&cca4Tg|RGGjGN7*E zz1-yKz!*j;-C$l!tx7h_Z8gKDk9D}M8rB*+ zPw$iQH|_w%K*TLNWaTB-ocl?!)Hd)5hhpwtvlPdSHInjKf=ggBvq5I|+%%S=*1lti z16P!PH_RPT_C*i&nn+EPvEXh2NLhXX5j3w8+Oynew7QI3v)Gjv7DLWs35%+8h}0ie z^U9m7+&l*<(=*&^QiT=*JV2S&!I&IX*?!986~(1il`T<*mq4ksRoU5Te14PxR4h|Y z#4+}$ogo48(W3k4&f-TN99_)PC$St)``lbseq@?8DfxkX$X@7pn%k)g%BQ%i1B6d< zH?7v~%_q2~DNJOIQ!!p|VIJ1YHmfoP+cMr*-fFa)L`ZD8?;c48*-=3e4 z6mL{|45ChluMkp|6pzcqlH&DjLV_c76bM=5txF=cG3^nP+&0RX$A2uPev>+QmMQh> zKtM*(#&$nj{*rsdEXU+(CD)Fn)RPVOe*01*x+wmwvK&?7TP3rU{3d!h*f3)bHW8>? zO?LA&*J%_5yXAn@`XU6z{=K$5CFOpKkn0E9^Oous((Ly;?b@Q}9c_@NdwU<1iA^>d z<`GB%HX+U4Qa3`HJ!{K41=BVL1%q^n&f{i*rAC(z(52|BO0o}m4$D&PV}d=B!FGR> zLTx!Q4rA#DO4=u)rjPZ8oiu0Jyc}UY zi)%I*j=pIIM`$Y=j8+l`C_?B3L$R^z4jQptcT7OsqpM7O_dxnaoQeoE^*L1TiPh6G z=i6~;RbutB@AXd08d>>POssaO+y@GI>Z62Og&HV$MC8qo;5?3m6{^hf!Y>(`hs=T- zORNr9Cb4=TT-pT04vcPT*E2$~Jsj3AJ>cRo^Gc>!&uv6Gc^jG4!)9jn z&?eMoQ9YX@(8AP*XWZS4DH^O!Z}Bp{M2i}-7|AJv5mz#uksmV3aD{p%%sZmc1jbid zp6zkQXn@>m=!6zN3EUN=;De~$HWPWa_k;+Q(WBkfTk@R324q% zIazZMpq=b*oDzbXQq@&X)*$#!0)!gFaf2-QPPByq=sYKjkBG|DF;S^Co}Vacym~&F zZDeXrqKkKCuQvAy^rl9_aUKQDPHbe1=jNEu3ki+jJ8|1eVNuHZF+<9_0)Lq=9CaA%5TSgt}hJ5jy zFc9uW{DXC~GX4blOT6iqG#_b=L49nY86j9c+eG%NP;Z_fYm_Y|GcOkT2h24@Wdn1; z43wJi;Z9g$&p|lam^_Q5oO2a_v_Sz!HAY`zI|cbJ{ts8uvMLSaBYY2PiD@P%n_HJl zOmj&`iAn0BQKtn{h#!&f6GBUpo!U~|O>?cQf=u@fW`cT@;^=Vm`d^fb)@9X20jqV0WDPPG6^HFxzc|L=B zIb8=gkYUV0BMsP%g+h?~9D*|QFmA$0Uubl5rJ3_@YZvsEC#-ijuSc#{-o)zsvF?8Bn5DDxB&PD ziSEY44KQ6LEW~U^@PtRg#(O|jCXqGktU2ytt<#?BFywyw#-WQ{c(vXmoP z1a_!0l?T-t*(}inB!t+7#8-%2*dUG4B0GUJg33|hnCZ+8NNE-%){(&2S|4NIv4Z8J z;6xZ~1?vKJPVCZKx!P@}FCQM0h=Y3g&=gA?`W?XMRtTrmW*$aB} zAn$u*1FgA_bC(#xLF;Xhu-g}l*~TTdK>@qwyd;;6JEkS2a_#R}>3MXgGAmcrn!!*! z5a1Ii2OKVg@!jXtn*MR4wQEhO2AK$mMMVh$GoU&BQ$wpaRLc;E&eltpNcT$6NEEDB z_mb8pz3U%qpV~FL09n*)=wiT}!$}hKG3b*v4Js55fvEO0+v}ot;V5O0Z+WUwc7!r1 zu9J0{F(co|J}kNxS3L*44)UDH8OVj6o?ts~Shu^+-xl=8xZ?|l!3lDdJKKq5RyB-! zn4OE}HrQWrf!mM!MFE;0lE9jlfyM*e(LLb46-ZX&aTkDfi{7S$?qb&(`4PT_jbu~k z5}QJ@t6`=zhjXb9=h9VQ2ot9{i)ISf?HTNliX5J`K@rS}Ih}K&V>!yD24^e@FJ?{H zSvg?838(E}vjtn4b0ZkL!`K{D4)=i`uvd>oDm>ePVB1 zJEL~tGpXUqxKQw0=UgyGdoaPUzyn!Z5&?xFm1Mne(v|6Z=jjHlS}Kpjx{?sgi|W-^ zu_VlS5#%GDcnk}+IXj`nSq_OG5palTWfF!XS&XR7T-!ibaHdLW+p5h(Qg3)oq)d+} z)aLlO3BeXkQQk|KXU$V9})Yl}NMAOnBMcGCY=GCAo+o&=w*JB$QV__Sa@qzFq zXS0^TlF$^e5hTh)#5e_Piwp(sTg?^Q^aFWl$c86ciatEa|FAYOs|CZ!x@9}GmcId! zD=a28IBqGKvE_BfyaUl=cMdx#nrLPuoz304fD{1;XAnCv^?Np#yi#U~FUz1Mk~7Hu znDX>zSAZB!SV`ly6A=PM9ac$_mdI~7`F-oGP!jz8!O4$&if(@5sq*u4m;m@;TFe`N zu+|Wo8S}g!YLqcK^Ex-;a9zgTfpBN>=bAhti*vWPNKpNGusdL7$5-*q!d4X}d$v7uX0oOMCZ9a9 zOr*_IHIYo5=E-D=`%}5BB6LirFMdSEOO{_^n60Mj?1cE&8Om0Pf1M`4g0AVhEl)tL zrstAST7%ZlLIW1IinPxDcZJUg-66XavU1Dwj3ky+0V%2O*hyoU>KLLLo;5O>f3e%1 z2lj9X+bf|mr2SiLW)yTE`+=%`^>wY%#*OGzyk{w z4YN$A1YHzkV8q2tvRYisGWr$a(z&ndS*K-Up{|es`7UUsApv|@TuT6#{y_qi7RjDm zCCC6?Q8IwF8l?bb$|GFHO_Q5hrDs`plPff2&$3?a(33_8Fhu?8s3AW4fH7zw;K@z` zwS9o6$0+TzC=KA?QS%E!abE~QKRbgGUI{U|Q&#VbsfhBad}OOSicsFCay!>O;DN^{ zW24&JNDCBwM!L8PUlFfV_)7eDxNn!ZTqGM;oaZmBP6UJg*wrG^ZQy0l!QN94pMn!{p2 z!p8Q4_;A99@z&8!u+*>}!ggb2{e@$!WM_m!tfbvraT~HM4bRn;8Dd#~%)4j(A$I&k zd(zbV^WoI`Y9ty|7>TVK7zrbi#WuXwa-VgA72cAklHo(SYy>kQ#c>vgvfMYiGTY;L zpeJGWcrCX+A-N^n-^j;;(yRht+%w*0VBHt#7+|Addpf+9TccHW$R;}-7S`=b zP`g$;Wn+lMj-B094w-#=(uv}>8}L|T){hAu_j}vf*ns%aJVpquB#;Wz2C4YbOGo>f zbdqes(Mw0d(MvYnlpn?vzGgt4pZ;1<5Hb&UJspCK+L)h+cDd6|3(f>eF?b@)$(6 zV}BdoW4-<%)R;$yk$mAy>z3~YlbbRfUZ=M#EWw8mu>ZB&XDnf5O0QVL3Jc-zs&OM? z+mpKV#WY75r~I~bfQWA`)48xw1Y_)0i)NAn6zEjOa?DwwdZS`_n4!l5r4MVszV`iq zG_;+n=-j4cEOfk1l67ra#lfv8oHKnUQ)6FD1^qLb0d$%osNhT%4}gRUS)ybCwUG=l z8#3!LoC68Qq~R6z?Bo^Nz3cHqq$LQ6d0UdotU_@0S&()c4#ztM9Pup3Q`WmH^Uu?* zWQ>bFc{V}@y);q1W`+t!maCFwsF7}OamJYv}O*?$}-OD7>i<%w{} z`Q;oyYo0pGOgWAlLOnFSO#Noq)gaeA=18_`8vXQ3n?=u10lU*8Y_Mxe#Ud&u!X!}p z9;-uK#|#yx3`VR~q8UPnP(lY#Mo9S#^A5!`U09jo2Yyc&4TKDpWyx`Jp;fY>@}^le z%{E)|G`*~30`uCW!7L5tr6@4(A(I5oybtHbyay>_jEC}yd1D|=kR6n`P}5>!p^f;P zi;Z(Ku^A!CQt36%f)^dtY>bp?vN5-T&<_AnWa9(Yzq9eX>3AJ%j74H>Y=;#DHump_ zuYrxtm#hJ-VB_4_*ld#h4M6t`(8$JmNf6&rV*jle3tG{gOy&&Ha13l=g|YDiw$x?gdY}QNX_y1uEE0U5 zNE$Oqe32B=yIHwC(ZkSXd1#hRisx6hjeCC4QnCYRU)7^Qg_hE#`OuMlGG}|EwCEs4 zW{?FY*Q6(=>O82JGZX3U)_~(@rDe!7s$U3FZ2229 zOF~&#Ne|?!i)D^DxAUal|EA+zW`B7+;9aObF04y$bNvaS-M)nog#IyJjH&L&{6+I| zeAHjei(WmYaVd^DZPt*P)4>Oaj<%d}&0fN;3fYOP&0NdpmNW6|nd7u;&9~N{PHqr{ z=DVK9>WxMj-UQV`q=s58uhoL?TYS?ev`Ig@4=t>CyFdPv_VspXJA+{@?W4dRxNq+W zvQLzJ9}?xox|mFp66KB4j|TjTKutC?2}cdjl}c7|{a3T};cU`MBI+up;gx!;xspI7 zjjbd)dc{@}9OkDu=ET*6b2w??$c>=D8_S5!*fK)7#Y%gK%Lq9&0@wQqrkpDOespjT zlLOtYGqW-U-LdjOK?fNiAdWPLE=pzDlr^joQB62}!fLrS@`#y2|uO#v!L%i`u;}!_2Kbh4{Wk7uW)#v04*Kq9Fsco;ALzhp?}dmD)pSx48p(5Qqee z#&OVLFz$ITFbJW@VES5~CHwJr9@FRT3vd$xZ(0vy$4Pu+yhRa=G&T`z4qM4xv#4bY zuT1nAZ^6vcsyehc=czgty#jF;qF2mrvrp96ks^%I4ff8MdKgQSRVP6`0H(p#Ed~g5 z-+ZL~c^)5QFLN`U=0KnTFae?t2vNMs<-1+VkTClw@k7nL*7w5qgjU5uk{H@4eGys( z#>bnt+KUJdz1RdJ*m*}MqCbpF8qjCL!bO%%-SQRJ5L)wa+D6R0z9$y%Z&1K~4b08F zzODN)^D?hH%ln)P6UatdIIpu~*SK0!3!+vgF4s0;qpY5?N*dqtf%U@p__Uf$v4RYC z2wt}ggeQNY$kPtN>qcU-QV5-yaW5h{u^};bigAmf+g>(yiAm7t zNXab7rh2PE0B+>IR;}OiAZA#*1#bnEh5f=zXyq0{{VrV!%Xo4+&6|rhxURuVHTf%@ zC6H==B&XMm*(GC1B60aPqxE;4&JvIn5@Xj7sdcx(?GB&tDz{fg`8d22*6M=Rs~fa- zfC!6C^JHR|S++}K^5nsskkWz>qNjjnD8^D+CZIYZyOGi&l-E{czDi1q5%0K*Aute_ zw^)EBY+Pa|(N7l_1QlXQEhN+~WF*>J#%Hem(1OQ8Qtpp}4)z2sG zZ690spzhh!wWiC=v#7g>o4g1(=oldF>lxwCCk0mnRXi;aX=GS@Ta_g)0v;A|DZGR?;3{$ zfxRwm*HT1{^Yf%0>>Muf-m}+fY#AOq`hRRzP6~Y2WS>dRu-4iLC8iUO%jD06C`hBPl8#UEq)G_|`D)hF`HkIcrf=644S3(w_#969@MIm^e7!yM^#WumglmQ-PJfBoYTkV z8V&1XbG7b?9>m~pLnub)}QBJtyX zhgtzK;AJA+kE9nt1iXaJ4$S2;6(u?JauO zf_Yq&zx!`Rc_RcgX&Ldiq8zdFH&&GI59|>|`8$Fr-yc}zIf!yoPzPz>Q!RsOgXB9{ zi;nk7bdcXuaE3QtI9=~~+|7q6wdxwdb$%q`E}C-$PP<(9qQ)aa`_gwK&^0(_R2 zR&AC|hgYHv&X5+2p%E-DjRWneub0+oH!N%Q@piM(mICczIM~*NCD9$eedgEhABcLZ z%9@KgFop_qNh_P7`H6D!d$zGvqmeel3s`yN(HmMBl*Oj-PCA}#9OjKa%LI!RV71D- z{gyG)#;Je&UzrMTo#f%R3`kkl>F^)urKX1)(8oO7eZ68HZf*BEpNCs{Gttnh6J?_L z?~Vg`0Gf$1t9iH$iAr>itJpU%Vz(A`xQfNC*OW997Fpy`_bq2;A=|D^5*qo-X>z_3 zzRFHU=V959aEW4RWv1;Bi^*1-dVBplZJm$(YdJFohvttj-F+!O9&jfbQXLDiK?i;q z;L6-!HVGo?NC^M@dI%LQc=zghq3-%}kGuOS3)?0ponr6DOd3|KG5-|O;gk>d*Z2t| z4sl%C$U0IrGuf-m3;Rl%AMrvp$ZlB*%?1jz)>R6Pof?-ZAv~ru6+r6d(FR*yEGDD4 z(6xdX2BX`lb$evhLX)&Z{>*^IZpQ=f)nb-2z()E|nc{GD{!GUM@5|q6p71iB%w=9G z-;n^C#L2cC^ZXfta>}e#^7e_9pU$k-kH)!LD_NH3&`yy%(TnG1YXT-@zUXY0Fl#LF z!Xe-%IW|s95k;GQm8WK>;-{Uf+!vozpl#;9NW74QW2+;w^^LMa%=|^}R@#*e94ok-LnDVbi zZ16qh2A1}dNF>u5n79EIP-9BLJIOkfV7O43Y1M0 z0K3QmBMbd`?h0#VSyvZ&SB%Q0M$65WCkiwsg%welD!D$ENmIFiB~A5VNRzhc*am%F z2UcC28hys^5x+9Z)Vef&+YNCNKm2r##6(M4iLR)QudvlPbJ@X7g2r<>>uy9o1mGF+ z?ni9w-QIwbw=YCC+-R4KAdfb*;9;!|b#gr4{GQ-PZ0ie=`Z{Dc;?Xw@i<2C~ai?>I zNK0rA^2h=P?yHh_tsV<+OFYKU{NS~#4*^*v-o;E0oO{8Ef+_kj`7J9cd=*M)vxN8t zJJ)Wz$Lk1~QI6W@nMoz35SitZn2j+y!bw)x=qDN*{y7 z5EtF1=51sS97qd#@d)e4lwbJrqa#7-pDM?Ss}Z`Ivrq?h3yEqvOhD)ltz_FO1E-JX&s4#Y@RnMtu@4aua?s- z$!WXQub_ipGXk)ADLm+WCv34GdK>B0(3^Jgsr=DfKXo^A}Lq}^wmVA7o)2^OxW#zNQ zlAneJ{zkgnC=9a)>{;qTrd)Gm6EC;(*vuPAvUaOgB1aYnl{nW>i7W$_?!T9S6{_}G z;NV$mNXG^yfUp4*of{kL>|`7-nVT-)cx`ze0OKQ*Q0MTg0Szy-0Lf6QWwEPFy>|n+if{i);2+yo5l7(SgIfE3b|QWWd=t8 zTWe<@EjBK9xDfiavwK}4t(BS9JjdpGGBaxo%OK!+!Ll4_6EO_WzHr0p(`&RI*C#2~ zh&OdGKCB=wpq$kmS`d_}2;VvNDA}Moq}lyK<_023nNuKOZK`NFx}p_xr72~x{1rPsfi@a2Q1fN!k#O?)sc!8xI7I@Z zb`)t-v-x~gyWOmLbVfCc&Z9*?oLj9iXA2b0gBaVB|4RaRG5PBB|Ht0jKF@u4_CDvl zSCTC|P6*Rj%lAEJpL6!dv!Ad1JkNf1jJbScdCbdl%09m!Dnzr@#z`qIm|WW)$tGZ8O%rGXpz3MdujVuJpm-cmu&tj&+~xd$ zjxmu(nI}H{86wP!;=1A|wG91qjP55`8pn*5M}f(So*j`{=KhVv_UKvaBcCPv?+(o; z)g-v0d%$4S!Hq2kuPs)-P?p2{UcvVMyJpq3Y9brm1qxnH{H*lagC@#=!SG;d+SbLY5&Z`SLl6fRXTMFUMV$U1Ol@7W6}4mVLTyDxHu7xk>)EF;XU9Cn|lv#9hXZ>m7~_n=8+FH;1K`2sP?uED>KSM}mZi*iTXs>phfrNiwU%}L8I5f) zc|)orn7f}1+h=S))GP;UG)t^PdHLMVYU#f5`_a~pmPuV}6o(=H>G=Kz&$ZHZHV>BK zA}9gUD0f#6l=}wvwm?G%J5B`gUGImm=vF07+{ZL8H6?G}LXNkT$ZD8+48{NbBA`xVLr93qDe* zaNvSIf~$ilwubu8(qIx-AjE21ar8%euReI7sJGNx4peXV(b}=LuU8(f0m|F2QneVH z10V}w;%CHIhh;%n#6wUznAIMFJn)+tcz6g(8(H@hZ;dav@-_&ZU?o_Llf(5$8D_W# zwU3U$A9ldb8n{7Y28I-JZDc#|zq({5s%aTdu|JaFW>nxIAd?@y0K7KMXa6C%J%Vnp z@?6+MFl>H9rAtwYMvK_X{+%|`SfkI8#tP*D5nTJq%1SJo+nSXU9;m&;It8Q4ZBD~p zALEU@987LWmI7pIr6g*C9E&`Lx~I5aXhRjs3@Fp>p5hIhDEww2lHC6p$a{@lICAzB z-`sjKJsAnSYkK#OsB*1Z^Xi;8U&}|c#T$zEKzXc2?xD(B+i${iSi4Hr>3GPe<$;2w zIGx~kwWEy={s}3Dv4da1=5J;=i)}zbsjR?5 z)UtA*>_CY}>sLO=TrGOf9PwA+yig`F6EElpid5->*6XXAKK^xmJif?}gHH2~fjn2s z^|rKwW!uBk#RDZ(fQIbyASVnmQ-%y9dy4HHWl)g7B23Af z!+Mm#qSchaq;IB-W#%O*&gakqaq)w)n#(5jr=R}KfBB0)`&+;CZAcPRLtX?%N25or#mOkA2R29@Seq9`C=k>Ts$ zWY!YCKR@rB2R!U#+C6}2Z1c3x>O#|wMH#Jx4y@;0eSUJ@PNcnJ@Et?>5d0^ynQ2a5 zaKFU!-LDD#S{34_nd>-0-no>pOha9(V1wYcMB{A5I5&hNgV^@_DdK7n0T%a)i@cdd zO4Z!okpz-ObYOIOA79x4gwPNcq5_)0mx9?~=Wu)lxMfkmRd3Z^Wn~wLjl9tzSL|tuifsd# zn-R#K-moWrIgDhhV4q|UIQOx77-f)h%-cZo=KYTu%gwYB?pxH+GtZP!O+HyG33=!B zbE8G7-d_nV#^<0#!UeZ!(Nv!4QkQJ{c6^sBG7HPAx?7 zby64FFIh_QB?8#MVIe*DIb6|BNE>@P%b2uS!Qf~qgV@Guwf(+II^}w+Qz9<26)+Gm zM5YKwqEb3xnb!=+%hED%Pw{$-2!tY&xwq8_*Ak9u%P}3NhTX_YCC~NiXrBtFTcShz z@6wg5o&-ZE=BYu~>r2KuCl!3HHcUIAARY0>awn!5hz@;gt#LD2-G4 z`WkIY=|pz#u5R2nxKr)!pCwB?ONF_459RgF&C2V1 zCtEcZ$ZY*s=&X38e8#mCyE=o1josTmR!>ZH@fOu@Z~alAA25%38HS)$vPbJGO7=;ho@eC-;;Ej(0dWW=YRR=ut zY!x^XA^w!oJ9|LBsn4_mRJ`#lDW~y?p^87%!~>k`a+hOr`iSt9xcKT*g?|7In#+_`!Ln`jDD@%<07RVL;`!;@Hxi|9z zncnES&%x=Slf+z5i!y64pSdx{yB~4_+1$+@9&PF4(Uy!y>UYZ^V6F*^mUx*OHepe~ z_*#Qem=_Ycd8T7pup)6PcjsL!WSk6eQ=8hLnxPcv z6HHRDNgpKhzirEX@U*sS+2)e1T8UX-$fu+3(-D~ee4qMxfG+jQK8Aj;uJ<5$D)Zi( zVoIGZJUK9!?L0D)Y{^b;tG0{)70ELsrB+2M@zCZ2&q9|9H^@C@W< z7o6!@vH+fAK}`BT0 zA(BQHQ5jbk6KAr87m>U4`8TVT%i?C{5{Y_>|6R568XR?gYfn)yKV|d9FKqyr$)_E; zS~h>K+Yz@bD_wODmn+*--PDAOP&NIN5*3J^Wy!^5_`i{L5)@K#gaP`Koz9kHQ?dS# z6EBI*f#X6DwGOpO=Ku%L@wA6T9)GEOD?d?Lb8Gvj0l7z^vqX;$mv=jKV9}dc`0_14 z3hNFpR?XS>cQFEdsNc50ltT z&s+T{$1d#hn*A*)ZsGj!*hQB_69JEI+Gr+ETnnQU|NnwfJ8yzfA6>6LIQjcPr&T|N zxJmuINJxH1RgQw*gkwC z#hR;_Ia0LhzO}bYj5r}qdfp;Vc*A5QnNgb&CmNDjWtY%=kaW($O;GT=-QR#sAc0^5ZJ5j)C|3qJ(O*YQgQ-q`w8LQg5Y*#x2JXxJ!O!BAe#3w|K;f&^tE z99%25CE6Si;e(k@-J9;fQ+#7~8zay;<+v!6sdPZYNp)*ntf)+9x3fKhUA1H)D-)QX}OA&|Y1gnoUlB zs!to7==cOHFAqxzlnK>so07w1sev~wVQZk4&T``>+6LIJU(*gIwyXIerk9Z_4gOAk z5Hbu#>s|mP1HvN6vz>OkwmAV$2QhRhf_F@=g0I#jir0paVnqn9OaLe`5ePX*Yvmi5 zc;<29X=L0i;o*Ig|AHof#i9s~FD92Kr3!Ee3nyA;e_o6zzEz+o*iuY2t@y+sg7xz6 z@ogoa_ZHnw-YN#ytgjE>s&X#>_PcoL-8U2%p19lc-sZIKu=a8{esBADwFxtE?+f-} zb9c#mo3rQrqOCBuu-Z6*VURd%!sPJgAsEkC%E>nMeUT$ukQNLA2t-VcN|`$Vt~F4< z%WR&BPHwmZip2)NQ7^xo{0H!${JZM%t!`!r42_rtD3hBJ1E5?-^?+i0P^&SU;ss!) z?Z1lIX+v?NK5wq@+rdHN2pahXrNrKO;#(F}1Oc;n8ZO9K0J#-^HFcRUBvB;ZdzP%8dCLOiAen#a-?$Vwx|R-2A!YB-f9 zmvuFny9DIl!U}X>DK|$zx7ts42@j#pw_5Bb)u}1pGlLaj2ORvJt7eD*P-ggduKL)4 zUGJZbWbV7EskE7BgwIKJs1ud2eiEk9T@fW@gxPhsD4NB$r%`G0R4uPh4o?1Seypj0 zNr(+6n&7ptIRXT@KBN8>p$AyY2#jy^dDnlho0!#YE0Yc0_?@qGY-fvhaD(R=oV@~~ zhO@<2V{~VWbBFg^Qf_17Bzw}t(TDR)oFH5=anJ!UV&b^^@|VB-x8GG)Z*CZyN)?Kl zrw&X?Qzu#5cys`scY+zWQztAGE_mw1H<>J^PIxPoV1DX^uxaX2(iBB_HKX@x>INpr zG<8p3S=E7-o%ij8SP~URM3VuTWC2y`B$lC~o8iN*0>0QDdrXEm`le^75U& z&AXKG?qU1glp15Mo8c{5jHs5y6xBj|H^MxYIGvZAj=ED!3yrcOyip7}#VF#g%6+I? z55l64zgA3*11ibTss?>3IyC@LZP)%c|8RrAc)Q~WThsjEMo4gVDvsna0Y~H@(YTh= z*cKpe>RV{4aATwzzoZ(&!S{k{q&8KKW@7GLwXt8 zRoVr0IS+S)=A|iBr$DsUwRr)o4lGXT4$Q}8iqWPOe#Fjq4?5ST2v1Miwo|(rfi<_T z%c;A15<58CaWQ0NbZSRkU#Uc)+ZpE;5`|_(N}6bWWpo2aO-+&t^+WhRj`@tTx;>C{&PV(5c*+jJ%i{{Y zKs#2b1zn?#D`0k6T){)?DJKm;H{s9qn*yMcfwx%myF%-T0=p=zY1k1ge9mYc^t~&2 zgCQhz<4j2PF4Oz=$Z>&VI1}@(mY4^M7=Z!w9K#eO@)x*cn-S{%beE9j)^LyAf&w0d zYYdV*a0Jb2jYo1`K3lAJP4-1@7<=l?UE;xLvd>N4+4}tOD$5N62&M2ULZIHJC+!?}BQPftg_j3`Y0FF*x?}K}a`G*D>E<+{uPgqpZvS30 zdC$95;cmb>i;e=;Jq7IEmPK8^HGQMLP0o~Ezfj8TR#!4se~eq*6S4Wt7%co^)0?Cz zhYl7T(-@*x;HRtLnR9F9?zY{dU+$%qOS)!}6(7xE9z6r)Qm?eJ6BXsXwB(?$NW~N0 zY>k`RM_GD$x51Ne$w&zx6}RpH^(5(AO3E;ejozLT>pmt3z2$`I zw_wts>bDW*hI;_{+DZOHlBzp>VrOV&o|U9Mm{{9*ivggS#DMy;U^YF1+Ik(BM z#Zm333Y^aV?o|)b=@ILpEGwi3gE`4y5%ivPkQAZaPOCBgMNVvgG#X+WcYk6bGl?8C z8ND#od$+`~DsP)^4@ME4xmJ&iU=ab18LLH^dtz4ZhR}uI&9h+TE(z00)~*Pz!wSu1 zS{SiZyIWgJ5-2qNe5V%n&+>da0Dn(`Qlr37lx3ey*9J-;jTI4~8lPYDQCn?H1z*aO zopoBNx97)78#pwWtOchrYwHMuQK=Ty^nRK6^nor+A}gpy^>*ugQjf?5;B1a;rMCw9 zZtGBSILQv>B4N=}ep{4Ug9LXMu;mqRApoy9M>V6!ni+3h#WsCumYelDibAdPqPPbh z6rV2EG3jH75P56_k%$!esnv3uR+49nyn80Ckz%O@I(Vst9tQ+G%aRmt+Bdkp@`6I7 zhsjc#MuHolzIlnYnpQ=7nNlHs+AshIS`9ugoi0U5zE-5h8c!k|1RT_#`>mdsR+bvwx5Rb z5taP3*lDbLE~b)@xJ=w?EG0B+bU3v-H)}Cl&lx3o`?*n)j4@2S7>>7jMWfypIX2gb z;Rs3c`4qLBU0It42~%zlwC_ng1ql^XX{M_gm<^I%Oq8S#-)7M!BCcf9%di*6&zl&K zK1@Ly8&^skjbgR{!YJ+Txj7h>Vo}9wLRl2Zg|G;(_9X1m@sY+kCUo3%_P z!zN9~rd>Q~rqi~C^X}pqLG7D%@woEQNHLPViWMU%Ofnv)=BDio8ifLHJeD`bSgy}t zf(#h7v>*Em7Q+@3^S)>^=q;5A3JujefM{vis!1=5GGw9V#j5}V(jpXCr7%i>r&;Mx zG9rBgx|Sa*ApeoT&6~n-?~55`ve16etoDQI34|9jQgTF%L*RUUj8?Kwqs0=h(Rx?F zn^;)bGqMoE)G%zPWov(0w&rQk=hx>+fsvuJYEm?ZF`dD8V^U)1md>8Y6qWdN$7mpZ zu@|Gs9Y`!K3{;iKC{!9nC4wpas6=KJ!6fkl8v1-IIRbJZJ{Upq`L_dhyds$$H1NLg zrF{Y#7c9Agg%sz8vHI1W)z$Y6?wyc^D4ifU6gZ4KA#WWDCWT7zz7*>%Miu`= z8TTR^l47xz6pI~67_YUny*q8m-4P-HJz_`Nf>>)ABGkB+muDcut=ys%5r>Rz+eD$K zmg@)sR6JBq?~$PN3XAJw?5IS=U?nf*P?xOjr98=&piMJa7;xwusHWFc`v+a;!{Rdz zi|#mCbW8h!dYacg>M0Hq3w|UaSI{s5 zM35tV*pei=+dQi299SWtw@LTV0JIXfW#WC)fqPVDoyM8U^LU$ostSe|Q2~8mY5MZK z2Qsz)EBZW4XI-NL99>bbuVKrVcciBGKPLssy3g*xdZ`|!m$ilmCFrdWOAEWI)GMjl zW-v;67V9j>P8*_dAEl-*l99H=K<4v33s$jgm=aG4v4T`HUczvIjP`X%m9+K?Q*Dc` zkDOA%;xZSCYu~nSu$M0w1lWf`S92M=UFjni*Z(8=F-aV0}f}-h$-FS{Z}P$=9CZGMRNHagtK^ zB$r8-JH@4TX;U@J{hVt5B$sKkjI6=Q#tU4tVOZ8+FA59oD@ayetij3hi?~do?O^>i z?arDyuJ$4m62NT`CYHdng!>XoZf|V5bw2lmPoEJ!JumuVQxgqHeDjkSP|)x&gh}i* z#^nsPi2Ot?+D)6KtH^T^Hj_O7pZQ{xetCv+^9|Jm1^t}Qcv zy4*UF1$X2%VRXzI%LyvHw6C#TYK>*1?AS6{DqxGd2OG*>LM};bEPNMOs}*~ww3>)C z3sZZg+}otEsvUirP@UyrYDc|PTgOVtfVY6?Fx=eOWt$r_5Tg4B+{0FBgouvuxX0`yjN0ln2Y?OtWFV$YH~pIB%zPOFtlR)nxlYli3?J!LAHy3DoAsc2=< zCoy`$a}ZI*Gsa)uIfQ5-RR702T&bX+YfS6QlF&mo*e8?vqkL=^li#m>JV@0Xr_?dA-rDp? ztYc}!+BYN8mRFSXzNss0Nm|3UDmPmQWyIRF^+)uT0;nSPHW8Wv?sFO;zNDfodJID_ z%3}WB>A(XqsnC1A)^l|k;KV4wy9lJhgUXy)#_A9j68<7WEnlHZoP)7NX|p)WVphwE zUDEpXRaX1Y*~er!*@1Zt3`D&?>D^2Jgd9S$Nu6wMQpf`;BZXQ=qAE`$PX&BbI1cwSW2^P{oVuw*`Qv6xKahuibxO*0nVx`nF$$lni66& zv=WngRyo80TnX)6S`zphJyQj!*So9N?i(2XBI31Ko0lJFZT3d%wZZ;<1owIC->#?{ z9o$g9Rv+$Cr)jb6Bfa3GT@o&K-d0F@k#TgaXdI+&wDB78ugZuOI}O?p6{D~sX;)0U z`q>8d{U4U54r~+O9!P@;U;5wxg6u|0KK|hi)CfHT9`B?E$6;#Oz~yz-ZQP@c4CJ8v zq^8_^n_W2h=ema%NO&>!y(w;%aL(S|EX6?ri=M4kOJCVlVt8B=RCASJM8|hmTjJeh zX7jraCudxmYjiZ0$p2RgM%| z4%1ue=#z$UTB?YUSr|4@Mc`g<7908aZ9~Y|m-hnoF_JQAe_^perOSu`7q>CfkE3paT7H*k8VZ-A=F+0^!Ltha|mE+*b-`) zgu6x=hiwgv?JKr5)UADkR!OWbgpF-EpZh;Q_`?tU&d;AIv_IcPe}3|x{pAlm^4mZ6 z2NV&Wq|H13`d5GcL%;upQ@`*@~K&L95=yP#p|=e`c730pq)zizMPkN!9VoU;P{ zph^}l&I;(-wAV6iww$ZYmcXvIug!!VQ|~V@VfonwC+vr-ixS6QuEa~MVp$yPdg+GZ z)gUiMgvP<5g9h6}iRP%=)HR3#=pl9qa+V_A|VS9!{I=mTVGF#%-JJsrK+EOwu z5bSA%ui@N0o5&a;W8=3F7(!Q&?rf&5`@JxXSJDA-3k4cU*C1~ny z0U-8YG4@!oMc+CcGQQm7UeE{?3t@I`=Qmf+r;*d0UolgLWpT%ZDr&w%bmYBP51tI~l#u^L9H~RH%Le^aXDSiX#v5 zF0eT6YgBL7Gl|&T@FlvUV^`K3{laMT(01kOaRQ`PF{h+1Vb3!#Rz!S7B<@0Y6C|36 z2EEdJuLeD_NC!bLSD6QmCHu0#;V@;VK3}4K<*JHUtXPeO*VOIuC`Ho3f|8#dCE6BK zrr9Q78%aIqUOmuiU`sXm`?Mqbz>UE7ao`sx5^3?R(lox=GC@hE;bpwTKXt1t>LkN$Z+` z!|xs}vPWe_ERh4H^n(yst3Gb6BXe$6^A_w>-^m6A__O=c=LnV5z7{CJaadzek178S zV3ej@2-^HrH;cm5=HK=2nes36?|-kmx#D3UAN#@=Z1$5tHBBohuUW$ax`qT$*3jl? zd2sUYJ1NgCp=^tjFR2L78XqL`H7#1W3j)>M`v%7|q-Mm(Tj^_#@U0g7`8D3zM`q2y zhoi=IzF(^zGN__|ZiJ@zw*Tc}zC5ljNIW0~Bn)$&YoQE_ zFpqVR3QR8`U>*FBAslTUGf~sZ*W2JkQ{G_2P@JA zSTipk?9N1)b0i#Chz%h;Y#DQJBPwNu^KRo@zF_oNSOqbVBsRh9!qpbMscOc7q!?MT zOllYAXTUSooNt6r4VzDM6HKe8odWZ$Y_jDSUDbPM4}2#q=ro2u9>>z&I_&RsXlotz zRR8{DcO!S9HnkN1r#^T<21Kr|KG+=nF}e^)rOvyU#eUmVG=%W&uVbf#V$ z(2c&dh3pQbJglFEAKR7t2G@I}LRF0vD{DIVhPb?B>z%War1%?9BOys*@hO==7Rea(!_PiH zWGr%d$h2lXX3%WdlK+%W*1(c~xWCY05~U4h676$$+PxbRV?}o-V}t#Q2t^_HSY1xK zt5sBt;)qJ~`QQ@9I#}b&0_$KDSizc04>lix2ei@md<4`x zIS7F!uXX|rwpuTJ=q4rmL#{9*i6wwl5-akrY05Igs)J`xkDZ)M8K}vhCwc{YRls_; zeFL}npkY0dFx6a?gqOQw*!#l`FklMiIp{8Je$K21JPo}h){lC-SDnPte%=L9Y}Ec# z3D(%mT<6#5s!j1N>a&$p&%B@%nuh@{hzvx6(_bCf2b&q-F3@l?Hi~Jq_w;)})`WC_ zPKVoeSg0o4IxO7Uw&Ix<$(&v&7lmcVQ^b)336eEoStaW4kjy(b@iz#`YW*-}VA2{g zH+fkmuz5;2T30_P4zZ?g7K61Z&@=lKR0(f2L_J*3&tn+4gUgI`gd11u)a{S~b~T!Y&dsMaq*kSElSk_Owf&^9gcqwkQ_C zS7SM>D&>HgWtG3m?Cfqj0)^kn^XTCFqJ#Ig9b9L?sfUnQ?xEDC65r9#xpbRdj*uWH zNUf;W`wqI_&oct5l?7ll0Vb^8r?Iqh1Wg{yNQ2445F2lWl4t6k^Y)CKcB~9#6d=&y zAgqMim4mTZ5d-bOs3aa}VrC&j=^;uO!4HW%^p@}`3jry3+=o#>Q*ExC`Sj*WJx%AY z(ABs@D=18;8qld`dbSXAtssF#A`BoH@lF0DzYiSTQE9kATh&h}6ow{cGEh7%_{tc@ z3|vbbY!NBZijY2*NM)wXL@~6VGxYc@X=P2|W$~q;D6J8s%S5US<@6w%#-bN3yc3J# zs+IGhr{b6hdjKy)3==aa{|x{%E6~WS?;;a4t0}SvZlFOX$rh1G^e65yp9BMe_dr>K z2YMT>nByzuQl{_`u02yYlP@Y=Vzq|?{FD|6V=WR!ic-3oADZ07!!?bTiT~rQ-!@uhRFBQK9#U=SzdY9HNBa0} zS|4$x*~EdM;}3F+XAvIv%eJ}=uDmt1q{xTd67qmP3j$Q2o$V;TZ3`>s=>e*#8&)S& zA1&`G-ZS}geI?!675A%r$ojQjJqiiYHocZc%uy-+qW3O!?;G3$7V+|W83*rj8Imo6 z(MFEwNx8V)=fOSuP@1WW(Kio2$XKuBhTctf<8{idQ3PY8t(jGjk)z4tQtKvK8`3lt z4);}WYYH9HID)0lw(x_7ny_dDiOg0hg4g6C?qIgQ+sie*pcQD`P3Us5+TZ<)ZSf!! zOK*nuwi)Y~dTFiNxqSirmW-3O8{G!6S92>u>@E35J$8uQSX#1&c&%CmgDn3uJC|mX zbz|y=gg5ENZ-Ufe)dLur#u640>;&sIMCvbdaDhXQ5d**!(MU$tBCc zLi0E`Nw<0FRbuc%ELA!%Labv!Ng)iwU(ORHnBdcT59BDr&9oRW8I-)wxL{+A6!T8o zmEt~y?sWiKsf<1}VJ=2{uBm5RqNb#fMrYEQi>fR-Q&Cy!YRRjfB+ap&YL1JZg{=!L zgeP@Ns03)ZndDc(fH1Ow6B#3->OB8{Ga)1%PYFW+;M+K>4!e0E8GPSp~i9b zsR3n2-oO$Ejl74FqgMVfiRoGyfz~z9D@Tq(}g(w-6@i-p3tbs8nA zP2u=-9tF^qD<+?MZ-)!h{XNAUR5ByT;N#p$i7;GY+Grd^%T?1N+PY0`iKpx-bbMB& zBtv2s=l+8|XgAs130jI((k4HpQGq9}ZczkbKjvQXItb^FI{?cG)?)$gob0rDi<{@I ze4ZA)Qe@}?48xOz%+H6_)s%pW0>2DQ&&1_2m!P9cZSH%zq$gW%THO+-BM__H)^qwh zHsZXXi>*iT8~&QVg7{f=igwY8+$aD8jtUS7t_0Pr-5%6sHa zv#qt(NpCc(lWST^O~I1V;dQi|!fTz#!*-EOf*89~*rc}CsYAPSRJ{vQ--Tj6Ap`V! zR%p%dGi6Y~*%BlTbcZs9eqnhYdBCYg!5EICT z!{$`X#oM7(OBHdT)ciES9n^*t;yA0`XrFhUb`Jp5RR`E4V?bLZ=yV_IIP92G4=LOr zNG}N^`q@dZFk7P)r9%*mJyT7=o}$()hUT`;OnH459ZDuORv%7GM|~{d-jmRVHl{Ll z`B?VM>O^2It1EaK5UgUaSpTh-+vu5QM0%w9bQ@i>vS#U4Xw-Or=uj zq(*cKos`sMx+{3V1z1dgu;y5rCvQaJOBaY7WnyXH08OQa7A_DStyPbgFpEpz zS-yKrcbDh8M__1^dZ!o~i8**#=Td{X#^;C4`nB8Nc#vIU1Z69}NAxO%x`7CqLqCA> zQgg$&Cf6`22^0Tj>+AA=X1;k53j0OtQr4leF4e6|FQiLt2@AxQl`d;SnYS8fT`cK2 zMtVBkiPpwu!Q#7J;soixI+sMHZSsV+@cdHL(y}K-vj&TP*-6oIx?G2P9mk$nkzoT9 zO8jcbR^+=*ohl0qu5mJIQgxL*VHM>fos9bXQh?*URMbbIX}B#`yQ3iSoX_V}C|z}> z6Do#HTWvmd%IKJjr-8*10aDPDR=%vUSP}M^P>dEsL;;u;je9~7g4Jm+ zoPm6Az*xCT0Wn{BbB%X&Bt-+zMqUGc7DHWR^}OX;L`Uxl0Er-#lXm5f4s}DV7?!lE{ceyc>(k9TG;BDU0=3*bpVPTBBV&!#0thJ=Q%Frbvj9 zJ}G2c)?x5vy+#j@RoO`zW+Ai)Simgl)YchypjPYD{)uiM9`6kZSJ#F0|0!!id&9^}XEg(gkwfs9`_|b)I&}>9^=fe4}9)F z(WcGOfzK_ygGHcRl5!JpWrNNz4o?z(4=LJd<%0mFq5XYBJ37BfUtuXi?WUY{F2}jI zeht2IEYMyime+2J$ZM|Nsd)^4`A`7&rV?zUuWf;ov);F6mSeRWb-XNclTx%4;SikP!;OE+4o5|1zv97TP+ zi8&k0byd`?dek4*KbV84{XzpeB6}@Ery^|9RrBGvWP5%B(R7W=V^PX>`sR_iRF;tA zhR<}jF12-(4f)h2%Y_WtRimY=AIZEtoKm!>c(k&WYk=L__n)YoOGdq*j>sniuTHmr z#5=epDs&JAw5RyEzP_P&Oz>vlk7^b`-wpk08C}?rtv4lsWW{Dody1c~)L3(7bZ|

    A+JJr&Y!HVyjS< zWJ8Xntaz1Lq#zc%W?mrE*)iaL4dPnAyUcb^kD5Y@*Kh!oXMO&|Ib~x!}bEF4= zBLaX7p+lvhC2!!K;zuezTwS>`!;3L+`9)9q*-<1veR_n(%UI8hP)7NEiZSb#9w6ve zu8b+v%7w*GneKLIAKs{_s!BQKist?GP+RZ*;6(Z6s|@)UTnuA0fc8p zc}mn>Ef^xT?cq#xT9+`RhmGaTg~)xx@`}_J6n}rkt`#RrZkBnF61?cSI_O~+lYd~I zK%u_S^u9&B?sdiQLEU?be}mtbXqd3trA%=}6t8e&xfgmS{TB zq48?AIQa*ar9sqgTQkP7(e#xXRa7KA6J=8K=iL+cZP8ot^T?%M1<2Ef+Jc1qeJ`Ec z)B&U&^4l$?ik$ZZ+-8t0fk!O2_+|DMQXd#p#%+xY1#>anBJ^k%1f*G1T5>rX%4UVZ zkG)D-U1m9lL5ZXp0(~l6ib82pHJJ;isM zK{KN;Y!$g8gs#65f8JBvZ~lzzt)^R8ppvs#+T0O_V&!~GJAh|PG3B7t1m(Y=AA%7F zvGeJ8&@yBoD&JxeyXA`*Fqk9XV%3mQPlC<2)W;ELy4@0NS8EP6s=l3dlc>>L|B1%T za+sLO96gM>HE`M@?(QHaKbQ)frBS7Bh~Q)$o- z=$8&1(l1@PU%zx^onI|pJZ(~__7pO1B;5D|*`|!6&H7l)4Q{Gm^>D8}VNI~-3p@vb z)T47y1~Y!e{AhF=BU15|%K&p1El_ZBBzMjEs7*;iA5H0&B!!+GPp#5C!*(={jrlC}tM>JKhH!F`_mF8;ej}}^`6snA z|LtLPV7{NR^2W!zbx>B>LRVx6v{_F}5nIS zw0AO-yAUeQQ}}Gz{I=3wn43_PKz_ns1vh!TRHY|M0xHZ$Ho*1+M5R3{tl!|pOCfEs zFU{bFn;j`+7eRJi(*KQ6oKf&h&U$dPp9J{@#89?5y;vM?$r zvE$mn%(v7luFY*qPkn?=5@nCP8X9{SW_A^xg04fTTnqoQFEAHrE_DoL;LBn3pnRkzn3r~DY zE99KcNegg_^7A%2IQF0_s%?hRHTKPtc95{IIIL6R!g3P^JjN$!loR_wXM|}DBkFqt zUIn@kSTrWMly&^w_LnMnv8boo(@y0MAfHY-DB>QBrFp>u6E4b0t@EuiG>t%UyL%Dxfiap z3M3EK-XgrF8dP?Wl-^*&8Ekz)OOI~xF%}bl=1)KQGh*UGW-mX+O+sKXd}eIKL`LlQ zuv>me$C+d8qo{vH|8ab6-PQe;Rk*#VBnTvdf7-!Z;NQgFJzlYQ!TplR6?n=Z(s3v< zovc--K(%ngaP!odNGE=uOt3ob9iGAGR&l`aNMMT)jc(daJsG%0+-Jrs!9ePPcB=v6 z$eYJx&}F}$CH;0K2kb#>6}2H9se|f}fOwJPjCEFEK`duz&?AE8Q_NPho@spylPKeq z9ISyY#;s@WsIH?IgK;0|3pa`q%E>&L6YtBvLiP8ujlGhRd=i*QxSinF#@EY|-g*zj zB~6)4F^zRw>PJV0cfxpQP|8*wy+W);|3VR-4RZFikZ?2e?wKWAEVV8R5uhz1xgqSu zZDgV38IgrTMw4F_bbPE4;vX1K{d>Y{k%impq!n&}@6D`3crU}WC)~z%)MiGB0ldGB z!i=)FjUqG3yp19~-^3`>Hj3dqqXd)Vw1+qiS(CS&PTPu}2Yq{Q(6W#1DZZr*FtbB9 z0ZPGrH{PkKQ(U_Sc-w3ek`hLdLKY3|C1&Olud5Wj$Pta2E_v-P;s2#HT|E|3 zN5<1_F>%|H=DyO(%R;#Ka=-3QXQu%$!U3>DkC?a@#V6< zknIQ#jB&d?j3Gvq<|BsU3fZCMEllF?anMPpsj`;`ZnZT8A6WSc_5I{{RBx5gtY0C? zM{JWMAF@o655;2&-4`Dl%9o8Nw+wH{~|1@Ps&MPK2 zUd)IxAYRazGBLYFkL_9&L1#`+3*s!9Uy06|}{ zS#ldONhB4awx?q8u30|aF6pgCNccNhVI{wu*(y0)L}lNs6;i~-DvnX4FJTLrT@i;T zP!JIWn7h*9i7Dg?irhApIAbL#QjwC*Un}X>HpGe@l^sg>iHPYs0n9^K^X-^+Zutl?q zrINr!qxzAUlRw%kJVoOG+1x+|OwY|ZYU!Y@kb@EDY(GAXEPW)U&?xMh&*^eq09!QIojPi?-Vv$?f?E8fr@0t#{eKkHDAiO z)chH!T1NOHoqYPV+Qu|ebNCFtjcl|`z7`>Q_Bq&l<3ZALcpr#1R&^{Q?oVt2b1t?) zv)*-^qM0N?6tT+R2h4V}x0sLQehL==x(_Wqijg+yliLI6j$|Y%rZRg|K=WBONq{pw z$3&nJWtD;o!YEw1%?*1rWgBiz+Fc{_u$a~pzSDIME8xqp4-2R#(&NI98`V59Y=qnoRP8A|9#BHBgPZ+pkwoR3c*s1Q^zIQoI9LLp+L`=T6s#by$TS zuk={-NB{kJ5RdH*Ix9!Mg32T8<&_>ub7H7{%IW4LH|g^{)aDdrYLWKaveQcZn(qYV zjcP^}XLwIlDJY@`7WNHbmf8#u!EPQPhpAQkF~f~op##{_6LrC|Anpq{vY!@DK8Q_M@+ z?N648g@f&G36kS;_W*AOg&d-P%Y07+NZT92Imo`TJ9_gFRmBO<^;(oX$m5-HS_m`5 zV`sQ<*H3Y$(Z`FYxf68a?hJRP!WblX?sYp+M?mm(jf;a!j_Q{aPY&ysfgI!6314fV zSk$@B$l;3C{rAMe!O8znYdDaP0}+Z^Oa(TO?gU>LK)TbsL;UFuMXC8xd#83ybn6Sj zX-^KatM-_Qj!>BNA<&~_XL}b!`9SwvRozc`kcd*@K~D>}+wdS`JVsOvOcdS=4?3-~ z6dpvVPYNHp`0yaYi#CM^31K2U2vP>4TkxM@OaEMW5dDem5kSnG3?79e4uz-P9sy*< z(U8d+ySXboMG9_LKxZjvw?{|7f_8_uXoJ|!QSXz$QKw8w;TL=Gg1@kawoRl2 zC4W<5%oyqmi80fOtS<|V@=AE?N`2K$^)*(SuF~zrO}7z2)7>IMMD{fs#J#;nxUjx} zVcFs?;`1OtrfAlpI3y_Esj1TRL{zcas3!#$qNrk+5*5CK-?Ix5Rs5poORac@VI3)| z*tigZoezB%+`1oC987#Zs`y`BRxRCE=HuIlDz5eeu0kGUY_Qjp7exi}Pm$GyM4SVQ z=YnHVniT<>I8+XfRo2wgm9#(&pMkDCRW)*IyBNllXv z=Lgw+i>W{vP{$2&;~#bRsXmklxOt<5(mE87 zg7xy4gL3j$j^asoHOZ66fGPCCT5nvA=~UYedcR}e;Fcc7dV(~b{DRK^Y$s*qJX1E< zuT_Z7_|(kN@j`iiJoWs&wwqug?5|d0H?VD zi&&&9%Gwj%c9T>$B506=KK`<{vrOF~(rijXbB%v0k*zbM^a(u(v`5&^5tR~7HafD* zAOv*O1NG6@-Ua}+fvoPU?w}o#vLFp%(KQ8#OYls$9EzhOM;D#o$|fh#kAQ?*U%8($ z{pfbx+Z$jYK`$SN*8Nxnb1u=d(}c%FEr?{$+JVy@N@~8DWJVd!L^2?{Nk;D(>AA=x zGpbeEk&Hg{QY=WO{j`Ul@wG`t8PhU$W|GmeMI^Hz{Dw@(o!cWBe|+HczxF+U`5T}4 zv0wgTp%n0mMpTu-m;0V*M12sAs4?p9jUdrTzZa&F1Yi-vmw}i0bAb0#&ja4a90!=0 zkC7ZE7honUlbL{WlO5DXw40{Ov}E>$y(7=s6uzJ+5T{iJ7>l#zdLf3S$ylhDJsEm3 zsxgHLUWtD#=th%a?&S*Wg*gt}4h2s`(n6hlZzW&@_>8*skSr-T6hsd}^q>fvuRE+G zzQ`P_!9Ft~gLtn_X!Z_iwyraaf?R2mHTpbGPG(-VFlTKY@^b@+3)GRAlIv#3nrRYe zTaw)p^aeYjGwSIcx*lvrPDk}-^A~!vV=FPOyxYEp_=S@(og+*p%u{r=-V(XYg+sD6 zkyByvXMzk2iN93StAMW)|5E4^hqLhplm{LrmWTIhm`-bp(J=H!_=asbiXYN95}LtA zjs_bshI=2;kv(c8Bq+5mx1aN+4G}y0~f@7V-(fgcg@lX{q9o6_^vWgmmkY|UVQ;j&-CjT62S)P%fJKqF04#EO6&N8I$+1nmUs zsbz2Xbg1w{_70u7w%Q&CejFtiR&}jjMK&_cr%Nu+uwqSnhj`yBi*m+>1RW@ucMtK} z;X%^AweCAv=KVurj;tM8QHxd2C1-jiqM53fpu$T>C5kvo`!WzbpfyTsAUMPw_t49A z-o_*Yfx;judsf^X{-A62Jh2ef6)7ot`-dL!#}CNj!}dwtz_6Tjg4GCbru{=~kkS4j zA-)#z9w5NgJo61pTe2rSp|7>v)i3>-_yo-}Slz|1SioLrV2A0VVv?y4X@Er`F74Gd zU>p|yY?N~7r!rdTUCtD1)@?M@X{_GX#XOv;(3$u>Tg6VIXW>u14YxsT_Rk?$)#Zu1q3-M+}crnrM;sa`(fQbo3((}Ta<(&NpWpc~O}Ae{%yjBnwR}vQYm7_Ser?jH z3Aj>Ry1S2XW@q;;_GAqjDDhCc_>IyiVe$goG4{IRr z>hKIj<_Z_3p|_Ywk!XsdgpjOVT8z9~&04`?40q0!)uU>vzh2r<=Bm3y1&qav8?vS0BY^lZPzQwK(3z6tmi}jJ`N?i~#0VR9d zg!}d@$c!hkWPh$xr^Pft0nC2x%Cufx1%n-u--tMt6=GpQVG5y<_a`KUsTeElAwz|I&R369X;19Zbvmw>yWD6?kmq>M4JFzA2tniIjY-3@{Z6-l9*1J zVo&DWSSHvQu@>%G5}#DZsxW9vO*d^=xR41?y^n}L`a}RQ{v>LaX3V8J7!qCdA8YeU z5pa*-+%L)L#Y!E2`**jTB*V>XfxE78E<8{3$*okzLerl-6X2Pu6u6z(Zf-+N!g5_)gx%s~xr{bBtQX`502%ebX1H|`YY?|yxF6KT7Reb?77nUdw3BJD zPdoG>R#H*hMfc%`^L7CQ2LeCfff`3N3c889>%kq5PDxCG|Kjxm4(#$mUDOgay7Aumh~^=VN7G4jy$RDwe{iM>J{!LFgf5*a#ajLhEw2CF8Dv7HXc~R? z`#_B+gb+e+`N5x`m<5>Au-+Ua712_RxAmV2Y|hH`;CF3=|CCSQFZ@OF(w$kzGw}gB zk37s>N}5kik))cC*bZN|Bv&(pxiw2FxT!}olI~?sc_r6)Iq1eWEb==9^Qza2@GRIK1Gx>b3kl>Vh@Y1*Id_aY4G8_!wcBkO+m@ z5$;szmhwe)?xN@oN1qk$l)E#W??WTq{5<_Qbo3?c2TWdObID&wkeed3NBV1%>T(-= z8@oNRfpW%|&@e*TISD4oh;-7&P4(7z9v0M9-i(vr2zuWVPrPf8VJjp6=*zr~^w?}W zEj!~kL9p3&iuR>R-C z`;%8zYhm_1Jj`Za78uFutDRfP>T3;gt=d2H`tIh==BpURZ0CK}Ea!ADpfR-8Q@xTi zeh1yH(hFEKfKWH zR(hqg3gAhIV`ZDwH>Xt3I^Q=$7iC3~(2Y3spcUfty#K5s?fi{Z68Ok1*|;m~3|}EL zuGu`E+tnNoUM}LkoSO(O)gF=t5Y1{nn7)RaGqJqe#U(*ydRt20*|6|_6PG6hG8#p; z@N-+(cQI7@NxKxhUbYvk4$@j>GuTtSp|?TLRs<>vn~jW`s@9fH@k*GgzIZ)#%*Hnq zhA`$Ct<$svV&qoDCH54yPtr~`-IjD;mF~6~f@zR?rKDHPm@e5@(EQWt;B;EE!${u@ z_E)`skoY+!Q#P?-q($SFQ`|Nu89`XU%0!1!@uV|PjAA5pbWUBU1%TMmH#H3CFI}|e zqVDjuhOAYaZ0)v(o#EF~<8+C1#^M;_8`&||M1W94kZW0v86feTIH?()lQskd&w(eU z?KHuYUx!$!Wifrw(WqDf29_yz4ka6}s~#|=x* z*>e5LxPdOSof2xDu~#a}MaN6^tK#MfZi>hQVA78xcf2&^Q1VyDODA|~OExz=$mrHS zR`34Ufwk|vzuxw-179vbc%c5y`@?#LHPk_-upv4JqlIn=%$a;>AU)2^qCk5NS~`rNoRD>Ti;bV_9*-gefT_ne+kg+LQr;dfi=Bd3%K2*Slb(Fass| zNvm(abyn;%sE97sA|g5*{hWMT1x*Y8z%o)S3Cm;v2T7CJPhiLXlI}G5;mnHG;ny2# z5{t%DDY>7F3Qvijw~|2IoqHO8PDub?k0on!KS1jwfyGLQf+SNy76=Tmg;o{}EDO|9 zEa-?!h0t0kNsY5CpdUFDn5QR7D|TYi)+7MMt-Y0j1SjRzL2v9O`mveK9B>e}XyxP4 z{#TM7qz!(!Tf}|E;N)%*ClrU*%B`OvTLpoekIiBH6QDgL0; z^yPnbVbe7`3z`KRw=)L{(>3d0d}n2-YeLd<~_+WntuGONxinrs#m;?>8&(m|OQ(j6eQQQ%>p15OT->x69c}rhlG1EW! zZ(10DvApwK;7VSePgM1EPeE)LP9D~8O3xU3J3n42@1s*MlBvL^U^~cw&O_C7S@)z2d!>HYt1y>;sf;xZ z$B4X2@y@S*Kjq+VUg|m?me{3dp2YX+vU?SD94Ql7JyGFY$&{-G{^^&+>9# zV(!!~yq?6owAI~1VqRt~AFVwbd6@rf(`Wt>4;Y&1pzO>~fqgY(dRka0)?73nm30jm z2tTuRZ9`-)C04pw7>A|6M&dx?o$5}>i$%EVyCA2c;;#!%r2$^0O?g)YIO9--T{jVe zt__a6WCntJXG5C#R%=ItTNU-olBGzDKa{9%5@u~w$$Tby;{nz}sIId$Al7C`oD6hL zfaZfD16myPcVRuM>I8B_EpZtMwNnSQr$FcErg>qux`jhBi9gTcLeuTpJl!*x0Fp46 zJi49?CY{AXvUWb;{2yOYT^)<0bz)-(IEU#aqlHc?3!{Zr=V7$asb*oc(BWlXcR|5} zWVGPivRGx3S5*sj@hP9ed^6;aYW60@3`!;UxlFq-d~ml#t8kewuFy{b!%;jlbj^=! z8iXP;qV9Onq0|$QekctD_zwlQnk3p{2eT`=4^^_>PTkwbMYX?rKmYrmUOHXPu7Wb1 zQhD7|Q?i64hVfS(oKL6xOWg17rBnX7{=JUWOb_Wm(a)zm)alU?7CY1#)whv}vle%z zXY}+cjmX%f#g3!k{Xl|n*eyY{Nt=LLN_MwPohVT)S|AJ+0TG}2uq%R=*I?j;`lik<5i9Qt#(tZpU1v6Ap2NSWtT_!SN< z`|1AGW9uJd;@o_=)hLfJ^bd7gGa}QDz_AdATb=usjzrZEqC3K&@7Xum-Zy zc7uK18QML#Z8|k6fDA@9V0o=-c-FhYJ)oH7^9df(u-1J-MK^D&cOV%;RB6)-gH=ppa&Ms)8{ezl7s zpWo~0m|SxJH+`)(pQ>&`tawiqFCIhmtH0d}X(;zS>q-XGu9_elu`5fBqtx$N=@4}O zs;+PGU_<-lGPZLK>zC`i^`Vwiujl8I>#Ds?g}HFu>~sV>{mXw}zOewx%~N#W3zeZv zR<}~}&{3JJ*n-ipIP_3GE*;aZ&K=bnNF(QZFPG}1;sQJ`lTYgIFcR6JxfyYrLn_%l z*e|`tdkoA9xLhv}qQkh9W15=w*a5x9VF(BQA=Yaku3KP~nYQ>j&KH%6fAhmJnb?bl zs*4rUkkc8wi=+Wln?L+0OlmNzWQsp`8thI6tU+o*P95$siKc!tIm!>}N7Duw^;xFIwRobl($|w^?#@cEI6F#l!n+lQj zg%A^=BuipaJp(bdh3r&U#@&f@=Q)QgX##EBl(Hoc;u~UM;VyzV0sc0Tp>O4-sLW8+>;*oF2lVLJ~pdKSzc=UFQsrX-)Z2g z{p^eU-D26_Vj;=uzSpv{S>%*TSXG*@z_ zJ&ZgdQrvuk_ajXBI~p&UvKpZuwhR4quhMILBKr4*VH-KyJ3vWj7A|MQg0v!;N!i z-;Hy!%5I!PdPzJu%|Imt<3-RTMat~IE1T{RdD)G_>WnYKh#>|?JMdjB zN;gtWy=sEKM5z8f*_k5==`qbab2O@T^?>nr-kjvBkv9iOb>5ud`Yh>eq!vq-6_IlB8JS9y*%$AE_J1mqX#%>h{1 zoAWPUT5rzNFUFfgcLI{(&B2x|i5Vux7~u3K=JFO|VP6If?zX z-kdoP^Je$%^LcY%x8cnZw~ZWT0l{pqtm!R8rCu#?8OHED29-i1Ht8jAPB-B2=EMNc z>&?Lq_%$2g0=dx`puIUqu_`8S&WE{-7;nW+qJAWAj{G3Wn{(JXT;Ku_r@TM-Y?3#J zJtlZ(k~immZnk7^4n#Ct$^INXK-mWa$<0=?KS%zb)}JHF+@8HKQ0#1yJvyT0B71b6 z;-<{rq0`(fWuK0`K&?*)MGT!2OePYA^l~GnkdO}9jr5*Qu>pv;w{E06zS?dip+$Bh zu`C0%h>lEdBp+R#7*spAUtKp+bO$pI253Nd9ygK!*KvM(k@gG5$%({gF?n-NB+XHB zu}`Txabgh?(nOpX+%qQzgX|zmP9*imNE1$^7Q5}BxgfBT6X{=6o191|k`w7u$%(X4 zDc!XVA>I>#lWC@VoJ@8i9Zyaq_8YuHYCUJdy+;G#vh{1}L_%>-pj7{Wip3oi(N>C z?wm+cpD*l0${O?extkPSbFYrO!Jt}=+1w4xe_n65+1olujG-vAH(2Kj;%_g^kz~%* zI+Ea5og+!2Mje?L8QU;yksRd+T?nt|MDSxVI((EIE>^b3Wt&0 zMBy-!b0{1}crTN~2A~hBKa_1O9!7Jde~)$KaR2^LcjGKV2R?#PMA^z@WmEx_It;uks1g?8DRhxyV*!)}+2^S$uRW37&3dnhIB zv`K1+k2$5}amxcYi=l^Ya2!sGw5F9~s5a8Y?Jp77^Gky}qwk()UWj;9&w-~xBVaJI zNpCI~0zm}8kY|tbOx8_9{`+JSqwBL(N~kQ4O5;`-DwGjxU(7>1(Q1%5 zG5qY#S~cNloao2iL5~FMVG*nEY#6*V3{yl8TdlYG2G1gP2w4c-f@*XD9yE6%3Iae7 zv*v+;4LfxP8x$UB*{H$>bp=lVRx$-31B1SjiOEa!T* zEF^QbWi8lVB#GRPR^A>R`P+?*aMGlyCBqaZ^0q)Qmx(+T41=EAdH!n|pfvcMB7nIh z9fYHlgk`RZE{$@$WtJ0|ik@AQIa3J696N!@VnuoiqE&DhTfK8Ft*)|Fa zU>j9(%AMFly$lFMj2^h|Y}mx}D%XM1F^S8IROn<&D0~cmm-7Icp1hIl^1pc#D96 zwuPgV?V#*TS0=;naq$CP94oVjRyMdD?RVNJoli%%ZQC`|X8VQ|+kCFN9XdG|tQc@> zh!^kn5E*>_RPDlR)>yp7lwtCgcjzgPh<@lruo_ogjImep1SRg5pTp&Ni=MP!zzHeY ze^*-ov!vkq?hUi%{8(LC^Dg00i%jfsa5&?r!P|Za=dF2ZErT(q4T*U@iqK{Lw(i+UD43sz=u#qAadNf16iK- z@`IO$O*rCf+JW=3>u~)Hdfp?p7>nZ#4tzJCvU6A)ceK%%2%nz!D4CRy_ujx?y$MZ8 zN2y)5|s5M zwB^t^T3HB?>?m7>R4SB~1OnZpoiSxV!RDLxdC@)3HQ-yXzTtGqOGw1mH=HgQNWS58 zfs=p3>GHMkDt*K0a)FIB|6w>?{wH*VZ#Z4P;dDXw{f5&8d-XS*F5hsv%sE{?$+m(9 z$H6z8E|^p|@80!)qufZgN3Dx9vCZn5et|RSuMWkfhKTkxo>H`*1*CO7so zE1ue8=Wk~n_PkSavWFoUttdIsm8cUNScYlqg7`pNUtN3;STTER&Iv1faNI zh&qdI{I{y*BxY==oGgCMSQ$^gph2`Rk^!1mbwZvtu%%BxD}ceNbwJ?q+EJ$Vnm;k5 zWwHg9%74krpADzGDqGNb%mC!1UU7z1od?I)ls%!>+7B5Z>80=5T2%#kk?gACYc?k; zBcXZ_L-z)+&$6G0+_z(1aJPlO3knG4y~j&J1Q?Pa@2$2@3C#oWO0c8Hdx}q%G>x(M zUDKt3r-ZhZnq@IIF)n%&BL|AB&?$ipNZ$h2Nx;>~NA0$*a~qFF8_R0r6SNUKWC9Sf z{r3T3PzsqCQaXxIJrB4Tl9FhKfvP*+tNQ0lZ(WS>vwL$O4^ke1r=Bj7mR|{im)PGp zQ0fI6t=pc;_YE|#itj0Yx&&YF7^DHIyW_N}@yTKI>6E9`eUmWrK!SVVjwYa(tg*^x zo%bn9&V>v7^pNp!6if6Vs%}vtC00#imP_E&aCW)#SufO=KTOl@mt>}(Q`f5HGlQIw z6@PTz#Sf*&r9t>KyHvYxj{-)`5KbPRI^Vjn;HY4rje^?!`MTo&#=Wwq_>I$V-Lo|r2> zI;1K@YI}(NV(<^x|5ntIM1OODL+nTrHn^=~2|}zbF*-moE}U<6A)3N6~Ku zf0?K|13{H;Ldo&Pv6X~GytZEY7)J#wvCj1J*o7;dQXDf2i`xY~*p<)~M-SC~OS^I0 zB?&9#s?Xf>onp4$MGR8jHd_(Z5Pg~DjVfU;vqX?C-);sjF3LwwAuCpco5t(yWP4-y zxjc1?y4@kGZ&wmSr%P&Ejoj?^2#io}Yjf0P3nB$irw}Q)fVQsDC#U;Z=F$$`p;V%$ zJKppEk@q%Gc3oGU=lyu^)vJ0{(vvL7vL)O1y|_aetY8`w8)JfQtvI%D(so#^Ug=&; z55x4#1j(xxcGSiLnWz#Aw^$fjfSFc<0YMB_Kmq{Pg7H7Hn z3&4SpN?gyGL$4Nf-RZUM^0beGS=)$OQP*ev7$7H6V^4PqTVSabzU@d#FSyPV!r(+< zy}(~#kG3%hp9SIb8GJU%fFLg1k36*+A{q?CDX68Fu=$qO6w~ubQhxFiKm0>e_YS}| zE)kH3&MWApXiY!d%_i8yE4u;bi7#*E(wrr6{TiX2H4~1ysbT<5~q&{$of1`H&E_ZmLIiC9M*AZ2AvL&yiG-1 z?BA}g`p%SL{Q_#s0*c-_e$l9rO!dTwLEX9owt2lmi0c+0FTOaCoM4U(W`b&9BwDKm zf0XDBBSAlbMu>|zMHQTDwSYvevhcPTml^WtAZy3UmPB~z-^zQ-^0Hpr9b7~Cy+8y$Zf$^BUP>O)u@(kGumEQhUH8?Y(y9X*6Pa;}fTxIf zSTh(#1gH(JHz+&>Qw9!9t5z}Ga%Pa`J6Uew&Li0c;oG1YT*Y|-y$h?U_$YRCT~L(LaC zi3kriF^A`diIkv-O}mr}!8UBEVnyFoGWE()`AiMXHOw`w@30L%Lb z3rNmE!P?JtM<^$1l(RerjS^xYh}YUDzjNpm68V6?B212Z(k7Q_v=T(U6)x zhSXqbV~Ye`nvfQ=$BLP#P1pqrzVPa@ET}u#rjt{2atdmnGHRbH+SbYTq)uu@VF%{K zDTy=Bl7uzeE3U5N)j_t*u}3r|>-B0MGny|P_$7u$jR<#DW+6Me?wn>|LZ>F}Lx#?A z=ug|grfpyv>_fW3(xKlN7&?qb=CSdws-u}=VCox?r`;~A3|?Jjxz=2#Mef9XHP7@5 zQpD)?FfTu#=v@{ih$9U0**a$@v&7_U3Nr_IBUQvUOWU4|OZ>8;&QqJSm%Y@Sn)F8` zM|sg75eel5e+8b*bJ2XEtgY(&q0vg94HIB;mXhBCVq9y78*Y7-8?WA6SkF*V)&LGOsWe_D>X z`-8v{cYjuzG1LesZ@BxPY1Iry=!UlfkKpcaIB-K>#a|@3s7=V5it3_IhTyedsdc#X zoslAd;(S`asCK7B1+ZO8Lp;&t-es=?{1kV>%kMrm!J}x@&RZDqxos(E3e0$Q`b=9j z8YdT4PH~gEsQ@nSsUG)hvONVdJm!sprE*5qReCA;T!+^xU*dbX$dNZmhZSTE>9lr1 zWiHTP#a02oZEEEAVq13}*cY&E`&RBRksJEe8xIQ7j*_x)K@{=Z{b1 zj;eVF;1N2Z+o4NIMPE4hb*Tm@=#Gd$HkjoQ&6=aY*i2hTP^`Eh7D_|b9qoweRToMN z(Nf1&dp9;@qn>hIH`Zalp4M)nyndt>HKlfYsA{770^Z`6W$P7P26{o7hw_SwV$)-o zhx>nZ*h%;Qsw_$z1{xlAFMRw1Klfdq_~hB2_xpd%JS|UGn>9AfaA7Wj*N{6*_xOF; z$T7PMIHVgPYhP%08SVns2S`-ym5QZ=Ld6-!T;nj52oH-!0@$EFYm=l##p#!!tCJmF znHUi*-8)*srScNqY#*R#??qXfxyN){Cs8e~_+YAupvKw50C7i}JaXfO<`Vcep3w`< zfwIvt9fZyF%{tHXjDyFy&5W7-&(!nK$jircc4WflXF7Le3u^ELM=LE}OacGmwA!O)6m%~rlT+-PH}(J$|snxO+253<-`=oy1`jU8Bp=klF z7!@qhTXty}zuLf*f);l{T}=xryo-hfeOyGI4$ z5RH`cor@RRJ?L z<}J3mzOCTghaENQX-D`mUcp7T=q>!-wAK|p9jI#RN<9uZ31HPiU56o*g|Vo&2#T$K z@CGyDHSy#Pw-=%*`1Aj3eS<0mus%x&hJ(?Qt`h%DJJ;GNo`Za2<>Ao;`$#jVR1 zexy1!J5!#nU+VQ4w7py6|}( znIvN?i&eA6u@wdT&||Fe3vxvPiCm2}qHG~x18WptkjYSd!K{q%3sd_g=4|QiYCmco zuZKqjU497pDCQylY9?G*Lr~;TNv~igp6s|HFQ!o`@~1jcktZ3Osm^@S2jm;_65U4( z%S?}^ri>`^F3){SHZZMHN^f*I9L(?^ zTI)^d4H}f&2C+9&4d85OE&wrbf4IB4TUin5vbwt?d8yt1D+x^C;Js)Rr)}1Z;7+S? zEqP2pc|+uHHz zG9|2g%imQ{jI$IJRdL6ev^>*u8!O}>b~LzGB$w$F$~5d(HL#+h32A7|HgPpGK)%{0 zs5}W1_nNsm_-2mg=VHo_Xle$ndfxeMc#t6OV4WeBcg_Ejm9l_iICiZo0N)2^FtjY{ zi|J?C&Ponpf6q?z()^%BKP$Hhyh z$I5zk1G0Fqj{jqOV@WOg+eG6V*(AY?`%2^w&~S;SctqF07|aq^^r?B4nrEn4?j36~ zFElW8pZhM>BEAQJaawmJQ3)Op2yzuZ_f^ zIQ2^r!K8>NvLGH{ghv!?<$sdLu(5Q2#}E{p_`H5EG9r~nv=#D7iLv<2C^1(818*G9 zHoo@a;U%;bQ*Fp?_Ir~CXfCil+Pfmn<3fMs^gi(8HI$SaG4CathvrbUZo8)+hE>)@BFaoVYCb1>D3>o_(2 z3+Jv47IyC1ly>-0-g{`BKNdR9$-OS`+PIYh5^$Wm%i6+65Wn$DHWyI$klT zXi3B}im-$F;TVE%*05&-PJ*whq04<$pN1p#KSGD=5C~dLjh-|YLsZI%`RvAhZTYMo zZ$~$N^S1S9wsNfsmlB?WSa8vP`;dMSQMDP(_Ea9-_zy$51ZwkT9G%5+-crsrQZy5A z?XFYgwynTJ2k>MTeeCC?KpnkckvHC%Df0Q?i8bg^etAOm#L^p{+dKjSo| zoQ+CNG5+B;YE;0t^1Sc%5?d}nYB1!H$*2rOmWyi~g3`&bC0ck5kB8fafX7gSK)|B8 z`0933|789ps|;pKP4aV+(|0J06AN|ThUQ4W!_|bXyOL)FTZsQKzw%;{i&(Z(V6N^3 zS;z(jE?V&##9IbJI>WW=WPvrZ4jRWz-yfmy0T-+eikxb~Kb(;3e@r;6oLmoKUR!c^ zG7k)VPo`-ETW|A{LYiJPy2v#X|OVaAwF7;U_Y~ z`79z#1|00bncUB+Gzh_tRbZcpX(EW7m{C-mQSn#sWb>U!l#E-TI>Rr0Lut*21gzJJ z&5S^px`ku1AU|^L;8!8{oJHcz8g5th;7SBv3bAor?qGQfHz8Ix8_FUuXHlI59lHcL zgq#v44$?unJd0&8iFlieZ-KBe;qav%h{wGBd+50F4znm(UlGban%G}m9^oUZQjS;( zqpDK0O?a~pR?D*xKlT!junmELz_cE{gUQDuu|$6u0hT;+A%#-W8{$=qOFSZ;lq#NBcqh>ihDkBN=lBi!R1Drg zxJYF&h61Z(=f8P5;bEpxJm>*F*|&unO(1ww!Xx{o45$&dE32TkMv>whVpJ8ZB>rFH z-MGkOh$k#ol@~)#f036~3?sa#)=GL{4XEJ*Y;d1~d=x?Wf_@3Xa#p_~+ZB-(+>*aA zGX6T59khxVq7SbBZADsGNLE8Ul7XC0SHW&o$1~NN@k~-&rHeh`0yp(UY(#VGK;~|X zHqXfn$F-dp!G&4Q!Z3?7LQGZjHl{EvrlwDC6Gm#j3Z&!9AjU3WEy=iKoiO!{9>Q@QgT6Gq}Ey5{Nj4s-DC!xZG?)0?^j-Lb_HgX4gMS z-_aP2Hs}?6cFlou9}9}leD+Rhb>ZlcbOJmmxFCE!dq}@ZXGck!N``UzQ~syNmy)t$ z7psC_dM58xXZ5)|sgB&n$bwS3R>jGK>l?1E9;18YHb&fd1Me4knO`e36^ zY2^2e_$|NiUC2PJS^MH>tVT3A9I#l!Q@+Hkr=uXD!+sA^g4mJ4Bc3nF%Z|3am*)Zw z*h8GoJMwAG$|d@=wcZrWimgU!qMj%pB;k;ex8x`69>!~>a#}&hpbW>A;9`ieZv!$x zxn$BvC3N&?^_p<8`T>|-a4XQ*tn7bN9KD8MiWtRuD+5c5S4ITM%+axmdmtrAfQF)Q zkstS*s4OHDbM^$4;%=J{3jKlvdX4s?EgXLLw{+P&6Sl<-ZTvnd|6_g+wy<6B`&5f7 zzxX|*Z4Z8*Zh0u(!!06R@%~I}K4wuazZRrwZLOS9Dt>5Qb3Z)BRTZ5Zr^E34i z61mw5nQ+EaPU+9pfIQv+-mAAqnJgsF;(;uCVJH@Y-ndNWmT;*$p zGxOKV(1WF0>!Ro*Rd`lilz_wy$dV$3RH{%1$heftc>9VPIkg8SS2IEQ*r-Ns%Ec;~ z;3A~GLM-sB>*E^dHa1#fV9IM?Kt1kUv3mg$T&YGcT{PxZ9Z-a2aY?V0fP1nKz+WfR z+5pA1l{t5Sl3))~<9On%45)`zx$I~kS#^XaF@FL3*e;+1o=6TG07wj#vJHTPs@&(I zGVFg6RAstl$xx??!<3E;--MA?MkQn!HUg+l+-vRqv5kP0yQ7T&#-n!BW#f>hEz6E! z-FDGZdG|nfCR3iYawd6X54ILg=R;)FW3othZBYP!+L0tp4;ft0Ktr85t-7t~=g4hsd>yaXfz`rzv2KW+wLWi1}ql zEnW zrAY>$>yNr@Jo5o zw5!w7!oHoBKD)T&7ASRd4eZi)1&n)C>{7sBK>BMz5`4aqN2`w^tEf1vctD(_Q<8)d z3V&>K=#8kSO0e_g_i(n-;kVORk^aQ#1igcpfsNE2hp2_j zbcdXr^?nx+MFr4UiS3~NBJZe2t)`r~u=0NNA!3O65F0{kx4bl@+O|HldywQi>7kg= z&>}bo=3*ArD9SiN()eyx$?7|u+iDcRfgJ1BH+Z+sjdg3Qp94{+#I@5}rNDg$)a@^L;V8O*lzu(>bZsF!fzdPN9rBk@ecr-^vFV+Y2Xiz(vqe7kKaGGi6 zkhg~D!HT6G5qk7{(foe%NDJ$GhQd(;u@Iz`U%f4R?Y@o-#0RIMfmjEc!*yrJc?@I}2s8dwMad~jV0))lO zve;GY^Gm$(enukoh?H7X(J0CLnuB(F#?8g7RJ5Va-z$|50A;xRjO{i~t=S?S7ZmFct8`yS0WcfTa9FX@Fr+25 z&ftfy0hLdRF_?xG7t>Dn8!1o$^xi-!5>*Wm1jM}m*`PqMse-+_e3xhyG4ml zEMg=L{irx|mQ$AU-y_M-i<7i2B&jC16vOSjV!QWjN5b)OF0WJfrU_hOc z2C7wjGPIYP)i`mhabi~EltWrsIqgH?)DLkJY@pLVA{|Iqr`6R(1aGtyznlKS4w?G% z(O7&KbyF+srD`vRu1N(Y?L;FDyB4N1x?iUm#kY`BA_JQt22-;ZKgW>7bTnE%vx;TI z)z8{Vcmv>;e(clHHr9(yb&;f>zQP(DLh)DD;BXP8FB`cTEnHOTH?FWM4Wa%$^gpXo zuBo5v7rNI{Zut=(<%eXh$<18D-1E-R!ROlEo8#&Y@AN8lGmmV8m1WtCeKBx2D1#hh zJhaI5Sp)lUAzeHk~BUNRoV zD62eZS;ejX@idR⪙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%0D|sv+hqy|GdH@D*Ev8 zhtUs=izvoQMXTlX@sag;+h?bFKd&w=UVTzsTJF;NwD`C9K~i4&Mg4ot=lb`eExmtn zXJ_Y2&CwH67F?`><7sHNG1djQ_%y*)G;j-ih^gWYvcNwsi6zons+(ob9VCL%x({XV zq0B7uevGT;)Sq${$4%;}Ez`&$?>H?R?aqiKNaQ=JXyH3r>f+v(8AJ&@KcucxscY5- zw;*@|SLu35-G|{jUi#_U!(PD&1-UxBpGUbbK}@T>H%Q%{A5nm=^i{@1+r-Q8Ee@HMyHvGAmSoHhHRi+}ZGXV*C|dFj?q zeDC0EUw7y0-}li!|BKIl?hAkYoyWg_$V<&RW?9eb-u^Sr+I-C2CQpAU`AvbX(bY}~Z@!j}yf58nB=(ZK`1hY^ zo3nBAaB=G3$L{~j2fq5XC;t8BSH9++_x$AppZ%*ZefgW;y5O!){q5(z^yST$Y`OYH zFWY+S>u&$(pMLUzhd%dLUz>Bni7$T1&;R48LsM;I*M8@_vu2+>URrq4)>qu{;g9^q z{r`EwiHlC&bp9nF-*Q*??I%C@(3cKfvgMi=XPai{mvsI3-^NS5XPvWQ;~jTCb?EXPlb`>>!(aLO zH-7NcAurn6anpBGH=WnCAeEVO;DfWKKCotKZtBr+UX!2dO07<1LqD6z&S|-H_A%Kj zvtepsOLN#1X2XE#*P2R)xr{&S_;i0bC!0y?D1`vrp^slgnnvHW_D|T>ZDV) zMq{a6r%Zi5ebas6{LD?i4quc#K6hgCajnO-?#i@e=4W1%Jw3gtWjTk~`(aORd1`(p z7fyYUSMBFqoLUi1G@TjF4$sW?HJzTm>Cl|HOQ#a3D*m43V8%@1B^MQL>PfYc^D|O(Tr)FEz>8U@Sb6_lg-O|%CynStI z>Mz3u;p{dq!%0PcDu7Ib7LEa*mCE~bf@9Lh&ND9ngB9(Q8%C8>~Wwom4!KJ)7P4|d)Dm7C6g*Z+6Zy6kDG zVB4uJn_8BpkG<)>7Z)!|t;^0?uc3a+FPaYi!)eX${*MDE_k?p&O$TnfHMKk47B*+| zZ`d~V^Oj1}_=%gQ-g;c?)y?y!UUlI7@Rb{8AOFfrPoMhgig11^IIyQb?Z48S`r5LK zQ!T0B<~iqGeAd+eI5Xp?u1qgj9UPdoJT=^URm;?e`%Y?Go@$1qGgEK9`Rh$>VOu!S z`l2jTCe;W0OPe|_IdDbm@nM+GHqXmuo5Qy3vZ=p0rR8Aei0n9K%Ucx?B#!*|=jSb^ z`yyEHQhrJLYVIX}lJsTVpUrQIU!t$w%DuujWjmYgQ#FE2_t-kQXX`}C44NC_ddFO(XSp|;XQTt zns*+0bj`2*fwg|iyVfpl8|eMOtjGGg=C-fvUO2GnCyU;7;S;+CF48Tz_-3KR4w!Gt1Mbhx=yxQ7_q3O|YkI3$mwQg;PyrXbI+X{?$5| zL5jojLVr;Za_}GNG#UKkf)ijBoA39|@@X%f^A|V!+f#l9kb-$Z zD$J)iW;)3DtgwY%cv5&$u!zH({A?4)8aMkZ!hJ!9znAmKoBd4qExHe+S=ARbWm*Ei zd(JtjZqjLgDW@JsbkGm`cnKI`e^U_L75Z&{R?UUM=lcD$=YP803t#JRi@eN8;H7*H zy}vX-sssDHAnm^;n14*0e`?dbTxZx#--2L?e=b-LIN7(!@A5g{C*%x0`h8l^1>YXS>4Rc^0$UU zV8*}O51WoRZ2JBQ{;X`6{&bVNaH25D=qQ&T{0s18xGo5;Y|@im!UAuLA;XyVn*HEs zj5Rdi-$7d`KWbT;vC+u{VJArTvY^4g?1Uhz+FqWa0q_iUsVN`$5l^0fPU;1^r=O{G nQ&W&#lzL<6^`=%f`Lp~J(*A5}nPWAiq0p3<9m{&#rk?me{K;dq literal 0 HcmV?d00001 From 4acd2b17b6372cdee98eee54b3a38367c83ffaa8 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 15:32:07 +0200 Subject: [PATCH 185/402] Update interface version --- packages/std/src/entry_points.rs | 2 +- packages/std/src/exports.rs | 4 ++-- packages/vm/README.md | 1 + packages/vm/src/compatibility.rs | 10 +++++----- packages/vm/src/environment.rs | 2 +- packages/vm/src/instance.rs | 6 +++--- packages/vm/src/static_analysis.rs | 6 +++--- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/std/src/entry_points.rs b/packages/std/src/entry_points.rs index 72130628f..62780e7db 100644 --- a/packages/std/src/entry_points.rs +++ b/packages/std/src/entry_points.rs @@ -81,7 +81,7 @@ macro_rules! create_entry_points { $crate::create_entry_points!(@migration; $contract, $migration); - // Other C externs like interface_version_6, allocate, deallocate are available + // Other C externs like interface_version_7, allocate, deallocate are available // automatically because we `use cosmwasm_std`. } }; diff --git a/packages/std/src/exports.rs b/packages/std/src/exports.rs index 64079cc66..30ef40389 100644 --- a/packages/std/src/exports.rs +++ b/packages/std/src/exports.rs @@ -1,6 +1,6 @@ //! exports exposes the public wasm API //! -//! interface_version_6, allocate and deallocate turn into Wasm exports +//! interface_version_7, allocate and deallocate turn into Wasm exports //! as soon as cosmwasm_std is `use`d in the contract, even privately. //! //! `do_execute`, `do_instantiate`, `do_migrate`, `do_query`, `do_reply` @@ -33,7 +33,7 @@ extern "C" fn requires_stargate() -> () {} /// They can be checked by cosmwasm_vm. /// Update this whenever the Wasm VM interface breaks. #[no_mangle] -extern "C" fn interface_version_6() -> () {} +extern "C" fn interface_version_7() -> () {} /// allocate reserves the given number of bytes in wasm memory and returns a pointer /// to a Region defining this data. This space is managed by the calling process diff --git a/packages/vm/README.md b/packages/vm/README.md index 4d2a08f66..6a380e73f 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -16,6 +16,7 @@ compatibility list: | cosmwasm-vm | Supported interface versions | cosmwasm-std | | ----------- | ---------------------------- | ------------ | +| 1.0 | `interface_version_7` | 1.0 | | 0.15 | `interface_version_6` | 0.15 | | 0.14 | `interface_version_5` | 0.14 | | 0.13 | `cosmwasm_vm_version_4` | 0.11-0.13 | diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 6c2df82cd..dcacfda0d 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -32,7 +32,7 @@ const SUPPORTED_IMPORTS: &[&str] = &[ /// Other optional exports exist, e.g. "execute", "migrate" and "query". /// This is unlikely to change much, must be frozen at 1.0 to avoid breaking existing contracts const REQUIRED_EXPORTS: &[&str] = &[ - "interface_version_6", + "interface_version_7", "instantiate", "allocate", "deallocate", @@ -169,7 +169,7 @@ mod tests { fn check_wasm_old_contract() { match check_wasm(CONTRACT_0_7, &default_features()) { Err(VmError::StaticValidationErr { msg, .. }) => assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_6\"" + "Wasm contract doesn't have required export: \"interface_version_7\"" )), Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("This must not succeeed"), @@ -177,7 +177,7 @@ mod tests { match check_wasm(CONTRACT_0_6, &default_features()) { Err(VmError::StaticValidationErr { msg, .. }) => assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_6\"" + "Wasm contract doesn't have required export: \"interface_version_7\"" )), Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("This must not succeeed"), @@ -291,7 +291,7 @@ mod tests { match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_6\"" + "Wasm contract doesn't have required export: \"interface_version_7\"" )); } Err(e) => panic!("Unexpected error {:?}", e), @@ -305,7 +305,7 @@ mod tests { match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_6\"" + "Wasm contract doesn't have required export: \"interface_version_7\"" )); } Err(e) => panic!("Unexpected error {:?}", e), diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index 32f374573..e983f80e3 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -704,7 +704,7 @@ mod tests { let (env, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - env.call_function0("interface_version_6", &[]).unwrap(); + env.call_function0("interface_version_7", &[]).unwrap(); } #[test] diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 487275811..98dd891f3 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -391,7 +391,7 @@ mod tests { let instance = mock_instance(&CONTRACT, &[]); instance - .call_function0("interface_version_6", &[]) + .call_function0("interface_version_7", &[]) .expect("error calling function"); } @@ -534,7 +534,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_6" (func 0)) + (export "interface_version_7" (func 0)) (export "instantiate" (func 0)) (export "allocate" (func 0)) (export "deallocate" (func 0)) @@ -552,7 +552,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_6" (func 0)) + (export "interface_version_7" (func 0)) (export "instantiate" (func 0)) (export "allocate" (func 0)) (export "deallocate" (func 0)) diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index aab8c6c0a..1ddf3eb99 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -124,7 +124,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_6" (func 0)) + (export "interface_version_7" (func 0)) (export "instantiate" (func 0)) (export "allocate" (func 0)) (export "deallocate" (func 0)) @@ -142,7 +142,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_6" (func 0)) + (export "interface_version_7" (func 0)) (export "instantiate" (func 0)) (export "execute" (func 0)) (export "allocate" (func 0)) @@ -167,7 +167,7 @@ mod tests { (type (func)) (func (type 0) nop) - (export "interface_version_6" (func 0)) + (export "interface_version_7" (func 0)) (export "instantiate" (func 0)) (export "execute" (func 0)) (export "allocate" (func 0)) From 6c732dda98402d9c1060aaf2c27a07166b54b30c Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 16:01:53 +0200 Subject: [PATCH 186/402] Update vm test contracts --- packages/vm/testdata/hackatom.wasm | 2 +- packages/vm/testdata/hackatom_1.0.wasm | Bin 0 -> 177717 bytes packages/vm/testdata/ibc_reflect_1.0.wasm | Bin 268213 -> 268213 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/vm/testdata/hackatom_1.0.wasm diff --git a/packages/vm/testdata/hackatom.wasm b/packages/vm/testdata/hackatom.wasm index 2f104ec42..76495bcd7 120000 --- a/packages/vm/testdata/hackatom.wasm +++ b/packages/vm/testdata/hackatom.wasm @@ -1 +1 @@ -hackatom_0.15.wasm \ No newline at end of file +hackatom_1.0.wasm \ No newline at end of file diff --git a/packages/vm/testdata/hackatom_1.0.wasm b/packages/vm/testdata/hackatom_1.0.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ac187e227f72a117b7096947166201eaf8beb01a GIT binary patch literal 177717 zcmeFa4Y*y`S>L%o&N=s6INNBF z|KGLu+4t&7mi$pt9<1b^z1QA*eZ1@ae&4lLcH`T>G0(Crzc;^NZ?S)WzF&W{z2$yi z>nGcrt2pPP$1Oj7{qURl(VcszeeWW_!Q1f)7p~~ey@Plq+dGxsO|{(Vruf_6e<%NO zcc*JsKkihs<(>K|{wkj@Z+`1Lr*8VX8}{9N<4svlchlVcn|*J-&DTd((|?ecM~#{3f1!)6H2ndH0rgeB+I8ZOevl zzxhqKz5EqBZhhGe@4R{6o4@|uS)o_AOp5p2{3cr4cf)P(__|wfes{K@$Lnss>E*9@ z#mio~;+suP;n&@G$D3|h@u+{(&0qJ9Z-^ex-Tsc7_r3duH{EjMo8L-*f4%tCVo(mJ zrpl?ZEb}}c=x31U{H5FdY^L9zX7c#2&wp7~@GQ@#@{)hNrR%}E>HhQ}D+*qk>-S5) zz2={i;g#i7o@e@0AL|e8aMPoXsd6wVXV=fpmV=&9Ms4fmvaeV9kFOcVh5_Bo2lInG z>!nx9vfs~V=wC1I=bPwhKG*BJt64Ap^XEMGf5yiwpH?r_d|5DjP?RCeOlbg9McLzD z+1r?%KhLNc8J{i;W{O^~phKBzD9g?5FwZN>qSw!F%kR9i59l@wE-d%w_44wuY;J#6 zANDZQr|#toQbJ-1N5W4RddP>)Y?R@vV2fS!nbxrfz=M&2M@K zSJ(ADUD>~!`o=eZ!#+LxSJOAX4eC~hU{_>ao zgL{fgZ(sb@{L6kT|Dk-_mtOvz`FG{togd1-C;#63`=H(L&wn8QXnr{Vr>}kG&MRK= z@%+C0(c-0BZ+qKY-?Fsr?RUKKl9EAI*Ox-}>_JERGc~e>A`RH}l`fxBhW{`73w+UjBdPf13Ya`N{mx z@>l$BzV-4~esghG@wLmvdyDTc4i!IN++F-YaryTaA1m%JeysSd;>U{zik~Qcqxj8Y z_AmZ$=2wg3W!~HWC0V`w)^Y#Rtjf1#y*<5MRlZnc9|FOZub2el?Z)GwxNzmu1~I*RTZi7g35K@yS2_$ zb)j#mI+gdU-dt7i!czT%Pq}J67#A+1{-(ZBUiIs0sVavb($#RO;%Bj_#{O9x{vZCm zR3IMyQ9j2j(@XrhL~W~%e%0SvY}#3ZS);tzrEiCI{+iydIveHle84MP%WP-StFn4t zpSs(8szeg|2X+~9fRj9-HYZo%U^_-6LI=@5UV)lyHT?{a$ zHQ?7>JSy~oFrlpJ*HA5&^_HdDEtG0#Q&m=(dp+bCpXIzUTpC`&J}V+l8ShkoZ}{_hHKooK{Ipm$RZXqHvZ+(CY^sZ8Li{d@O?jUF zeuf%W@w{f}p%-z6KKl1G6wLg&%}@xi;f5EFgnni^pB0y0&dsLHRYp^=(355sh^Xmt zKKyiE?1CY~M{fx}3OhCDj2G+PzHz>_m`H`Zl?uVQpUflx;lyy9#o{e+PNY6Ex_`$A zhQCLg8kRvdqaIgR_-dy9%-zSt;79XqE2G&G9$x3S!^+`jbPcZCY6sM67OW@z3W;Hs z7utaZZ>t@|@CL(Q^te`ytyj%@ERx;`$Jv!*smg8HZC7TOB62j89Yqzr<8QT8KZVX% zqX|e5o!5aE!`fQBWv4iz>MZN0vLta0APZ=EEm^fKyVM#`;_QWl3o^?i({%K!0`&&C zB)uosjYc*`n8D`}nCf26_v1P7;FUGRXgZZxvS`8@WrCXenp}U}zqRfQgHapmfz%Od zM0TVejQjQ9Fyh55+mWFd&}98N?vwJ9l#{`#`mEllKC3q?>T7kIu3A&>2C=RI-t#+( ztNEGQQC!C;LBKa^66(h@w4dvJ`G_uWiihv1%H8?S;w{`g`o3d`k6Zl8alP^`3ZDRg zhdz7^j1;a9zq?ov+Fv1siHW75#o}7jr9k_u$HgAh7Rs*CZ(-f3MA4~cTJ)g$86i%& zsQ0cwYeLu1#FvYmiQk^)T@wW+2ps@{;9XWdf1U-+NOh~T;Zf1XXt2x2RDsSm6F!Tvx{xXoqs z0nYKc?9~fpHMfx0Gf0fV!uC|{ z^k-Hg1%fSWI0TZY{_r=8l@Bp9g#OHz#Uflom(!G7Q(xtiU$Gv*9Kp}Qazl2WelRDC`*6~37n5*Ww znwOL6bG4F%8!d#t>EBNU;u0WLa8c$$XUXO+0L#8qZ!(Ov6 zs5gS`cp1!q8{|RM-Yz7AHb9ucJXSv_H4`609!+6FJJ0~Ud(dFIMJTjb+@#4|EcP;0 zp0NO7C{_j2n75S#9iS}jf@+`+{ex5dFH7r+JcDcBSxf3B6nnh5*d{uqlCBAVUCI!_ zgnpXhm)udmWrgl3y{;#n zE<^LFKmH*&Xcd4OUMM%y`uGT|0zcCSi#(TnJJHCu3OyLLtMTYu(m0KF7ds1?5>KJX zpeb|3i3!1#ewX*~1gflSxGLguGi-i;`8U7Epk5NgBYa&A*aPDHq(P7JknK z6owuE16Be&C5%Fj?kO8gNCTgo}9>XfKkn zxG51Wx>DKDSLn}+#r$ZXAB4lJQ6j`^;LIVEm^_dciNJ^4dPrShN7U z*jn7Nvpkd+l2?G`w(&X`lt3-D$RCe4NErk4uyL95T>b0%52RyO+3xo)FE5{ff-((g zLrleEe7HesCU0Jcnn|_SqUQlWnRdnQ>7C_X?!*@7I&-bpua>?Cc&A6RQfDc7?I_1` z%Wof@$0vt!DSYthLPOK#dM=+v*&6bTF*G`#Pd663N)5+q=6E_((dqgRQAPXJdDNbb z&J%B+VsZigT=aU^t?rH5WO|cQ?H4GiNA$+^sT!)-$hU~9LS|?h#3mFC;Rml@p$Znj z(Gl+MZP_cOl3Q~#s&3aO0iMedFNIWlV6=TaC1_-$8BIo1w3vEQ&|JV{D^<=49{KKU zv_&|`|NH!Zv&NjhEUkpMBbO4MS2-9wLp`WTQd5R;ITfR?mMXQb-d65BsIe^@MYA(Z z^_JcF8~9moH-gnLiWq>NUGt+ddPG!?u!`#m?^H%4sZ(t z481Vs5TmBi30;stBI21cOL5EVqNfm$2I}!>pc+=FH|v1Kw0MCvhnR`@Tb00@DNJ|k zth*5g4Ye?D#wZ0)(`>acZvgGmxoR5VMWZZ<1n^<_`zq4>MRHt)HW)=I!S=(6Wa^xu#I055a9M4~X)sp?KR&h&*Gd`OXvy zVE{+o6|R7mXM6b+q-oLMf&eZwq1R_La~(KHHv|n|-;P8cEl_cDGzxR*jwC<*NHh;> zB1RM34$j*UfQ?RO400CphYmJO@PmScAJLvf&SG&Sjp;rK1MUy!fg$(ifg*>@Ud2sT!&IzWoZk~=UQU>%HV_le8BT%4Tg!Kix9qMCe1aaFkArD^ zp>H-1IeYBsyPBs1)7?nA#q8 zP$`FcJE*k2MJ3f_Rv9nvs5s#J<1k-M_nf|6QXkRsa6ch1Di7c4iOr zMN>Cb3v%oh)_fO+|Fg>WjyCG&mVUJ`hX!43T*AMN^F&MsMspESS+1~bXCq4a1)R)YdN0tk%>nAX_0OLkA7jgWC|x*g-{=$(WFOJW+PQhePHo8KZJ! zz(Ay<4nyFnWq_kh;*RgaLE?cc1Th&kmI!b04GxmrBk%74HnMkmGIlUrM0P+ow3uVq z5>m40l2pqxbZL6R>TnIlyP@t&{htg(TANVv0Xb>seqbi@CltR4?F`jHx^BTh;-4^8 zszcBBx_c$;_J{T_t^1OGUgl@|ua}p!Rn}j-v~I4SHUCBXqN?G~Fh@ZLVxK0Aau*+5 z_Gya_DYFnr+H+^}n@bxWo>XB5|G1xEF*fD%6 z(7Rj9Yj+x$Npn^wbLl+b`XqkjHwi68jknknFo84-mbz4vaIe84@X4)B1c6`L6)#!+ zw~e9f8jZ#*u$q8eaH(2=j~caI#*^nP8Bg%62J~AR&|h+T(7&n$eZDs6n->K7(x4Yz z$=pd;@uC16HgpaE7vVoEz|9VrmD2*;VhT1Dget$}eH+O(IT9q3_OHG+%A zE%1#=ghvY9LaG_N;dd>TV0)rMh<90K&=7)7C*XC5u!vL_2B;88_%yL9#g+IBrXchY ze{v9M?%^UYWryzq#V^f*TI>D)6g|kYRzs3{Z$r0_)`HuvqO&q|>7qO_^KjLu!c8 zri>s45?c;Bsm^T6j-nqX zlhe6d6#ZP@26CdvA32hPKuLAnZ};GX_7B!aRJ>R`kdNg7*9=DGN1Do+Dd|;I{>hw4 zD`*o$E9=L?tR@UzKOL9D(qBg%&0l1xOsuIesHY?~(35&9v}x&xgKt5aA#I^;B;WdB zy4JYm54$@N)cF|wP?u!g%u4PwovHty_Z|aD9gR7WCv3)T7ncgL9FNO^hWt3yRO|OF ztgEIa)7ME7GARBE(2mUTCG_CWH0H(Pv0NNjDyZ_ScqSei{(h<(RO@-7+Her4Vuy=X zRU9Fe=U9<_KGUEm5^}@+QVFyAGCTu;rwBvqj?!W(W%=>+lBMvc8mm)$1Y|!yo+gUe zowdVPZ0t`3#)yrr0Y-`FnAAKhoQ~a`M>s$#cr$adVv^;Yr)bLeqz~6IkHlBfbPM)P zDCI;R4)xDSRR`|J^YD9n&O8rcJ}+nrfd3Sl{1hP${j;M2tW9?dvTl2%KsToIR5QLd zqLSBllChR$yZ_{me(vL+__5$GifC2P z{~Lw2^<&gRlSCX>Q2({5!U^%e9%3m(`^9d2F#NykItp}H5x>>j6B@@WPc3meLBU01LKA)=dV zwV2Ijd$XA5lNJ{s0PsjIpunTlm(8+NTml>-K&MG%03LC}=}GN^?Q9grDN56VSvCn+ zhR4TUUuXazRDKx~^)FyMWtQbum%eIA)KJg7mZS!;Jv1Rr1Kt(U(nd)=PfJl>yLA8V z&*$GV+Gyhdmfph*(|f9SE03w#RlSaoJw=PAnwFr@T{iB{cF*q4hQD2ag-q+#vbt7d z-&$@N;}UiC?-_5bHhm3PGN9h(R z->?9apK$fWS zCv3!wsZhcULjs*0m+pwq>6i>Y2o2cMDAZyHXO9C-DaDTqScb$#)pR1C1KumJ#BAqm zL>c-*)9q8xq~W8Yu@wWBmeGL8QSgA0!{GH@MXTH`$ECRzxL}7~X>}fM2-J9hD^@rX zR+ijjNHqlYo@zQAdREvBVEDl*J>U(pSt2_E#Ay`Fvz_j_g_Iv5q-*jcn3PqzB=B7! zMS7!t$p3@>OlrBhe-K=4$wt$&E&IqSeLu(x_=n4J2Smc%sl zH=h^|Y?=f!*7f}L;PNZH>Q{JmHtJD2tUC!q+EE-(uQu#JDDcbuvVJjv zp2?#h2MbMw*~h`cBUZcwwsw$Ykraa}>qCW|cDR|$(&T9|jW{I`7oo`2UPH}3vawX| znVSY6ZW;%Ho5pAJ3}cy#R2Z&OE(~;+#8pRpS)9SLtn1Gq-AGofMEcT7%n@1@%*+Y7 z6Ku3$Bq42?M!yftP9cs76HTc^9VXg{nnk)EB9*=*_KAB$rUlJ<=rh4Sr-lCw`&>Q7 z^}$YY&D&lIv0}H8)!9bE;B|RiXa-6>mRIs9)t~qvq{)Vte za|KttLfSbOSVWPCUe+(=>UtN-^>i%{QOA@-KKuZP77H0%IQ*dQN!GbS-M|%1tVC|2 z#o{vkMhKSst>qQ5w2t0qj2`p5M00m$x1(2?(jD}K8IZmPC^YNXdcfkx*5|{OslKRG z8ohl)Xr}HO)7DA#ohYeFgcVrqK!-1{b82jSV^gddTZoOzH1+Z$csP!Z<)a~T14!$i zs;bPu8JB|oa_Y!6v_epA zyyICXKJS8rb{fC)H$eMaG%Ex?nN@!F0ziJ0fz8kL!Dz&``))0$!he%_T=l_(Qubv0 z1JS=}Y2BbGy{10w;#{`wfBv;!{q;Zn)bIb~UuAE&81|2GyuZ#FOu}cG%zbc`(mN?l zNa|8V4HFscrQh1cgp0#2o-(P-x!J*VHa+d7)2o`4d8a&&pn`;%o#a_zW)M!mG$4de z3fauSEZ?sum~6B&xD2(u6SPz3qk2G_5`K-7El62aV310MX%l{X)y&+eV6wr_v;<%@ zFNV>9jEphTe)JXnY9O{|?=@APKTqTJOd3`BGkW!WhvUUy?Qmw-9?p66U^a#{+pq)- zG=a4H%p+CS0N&RGOh~Qg%B-$=&nDHD<^P*j{vE0}WZ5W=Q<9 zWm;O&wt;@En}adq)tkW6@1Gehm;x(YkC^7HrCqHr+EizE^V%5ZHIQFW8jZjRQoaVS zC@jsKrhE-)XaWSrogfK&YgCeW9u+;vJjVToduHU2b8 zswD`DSl+H+FGYR1V!69+MQGq7=p@F(dd$msNHnRpPxD7id9iqvv>C4CSly;g39j<@ z{9)N;5I6jSw8+(Mpe7+J#Buq0Yw;>Y*1DBPkEtZM5*RzLHIUD}p1^GC*)pj|^q&!u&Li#AW-_O2ifmUSe7fhg4`T!6I>{%0A_3~c<{W-=~f9T7L^Y#}a!ewHs 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 literal 0 HcmV?d00001 diff --git a/packages/vm/testdata/ibc_reflect_1.0.wasm b/packages/vm/testdata/ibc_reflect_1.0.wasm index 96a1feeeda26ad573ed8cc4ab3b6eacc7ba0b8b7..eca5db971eb28635fd9cc9feaa4ee061c05bf17d 100644 GIT binary patch delta 32 kcmdnGUSR8bfeo1~jONW*EbUn=j6lo;#LU~XSXjJ;0lESSn*aa+ delta 32 kcmdnGUSR8bfeo1~jAqSQEbUn=j6lo;#LU~XSXjJ;0lDl6ng9R* From 4fd16857c0ba46a8dd556ebb5f6c6b54d089d011 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 16:02:08 +0200 Subject: [PATCH 187/402] Update CHANGELOG.md --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ee47b30..ebcfc37cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to ## [Unreleased] +### Added + +- cosmwasm-std: Added the `IbcChannelOpenMsg`, `IbcChannelConnectMsg`, + `IbcChannelCloseMsg`, `IbcPacketReceiveMsg`, `IbcPacketAckMsg`, and + `IbcPacketTimeoutMsg` types for use with corresponding IBC entrypoints. + ### Changed - cosmwasm-std: The `attr` function now accepts types that implement @@ -14,6 +20,12 @@ and this project adheres to enabled by default. - cosmwasm-std: Make `MockApi::canonical_length` private. - cosmwasm-vm: Make `MockApi::canonical_length` private. +- cosmwasm-vm: Bump required marker export `cosmwasm_vm_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 wrap around channels, packets and acknowledgements. ## [0.15.0] - 2021-06-24 From cb71b9e079ede71f70b2d26f7ac5c72b73c1c054 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 16:27:07 +0200 Subject: [PATCH 188/402] Update IBC.md --- IBC.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/IBC.md b/IBC.md index 7d88c41b8..9f2349672 100644 --- a/IBC.md +++ b/IBC.md @@ -102,11 +102,11 @@ enforce other constraints as well: ```rust #[entry_point] /// enforces ordering and versioning constraints -pub fn ibc_channel_open(deps: DepsMut, env: Env, channel: IbcChannel) -> StdResult<()> { } +pub fn ibc_channel_open(deps: DepsMut, env: Env, msg: IbcChannelOpenMsg) -> StdResult<()> { } ``` This is the -[IbcChannel structure](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta4/packages/std/src/ibc.rs#L70-L81) +[IbcChannel structure](https://github.com/CosmWasm/cosmwasm/blob/v0.15.0/packages/std/src/ibc.rs#L117-L128) used heavily in the handshake process: ```rust @@ -130,6 +130,12 @@ pub struct IbcEndpoint { } ``` +This `IbcChannel` value has to be wrapped in the `IbcChannelOpenMsg` type. + +```rust +let msg = IbcChannelOpenMsg::new(channel); +``` + Note that neither `counterparty_version` nor `counterparty_endpoint` is set in `ibc_channel_open` for chain A. Chain B should enforce any `counterparty_version` constraints in `ibc_channel_open`. Chain A must enforce @@ -155,7 +161,7 @@ second step of the handshake, which is equivalent to `ChanOpenAck` and pub fn ibc_channel_connect( deps: DepsMut, env: Env, - channel: IbcChannel, + channel: IbcChannelConnectMsg, ) -> StdResult { } ``` @@ -192,7 +198,7 @@ allows it to take appropriate cleanup action: pub fn ibc_channel_close( deps: DepsMut, env: Env, - channel: IbcChannel, + msg: IbcChannelCloseMsg, ) -> StdResult { } ``` @@ -255,7 +261,7 @@ the following entry point on chain B: pub fn ibc_packet_receive( deps: DepsMut, env: Env, - packet: IbcPacket, + msg: IbcPacketReceiveMsg, ) -> StdResult { } ``` @@ -270,7 +276,7 @@ return an encoded `Acknowledgement` response in this field, that can be parsed by the sending chain. The -[`IbcPacket` structure](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta4/packages/std/src/ibc.rs#L129-L146) +[`IbcPacket` structure](https://github.com/CosmWasm/cosmwasm/blob/v0.15.0/packages/std/src/ibc.rs#L176-L187) contains all information needed to process the receipt. This info has already been verified by the core IBC modules via light client and merkle proofs. It guarantees all metadata in the `IbcPacket` structure is valid, and the `data` @@ -304,6 +310,8 @@ pub struct IbcPacket { } ``` +`IbcPacketReceiveMsg` is currently a wrapper around `IbcPacket`. + ##### Acknowledging Errors A major issue that is unique to `ibc_packet_receive` is that it is expected to @@ -500,16 +508,16 @@ error message), chain A will eventually get an acknowledgement: pub fn ibc_packet_ack( deps: DepsMut, env: Env, - ack: IbcAcknowledgement, + msg: IbcPacketAckMsg, ) -> StdResult { } ``` The -[`IbcAcknowledgement` structure](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta4/packages/std/src/ibc.rs#L148-L152) +[`IbcAcknowledgement` structure](https://github.com/CosmWasm/cosmwasm/blob/v0.15.0/packages/std/src/ibc.rs#L195-L200) contains both the original packet that was sent as well as the acknowledgement bytes returned from executing the remote contract. You can use the `original_packet` to -[map it the proper handler](https://github.com/CosmWasm/cosmwasm/blob/v0.14.0-beta4/contracts/ibc-reflect-send/src/ibc.rs#L114-L138) +[map it the proper handler](https://github.com/CosmWasm/cosmwasm/blob/update-ibc-types/contracts/ibc-reflect-send/src/ibc.rs#L111-L136) (after parsing your custom data format), and parse the `acknowledgement` there, to determine how to respond: @@ -552,7 +560,7 @@ The timeout callback looks like this: pub fn ibc_packet_timeout( deps: DepsMut, env: Env, - packet: IbcPacket, + msg: IbcPacketTimeoutMsg, ) -> StdResult {} ``` From e5eefe2514f6724e8a5c565d83a05a06c47ec8f4 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Mon, 12 Jul 2021 09:46:20 -0500 Subject: [PATCH 189/402] Implemented suggestions --- packages/std/src/imports.rs | 2 +- packages/vm/src/imports.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index d7a2f7cac..5d9848a74 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -18,7 +18,7 @@ use crate::{ }; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) -const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 32; +const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 54; /// An upper bound for typical human readable address formats (e.g. 42 for Ethereum hex addresses or 90 for bech32) const HUMAN_ADDRESS_BUFFER_LENGTH: usize = 90; diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 8847ae3a3..c645a8f5c 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -994,7 +994,7 @@ mod tests { let api = MockApi::default(); let (env, _instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 33]); + let source_ptr = write_data(&env, &[61; 100]); leave_default_data(&env); @@ -1087,7 +1087,7 @@ mod tests { let api = MockApi::default(); let (env, mut instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 33]); + let source_ptr = write_data(&env, &[61; 100]); let dest_ptr = create_empty(&mut instance, 8); leave_default_data(&env); @@ -1189,7 +1189,7 @@ mod tests { let api = MockApi::default(); let (env, mut instance) = make_instance(api); - let source_ptr = write_data(&env, &[61; 33]); + let source_ptr = write_data(&env, &[61; 65]); let dest_ptr = create_empty(&mut instance, 70); leave_default_data(&env); @@ -1203,8 +1203,8 @@ mod tests { }, .. } => { - assert_eq!(length, 33); - assert_eq!(max_length, 32); + assert_eq!(length, 65); + assert_eq!(max_length, 64); } err => panic!("Incorrect error returned: {:?}", err), } From 6f8c9a2ccdb64e3ae96198c052b2948403ecc977 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 12 Jul 2021 16:46:56 +0200 Subject: [PATCH 190/402] Update MIGRATING.md --- MIGRATING.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index 1287fa80d..4f24bbe0e 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -29,7 +29,92 @@ major releases of `cosmwasm`. Note that you can also view the ```diff - cosmwasm-std = { version = "0.15.0" } - + cosmwasm-std = { version = "0.15.0", default-features = false } + + cosmwasm-std = { version = "1.0.0", default-features = false } + ``` + +- For IBC-enabled contracts only: IBC entry points have different signatures. + Instead of accepting bare packets, channels and acknowledgements, all of those + are wrapped in a `Msg` type specific to the given entry point. Channels, + packets and acknowledgements have to be unpacked from those. + + ```diff + #[entry_point] + - pub fn ibc_channel_open(_deps: DepsMut, _env: Env, channel: IbcChannel) -> StdResult<()> { + + pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> StdResult<()> { + + let channel = msg.channel; + + // do things + } + ``` + + ```diff + #[entry_point] + pub fn ibc_channel_connect( + deps: DepsMut, + env: Env, + - channel: IbcChannel, + + msg: IbcChannelConnectMsg, + ) -> StdResult { + + let channel = msg.channel; + + // do things + } + ``` + + ```diff + #[entry_point] + pub fn ibc_channel_close( + deps: DepsMut, + env: Env, + - channel: IbcChannel, + + msg: IbcChannelCloseMsg, + ) -> StdResult { + + let channel = msg.channel; + + // do things + } + ``` + + ```diff + #[entry_point] + pub fn ibc_packet_receive( + deps: DepsMut, + env: Env, + - packet: IbcPacket, + + msg: IbcPacketReceiveMsg, + ) -> StdResult { + + let packet = msg.packet; + + // do things + } + ``` + + ```diff + #[entry_point] + pub fn ibc_packet_receive( + deps: DepsMut, + env: Env, + - ack: IbcAcknowledgementWithPacket, + + msg: IbcPacketReceiveMsg, + ) -> StdResult { + + let ack = msg.ack; + + // do things + } + ``` + + ```diff + #[entry_point] + pub fn ibc_packet_timeout( + deps: DepsMut, + env: Env, + - packet: IbcPacket, + + msg: IbcPacketTimeoutMsg, + ) -> StdResult { + + let packet = msg.packet; + + // do things + } ``` ## 0.14 -> 0.15 From 1270309a9439dfc5cce8e1de0a15551523d66d02 Mon Sep 17 00:00:00 2001 From: Luke Rhoads <51463884+lukerhoads@users.noreply.github.com> Date: Mon, 12 Jul 2021 10:21:51 -0500 Subject: [PATCH 191/402] Update packages/vm/src/imports.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- 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 c645a8f5c..556b89f4c 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -34,7 +34,7 @@ const MI: usize = 1024 * 1024; const MAX_LENGTH_DB_KEY: usize = 64 * KI; /// Max key length for db_write (i.e. when VM reads from Wasm memory) const MAX_LENGTH_DB_VALUE: usize = 128 * KI; -/// Typically 20 (Cosmos SDK, Ethereum) or 32 (Nano, Substrate) +/// Typically 20 (Cosmos SDK, Ethereum), 32 (Nano, Substrate) or 54 (MockApi) const MAX_LENGTH_CANONICAL_ADDRESS: usize = 64; /// The maximum allowed size for bech32 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32) const MAX_LENGTH_HUMAN_ADDRESS: usize = 90; From 09880a86701b4c78c8ad41b3f5f6e28441c06d9e Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Mon, 12 Jul 2021 10:55:00 -0500 Subject: [PATCH 192/402] Buffer length bumped to 64 to allow flexibility --- packages/std/src/imports.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index 5d9848a74..b4c983d1d 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -18,7 +18,7 @@ use crate::{ }; /// An upper bound for typical canonical address lengths (e.g. 20 in Cosmos SDK/Ethereum or 32 in Nano/Substrate) -const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 54; +const CANONICAL_ADDRESS_BUFFER_LENGTH: usize = 64; /// An upper bound for typical human readable address formats (e.g. 42 for Ethereum hex addresses or 90 for bech32) const HUMAN_ADDRESS_BUFFER_LENGTH: usize = 90; From 6ae035c194399beed9b56d737aa8002591f3f060 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Mon, 12 Jul 2021 11:33:11 -0500 Subject: [PATCH 193/402] Changelog entries --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ee47b30..2c800f5e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ and this project adheres to enabled by default. - cosmwasm-std: Make `MockApi::canonical_length` private. - cosmwasm-vm: Make `MockApi::canonical_length` private. +- 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]) ## [0.15.0] - 2021-06-24 From 8e2f579f1a974431d42380c5371a395131a83801 Mon Sep 17 00:00:00 2001 From: Simon Warta <2603011+webmaster128@users.noreply.github.com> Date: Mon, 12 Jul 2021 19:52:52 +0200 Subject: [PATCH 194/402] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c800f5e2..555683db5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ and this project adheres to representation. This allows you to insert typical bech32 addresses in tests. ([#995]) +[#995]: https://github.com/CosmWasm/cosmwasm/pull/995 + ## [0.15.0] - 2021-06-24 ### Added From e57ad26f6583284a571a6cc25a964e45d721453e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 13 Jul 2021 00:03:14 +0200 Subject: [PATCH 195/402] Update a link in IBC.md --- IBC.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IBC.md b/IBC.md index 9f2349672..8f20bea31 100644 --- a/IBC.md +++ b/IBC.md @@ -517,7 +517,7 @@ The contains both the original packet that was sent as well as the acknowledgement bytes returned from executing the remote contract. You can use the `original_packet` to -[map it the proper handler](https://github.com/CosmWasm/cosmwasm/blob/update-ibc-types/contracts/ibc-reflect-send/src/ibc.rs#L111-L136) +[map it the proper handler](https://github.com/CosmWasm/cosmwasm/blob/378b029707ebaed4505b3666c620bed69ff9a682/contracts/ibc-reflect-send/src/ibc.rs#L111-L136) (after parsing your custom data format), and parse the `acknowledgement` there, to determine how to respond: From ea0caad9b2e60d7357ec8a097e0509e3c0187514 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Tue, 13 Jul 2021 00:13:27 -0500 Subject: [PATCH 196/402] Removed unnecessary native wrappers --- packages/vm/src/imports.rs | 123 ++++-------------------------------- packages/vm/src/instance.rs | 33 +++++----- 2 files changed, 28 insertions(+), 128 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 556b89f4c..fe5f75efd 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -65,105 +65,6 @@ pub fn native_db_read( Ok(ptr) } -pub fn native_db_write( - env: &Environment, - key_ptr: u32, - value_ptr: u32, -) -> VmResult<()> { - do_write(env, key_ptr, value_ptr) -} - -pub fn native_db_remove( - env: &Environment, - key_ptr: u32, -) -> VmResult<()> { - do_remove(env, key_ptr) -} - -pub fn native_addr_validate( - env: &Environment, - source_ptr: u32, -) -> VmResult { - do_addr_validate(&env, source_ptr) -} - -pub fn native_addr_canonicalize( - env: &Environment, - source_ptr: u32, - destination_ptr: u32, -) -> VmResult { - do_addr_canonicalize(&env, source_ptr, destination_ptr) -} - -pub fn native_addr_humanize( - env: &Environment, - source_ptr: u32, - destination_ptr: u32, -) -> VmResult { - do_addr_humanize(&env, source_ptr, destination_ptr) -} - -pub fn native_secp256k1_verify( - env: &Environment, - hash_ptr: u32, - signature_ptr: u32, - pubkey_ptr: u32, -) -> VmResult { - do_secp256k1_verify(env, hash_ptr, signature_ptr, pubkey_ptr) -} - -pub fn native_secp256k1_recover_pubkey( - env: &Environment, - hash_ptr: u32, - signature_ptr: u32, - recovery_param: u32, -) -> VmResult { - do_secp256k1_recover_pubkey(env, hash_ptr, signature_ptr, recovery_param) -} - -pub fn native_ed25519_verify( - env: &Environment, - message_ptr: u32, - signature_ptr: u32, - pubkey_ptr: u32, -) -> VmResult { - do_ed25519_verify(env, message_ptr, signature_ptr, pubkey_ptr) -} - -pub fn native_ed25519_batch_verify( - env: &Environment, - messages_ptr: u32, - signatures_ptr: u32, - pubkeys_ptr: u32, -) -> VmResult { - do_ed25519_batch_verify(env, messages_ptr, signatures_ptr, pubkeys_ptr) -} - -pub fn native_query_chain( - env: &Environment, - request_ptr: u32, -) -> VmResult { - do_query_chain(env, request_ptr) -} - -#[cfg(feature = "iterator")] -pub fn native_db_scan( - env: &Environment, - start_ptr: u32, - end_ptr: u32, - order: i32, -) -> VmResult { - do_scan(env, start_ptr, end_ptr, order) -} - -#[cfg(feature = "iterator")] -pub fn native_db_next( - env: &Environment, - iterator_id: u32, -) -> VmResult { - do_next(env, iterator_id) -} - /// 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 native_debug( @@ -201,7 +102,7 @@ fn do_read( } /// Writes a storage entry from Wasm memory into the VM's storage -fn do_write( +pub fn do_write( env: &Environment, key_ptr: u32, value_ptr: u32, @@ -221,7 +122,7 @@ fn do_write( Ok(()) } -fn do_remove( +pub fn do_remove( env: &Environment, key_ptr: u32, ) -> VmResult<()> { @@ -239,7 +140,7 @@ fn do_remove( Ok(()) } -fn do_addr_validate( +pub fn do_addr_validate( env: &Environment, source_ptr: u32, ) -> VmResult { @@ -264,7 +165,7 @@ fn do_addr_validate( } } -fn do_addr_canonicalize( +pub fn do_addr_canonicalize( env: &Environment, source_ptr: u32, destination_ptr: u32, @@ -293,7 +194,7 @@ fn do_addr_canonicalize( } } -fn do_addr_humanize( +pub fn do_addr_humanize( env: &Environment, source_ptr: u32, destination_ptr: u32, @@ -314,7 +215,7 @@ fn do_addr_humanize( } } -fn do_secp256k1_verify( +pub fn do_secp256k1_verify( env: &Environment, hash_ptr: u32, signature_ptr: u32, @@ -341,7 +242,7 @@ fn do_secp256k1_verify( )) } -fn do_secp256k1_recover_pubkey( +pub fn do_secp256k1_recover_pubkey( env: &Environment, hash_ptr: u32, signature_ptr: u32, @@ -374,7 +275,7 @@ fn do_secp256k1_recover_pubkey( } } -fn do_ed25519_verify( +pub fn do_ed25519_verify( env: &Environment, message_ptr: u32, signature_ptr: u32, @@ -402,7 +303,7 @@ fn do_ed25519_verify( )) } -fn do_ed25519_batch_verify( +pub fn do_ed25519_batch_verify( env: &Environment, messages_ptr: u32, signatures_ptr: u32, @@ -465,7 +366,7 @@ fn write_to_contract( Ok(target_ptr) } -fn do_query_chain( +pub fn do_query_chain( env: &Environment, request_ptr: u32, ) -> VmResult { @@ -481,7 +382,7 @@ fn do_query_chain( } #[cfg(feature = "iterator")] -fn do_scan( +pub fn do_scan( env: &Environment, start_ptr: u32, end_ptr: u32, @@ -502,7 +403,7 @@ fn do_scan( } #[cfg(feature = "iterator")] -fn do_next( +pub fn do_next( env: &Environment, iterator_id: u32, ) -> VmResult { diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 487275811..a01e9fee1 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -9,13 +9,12 @@ use crate::environment::Environment; use crate::errors::{CommunicationError, VmError, VmResult}; use crate::features::required_features_from_wasmer_instance; use crate::imports::{ - native_addr_canonicalize, native_addr_humanize, native_addr_validate, native_db_read, - native_db_remove, native_db_write, native_debug, native_ed25519_batch_verify, - native_ed25519_verify, native_query_chain, native_secp256k1_recover_pubkey, - native_secp256k1_verify, + do_write, do_remove, do_addr_validate, do_addr_canonicalize, + do_addr_humanize, do_secp256k1_verify, native_debug, do_secp256k1_recover_pubkey, + do_ed25519_verify, do_ed25519_batch_verify, do_query_chain, + do_scan, do_next, native_db_read }; #[cfg(feature = "iterator")] -use crate::imports::{native_db_next, native_db_scan}; use crate::memory::{read_region, write_region}; use crate::size::Size; use crate::wasm_backend::compile; @@ -94,7 +93,7 @@ where // 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(), native_db_write), + Function::new_native_with_env(store, env.clone(), do_write), ); // Removes the value at the given key. Different than writing &[] as future @@ -103,7 +102,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(), native_db_remove), + Function::new_native_with_env(store, env.clone(), do_remove), ); // Reads human address from source_ptr and checks if it is valid. @@ -111,7 +110,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(), native_addr_validate), + Function::new_native_with_env(store, env.clone(), do_addr_validate), ); // Reads human address from source_ptr and writes canonicalized representation to destination_ptr. @@ -120,7 +119,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(), native_addr_canonicalize), + Function::new_native_with_env(store, env.clone(), do_addr_canonicalize), ); // Reads canonical address from source_ptr and writes humanized representation to destination_ptr. @@ -129,7 +128,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(), native_addr_humanize), + Function::new_native_with_env(store, env.clone(), do_addr_humanize), ); // Verifies message hashes against a signature with a public key, using the secp256k1 ECDSA parametrization. @@ -137,12 +136,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(), native_secp256k1_verify), + Function::new_native_with_env(store, env.clone(), do_secp256k1_verify), ); env_imports.insert( "secp256k1_recover_pubkey", - Function::new_native_with_env(store, env.clone(), native_secp256k1_recover_pubkey), + Function::new_native_with_env(store, env.clone(), do_secp256k1_recover_pubkey), ); // Verifies a message against a signature with a public key, using the ed25519 EdDSA scheme. @@ -150,7 +149,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(), native_ed25519_verify), + Function::new_native_with_env(store, env.clone(), do_ed25519_verify), ); // Verifies a batch of messages against a batch of signatures with a batch of public keys, @@ -160,7 +159,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(), native_ed25519_batch_verify), + Function::new_native_with_env(store, env.clone(), do_ed25519_batch_verify), ); // Allows the contract to emit debug logs that the host can either process or ignore. @@ -174,7 +173,7 @@ where env_imports.insert( "query_chain", - Function::new_native_with_env(store, env.clone(), native_query_chain), + Function::new_native_with_env(store, env.clone(), do_query_chain), ); // Creates an iterator that will go from start to end. @@ -186,7 +185,7 @@ where #[cfg(feature = "iterator")] env_imports.insert( "db_scan", - Function::new_native_with_env(store, env.clone(), native_db_scan), + Function::new_native_with_env(store, env.clone(), do_scan), ); // Get next element of iterator with ID `iterator_id`. @@ -197,7 +196,7 @@ where #[cfg(feature = "iterator")] env_imports.insert( "db_next", - Function::new_native_with_env(store, env.clone(), native_db_next), + Function::new_native_with_env(store, env.clone(), do_next), ); import_obj.register("env", env_imports); From e82f9dd36cfb5fe642c592f66b4976593149af96 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Tue, 13 Jul 2021 00:44:31 -0500 Subject: [PATCH 197/402] Suggestions implemented --- packages/vm/src/imports.rs | 86 ++++++++++++++++++------------------- packages/vm/src/instance.rs | 18 ++++---- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index fe5f75efd..5f18acfc7 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -67,7 +67,7 @@ pub fn native_db_read( /// 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 native_debug( +pub fn do_debug( env: &Environment, message_ptr: u32, ) -> VmResult<()> { @@ -102,7 +102,7 @@ fn do_read( } /// Writes a storage entry from Wasm memory into the VM's storage -pub fn do_write( +pub fn do_db_write( env: &Environment, key_ptr: u32, value_ptr: u32, @@ -122,7 +122,7 @@ pub fn do_write( Ok(()) } -pub fn do_remove( +pub fn do_db_remove( env: &Environment, key_ptr: u32, ) -> VmResult<()> { @@ -382,7 +382,7 @@ pub fn do_query_chain( } #[cfg(feature = "iterator")] -pub fn do_scan( +pub fn do_db_scan( env: &Environment, start_ptr: u32, end_ptr: u32, @@ -403,7 +403,7 @@ pub fn do_scan( } #[cfg(feature = "iterator")] -pub fn do_next( +pub fn do_db_next( env: &Environment, iterator_id: u32, ) -> VmResult { @@ -599,7 +599,7 @@ mod tests { } #[test] - fn do_write_works() { + fn do_db_write_works() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -608,7 +608,7 @@ mod tests { leave_default_data(&env); - do_write(&env, key_ptr, value_ptr).unwrap(); + do_db_write(&env, key_ptr, value_ptr).unwrap(); let val = env .with_storage_from_context::<_, _>(|store| { @@ -622,7 +622,7 @@ mod tests { } #[test] - fn do_write_can_override() { + fn do_db_write_can_override() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -631,7 +631,7 @@ mod tests { leave_default_data(&env); - do_write(&env, key_ptr, value_ptr).unwrap(); + do_db_write(&env, key_ptr, value_ptr).unwrap(); let val = env .with_storage_from_context::<_, _>(|store| { @@ -642,7 +642,7 @@ mod tests { } #[test] - fn do_write_works_for_empty_value() { + fn do_db_write_works_for_empty_value() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -651,7 +651,7 @@ mod tests { leave_default_data(&env); - do_write(&env, key_ptr, value_ptr).unwrap(); + do_db_write(&env, key_ptr, value_ptr).unwrap(); let val = env .with_storage_from_context::<_, _>(|store| { @@ -665,7 +665,7 @@ mod tests { } #[test] - fn do_write_fails_for_large_key() { + fn do_db_write_fails_for_large_key() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -674,7 +674,7 @@ mod tests { leave_default_data(&env); - let result = do_write(&env, key_ptr, value_ptr); + let result = do_db_write(&env, key_ptr, value_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -691,7 +691,7 @@ mod tests { } #[test] - fn do_write_fails_for_large_value() { + fn do_db_write_fails_for_large_value() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -700,7 +700,7 @@ mod tests { leave_default_data(&env); - let result = do_write(&env, key_ptr, value_ptr); + let result = do_db_write(&env, key_ptr, value_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -717,7 +717,7 @@ mod tests { } #[test] - fn do_write_is_prohibited_in_readonly_contexts() { + fn do_db_write_is_prohibited_in_readonly_contexts() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -727,7 +727,7 @@ mod tests { leave_default_data(&env); env.set_storage_readonly(true); - let result = do_write(&env, key_ptr, value_ptr); + let result = do_db_write(&env, key_ptr, value_ptr); match result.unwrap_err() { VmError::WriteAccessDenied { .. } => {} e => panic!("Unexpected error: {:?}", e), @@ -735,7 +735,7 @@ mod tests { } #[test] - fn do_remove_works() { + fn do_db_remove_works() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -750,7 +750,7 @@ mod tests { }) .unwrap(); - do_remove(&env, key_ptr).unwrap(); + do_db_remove(&env, key_ptr).unwrap(); env.with_storage_from_context::<_, _>(|store| { println!("{:?}", store); @@ -767,7 +767,7 @@ mod tests { } #[test] - fn do_remove_works_for_non_existent_key() { + fn do_db_remove_works_for_non_existent_key() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -777,7 +777,7 @@ mod tests { leave_default_data(&env); // Note: right now we cannot differnetiate between an existent and a non-existent key - do_remove(&env, key_ptr).unwrap(); + do_db_remove(&env, key_ptr).unwrap(); let value = env .with_storage_from_context::<_, _>(|store| { @@ -788,7 +788,7 @@ mod tests { } #[test] - fn do_remove_fails_for_large_key() { + fn do_db_remove_fails_for_large_key() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -796,7 +796,7 @@ mod tests { leave_default_data(&env); - let result = do_remove(&env, key_ptr); + let result = do_db_remove(&env, key_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: @@ -813,7 +813,7 @@ mod tests { } #[test] - fn do_remove_is_prohibited_in_readonly_contexts() { + fn do_db_remove_is_prohibited_in_readonly_contexts() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -822,7 +822,7 @@ mod tests { leave_default_data(&env); env.set_storage_readonly(true); - let result = do_remove(&env, key_ptr); + let result = do_db_remove(&env, key_ptr); match result.unwrap_err() { VmError::WriteAccessDenied { .. } => {} e => panic!("Unexpected error: {:?}", e), @@ -1726,13 +1726,13 @@ mod tests { #[test] #[cfg(feature = "iterator")] - fn do_scan_unbound_works() { + fn do_db_scan_unbound_works() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); // set up iterator over all space - let id = do_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); + let id = do_db_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); assert_eq!(1, id); let item = env @@ -1753,13 +1753,13 @@ mod tests { #[test] #[cfg(feature = "iterator")] - fn do_scan_unbound_descending_works() { + fn do_db_scan_unbound_descending_works() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); // set up iterator over all space - let id = do_scan(&env, 0, 0, Order::Descending.into()).unwrap(); + let id = do_db_scan(&env, 0, 0, Order::Descending.into()).unwrap(); assert_eq!(1, id); let item = env @@ -1780,7 +1780,7 @@ mod tests { #[test] #[cfg(feature = "iterator")] - fn do_scan_bound_works() { + fn do_db_scan_bound_works() { let api = MockApi::default(); let (env, _instance) = make_instance(api); @@ -1789,7 +1789,7 @@ mod tests { leave_default_data(&env); - let id = do_scan(&env, start, end, Order::Ascending.into()).unwrap(); + let id = do_db_scan(&env, start, end, Order::Ascending.into()).unwrap(); let item = env .with_storage_from_context::<_, _>(|store| Ok(store.next(id))) @@ -1804,14 +1804,14 @@ mod tests { #[test] #[cfg(feature = "iterator")] - fn do_scan_multiple_iterators() { + fn do_db_scan_multiple_iterators() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); // unbounded, ascending and descending - let id1 = do_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); - let id2 = do_scan(&env, 0, 0, Order::Descending.into()).unwrap(); + let id1 = do_db_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); + let id2 = do_db_scan(&env, 0, 0, Order::Descending.into()).unwrap(); assert_eq!(id1, 1); assert_eq!(id2, 2); @@ -1848,13 +1848,13 @@ mod tests { #[test] #[cfg(feature = "iterator")] - fn do_scan_errors_for_invalid_order_value() { + fn do_db_scan_errors_for_invalid_order_value() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); // set up iterator over all space - let result = do_scan(&env, 0, 0, 42); + let result = do_db_scan(&env, 0, 0, 42); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::InvalidOrder { .. }, @@ -1866,44 +1866,44 @@ mod tests { #[test] #[cfg(feature = "iterator")] - fn do_next_works() { + fn do_db_next_works() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); - let id = do_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); + let id = do_db_scan(&env, 0, 0, Order::Ascending.into()).unwrap(); // Entry 1 - let kv_region_ptr = do_next(&env, id).unwrap(); + let kv_region_ptr = do_db_next(&env, id).unwrap(); assert_eq!( force_read(&env, kv_region_ptr), [KEY1, b"\0\0\0\x03", VALUE1, b"\0\0\0\x06"].concat() ); // Entry 2 - let kv_region_ptr = do_next(&env, id).unwrap(); + let kv_region_ptr = do_db_next(&env, id).unwrap(); assert_eq!( force_read(&env, kv_region_ptr), [KEY2, b"\0\0\0\x04", VALUE2, b"\0\0\0\x05"].concat() ); // End - let kv_region_ptr = do_next(&env, id).unwrap(); + 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"); // API makes no guarantees for value_ptr in this case } #[test] #[cfg(feature = "iterator")] - fn do_next_fails_for_non_existent_id() { + fn do_db_next_fails_for_non_existent_id() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); let non_existent_id = 42u32; - let result = do_next(&env, non_existent_id); + let result = do_db_next(&env, 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 a01e9fee1..2f344ac66 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -9,12 +9,12 @@ use crate::environment::Environment; use crate::errors::{CommunicationError, VmError, VmResult}; use crate::features::required_features_from_wasmer_instance; use crate::imports::{ - do_write, do_remove, do_addr_validate, do_addr_canonicalize, - do_addr_humanize, do_secp256k1_verify, native_debug, do_secp256k1_recover_pubkey, - do_ed25519_verify, do_ed25519_batch_verify, do_query_chain, - do_scan, do_next, native_db_read + do_addr_canonicalize, do_addr_humanize, do_addr_validate, 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, native_db_read, }; #[cfg(feature = "iterator")] +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; @@ -93,7 +93,7 @@ where // 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_write), + Function::new_native_with_env(store, env.clone(), do_db_write), ); // Removes the value at the given key. Different than writing &[] as future @@ -102,7 +102,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_remove), + Function::new_native_with_env(store, env.clone(), do_db_remove), ); // Reads human address from source_ptr and checks if it is valid. @@ -168,7 +168,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(), native_debug), + Function::new_native_with_env(store, env.clone(), do_debug), ); env_imports.insert( @@ -185,7 +185,7 @@ where #[cfg(feature = "iterator")] env_imports.insert( "db_scan", - Function::new_native_with_env(store, env.clone(), do_scan), + Function::new_native_with_env(store, env.clone(), do_db_scan), ); // Get next element of iterator with ID `iterator_id`. @@ -196,7 +196,7 @@ where #[cfg(feature = "iterator")] env_imports.insert( "db_next", - Function::new_native_with_env(store, env.clone(), do_next), + Function::new_native_with_env(store, env.clone(), do_db_next), ); import_obj.register("env", env_imports); From 0eeb0e81de15eddffb96bf25a4e751cc09a110ec Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 13 Jul 2021 16:55:31 +0200 Subject: [PATCH 198/402] Organize code --- packages/vm/src/imports.rs | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 5f18acfc7..2361bc9bc 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -53,10 +53,6 @@ const MAX_COUNT_ED25519_BATCH: usize = 256; /// Max length for a debug message const MAX_LENGTH_DEBUG: usize = 2 * MI; -// The block of native_* prefixed functions is tailored for Wasmer's -// Function::new_native_with_env interface. Those require an env in the first -// argument and cannot capiture other variables such as the Api. - pub fn native_db_read( env: &Environment, key_ptr: u32, @@ -65,23 +61,12 @@ pub fn native_db_read( Ok(ptr) } -/// 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, - message_ptr: u32, -) -> VmResult<()> { - if env.print_debug { - let message_data = read_region(&env.memory(), message_ptr, MAX_LENGTH_DEBUG)?; - let msg = String::from_utf8_lossy(&message_data); - println!("{}", msg); - } - Ok(()) -} - -// // Import implementations // +// This block of do_* prefixed functions is tailored for Wasmer's +// Function::new_native_with_env interface. Those require an env in the first +// argument and cannot capture other variables. Thus everything is accessed +// through the env. /// Reads a storage entry from the VM's storage into Wasm memory fn do_read( @@ -351,6 +336,20 @@ 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, + message_ptr: u32, +) -> VmResult<()> { + if env.print_debug { + let message_data = read_region(&env.memory(), message_ptr, MAX_LENGTH_DEBUG)?; + let msg = String::from_utf8_lossy(&message_data); + println!("{}", msg); + } + Ok(()) +} + /// Creates a Region in the contract, writes the given data to it and returns the memory location fn write_to_contract( env: &Environment, From 91d296587b4ce4241f3d785eb2aa317738543c9b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 13 Jul 2021 16:56:49 +0200 Subject: [PATCH 199/402] Remove obsolete native_db_read; Rename to do_db_read --- packages/vm/src/imports.rs | 22 +++++++--------------- packages/vm/src/instance.rs | 8 ++++---- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 2361bc9bc..70a97b381 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -53,14 +53,6 @@ const MAX_COUNT_ED25519_BATCH: usize = 256; /// Max length for a debug message const MAX_LENGTH_DEBUG: usize = 2 * MI; -pub fn native_db_read( - env: &Environment, - key_ptr: u32, -) -> VmResult { - let ptr = do_read::(env, key_ptr)?; - Ok(ptr) -} - // Import implementations // // This block of do_* prefixed functions is tailored for Wasmer's @@ -69,7 +61,7 @@ pub fn native_db_read( // through the env. /// Reads a storage entry from the VM's storage into Wasm memory -fn do_read( +pub fn do_db_read( env: &Environment, key_ptr: u32, ) -> VmResult { @@ -557,37 +549,37 @@ mod tests { } #[test] - fn do_read_works() { + fn do_db_read_works() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); let key_ptr = write_data(&env, KEY1); - let result = do_read(&env, key_ptr); + 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); } #[test] - fn do_read_works_for_non_existent_key() { + fn do_db_read_works_for_non_existent_key() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); let key_ptr = write_data(&env, b"I do not exist in storage"); - let result = do_read(&env, key_ptr); + let result = do_db_read(&env, key_ptr); assert_eq!(result.unwrap(), 0); } #[test] - fn do_read_fails_for_large_key() { + fn do_db_read_fails_for_large_key() { let api = MockApi::default(); let (env, _instance) = make_instance(api); leave_default_data(&env); let key_ptr = write_data(&env, &vec![7u8; 300 * 1024]); - let result = do_read(&env, key_ptr); + let result = do_db_read(&env, key_ptr); match result.unwrap_err() { VmError::CommunicationErr { source: CommunicationError::RegionLengthTooBig { length, .. }, diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 2f344ac66..7a85e0b97 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -9,9 +9,9 @@ use crate::environment::Environment; use crate::errors::{CommunicationError, VmError, VmResult}; use crate::features::required_features_from_wasmer_instance; use crate::imports::{ - do_addr_canonicalize, do_addr_humanize, do_addr_validate, 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, native_db_read, + 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, }; #[cfg(feature = "iterator")] use crate::imports::{do_db_next, do_db_scan}; @@ -86,7 +86,7 @@ where // Ownership of the value pointer is transferred to the contract. env_imports.insert( "db_read", - Function::new_native_with_env(store, env.clone(), native_db_read), + Function::new_native_with_env(store, env.clone(), do_db_read), ); // Writes the given value into the database entry at the given key. From 2e643c2a620bcde376ca6fd66997fccd3dd5b39b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 13 Jul 2021 17:53:26 +0200 Subject: [PATCH 200/402] Update IBC testing mocks to produce msg types --- contracts/ibc-reflect-send/src/ibc.rs | 28 ++----- .../ibc-reflect-send/tests/integration.rs | 28 +++---- contracts/ibc-reflect/src/contract.rs | 12 +-- contracts/ibc-reflect/tests/integration.rs | 13 ++- packages/std/src/lib.rs | 5 +- packages/std/src/mock.rs | 79 +++++++++++++++++-- packages/vm/src/calls.rs | 22 +++--- 7 files changed, 113 insertions(+), 74 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index bf179c1f8..00c946017 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -254,10 +254,7 @@ mod tests { mock_dependencies, mock_env, mock_ibc_channel, mock_ibc_packet_ack, mock_info, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::{ - coin, coins, BankMsg, CosmosMsg, IbcAcknowledgement, IbcAcknowledgementWithPacket, - OwnedDeps, - }; + use cosmwasm_std::{coin, coins, BankMsg, CosmosMsg, IbcAcknowledgement, OwnedDeps}; const CREATOR: &str = "creator"; @@ -301,11 +298,8 @@ mod tests { let response = AcknowledgementMsg::Ok(WhoAmIResponse { account: account.into(), }); - let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), - original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), - }; - let msg = IbcPacketAckMsg::new(ack); + let ack = IbcAcknowledgement::encode_json(&response).unwrap(); + let msg = mock_ibc_packet_ack(channel_id, &packet, ack).unwrap(); let res = ibc_packet_ack(deps, mock_env(), msg).unwrap(); assert_eq!(0, res.messages.len()); } @@ -390,23 +384,17 @@ mod tests { let info = mock_info(CREATOR, &[]); let mut res = execute(deps.as_mut(), mock_env(), info, handle_msg).unwrap(); assert_eq!(1, res.messages.len()); - let packet = match res.messages.swap_remove(0).msg { + let msg = match res.messages.swap_remove(0).msg { CosmosMsg::Ibc(IbcMsg::SendPacket { channel_id, data, .. }) => { - let mut packet = mock_ibc_packet_ack(&channel_id, &1).unwrap(); - packet.data = data; - packet + let ack = IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(); + let mut msg = mock_ibc_packet_ack(&channel_id, &1, ack).unwrap(); + msg.ack.original_packet.data = data; + msg } o => panic!("Unexpected message: {:?}", o), }; - - // and handle the ack - let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(), - original_packet: packet, - }; - let msg = IbcPacketAckMsg::new(ack); 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 assert_eq!(0, res.messages.len()); diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 9c7179639..32b38ea56 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -19,9 +19,8 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; use cosmwasm_std::{ - attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcAcknowledgementWithPacket, - IbcBasicResponse, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, - Response, + attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcBasicResponse, + IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, Response, }; use cosmwasm_vm::testing::{ execute, ibc_channel_connect, ibc_channel_open, ibc_packet_ack, instantiate, mock_env, @@ -85,11 +84,8 @@ fn who_am_i_response>( let response = AcknowledgementMsg::Ok(WhoAmIResponse { account: account.into(), }); - let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), - original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), - }; - let msg = IbcPacketAckMsg::new(ack); + let ack = IbcAcknowledgement::encode_json(&response).unwrap(); + let msg = mock_ibc_packet_ack(channel_id, &packet, ack).unwrap(); let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), msg).unwrap(); assert_eq!(0, res.messages.len()); } @@ -185,23 +181,17 @@ fn dispatch_message_send_and_ack() { let info = mock_info(CREATOR, &[]); let mut res: Response = execute(&mut deps, mock_env(), info, execute_msg).unwrap(); assert_eq!(1, res.messages.len()); - let packet = match res.messages.swap_remove(0).msg { + let msg = match res.messages.swap_remove(0).msg { CosmosMsg::Ibc(IbcMsg::SendPacket { channel_id, data, .. }) => { - let mut packet = mock_ibc_packet_ack(&channel_id, &1).unwrap(); - packet.data = data; - packet + let ack = IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(); + let mut msg = mock_ibc_packet_ack(&channel_id, &1, ack).unwrap(); + msg.ack.original_packet.data = data; + msg } o => panic!("Unexpected message: {:?}", o), }; - - // and handle the ack - let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(), - original_packet: packet, - }; - let msg = IbcPacketAckMsg::new(ack); 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 assert_eq!(0, res.messages.len()); diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index d40ef1a8f..f10cc8c0d 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -545,8 +545,8 @@ mod tests { let ibc_msg = PacketMsg::Dispatch { msgs: msgs_to_dispatch.clone(), }; - let packet = IbcPacketReceiveMsg::new(mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap()); - let res = ibc_packet_receive(deps.as_mut(), mock_env(), packet).unwrap(); + let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); + let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error @@ -560,8 +560,8 @@ mod tests { connect(deps.as_mut(), channel_id, account); // receive a packet for an unregistered channel returns app-level error (not Result::Err) - let packet = IbcPacketReceiveMsg::new(mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap()); - let res = ibc_packet_receive(deps.as_mut(), mock_env(), packet).unwrap(); + let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); + let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // assert app-level success let ack: AcknowledgementMsg<()> = from_slice(&res.acknowledgement).unwrap(); @@ -596,8 +596,8 @@ mod tests { let bad_data = InstantiateMsg { reflect_code_id: 12345, }; - let packet = IbcPacketReceiveMsg::new(mock_ibc_packet_recv(channel_id, &bad_data).unwrap()); - let res = ibc_packet_receive(deps.as_mut(), mock_env(), packet).unwrap(); + let msg = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); + let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); // acknowledgement is an error diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index aa5e25939..9a6d8adee 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -20,8 +20,8 @@ use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_recv}; use cosmwasm_std::{ attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcChannelConnectMsg, - IbcChannelOpenMsg, IbcOrder, IbcPacketReceiveMsg, IbcReceiveResponse, Reply, Response, - SubMsgExecutionResponse, WasmMsg, + IbcChannelOpenMsg, IbcOrder, IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, + WasmMsg, }; use cosmwasm_vm::testing::{ ibc_channel_connect, ibc_channel_open, ibc_packet_receive, instantiate, mock_env, mock_info, @@ -233,8 +233,7 @@ fn handle_dispatch_packet() { let ibc_msg = PacketMsg::Dispatch { msgs: msgs_to_dispatch.clone(), }; - let packet = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); - let msg = IbcPacketReceiveMsg::new(packet); + let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); @@ -250,8 +249,7 @@ fn handle_dispatch_packet() { connect(&mut deps, channel_id, account); // receive a packet for an unregistered channel returns app-level error (not Result::Err) - let packet = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); - let msg = IbcPacketReceiveMsg::new(packet); + let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); // assert app-level success @@ -288,8 +286,7 @@ fn handle_dispatch_packet() { let bad_data = InstantiateMsg { reflect_code_id: 12345, }; - let packet = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); - let msg = IbcPacketReceiveMsg::new(packet); + let msg = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index ecfa4f66c..2543be145 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -103,7 +103,10 @@ pub mod testing { MockStorage, MOCK_CONTRACT_ADDR, }; #[cfg(feature = "stargate")] - pub use crate::mock::{mock_ibc_channel, mock_ibc_packet_ack, mock_ibc_packet_recv}; + pub use crate::mock::{ + mock_ibc_channel, mock_ibc_channel_close, mock_ibc_channel_connect, mock_ibc_channel_open, + mock_ibc_packet, mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, + }; } // Re-exports diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 2a34126b0..db4d7bc74 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -9,7 +9,11 @@ use crate::coins::Coin; use crate::deps::OwnedDeps; use crate::errors::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; #[cfg(feature = "stargate")] -use crate::ibc::{IbcChannel, IbcEndpoint, IbcOrder, IbcPacket, IbcTimeoutBlock}; +use crate::ibc::{ + IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcChannel, IbcChannelCloseMsg, + IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcOrder, IbcPacket, IbcPacketAckMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcTimeoutBlock, +}; use crate::query::{ AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery, }; @@ -237,10 +241,43 @@ pub fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> } #[cfg(feature = "stargate")] -/// Creates a IbcPacket for testing ibc_packet_receive. You set a few key parameters that are +/// Creates a IbcChannelOpenMsg for testing ibc_channel_open. +pub fn mock_ibc_channel_open( + my_channel_id: &str, + order: IbcOrder, + version: &str, +) -> IbcChannelOpenMsg { + IbcChannelOpenMsg::new(mock_ibc_channel(my_channel_id, order, version)) +} + +#[cfg(feature = "stargate")] +/// Creates a IbcChannelConnectMsg for testing ibc_channel_connect. +pub fn mock_ibc_channel_connect( + my_channel_id: &str, + order: IbcOrder, + version: &str, +) -> IbcChannelConnectMsg { + IbcChannelConnectMsg::new(mock_ibc_channel(my_channel_id, order, version)) +} + +#[cfg(feature = "stargate")] +/// Creates a IbcChannelCloseMsg for testing ibc_channel_close. +pub fn mock_ibc_channel_close( + my_channel_id: &str, + order: IbcOrder, + version: &str, +) -> IbcChannelCloseMsg { + IbcChannelCloseMsg::new(mock_ibc_channel(my_channel_id, order, version)) +} + +#[cfg(feature = "stargate")] +/// 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 -pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &T) -> StdResult { - Ok(IbcPacket { +pub fn mock_ibc_packet_recv( + my_channel_id: &str, + data: &T, +) -> StdResult { + Ok(IbcPacketReceiveMsg::new(IbcPacket { data: to_binary(data)?, src: IbcEndpoint { port_id: "their-port".to_string(), @@ -256,14 +293,14 @@ pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &T) -> StdR height: 12345678, } .into(), - }) + })) } #[cfg(feature = "stargate")] /// 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 between mock_ibc_packet_recv is if `my_channel_id` is src or dest. -pub fn mock_ibc_packet_ack(my_channel_id: &str, data: &T) -> StdResult { +/// The difference from mock_ibc_packet_recv is if `my_channel_id` is src or dest. +pub fn mock_ibc_packet(my_channel_id: &str, data: &T) -> StdResult { Ok(IbcPacket { data: to_binary(data)?, src: IbcEndpoint { @@ -283,6 +320,34 @@ pub fn mock_ibc_packet_ack(my_channel_id: &str, data: &T) -> StdRe }) } +#[cfg(feature = "stargate")] +/// Creates a IbcPacketAckMsg for testing ibc_packet_ack. 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. +pub fn mock_ibc_packet_ack( + my_channel_id: &str, + data: &T, + ack: IbcAcknowledgement, +) -> StdResult { + let packet = mock_ibc_packet(my_channel_id, data)?; + + Ok(IbcPacketAckMsg::new(IbcAcknowledgementWithPacket { + acknowledgement: ack, + original_packet: packet, + })) +} + +#[cfg(feature = "stargate")] +/// Creates a IbcPacketTimeoutMsg for testing ibc_packet_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./ +pub fn mock_ibc_packet_timeout( + my_channel_id: &str, + data: &T, +) -> StdResult { + mock_ibc_packet(my_channel_id, data).map(IbcPacketTimeoutMsg::new) +} + /// The same type as cosmwasm-std's QuerierResult, but easier to reuse in /// cosmwasm-vm. It might diverge from QuerierResult at some point. pub type MockQuerierCustomHandlerResult = SystemResult>; diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 5358374f7..ac9679c77 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -678,10 +678,12 @@ mod tests { use crate::testing::{ mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, }; - use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; + use cosmwasm_std::testing::{ + mock_ibc_channel, mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, + }; use cosmwasm_std::{ - attr, Empty, Event, IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcOrder, Reply, - ReplyOn, SubMsgExecutionResponse, + attr, Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, + SubMsgExecutionResponse, }; static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); const IBC_VERSION: &str = "ibc-reflect-v1"; @@ -760,12 +762,8 @@ mod tests { fn call_ibc_packet_ack_works() { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); - let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); - let ack = IbcAcknowledgementWithPacket { - acknowledgement: IbcAcknowledgement::new(br#"{}"#), - original_packet: packet, - }; - let msg = IbcPacketAckMsg::new(ack); + let ack = IbcAcknowledgement::new(br#"{}"#); + let msg = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#, ack).unwrap(); call_ibc_packet_ack::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap(); @@ -774,8 +772,7 @@ mod tests { fn call_ibc_packet_timeout_works() { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); - let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#).unwrap(); - let msg = IbcPacketTimeoutMsg::new(packet); + let msg = mock_ibc_packet_timeout(CHANNEL_ID, br#"{}"#).unwrap(); call_ibc_packet_timeout::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap(); @@ -785,8 +782,7 @@ mod tests { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let who_am_i = br#"{"who_am_i":{}}"#; - let packet = mock_ibc_packet_ack(CHANNEL_ID, who_am_i).unwrap(); - let msg = IbcPacketReceiveMsg::new(packet); + let msg = mock_ibc_packet_recv(CHANNEL_ID, who_am_i).unwrap(); call_ibc_packet_receive::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) .unwrap() .unwrap(); From 37e508e48cb3e01d34fbba144b29bb224a5397bf Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 13 Jul 2021 18:41:02 +0200 Subject: [PATCH 201/402] Switch to using the new mock_ibc_channel helpers --- contracts/ibc-reflect-send/src/ibc.rs | 24 ++++-------- .../ibc-reflect-send/tests/integration.rs | 27 ++++--------- contracts/ibc-reflect/src/contract.rs | 33 ++++++---------- contracts/ibc-reflect/tests/integration.rs | 39 ++++++------------- packages/vm/src/calls.rs | 24 ++++-------- 5 files changed, 46 insertions(+), 101 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 00c946017..35af99125 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -251,8 +251,8 @@ mod tests { use crate::msg::{AccountResponse, ExecuteMsg, InstantiateMsg, QueryMsg}; use cosmwasm_std::testing::{ - mock_dependencies, mock_env, mock_ibc_channel, mock_ibc_packet_ack, mock_info, MockApi, - MockQuerier, MockStorage, + mock_dependencies, mock_env, mock_ibc_channel_connect, mock_ibc_channel_open, + mock_ibc_packet_ack, mock_info, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::{coin, coins, BankMsg, CosmosMsg, IbcAcknowledgement, OwnedDeps}; @@ -271,15 +271,14 @@ mod tests { // save the account (tested in detail in `proper_handshake_flow`) fn connect(mut deps: DepsMut, channel_id: &str) { // open packet has no counterparty version, connect does - let mut handshake_open = - IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); handshake_open.channel.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) let handshake_connect = - IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); // this should send a WhoAmI request, which is received some blocks later @@ -308,22 +307,13 @@ mod tests { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-12", - IbcOrder::Unordered, - IBC_VERSION, - )); + let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), wrong_order).unwrap_err(); - let wrong_version = - IbcChannelOpenMsg::new(mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect")); + let wrong_version = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, "reflect"); ibc_channel_open(deps.as_mut(), mock_env(), wrong_version).unwrap_err(); - let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-12", - IbcOrder::Ordered, - IBC_VERSION, - )); + let valid_handshake = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), valid_handshake).unwrap(); } diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 32b38ea56..5108f5e87 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -17,10 +17,10 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_ack}; +use cosmwasm_std::testing::{mock_ibc_channel_connect, mock_ibc_channel_open, mock_ibc_packet_ack}; use cosmwasm_std::{ - attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcBasicResponse, - IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, Response, + attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcBasicResponse, IbcMsg, + IbcOrder, Response, }; use cosmwasm_vm::testing::{ execute, ibc_channel_connect, ibc_channel_open, ibc_packet_ack, instantiate, mock_env, @@ -53,15 +53,13 @@ fn setup() -> Instance { // save the account (tested in detail in `proper_handshake_flow`) fn connect(deps: &mut Instance, channel_id: &str) { // open packet has no counterparty version, connect does - let mut handshake_open = - IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); handshake_open.channel.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = - IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); // this should send a WhoAmI request, which is received some blocks later @@ -102,22 +100,13 @@ fn instantiate_works() { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-12", - IbcOrder::Unordered, - IBC_VERSION, - )); + let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); - let wrong_version = - IbcChannelOpenMsg::new(mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect")); + let wrong_version = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, "reflect"); ibc_channel_open(&mut deps, mock_env(), wrong_version).unwrap_err(); - let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-12", - IbcOrder::Ordered, - IBC_VERSION, - )); + let valid_handshake = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), valid_handshake).unwrap(); } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index f10cc8c0d..dcafb4e29 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -354,8 +354,9 @@ pub fn ibc_packet_timeout( mod tests { use super::*; use cosmwasm_std::testing::{ - mock_dependencies, mock_env, mock_ibc_channel, mock_ibc_packet_recv, mock_info, MockApi, - MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, + mock_dependencies, mock_env, mock_ibc_channel_close, mock_ibc_channel_connect, + mock_ibc_channel_open, mock_ibc_packet_recv, mock_info, MockApi, MockQuerier, MockStorage, + MOCK_CONTRACT_ADDR, }; use cosmwasm_std::{coin, coins, from_slice, BankMsg, OwnedDeps, WasmMsg}; @@ -396,15 +397,14 @@ mod tests { // open packet has no counterparty versin, connect does // TODO: validate this with alpe - let mut handshake_open = - IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); handshake_open.channel.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) let handshake_connect = - IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); let id = res.messages[0].id; @@ -436,22 +436,13 @@ mod tests { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-12", - IbcOrder::Unordered, - IBC_VERSION, - )); + let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), wrong_order).unwrap_err(); - let wrong_version = - IbcChannelOpenMsg::new(mock_ibc_channel("channel-12", IbcOrder::Ordered, "reflect")); + let wrong_version = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, "reflect"); ibc_channel_open(deps.as_mut(), mock_env(), wrong_version).unwrap_err(); - let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-12", - IbcOrder::Ordered, - IBC_VERSION, - )); + let valid_handshake = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), valid_handshake).unwrap(); } @@ -461,14 +452,13 @@ mod tests { let channel_id = "channel-1234"; // first we try to open with a valid handshake - let mut handshake_open = - IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); handshake_open.channel.counterparty_version = None; ibc_channel_open(deps.as_mut(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) let handshake_connect = - IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.as_mut(), mock_env(), handshake_connect).unwrap(); // and set up a reflect account assert_eq!(1, res.messages.len()); @@ -626,8 +616,7 @@ mod tests { assert_eq!(funds, balance); // close the channel - let channel = - IbcChannelCloseMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let channel = mock_ibc_channel_close(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_close(deps.as_mut(), mock_env(), channel).unwrap(); // it pulls out all money from the reflect contract diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 9a6d8adee..9f220399a 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -17,11 +17,12 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::testing::{mock_ibc_channel, mock_ibc_packet_recv}; +use cosmwasm_std::testing::{ + mock_ibc_channel_connect, mock_ibc_channel_open, mock_ibc_packet_recv, +}; use cosmwasm_std::{ - attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcChannelConnectMsg, - IbcChannelOpenMsg, IbcOrder, IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, - WasmMsg, + attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, + IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, WasmMsg, }; use cosmwasm_vm::testing::{ ibc_channel_connect, ibc_channel_open, ibc_packet_receive, instantiate, mock_env, mock_info, @@ -79,14 +80,12 @@ fn connect>( ) { let account: String = account.into(); // first we try to open with a valid handshake - let mut handshake_open = - IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); handshake_open.channel.counterparty_version = None; ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = - IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); let id = res.messages[0].id; @@ -119,25 +118,13 @@ fn instantiate_works() { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-1234", - IbcOrder::Unordered, - IBC_VERSION, - )); + let wrong_order = mock_ibc_channel_open("channel-1234", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); - let wrong_version = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-1234", - IbcOrder::Ordered, - "reflect", - )); + let wrong_version = mock_ibc_channel_open("channel-1234", IbcOrder::Ordered, "reflect"); ibc_channel_open(&mut deps, mock_env(), wrong_version).unwrap_err(); - let valid_handshake = IbcChannelOpenMsg::new(mock_ibc_channel( - "channel-1234", - IbcOrder::Ordered, - IBC_VERSION, - )); + let valid_handshake = mock_ibc_channel_open("channel-1234", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), valid_handshake).unwrap(); } @@ -147,14 +134,12 @@ fn proper_handshake_flow() { let channel_id = "channel-432"; // first we try to open with a valid handshake - let mut handshake_open = - IbcChannelOpenMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); handshake_open.channel.counterparty_version = None; ibc_channel_open(&mut deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = - IbcChannelConnectMsg::new(mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION)); + let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(&mut deps, mock_env(), handshake_connect).unwrap(); // and set up a reflect account diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index ac9679c77..0aed7d5e4 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -679,7 +679,8 @@ mod tests { mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::testing::{ - mock_ibc_channel, mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, + mock_ibc_channel_close, mock_ibc_channel_connect, mock_ibc_channel_open, + mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, }; use cosmwasm_std::{ attr, Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, @@ -699,21 +700,15 @@ mod tests { .unwrap() .unwrap(); // first we try to open with a valid handshake - let mut handshake_open = IbcChannelOpenMsg::new(mock_ibc_channel( - channel_id, - IbcOrder::Ordered, - IBC_VERSION, - )); + let mut handshake_open = + mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); handshake_open.channel.counterparty_version = None; call_ibc_channel_open(instance, &mock_env(), &handshake_open) .unwrap() .unwrap(); // then we connect (with counter-party version set) - let handshake_connect = IbcChannelConnectMsg::new(mock_ibc_channel( - channel_id, - IbcOrder::Ordered, - IBC_VERSION, - )); + let handshake_connect = + mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = call_ibc_channel_connect::<_, _, _, Empty>( instance, &mock_env(), @@ -749,11 +744,8 @@ mod tests { fn call_ibc_channel_close_works() { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); - let handshake_close = IbcChannelCloseMsg::new(mock_ibc_channel( - CHANNEL_ID, - IbcOrder::Ordered, - IBC_VERSION, - )); + let handshake_close = + mock_ibc_channel_close(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); call_ibc_channel_close::<_, _, _, Empty>(&mut instance, &mock_env(), &handshake_close) .unwrap() .unwrap(); From 0aa52bec7d03aef4b765dc44183411cdc1cf0d4f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 13 Jul 2021 18:59:13 +0200 Subject: [PATCH 202/402] Update changelog and MIGRATING.md with new mocks --- CHANGELOG.md | 8 ++++++++ MIGRATING.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f28959dc..097666c75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ and this project adheres to - 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`, `mock_ibc_channel_connect`, `mock_ibc_channel_close`. +- 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`. ### Changed @@ -31,6 +36,9 @@ and this project adheres to 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` now returns an + `IbcPacketReceiveMsg`, `mock_ibc_packet_ack` requires an acknowledgement to be + passed and returns an `IbcPacketAckMsg`. [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 diff --git a/MIGRATING.md b/MIGRATING.md index 4f24bbe0e..3f9fbae2d 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -117,6 +117,63 @@ major releases of `cosmwasm`. Note that you can also view the } ``` +- IBC-related mocking functions have changed somewhat to accomodate creating the + new entry-point-specific `Msg` types, rather than just channels, packets and + acknowledgements. + + For the channel ones, we now have three distinct helpers. + + ```diff + - let wrong_order = mock_ibc_channel("channel-12", IbcOrder::Unordered, IBC_VERSION); + + let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); + ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); + ``` + + ```diff + - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); + + let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); + ``` + + ```diff + - let handshake_close = mock_ibc_channel(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); + + let handshake_close = mock_ibc_channel_close(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); + ibc_channel_close(deps, mock_env(), handshake_close).unwrap(); + ``` + + When testing against `ibc_packet_receive`, in most cases no change should be + necessary - `mock_ibc_packet_recv` now returns the `IbcPacketReceiveMsg`, + which is exactly what `ibc_packet_receive` now expects. + + ```rust + let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); + let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); + ``` + + `mock_ibc_packet_ack` is now only usable for `ibc_packet_ack` and requires an + `Acknowledgement`. It will internally construct an + `IbcAcknowledgementWithPacket` so that you no longer have to do it yourself. + + ```diff + - let ack = IbcAcknowledgementWithPacket { + - acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), + - original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), + - }; + - let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), ack).unwrap(); + + let ack = IbcAcknowledgement::encode_json(&response).unwrap(); + + let msg = mock_ibc_packet_ack(channel_id, &packet, ack).unwrap(); + + let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), msg).unwrap(); + ``` + + For `ibc_packet_timeout`, use the new `mock_ibc_packet_timeout` helper: + + ```diff + - let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#)?; + - ibc_packet_timeout(deps, mock_env(), packet)?; + + let msg = mock_ibc_packet_timeout(CHANNEL_ID, br#"{}"#)?; + + ibc_packet_timeout(deps, mock_env(), msg)?; + ``` + ## 0.14 -> 0.15 - Combine `messages` and `submessages` on the `Response` object. The new format From 768ebf6fe0d7e08780acc41f48598e0240a3ee37 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 13 Jul 2021 21:31:46 +0200 Subject: [PATCH 203/402] typo --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 097666c75..31c7c0052 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,12 +25,12 @@ and this project adheres to enabled by default. - cosmwasm-std: Make `MockApi::canonical_length` private. - cosmwasm-vm: Make `MockApi::canonical_length` private. -- cosmwasm-vm: Bump required marker export `cosmwasm_vm_version_6` to +- 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 wrap around channels, packets and acknowledgements. + 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 From 290318beec6262c0a227fb2eb0fb01c0616335a6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 09:50:11 +0200 Subject: [PATCH 204/402] Typo in IBC.md Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- IBC.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IBC.md b/IBC.md index 8f20bea31..79ecc85cd 100644 --- a/IBC.md +++ b/IBC.md @@ -161,7 +161,7 @@ second step of the handshake, which is equivalent to `ChanOpenAck` and pub fn ibc_channel_connect( deps: DepsMut, env: Env, - channel: IbcChannelConnectMsg, + msg: IbcChannelConnectMsg, ) -> StdResult { } ``` From ff5ab38c1678c19e83bf4fef8af49999f85cac08 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 09:58:07 +0200 Subject: [PATCH 205/402] Make mock_ibc_{channel, packet} private --- CHANGELOG.md | 6 ++++++ packages/std/src/lib.rs | 4 ++-- packages/std/src/mock.rs | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31c7c0052..19e52faad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,12 @@ and this project adheres to [#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.0] - 2021-06-24 ### Added diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 2543be145..fc62ff5b2 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -104,8 +104,8 @@ pub mod testing { }; #[cfg(feature = "stargate")] pub use crate::mock::{ - mock_ibc_channel, mock_ibc_channel_close, mock_ibc_channel_connect, mock_ibc_channel_open, - mock_ibc_packet, mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, + mock_ibc_channel_close, mock_ibc_channel_connect, mock_ibc_channel_open, + mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, }; } diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index bdce6f874..fede1b5ed 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -223,7 +223,7 @@ pub fn mock_info(sender: &str, funds: &[Coin]) -> MessageInfo { #[cfg(feature = "stargate")] /// Creates an IbcChannel for testing. You set a few key parameters for handshaking, /// If you want to set more, use this as a default and mutate other fields -pub fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcChannel { +fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcChannel { IbcChannel { endpoint: IbcEndpoint { port_id: "my_port".to_string(), @@ -300,7 +300,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. -pub fn mock_ibc_packet(my_channel_id: &str, data: &T) -> StdResult { +fn mock_ibc_packet(my_channel_id: &str, data: &T) -> StdResult { Ok(IbcPacket { data: to_binary(data)?, src: IbcEndpoint { From e74e905e4878961d9e4dc98944481ad907fc122a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 10:11:06 +0200 Subject: [PATCH 206/402] Change new release version to 0.16 --- MIGRATING.md | 4 ++-- packages/vm/testdata/hackatom.wasm | 2 +- .../{hackatom_1.0.wasm => hackatom_0.16.wasm} | Bin packages/vm/testdata/ibc_reflect.wasm | 2 +- .../{ibc_reflect_1.0.wasm => ibc_reflect_0.16.wasm} | Bin 5 files changed, 4 insertions(+), 4 deletions(-) rename packages/vm/testdata/{hackatom_1.0.wasm => hackatom_0.16.wasm} (100%) rename packages/vm/testdata/{ibc_reflect_1.0.wasm => ibc_reflect_0.16.wasm} (100%) diff --git a/MIGRATING.md b/MIGRATING.md index 3f9fbae2d..6f815244f 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,7 +4,7 @@ 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. -## 0.15 -> 1.0 (unreleased) +## 0.15 -> 0.16 (unreleased) - The `attr` function now accepts arguments that implement `Into` rather than `ToString`. This means that "stringly" types like `&str` are still @@ -29,7 +29,7 @@ major releases of `cosmwasm`. Note that you can also view the ```diff - cosmwasm-std = { version = "0.15.0" } - + cosmwasm-std = { version = "1.0.0", default-features = false } + + cosmwasm-std = { version = "0.16.0", default-features = false } ``` - For IBC-enabled contracts only: IBC entry points have different signatures. diff --git a/packages/vm/testdata/hackatom.wasm b/packages/vm/testdata/hackatom.wasm index 76495bcd7..333e1ca11 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_0.16.wasm \ No newline at end of file diff --git a/packages/vm/testdata/hackatom_1.0.wasm b/packages/vm/testdata/hackatom_0.16.wasm similarity index 100% rename from packages/vm/testdata/hackatom_1.0.wasm rename to packages/vm/testdata/hackatom_0.16.wasm diff --git a/packages/vm/testdata/ibc_reflect.wasm b/packages/vm/testdata/ibc_reflect.wasm index c5b6708f3..43a733375 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_0.16.wasm \ No newline at end of file diff --git a/packages/vm/testdata/ibc_reflect_1.0.wasm b/packages/vm/testdata/ibc_reflect_0.16.wasm similarity index 100% rename from packages/vm/testdata/ibc_reflect_1.0.wasm rename to packages/vm/testdata/ibc_reflect_0.16.wasm From db0a9351a8ddfa18e9602a9842290fc764cc67ed Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 12:19:32 +0200 Subject: [PATCH 207/402] Add custom events to IBC response types --- CHANGELOG.md | 1 + packages/std/src/ibc.rs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19e52faad..63a1118d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ and this project adheres to - cosmwasm-std::testing: `mock_ibc_packet_recv` 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. [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 7b9ddfae5..e4dbe954e 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -10,7 +10,7 @@ use std::fmt; use crate::binary::Binary; use crate::coins::Coin; use crate::errors::StdResult; -use crate::results::{Attribute, Empty, SubMsg}; +use crate::results::{Attribute, Empty, Event, SubMsg}; use crate::serde::to_binary; use crate::timestamp::Timestamp; @@ -300,8 +300,11 @@ where /// after execution. Otherwise, they act like "fire and forget". /// Use `SubMsg::new` to create messages with the older "fire and forget" semantics. pub messages: Vec>, - /// The attributes that will be emitted as part of a "wasm" event + /// The attributes that will be emitted as part of a `wasm` event. pub attributes: Vec, + /// Extra, custom events separate from the main `wasm` one. These will have + /// `wasm-` prepended to the type. + pub events: Vec, } impl Default for IbcBasicResponse @@ -312,6 +315,7 @@ where IbcBasicResponse { messages: vec![], attributes: vec![], + events: vec![], } } } @@ -336,6 +340,9 @@ where pub messages: Vec>, /// The attributes that will be emitted as part of a "wasm" event pub attributes: Vec, + /// Extra, custom events separate from the main `wasm` one. These will have + /// `wasm-` prepended to the type. + pub events: Vec, } impl Default for IbcReceiveResponse @@ -347,6 +354,7 @@ where acknowledgement: Binary(vec![]), messages: vec![], attributes: vec![], + events: vec![], } } } From 64b5001c5d8123565c8d000fedbb7b2591ccd6bb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 14 Jul 2021 12:33:46 +0200 Subject: [PATCH 208/402] Add the cosmwasm-* version changes to MIGRATING.md --- MIGRATING.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index 6f815244f..ad7f025f9 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -6,6 +6,20 @@ major releases of `cosmwasm`. Note that you can also view the ## 0.15 -> 0.16 (unreleased) +- Update CosmWasm dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "0.16.0" + cosmwasm-storage = "0.16.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "0.16.0" + cosmwasm-vm = "0.16.0" + # ... + ``` + - The `attr` function now accepts arguments that implement `Into` rather than `ToString`. This means that "stringly" types like `&str` are still accepted, but others (like numbers or booleans) have to be explicitly @@ -176,6 +190,20 @@ major releases of `cosmwasm`. Note that you can also view the ## 0.14 -> 0.15 +- Update CosmWasm dependencies in Cargo.toml (skip the ones you don't use): + + ``` + [dependencies] + cosmwasm-std = "0.15.0" + cosmwasm-storage = "0.15.0" + # ... + + [dev-dependencies] + cosmwasm-schema = "0.15.0" + cosmwasm-vm = "0.15.0" + # ... + ``` + - Combine `messages` and `submessages` on the `Response` object. The new format uses `messages: Vec>`, so copy `submessages` content, and wrap old messages using `SubMsg::new`. Here is how to change messages: From 75835f0af6e25edbce6342df090230d124d6b672 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 13:27:11 +0200 Subject: [PATCH 209/402] Update IBC contracts --- CHANGELOG.md | 3 ++- contracts/ibc-reflect-send/src/ibc.rs | 9 +++++++++ contracts/ibc-reflect/src/contract.rs | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63a1118d4..a29600ab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,8 @@ and this project adheres to - cosmwasm-std::testing: `mock_ibc_packet_recv` 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: `IbcBasicResponse` and `IbcReceiveResponse` now both support + custom events via the `events` field. [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 35af99125..1457705dd 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -72,6 +72,7 @@ pub fn ibc_channel_connect( attr("action", "ibc_connect"), attr("channel_id", channel_id), ], + ..IbcBasicResponse::default() }) } @@ -91,6 +92,7 @@ pub fn ibc_channel_close( Ok(IbcBasicResponse { attributes: vec![attr("action", "ibc_close"), attr("channel_id", channel_id)], messages: vec![], + ..IbcBasicResponse::default() }) } @@ -105,6 +107,7 @@ pub fn ibc_packet_receive( acknowledgement: b"{}".into(), messages: vec![], attributes: vec![attr("action", "ibc_packet_ack")], + ..IbcReceiveResponse::default() }) } @@ -146,6 +149,7 @@ fn acknowledge_dispatch( Ok(IbcBasicResponse { messages: vec![], attributes: vec![attr("action", "acknowledge_dispatch")], + ..IbcBasicResponse::default() }) } @@ -163,6 +167,7 @@ fn acknowledge_who_am_i( return Ok(IbcBasicResponse { messages: vec![], attributes: vec![attr("action", "acknowledge_who_am_i"), attr("error", e)], + ..IbcBasicResponse::default() }) } }; @@ -183,6 +188,7 @@ fn acknowledge_who_am_i( Ok(IbcBasicResponse { messages: vec![], attributes: vec![attr("action", "acknowledge_who_am_i")], + ..IbcBasicResponse::default() }) } @@ -200,6 +206,7 @@ fn acknowledge_balances( return Ok(IbcBasicResponse { messages: vec![], attributes: vec![attr("action", "acknowledge_balances"), attr("error", e)], + ..IbcBasicResponse::default() }) } }; @@ -228,6 +235,7 @@ fn acknowledge_balances( Ok(IbcBasicResponse { messages: vec![], attributes: vec![attr("action", "acknowledge_balances")], + ..IbcBasicResponse::default() }) } @@ -241,6 +249,7 @@ pub fn ibc_packet_timeout( Ok(IbcBasicResponse { messages: vec![], attributes: vec![attr("action", "ibc_packet_timeout")], + ..IbcBasicResponse::default() }) } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index dcafb4e29..91c1d89be 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -178,6 +178,7 @@ pub fn ibc_channel_connect( Ok(IbcBasicResponse { messages: vec![msg], attributes: vec![attr("action", "ibc_connect"), attr("channel_id", chan_id)], + ..IbcBasicResponse::default() }) } @@ -219,6 +220,7 @@ pub fn ibc_channel_close( attr("channel_id", channel_id), attr("steal_funds", steal_funds.to_string()), ], + ..IbcBasicResponse::default() }) } @@ -263,6 +265,7 @@ pub fn ibc_packet_receive( acknowledgement, messages: vec![], attributes: vec![], + ..IbcReceiveResponse::default() }) }) } @@ -279,6 +282,7 @@ fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult StdResult Date: Wed, 14 Jul 2021 13:53:06 +0200 Subject: [PATCH 210/402] Test the new events field in IBC response types --- contracts/ibc-reflect/src/contract.rs | 8 ++++++-- contracts/ibc-reflect/tests/integration.rs | 4 ++++ packages/vm/src/calls.rs | 2 ++ packages/vm/testdata/ibc_reflect_0.16.wasm | Bin 268213 -> 269976 bytes 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 91c1d89be..92c2f65f1 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -178,7 +178,7 @@ pub fn ibc_channel_connect( Ok(IbcBasicResponse { messages: vec![msg], attributes: vec![attr("action", "ibc_connect"), attr("channel_id", chan_id)], - ..IbcBasicResponse::default() + events: vec![Event::new("ibc").attr("channel", "connect")], }) } @@ -265,7 +265,7 @@ pub fn ibc_packet_receive( acknowledgement, messages: vec![], attributes: vec![], - ..IbcReceiveResponse::default() + events: vec![Event::new("ibc").attr("packet", "receive")], }) }) } @@ -415,6 +415,8 @@ mod tests { mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); + assert_eq!(1, res.events.len()); + assert_eq!(Event::new("ibc").attr("channel", "connect"), res.events[0]); let id = res.messages[0].id; // fake a reply and ensure this works @@ -547,6 +549,8 @@ mod tests { let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); + assert_eq!(1, res.events.len()); + assert_eq!(Event::new("ibc").attr("packet", "receive"), res.events[0]); // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); assert_eq!( diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 9f220399a..92be02efe 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -88,6 +88,8 @@ fn connect>( let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); + assert_eq!(1, res.events.len()); + assert_eq!(Event::new("ibc").attr("channel", "connect"), res.events[0]); let id = res.messages[0].id; // fake a reply and ensure this works @@ -222,6 +224,8 @@ fn handle_dispatch_packet() { let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); // we didn't dispatch anything assert_eq!(0, res.messages.len()); + assert_eq!(1, res.events.len()); + assert_eq!(Event::new("ibc").attr("packet", "receive"), res.events[0]); // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 0aed7d5e4..3806439c9 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -717,6 +717,8 @@ mod tests { .unwrap() .unwrap(); assert_eq!(1, res.messages.len()); + assert_eq!(1, res.events.len()); + assert_eq!(Event::new("ibc").attr("channel", "connect"), res.events[0]); assert_eq!(ReplyOn::Success, res.messages[0].reply_on); let id = res.messages[0].id; let event = Event { diff --git a/packages/vm/testdata/ibc_reflect_0.16.wasm b/packages/vm/testdata/ibc_reflect_0.16.wasm index eca5db971eb28635fd9cc9feaa4ee061c05bf17d..d7fcf59ac076281811e7aadb36308579a5c70558 100644 GIT binary patch delta 35617 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 delta 35488 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 From f8d439456224a516d466e2aeca4722ca4ada884a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 15:24:49 +0200 Subject: [PATCH 211/402] attr construction should panic for reserved names --- CHANGELOG.md | 5 ++++ packages/std/src/results/attribute.rs | 40 +++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a29600ab2..290a06a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ and this project adheres to - 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`. ### Changed @@ -41,6 +43,9 @@ and this project adheres to 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. [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 diff --git a/packages/std/src/results/attribute.rs b/packages/std/src/results/attribute.rs index eb56522fa..a1c681138 100644 --- a/packages/std/src/results/attribute.rs +++ b/packages/std/src/results/attribute.rs @@ -8,14 +8,32 @@ pub struct Attribute { pub value: String, } -/// Creates a new Attribute. -pub fn attr(key: impl Into, value: impl Into) -> Attribute { - Attribute { - key: key.into(), - value: value.into(), +impl Attribute { + /// Creates a new Attribute. `attr` is just an alias for this. + pub fn new(key: impl Into, value: impl Into) -> Self { + let key = key.into(); + + #[cfg(debug_assertions)] + if key.starts_with('_') { + panic!( + "attribute `{}` is invalid - attributes starting with an underscore are reserved", + key + ); + } + + Self { + key, + value: value.into(), + } } } +/// Creates a new Attribute. `Attribute::new` is an alias for this. +#[inline] +pub fn attr(key: impl Into, value: impl Into) -> Attribute { + Attribute::new(key, value) +} + #[cfg(test)] mod tests { use super::*; @@ -34,4 +52,16 @@ mod tests { assert_eq!(attr("foo", Uint128::new(42)), expected); assert_eq!(attr("foo", 42.to_string()), expected); } + + #[test] + #[should_panic] + fn reserved_attr_key_panicks() { + Attribute::new("_invalid", "value"); + } + + #[test] + #[should_panic] + fn reserved_attr_key_panicks2() { + Attribute::new("_", "value"); + } } From 02adf9129aa35096276a47197e2cad53d82be85a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 15:33:00 +0200 Subject: [PATCH 212/402] type in packages/std/src/results/attribute.rs Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/results/attribute.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/results/attribute.rs b/packages/std/src/results/attribute.rs index a1c681138..4dd7edea9 100644 --- a/packages/std/src/results/attribute.rs +++ b/packages/std/src/results/attribute.rs @@ -16,7 +16,7 @@ impl Attribute { #[cfg(debug_assertions)] if key.starts_with('_') { panic!( - "attribute `{}` is invalid - attributes starting with an underscore are reserved", + "attribute key `{}` is invalid - keys starting with an underscore are reserved", key ); } From fb6283ccdc72dfb59cd6f537c143c1fccf3e8a2b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 14 Jul 2021 15:47:36 +0200 Subject: [PATCH 213/402] Collect Attribute and Event in events.rs --- .../src/results/{attribute.rs => events.rs} | 67 ++++++++++++++++--- packages/std/src/results/mod.rs | 6 +- packages/std/src/results/response.rs | 4 +- packages/std/src/results/submessages.rs | 53 +-------------- 4 files changed, 62 insertions(+), 68 deletions(-) rename packages/std/src/results/{attribute.rs => events.rs} (50%) diff --git a/packages/std/src/results/attribute.rs b/packages/std/src/results/events.rs similarity index 50% rename from packages/std/src/results/attribute.rs rename to packages/std/src/results/events.rs index 4dd7edea9..31a2e4d82 100644 --- a/packages/std/src/results/attribute.rs +++ b/packages/std/src/results/events.rs @@ -1,6 +1,40 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +/// A full Cosmos SDK event as documented in +/// https://docs.cosmos.network/v0.42/core/events.html. +/// +/// This version uses string attributes (similar to +/// https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70), +/// which then get magically converted to bytes for Tendermint somewhere between +/// the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK. +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct Event { + /// The event type. This is renamed to "ty" because "type" is reserved in Rust. This sucks, we know. + #[serde(rename = "type")] + pub ty: String, + pub attributes: Vec, +} + +impl Event { + /// Create a new event with the given type and an empty list of attributes. + pub fn new(ty: impl Into) -> Self { + Event { + ty: ty.into(), + attributes: Vec::with_capacity(10), + } + } + + /// Add an attribute to the event. + pub fn attr(mut self, key: impl Into, value: impl Into) -> Self { + self.attributes.push(Attribute { + key: key.into(), + value: value.into(), + }); + self + } +} + /// An key value pair that is used in the context of event attributes in logs #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, JsonSchema)] pub struct Attribute { @@ -40,28 +74,39 @@ mod tests { use crate::Uint128; #[test] - fn attr_works_for_different_types() { - let expected = Attribute { - key: "foo".to_string(), - value: "42".to_string(), + fn event_construction() { + let event_direct = Event { + ty: "test".to_string(), + attributes: vec![attr("foo", "bar"), attr("bar", "baz")], }; + let event_builder = Event::new("test").attr("foo", "bar").attr("bar", "baz"); - assert_eq!(attr("foo", "42"), expected); - assert_eq!(attr("foo".to_string(), "42"), expected); - assert_eq!(attr("foo", "42".to_string()), expected); - assert_eq!(attr("foo", Uint128::new(42)), expected); - assert_eq!(attr("foo", 42.to_string()), expected); + assert_eq!(event_direct, event_builder); } #[test] #[should_panic] - fn reserved_attr_key_panicks() { + fn attribute_new_reserved_key_panicks() { Attribute::new("_invalid", "value"); } #[test] #[should_panic] - fn reserved_attr_key_panicks2() { + fn attribute_new_reserved_key_panicks2() { Attribute::new("_", "value"); } + + #[test] + fn attr_works_for_different_types() { + let expected = Attribute { + key: "foo".to_string(), + value: "42".to_string(), + }; + + assert_eq!(attr("foo", "42"), expected); + assert_eq!(attr("foo".to_string(), "42"), expected); + assert_eq!(attr("foo", "42".to_string()), expected); + assert_eq!(attr("foo", Uint128::new(42)), expected); + assert_eq!(attr("foo", 42.to_string()), expected); + } } diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 6321503f7..0fc535225 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -1,21 +1,21 @@ //! This module contains the messages that are sent from the contract to the VM as an execution result -mod attribute; mod contract_result; mod cosmos_msg; mod empty; +mod events; mod query; mod response; mod submessages; mod system_result; -pub use attribute::{attr, Attribute}; pub use contract_result::ContractResult; pub use cosmos_msg::{wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, WasmMsg}; #[cfg(feature = "staking")] pub use cosmos_msg::{DistributionMsg, StakingMsg}; pub use empty::Empty; +pub use events::{attr, Attribute, Event}; pub use query::QueryResponse; pub use response::Response; -pub use submessages::{Event, Reply, ReplyOn, SubMsg, SubMsgExecutionResponse}; +pub use submessages::{Reply, ReplyOn, SubMsg, SubMsgExecutionResponse}; pub use system_result::SystemResult; diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index d105a4095..48784ac08 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -2,9 +2,9 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt; -use crate::{Binary, Event}; +use crate::Binary; -use super::{Attribute, CosmosMsg, Empty, SubMsg}; +use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// A response of a contract entry point, such as `instantiate`, `execute` or `migrate`. /// diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index e2e6157c0..c7b3163f9 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -4,7 +4,7 @@ use std::fmt; use crate::{Binary, ContractResult}; -use super::{Attribute, CosmosMsg, Empty}; +use super::{CosmosMsg, Empty, Event}; /// 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 @@ -116,54 +116,3 @@ pub struct SubMsgExecutionResponse { pub events: Vec, pub data: Option, } - -/// A full Cosmos SDK event as documented in -/// https://docs.cosmos.network/v0.42/core/events.html. -/// -/// This version uses string attributes (similar to -/// https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70), -/// which then get magically converted to bytes for Tendermint somewhere between -/// the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK. -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct Event { - /// The event type. This is renamed to "ty" because "type" is reserved in Rust. This sucks, we know. - #[serde(rename = "type")] - pub ty: String, - pub attributes: Vec, -} - -impl Event { - /// Create a new event with the given type and an empty list of attributes. - pub fn new(ty: impl Into) -> Self { - Event { - ty: ty.into(), - attributes: Vec::with_capacity(10), - } - } - - /// Add an attribute to the event. - pub fn attr(mut self, key: impl Into, value: impl Into) -> Self { - self.attributes.push(Attribute { - key: key.into(), - value: value.into(), - }); - self - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::attr; - - #[test] - fn event_construction() { - let event_direct = Event { - ty: "test".to_string(), - attributes: vec![attr("foo", "bar"), attr("bar", "baz")], - }; - let event_builder = Event::new("test").attr("foo", "bar").attr("bar", "baz"); - - assert_eq!(event_direct, event_builder); - } -} From 1df3bfb44662be94dca09d201b811bceafa71ee5 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 15 Jul 2021 07:46:58 +0200 Subject: [PATCH 214/402] cargo update --- Cargo.lock | 532 +++++++++++++++++++++++++++-------------------------- 1 file changed, 274 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a199615de..81ae49890 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,19 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" -version = "0.14.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" dependencies = [ - "gimli 0.23.0", + "gimli", ] [[package]] name = "adler" -version = "0.2.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ansi_term" @@ -43,15 +45,16 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.55" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" +checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" dependencies = [ "addr2line", - "cfg-if 1.0.0", + "cc", + "cfg-if", "libc", "miniz_oxide", - "object 0.22.0", + "object", "rustc-demangle", ] @@ -69,9 +72,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "bitvec" -version = "0.18.4" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" +checksum = "98fcd36dda4e17b7d7abc64cb549bf0201f4ab71e00700c798ca7e62ed3761fa" dependencies = [ "funty", "radium", @@ -89,9 +92,9 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473fc6b38233f9af7baa94fb5852dca389e3d95b8e21c8e3719301462c5d9faf" +checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" dependencies = [ "lazy_static", "memchr", @@ -101,36 +104,30 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.4.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" [[package]] name = "byteorder" -version = "1.3.4" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cast" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a" dependencies = [ "rustc_version", ] [[package]] name = "cc" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" [[package]] name = "cfg-if" @@ -178,12 +175,6 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" -[[package]] -name = "const_fn" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" - [[package]] name = "cosmwasm-crypto" version = "0.15.0" @@ -197,7 +188,7 @@ dependencies = [ "hex", "hex-literal", "k256", - "rand_core", + "rand_core 0.5.1", "serde", "serde_json", "sha2", @@ -271,10 +262,13 @@ dependencies = [ ] [[package]] -name = "cpuid-bool" -version = "0.1.2" +name = "cpufeatures" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] [[package]] name = "cranelift-bforest" @@ -295,7 +289,7 @@ dependencies = [ "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.24.0", + "gimli", "log", "regalloc", "smallvec", @@ -342,21 +336,21 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "criterion" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8" +checksum = "ab327ed7354547cc2ef43cbe20ef68b988e70b4b593cbd66a2a61733123a3d23" dependencies = [ "atty", "cast", "clap", "criterion-plot", "csv", - "itertools", + "itertools 0.10.1", "lazy_static", "num-traits", "oorandom", @@ -378,16 +372,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" dependencies = [ "cast", - "itertools", + "itertools 0.9.0", ] [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", ] @@ -397,19 +391,18 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" dependencies = [ - "cfg-if 1.0.0", - "const_fn", + "cfg-if", "crossbeam-utils", "lazy_static", "memoffset", @@ -418,12 +411,11 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ - "autocfg", - "cfg-if 1.0.0", + "cfg-if", "lazy_static", ] @@ -445,9 +437,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d58633299b24b515ac72a3f869f8b91306a3cec616a602843a383acd6f9e97" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" dependencies = [ "bstr", "csv-core", @@ -467,22 +459,22 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.0.2" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" +checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] [[package]] name = "darling" -version = "0.10.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" dependencies = [ "darling_core", "darling_macro", @@ -490,23 +482,23 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.10.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.9.3", + "strsim 0.10.0", "syn", ] [[package]] name = "darling_macro" -version = "0.10.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" dependencies = [ "darling_core", "quote", @@ -539,9 +531,9 @@ checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" [[package]] name = "dynasm" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7d1242462849390bb2ad38aeed769499f1afc7383affa2ab0c1baa894c0200" +checksum = "cdc2d9a5e44da60059bd38db2d05cbb478619541b8c79890547861ec1e3194f0" dependencies = [ "bitflags", "byteorder", @@ -554,9 +546,9 @@ dependencies = [ [[package]] name = "dynasmrt" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dd4d1d5ca12258cef339a57a7643e8b233a42dea9bb849630ddd9dd7726aa9" +checksum = "42276e3f205fe63887cca255aa9a65a63fb72764c30b9a6252a7c7e46994f689" dependencies = [ "byteorder", "dynasm", @@ -582,7 +574,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -596,17 +588,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "f2db227e61a43a34915680bdda462ec0e212095518020a88a1f91acd16092c39" dependencies = [ "bitvec", "digest", "ff", + "funty", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -619,18 +612,18 @@ checksum = "4e4f5d6e192964d498b45abee72ca445e91909094bc8e8791259e82c2a0d1aa6" [[package]] name = "enumset" -version = "1.0.4" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6167d1be7a76696cadccfbdb89e5cb519244a42bab7da5577994579217dcff" +checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8a79bce471eb6165aa8ac86ebc8d788543b741eaa15e8b8486591696207d6c" +checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" dependencies = [ "darling", "proc-macro2", @@ -651,7 +644,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" dependencies = [ "bitvec", - "rand_core", + "rand_core 0.5.1", "subtle", ] @@ -683,16 +676,21 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] -name = "gimli" -version = "0.23.0" +name = "getrandom" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] [[package]] name = "gimli" @@ -712,42 +710,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" dependencies = [ "ff", - "rand_core", + "rand_core 0.5.1", "subtle", ] [[package]] name = "half" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" +checksum = "62aca2aba2d62b4a7f5b33f3712cb1b0692779a56fb510499d5c0aa594daeaf3" [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "hermit-abi" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "hex" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hex-literal" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af1f635ef1bc545d78392b136bfe1c9809e029023c84a3638a864a10b8819c8" +checksum = "76505e26b6ca3bbdbbb360b68472abbb80998c5fa5dc43672eca34f28258e138" [[package]] name = "hmac" @@ -767,9 +765,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg", "hashbrown", @@ -785,6 +783,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -793,22 +800,23 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.46" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d7383929f7c9c7c2d0fa596f325832df98c3704f2c60553080f7127a58175" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "4476a0808212a9e81ce802eb1a0cfc60e73aea296553bacc0fac7e1268bc572a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -825,9 +833,9 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.81" +version = "0.2.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" +checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" [[package]] name = "libloading" @@ -835,24 +843,24 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "winapi", ] [[package]] name = "log" -version = "0.4.11" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", ] [[package]] name = "loupe" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" dependencies = [ "indexmap", "loupe-derive", @@ -861,9 +869,9 @@ dependencies = [ [[package]] name = "loupe-derive" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" dependencies = [ "quote", "syn", @@ -886,27 +894,27 @@ checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memmap2" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73be3b7d04a0123e933fea1d50d126cc7196bbc0362c0ce426694f777194eee" +checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg", @@ -947,12 +955,6 @@ dependencies = [ "libc", ] -[[package]] -name = "object" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" - [[package]] name = "object" version = "0.25.3" @@ -978,15 +980,15 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-wasm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17797de36b94bc5f73edad736fd0a77ce5ab64dd622f809c1eead8c91fa6564" +checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" @@ -999,16 +1001,32 @@ dependencies = [ [[package]] name = "plotters" -version = "0.2.15" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" +checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" dependencies = [ - "js-sys", "num-traits", + "plotters-backend", + "plotters-svg", "wasm-bindgen", "web-sys", ] +[[package]] +name = "plotters-backend" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" + +[[package]] +name = "plotters-svg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" +dependencies = [ + "plotters-backend", +] + [[package]] name = "ppv-lite86" version = "0.2.10" @@ -1050,18 +1068,18 @@ dependencies = [ [[package]] name = "ptr_meta" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" dependencies = [ "ptr_meta_derive", ] [[package]] name = "ptr_meta_derive" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", @@ -1070,40 +1088,39 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] [[package]] name = "radium" -version = "0.4.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" +checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" [[package]] name = "rand" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ - "getrandom", "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.3", "rand_hc", ] [[package]] name = "rand_chacha" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1112,23 +1129,32 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ - "rand_core", + "rand_core 0.6.3", ] [[package]] name = "rayon" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" dependencies = [ "autocfg", "crossbeam-deque", @@ -1138,9 +1164,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1151,9 +1177,12 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +dependencies = [ + "bitflags", +] [[package]] name = "regalloc" @@ -1168,27 +1197,24 @@ dependencies = [ [[package]] name = "regex" -version = "1.4.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -dependencies = [ - "byteorder", -] +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" -version = "0.6.21" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "region" @@ -1236,9 +1262,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" [[package]] name = "rustc-hash" @@ -1248,9 +1274,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc_version" -version = "0.2.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] @@ -1278,9 +1304,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a24475737c47c5a97cd0858d09db5b0c01ade85d671ee569cd1a5a2c0c80a44" +checksum = "bc6ab463ae35acccb5cba66c0084c985257b797d288b6050cc2f6ac1b266cb78" dependencies = [ "dyn-clone", "schemars_derive", @@ -1290,9 +1316,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f0ccbfe5a97322d90f8b19604fa5b99dd8223540eb6e36c99a9125303e4c00" +checksum = "902fdfbcf871ae8f653bddf4b2c05905ddaabc08f69d32a915787e3be0d31356" dependencies = [ "proc-macro2", "quote", @@ -1314,24 +1340,15 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "semver" -version = "0.9.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "5f3aac57ee7f3272d8395c6e4f502f434f0e289fcd62876f70daa008c20dcabe" [[package]] name = "serde" -version = "1.0.118" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" dependencies = [ "serde_derive", ] @@ -1366,9 +1383,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.118" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", @@ -1388,9 +1405,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -1399,13 +1416,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" dependencies = [ "block-buffer", - "cfg-if 1.0.0", - "cpuid-bool", + "cfg-if", + "cpufeatures", "digest", "opaque-debug", ] @@ -1417,7 +1434,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" dependencies = [ "digest", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1446,15 +1463,15 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "strsim" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" @@ -1475,11 +1492,11 @@ checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", "libc", "rand", "redox_syscall", @@ -1498,18 +1515,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" dependencies = [ "proc-macro2", "quote", @@ -1518,20 +1535,19 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] [[package]] name = "tinytemplate" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ada8616fad06a2d0c455adc530de4ef57605a8120cc65da9653e0e9623ca74" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ "serde", "serde_json", @@ -1539,11 +1555,11 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.22" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1551,9 +1567,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.11" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", @@ -1562,24 +1578,24 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" dependencies = [ "lazy_static", ] [[package]] name = "typenum" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" [[package]] name = "uint" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" dependencies = [ "byteorder", "crunchy", @@ -1595,9 +1611,9 @@ checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "vec_map" @@ -1607,15 +1623,15 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "walkdir" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", "winapi", @@ -1630,25 +1646,25 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.69" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd364751395ca0f68cafb17666eee36b63077fb5ecd972bbcd74c90c4bf736e" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.69" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1114f89ab1f4106e5b55e688b828c0ab0ea593a1ea7c094b141b14cbaaec2d62" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" dependencies = [ "bumpalo", "lazy_static", @@ -1661,9 +1677,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.69" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6ac8995ead1f084a8dea1e65f194d0973800c7f571f6edd70adf06ecf77084" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1671,9 +1687,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.69" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a48c72f299d80557c7c62e37e7225369ecc0c963964059509fbafe917c7549" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" dependencies = [ "proc-macro2", "quote", @@ -1684,9 +1700,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.69" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" [[package]] name = "wasmer" @@ -1694,7 +1710,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "indexmap", "loupe", "more-asserts", @@ -1740,7 +1756,7 @@ dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "gimli 0.24.0", + "gimli", "loupe", "more-asserts", "rayon", @@ -1809,7 +1825,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "leb128", "libloading", "loupe", @@ -1831,7 +1847,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "leb128", "loupe", "region", @@ -1861,7 +1877,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ - "object 0.25.3", + "object", "thiserror", "wasmer-compiler", "wasmer-types", @@ -1888,7 +1904,7 @@ checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", - "cfg-if 1.0.0", + "cfg-if", "indexmap", "libc", "loupe", @@ -1910,27 +1926,27 @@ checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "wast" -version = "30.0.0" +version = "36.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" +checksum = "8b5d7ba374a364571da1cb0a379a3dc302582a2d9937a183bfe35b68ad5bb9c4" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.31" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" +checksum = "16383df7f0e3901484c2dda6294ed6895caa3627ce4f6584141dcf30a33a23e6" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.46" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222b1ef9334f92a21d3fb53dc3fd80f30836959a90f9274a626d7e06315ba3c3" +checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" dependencies = [ "js-sys", "wasm-bindgen", @@ -1938,12 +1954,12 @@ dependencies = [ [[package]] name = "which" -version = "4.0.2" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c14ef7e1b8b8ecfc75d5eca37949410046e66f15d185c01d70824f1f8111ef" +checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" dependencies = [ + "either", "libc", - "thiserror", ] [[package]] @@ -1985,6 +2001,6 @@ checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" [[package]] name = "zeroize" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" From cec2bcbd91484556babba5b403312d314a0fa058 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 15 Jul 2021 07:48:22 +0200 Subject: [PATCH 215/402] Update to latest k256 v0.9.4 --- packages/crypto/Cargo.toml | 4 ++-- packages/crypto/src/secp256k1.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 76f63816c..8f627aa99 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -19,7 +19,7 @@ backtraces = [] bench = false [dependencies] -k256 = { version = "0.7.2", features = ["ecdsa"] } +k256 = { version = "0.9.4", features = ["ecdsa"] } ed25519-zebra = "2" digest = "0.9" rand_core = { version = "0.5", features = ["getrandom"] } @@ -34,7 +34,7 @@ base64 = "0.13.0" hex = "0.4" hex-literal = "0.3.1" english-numbers = "0.3" -elliptic-curve = "0.8.4" +elliptic-curve = "0.10.3" [[bench]] name = "main" diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 1f3c9fb2a..96e387285 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -155,8 +155,8 @@ fn check_pubkey(data: &[u8]) -> Result<(), InvalidSecp256k1PubkeyFormat> { mod tests { use super::*; + use elliptic_curve::rand_core::OsRng; use elliptic_curve::sec1::ToEncodedPoint; - use rand_core::OsRng; use hex_literal::hex; use k256::{ @@ -316,7 +316,7 @@ mod tests { hex!("3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1"); let expected = SigningKey::from_bytes(&private_key) .unwrap() - .verify_key() + .verifying_key() .to_encoded_point(false) .as_bytes() .to_vec(); From 5ebccd4ebbd1e7569928f9e550283f38f73d3e10 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 15 Jul 2021 07:48:41 +0200 Subject: [PATCH 216/402] Update Cargo.lock --- Cargo.lock | 109 ++++++++++++++++++++++++----------------------------- 1 file changed, 50 insertions(+), 59 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 81ae49890..123b52a69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,17 +70,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98fcd36dda4e17b7d7abc64cb549bf0201f4ab71e00700c798ca7e62ed3761fa" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -171,9 +160,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" @@ -425,11 +414,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -507,9 +508,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -557,10 +558,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -588,18 +590,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.5" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2db227e61a43a34915680bdda462ec0e212095518020a88a1f91acd16092c39" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", - "funty", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -639,12 +639,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core 0.5.1", + "rand_core 0.6.3", "subtle", ] @@ -654,12 +653,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -705,12 +698,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core 0.6.3", "subtle", ] @@ -749,9 +742,9 @@ checksum = "76505e26b6ca3bbdbbb360b68472abbb80998c5fa5dc43672eca34f28258e138" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -809,9 +802,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.7.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4476a0808212a9e81ce802eb1a0cfc60e73aea296553bacc0fac7e1268bc572a" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if", "ecdsa", @@ -992,11 +985,12 @@ checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -1095,12 +1089,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - [[package]] name = "rand" version = "0.8.4" @@ -1429,12 +1417,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core 0.6.3", ] [[package]] @@ -1443,6 +1431,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1993,12 +1990,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.3.0" From c03a22e1f2ffedcaab2c8d15532636eb494959f6 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 15 Jul 2021 07:56:26 +0200 Subject: [PATCH 217/402] Fix deprecation warning in benches --- packages/crypto/benches/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index e4c4e0564..8bb02c3e5 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -95,7 +95,7 @@ fn bench_crypto(c: &mut Criterion) { let expected = SigningKey::from_bytes(&private_key) .unwrap() - .verify_key() + .verifying_key() .to_encoded_point(false) .as_bytes() .to_vec(); From 41ee4351e8a52b0901bd1820a483780dd54fc2e7 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 15 Jul 2021 08:16:01 +0200 Subject: [PATCH 218/402] Update contract lock files --- contracts/burner/Cargo.lock | 155 +++++++++++++++----------- contracts/crypto-verify/Cargo.lock | 155 +++++++++++++++----------- contracts/floaty/Cargo.lock | 111 +++++++++--------- contracts/hackatom/Cargo.lock | 155 +++++++++++++++----------- contracts/ibc-reflect-send/Cargo.lock | 155 +++++++++++++++----------- contracts/ibc-reflect/Cargo.lock | 155 +++++++++++++++----------- contracts/queue/Cargo.lock | 155 +++++++++++++++----------- contracts/reflect/Cargo.lock | 155 +++++++++++++++----------- contracts/staking/Cargo.lock | 155 +++++++++++++++----------- 9 files changed, 756 insertions(+), 595 deletions(-) diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 82fd171a4..b947100e6 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -110,9 +101,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -127,7 +118,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -306,11 +297,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -324,7 +327,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -366,9 +369,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -416,10 +419,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -433,7 +437,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -447,17 +451,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -491,12 +494,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -506,12 +508,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -530,7 +526,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -552,12 +559,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -584,9 +591,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -617,13 +624,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -780,11 +788,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -855,22 +864,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -881,7 +884,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -890,7 +893,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -899,7 +911,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1123,12 +1135,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1137,6 +1149,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1280,6 +1301,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1532,12 +1559,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index cdde06684..d8190f57f 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -112,9 +103,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -129,7 +120,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -316,11 +307,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -351,7 +354,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -393,9 +396,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -443,10 +446,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -460,7 +464,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -474,17 +478,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -518,12 +521,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -533,12 +535,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -557,7 +553,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -579,12 +586,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -617,9 +624,9 @@ checksum = "5af1f635ef1bc545d78392b136bfe1c9809e029023c84a3638a864a10b8819c8" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -650,13 +657,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -819,11 +827,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -894,22 +903,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -920,7 +923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -929,7 +932,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -938,7 +950,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1190,12 +1202,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1204,6 +1216,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1347,6 +1368,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1599,12 +1626,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index edc543786..67382a5d1 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -48,17 +50,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98fcd36dda4e17b7d7abc64cb549bf0201f4ab71e00700c798ca7e62ed3761fa" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -94,9 +85,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" @@ -293,11 +284,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -353,9 +356,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -403,10 +406,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -434,18 +438,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.5" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2db227e61a43a34915680bdda462ec0e212095518020a88a1f91acd16092c39" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", - "funty", "generic-array", "group", "pkcs8", - "rand_core 0.5.1", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -479,12 +481,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core 0.5.1", + "rand_core 0.6.3", "subtle", ] @@ -508,12 +509,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -559,12 +554,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core 0.5.1", + "rand_core 0.6.3", "subtle", ] @@ -591,9 +586,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -624,9 +619,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4476a0808212a9e81ce802eb1a0cfc60e73aea296553bacc0fac7e1268bc572a" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if", "ecdsa", @@ -782,11 +777,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -857,12 +853,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - [[package]] name = "rand" version = "0.8.4" @@ -1136,12 +1126,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core 0.5.1", + "rand_core 0.6.3", ] [[package]] @@ -1150,6 +1140,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1551,12 +1550,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.3.0" diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a17e182a7..97b9a835f 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -99,9 +90,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -116,7 +107,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -303,11 +294,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -321,7 +324,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -363,9 +366,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -413,10 +416,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -430,7 +434,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -444,17 +448,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -488,12 +491,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -503,12 +505,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -527,7 +523,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -549,12 +556,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -595,9 +602,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -628,13 +635,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -791,11 +799,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -866,22 +875,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -892,7 +895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -901,7 +904,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -910,7 +922,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1134,12 +1146,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1148,6 +1160,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1291,6 +1312,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1543,12 +1570,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 6f5502fad..d31b5fde5 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -99,9 +90,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -116,7 +107,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -303,11 +294,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -321,7 +324,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -363,9 +366,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -413,10 +416,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -430,7 +434,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -444,17 +448,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -488,12 +491,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -503,12 +505,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -527,7 +523,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -549,12 +556,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -581,9 +588,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -626,13 +633,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -789,11 +797,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -864,22 +873,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -890,7 +893,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -899,7 +902,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -908,7 +920,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1132,12 +1144,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1146,6 +1158,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1289,6 +1310,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1541,12 +1568,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 51268ca57..a3607f8d3 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -99,9 +90,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -116,7 +107,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -303,11 +294,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -321,7 +324,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -363,9 +366,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -413,10 +416,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -430,7 +434,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -444,17 +448,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -488,12 +491,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -503,12 +505,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -527,7 +523,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -549,12 +556,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -581,9 +588,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -626,13 +633,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -789,11 +797,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -864,22 +873,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -890,7 +893,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -899,7 +902,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -908,7 +920,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1132,12 +1144,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1146,6 +1158,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1289,6 +1310,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1541,12 +1568,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 3de10e960..e5f820053 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -99,9 +90,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -116,7 +107,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -295,11 +286,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -313,7 +316,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -355,9 +358,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -405,10 +408,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -422,7 +426,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -436,17 +440,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -480,12 +483,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -495,12 +497,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -519,7 +515,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -541,12 +548,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -573,9 +580,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -606,13 +613,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -769,11 +777,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -855,22 +864,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -881,7 +884,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -890,7 +893,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -899,7 +911,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1123,12 +1135,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1137,6 +1149,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1280,6 +1301,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1532,12 +1559,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 72db8bd6d..db832083c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -99,9 +90,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -116,7 +107,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -303,11 +294,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -321,7 +324,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -363,9 +366,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -413,10 +416,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -430,7 +434,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -444,17 +448,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -488,12 +491,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -503,12 +505,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -527,7 +523,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -549,12 +556,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -581,9 +588,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -614,13 +621,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -777,11 +785,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -852,22 +861,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -878,7 +881,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -887,7 +890,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -896,7 +908,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1133,12 +1145,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1147,6 +1159,15 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1290,6 +1311,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1542,12 +1569,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index c4660f3f9..17b256498 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -47,17 +49,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitvec" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2838fdd79e8776dbe07a106c784b0f8dda571a21b2750a092cc4cbaa653c8e" -dependencies = [ - "funty", - "radium", - "wyz", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -99,9 +90,9 @@ checksum = "591ff76ca0691bd91c1b0b5b987e5cf93b21ec810ad96665c5a569c60846dd93" [[package]] name = "const-oid" -version = "0.4.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" +checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "const_fn" @@ -116,7 +107,7 @@ dependencies = [ "digest", "ed25519-zebra", "k256", - "rand_core", + "rand_core 0.5.1", "thiserror", ] @@ -303,11 +294,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -321,7 +324,7 @@ checksum = "f627126b946c25a4638eec0ea634fc52506dea98db118aae985118ce7c3d723f" dependencies = [ "byteorder", "digest", - "rand_core", + "rand_core 0.5.1", "subtle", "zeroize", ] @@ -363,9 +366,9 @@ dependencies = [ [[package]] name = "der" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f59c66c30bb7445c8320a5f9233e437e3572368099f25532a59054328899b4" +checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" dependencies = [ "const-oid", ] @@ -419,10 +422,11 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.10.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fbdb4ff710acb4db8ca29f93b897529ea6d6a45626d5183b47e012aa6ae7e4" +checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" dependencies = [ + "der", "elliptic-curve", "hmac", "signature", @@ -436,7 +440,7 @@ checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" dependencies = [ "curve25519-dalek", "hex", - "rand_core", + "rand_core 0.5.1", "serde", "sha2", "thiserror", @@ -450,17 +454,16 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.8.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b1c857559479c056b73a3053c717108a70e4dce320ad28c79c63f5c2e62ba" +checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" dependencies = [ - "bitvec", - "digest", + "crypto-bigint", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.3", "subtle", "zeroize", ] @@ -494,12 +497,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "ff" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01646e077d4ebda82b73f1bca002ea1e91561a77df2431a9e79729bcc31950ef" +checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" dependencies = [ - "bitvec", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -509,12 +511,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "generic-array" version = "0.14.4" @@ -533,7 +529,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "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 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -555,12 +562,12 @@ dependencies = [ [[package]] name = "group" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11f9f5fbf1943b48ae7c2bf6846e7d827a512d1be4f23af708f5ca5d01dde1" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.3", "subtle", ] @@ -587,9 +594,9 @@ checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", "digest", @@ -620,13 +627,14 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.7.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf02ecc966e1b7e8db1c81ac8f321ba24d1cfab5b634961fab10111f015858e1" +checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "sha2", ] [[package]] @@ -783,11 +791,12 @@ checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pkcs8" -version = "0.3.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4839a901843f3942576e65857f0ebf2e190ef7024d3c62a94099ba3f819ad1d" +checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" dependencies = [ "der", + "spki", ] [[package]] @@ -858,22 +867,16 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64de9a0c5361e034f1aefc9f71a86871ec870e766fe31a009734a989b329286a" - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -884,7 +887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -893,7 +896,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "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]] @@ -902,7 +914,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1126,12 +1138,12 @@ dependencies = [ [[package]] name = "signature" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -1161,6 +1173,15 @@ dependencies = [ "syn", ] +[[package]] +name = "spki" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +dependencies = [ + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1317,6 +1338,12 @@ 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 = "wasmer" version = "2.0.0" @@ -1569,12 +1596,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "zeroize" version = "1.2.0" From eb268937f9d4cdc16264a911f51d861fe9ebea2e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 14 Jul 2021 19:00:48 +0200 Subject: [PATCH 219/402] Move counterparty_version to IbcChannelOpenMsg --- contracts/ibc-reflect-send/src/ibc.rs | 4 ++-- contracts/ibc-reflect-send/tests/integration.rs | 2 +- contracts/ibc-reflect/src/contract.rs | 6 +++--- contracts/ibc-reflect/tests/integration.rs | 4 ++-- packages/std/src/ibc.rs | 14 +++++++++++--- packages/std/src/mock.rs | 2 +- packages/vm/src/calls.rs | 2 +- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 1457705dd..f812aec5d 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -31,7 +31,7 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> St } // TODO: do we need to check counterparty version as well? // This flow needs to be well documented - if let Some(counter_version) = channel.counterparty_version { + if let Some(counter_version) = msg.counterparty_version { if counter_version.as_str() != IBC_VERSION { return Err(StdError::generic_err(format!( "Counterparty version must be `{}`", @@ -281,7 +281,7 @@ mod tests { fn connect(mut deps: DepsMut, channel_id: &str) { // open packet has no counterparty version, connect does let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.channel.counterparty_version = None; + handshake_open.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 5108f5e87..3df2c0e1f 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -54,7 +54,7 @@ fn setup() -> Instance { fn connect(deps: &mut Instance, channel_id: &str) { // open packet has no counterparty version, connect does let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.channel.counterparty_version = None; + handshake_open.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 92c2f65f1..7502d9b5e 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -140,7 +140,7 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> St } // TODO: do we need to check counterparty version as well? // This flow needs to be well documented - if let Some(counter_version) = channel.counterparty_version { + if let Some(counter_version) = msg.counterparty_version { if counter_version.as_str() != IBC_VERSION { return Err(StdError::generic_err(format!( "Counterparty version must be `{}`", @@ -406,7 +406,7 @@ mod tests { // open packet has no counterparty versin, connect does // TODO: validate this with alpe let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.channel.counterparty_version = None; + handshake_open.counterparty_version = None; // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); @@ -463,7 +463,7 @@ mod tests { // first we try to open with a valid handshake let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.channel.counterparty_version = None; + handshake_open.counterparty_version = None; ibc_channel_open(deps.as_mut(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 92be02efe..dc78cd4f9 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -81,7 +81,7 @@ fn connect>( let account: String = account.into(); // first we try to open with a valid handshake let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.channel.counterparty_version = None; + handshake_open.counterparty_version = None; ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) @@ -137,7 +137,7 @@ fn proper_handshake_flow() { // first we try to open with a valid handshake let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.channel.counterparty_version = None; + handshake_open.counterparty_version = None; ibc_channel_open(&mut deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index e4dbe954e..090821d82 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -120,8 +120,6 @@ pub struct IbcChannel { pub counterparty_endpoint: IbcEndpoint, pub order: IbcOrder, pub version: String, - /// CounterpartyVersion can be None when not known this context, yet - pub counterparty_version: Option, /// The connection upon which this channel was created. If this is a multi-hop /// channel, we only expose the first hop. pub connection_id: String, @@ -215,11 +213,21 @@ impl IbcAcknowledgement { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct IbcChannelOpenMsg { pub channel: IbcChannel, + /// CounterpartyVersion can be None when not known this context, yet + pub counterparty_version: Option, } impl IbcChannelOpenMsg { pub fn new(channel: IbcChannel) -> Self { - Self { channel } + Self { + channel, + counterparty_version: None, + } + } + + pub fn counterparty_version(mut self, counterparty_version: impl Into) -> Self { + self.counterparty_version = Some(counterparty_version.into()); + self } } diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index fede1b5ed..f409cbe76 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -235,7 +235,6 @@ fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcC }, order, version: version.to_string(), - counterparty_version: Some(version.to_string()), connection_id: "connection-2".to_string(), } } @@ -248,6 +247,7 @@ pub fn mock_ibc_channel_open( version: &str, ) -> IbcChannelOpenMsg { IbcChannelOpenMsg::new(mock_ibc_channel(my_channel_id, order, version)) + .counterparty_version(version) } #[cfg(feature = "stargate")] diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 3806439c9..ae56ef6f3 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -702,7 +702,7 @@ mod tests { // first we try to open with a valid handshake let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.channel.counterparty_version = None; + handshake_open.counterparty_version = None; call_ibc_channel_open(instance, &mock_env(), &handshake_open) .unwrap() .unwrap(); From 455b49ad83333f23ac6563ffb425e9e4b8edc6d0 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 15 Jul 2021 18:12:06 +0200 Subject: [PATCH 220/402] Diff between the 6 different IBC entry points --- packages/std/src/ibc.rs | 105 ++++++++++++++++++++++++++++++++------- packages/std/src/lib.rs | 3 +- packages/std/src/mock.rs | 45 ++++++++++++++--- 3 files changed, 126 insertions(+), 27 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 090821d82..c2a64d85d 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -211,47 +211,116 @@ impl IbcAcknowledgement { /// The message that is passed into `ibc_channel_open` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct IbcChannelOpenMsg { - pub channel: IbcChannel, - /// CounterpartyVersion can be None when not known this context, yet - pub counterparty_version: Option, +pub enum IbcChannelOpenMsg { + OpenInit { + channel: IbcChannel, + }, + OpenTry { + channel: IbcChannel, + counterparty_version: String, + }, } impl IbcChannelOpenMsg { - pub fn new(channel: IbcChannel) -> Self { - Self { + pub fn new_init(channel: IbcChannel) -> Self { + Self::OpenInit { channel } + } + + pub fn new_try(channel: IbcChannel, counterparty_version: impl Into) -> Self { + Self::OpenTry { channel, - counterparty_version: None, + counterparty_version: counterparty_version.into(), } } - pub fn counterparty_version(mut self, counterparty_version: impl Into) -> Self { - self.counterparty_version = Some(counterparty_version.into()); - self + pub fn channel(&self) -> &IbcChannel { + match self { + Self::OpenInit { channel } => channel, + Self::OpenTry { channel, .. } => channel, + } + } +} + +impl From for IbcChannel { + fn from(msg: IbcChannelOpenMsg) -> IbcChannel { + match msg { + IbcChannelOpenMsg::OpenInit { channel } => channel, + IbcChannelOpenMsg::OpenTry { channel, .. } => channel, + } } } /// The message that is passed into `ibc_channel_connect` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct IbcChannelConnectMsg { - pub channel: IbcChannel, +pub enum IbcChannelConnectMsg { + OpenAck { + channel: IbcChannel, + counterparty_version: String, + }, + OpenConfirm { + channel: IbcChannel, + }, } impl IbcChannelConnectMsg { - pub fn new(channel: IbcChannel) -> Self { - Self { channel } + pub fn new_ack(channel: IbcChannel, counterparty_version: impl Into) -> Self { + Self::OpenAck { + channel, + counterparty_version: counterparty_version.into(), + } + } + + pub fn new_confirm(channel: IbcChannel) -> Self { + Self::OpenConfirm { channel } + } + + pub fn channel(&self) -> &IbcChannel { + match self { + Self::OpenAck { channel, .. } => channel, + Self::OpenConfirm { channel } => channel, + } + } +} + +impl From for IbcChannel { + fn from(msg: IbcChannelConnectMsg) -> IbcChannel { + match msg { + IbcChannelConnectMsg::OpenAck { channel, .. } => channel, + IbcChannelConnectMsg::OpenConfirm { channel } => channel, + } } } /// The message that is passed into `ibc_channel_close` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct IbcChannelCloseMsg { - pub channel: IbcChannel, +pub enum IbcChannelCloseMsg { + CloseInit { channel: IbcChannel }, + CloseConfirm { channel: IbcChannel }, // pub channel: IbcChannel, } impl IbcChannelCloseMsg { - pub fn new(channel: IbcChannel) -> Self { - Self { channel } + pub fn new_init(channel: IbcChannel) -> Self { + Self::CloseInit { channel } + } + + pub fn new_confirm(channel: IbcChannel) -> Self { + Self::CloseConfirm { channel } + } + + pub fn channel(&self) -> &IbcChannel { + match self { + Self::CloseInit { channel } => channel, + Self::CloseConfirm { channel } => channel, + } + } +} + +impl From for IbcChannel { + fn from(msg: IbcChannelCloseMsg) -> IbcChannel { + match msg { + IbcChannelCloseMsg::CloseInit { channel } => channel, + IbcChannelCloseMsg::CloseConfirm { channel } => channel, + } } } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index fc62ff5b2..a86b71e2e 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -104,7 +104,8 @@ pub mod testing { }; #[cfg(feature = "stargate")] pub use crate::mock::{ - mock_ibc_channel_close, mock_ibc_channel_connect, mock_ibc_channel_open, + 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, }; } diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index f409cbe76..4ea56fe8b 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -240,34 +240,63 @@ fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcC } #[cfg(feature = "stargate")] -/// Creates a IbcChannelOpenMsg for testing ibc_channel_open. -pub fn mock_ibc_channel_open( +/// Creates a IbcChannelOpenMsg::OpenInit for testing ibc_channel_open. +pub fn mock_ibc_channel_open_init( my_channel_id: &str, order: IbcOrder, version: &str, ) -> IbcChannelOpenMsg { - IbcChannelOpenMsg::new(mock_ibc_channel(my_channel_id, order, version)) - .counterparty_version(version) + IbcChannelOpenMsg::new_init(mock_ibc_channel(my_channel_id, order, version)) +} + +#[cfg(feature = "stargate")] +/// Creates a IbcChannelOpenMsg::OpenTry for testing ibc_channel_open. +pub fn mock_ibc_channel_open_try( + my_channel_id: &str, + order: IbcOrder, + version: &str, +) -> IbcChannelOpenMsg { + IbcChannelOpenMsg::new_try(mock_ibc_channel(my_channel_id, order, version), version) } #[cfg(feature = "stargate")] /// Creates a IbcChannelConnectMsg for testing ibc_channel_connect. -pub fn mock_ibc_channel_connect( +pub fn mock_ibc_channel_connect_ack( my_channel_id: &str, order: IbcOrder, version: &str, ) -> IbcChannelConnectMsg { - IbcChannelConnectMsg::new(mock_ibc_channel(my_channel_id, order, version)) + IbcChannelConnectMsg::new_ack(mock_ibc_channel(my_channel_id, order, version), version) +} + +#[cfg(feature = "stargate")] +/// Creates a IbcChannelConnectMsg for testing ibc_channel_connect. +pub fn mock_ibc_channel_connect_confirm( + my_channel_id: &str, + order: IbcOrder, + version: &str, +) -> IbcChannelConnectMsg { + IbcChannelConnectMsg::new_confirm(mock_ibc_channel(my_channel_id, order, version)) +} + +#[cfg(feature = "stargate")] +/// Creates a IbcChannelCloseMsg for testing ibc_channel_close. +pub fn mock_ibc_channel_close_init( + my_channel_id: &str, + order: IbcOrder, + version: &str, +) -> IbcChannelCloseMsg { + IbcChannelCloseMsg::new_init(mock_ibc_channel(my_channel_id, order, version)) } #[cfg(feature = "stargate")] /// Creates a IbcChannelCloseMsg for testing ibc_channel_close. -pub fn mock_ibc_channel_close( +pub fn mock_ibc_channel_close_confirm( my_channel_id: &str, order: IbcOrder, version: &str, ) -> IbcChannelCloseMsg { - IbcChannelCloseMsg::new(mock_ibc_channel(my_channel_id, order, version)) + IbcChannelCloseMsg::new_confirm(mock_ibc_channel(my_channel_id, order, version)) } #[cfg(feature = "stargate")] From 429ca607b467c7e9e38ae966f75d296bf6129089 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 15 Jul 2021 19:06:05 +0200 Subject: [PATCH 221/402] Update contracts --- contracts/ibc-reflect-send/src/ibc.rs | 35 ++++++++-------- .../ibc-reflect-send/tests/integration.rs | 17 ++++---- contracts/ibc-reflect/src/contract.rs | 42 +++++++++---------- contracts/ibc-reflect/tests/integration.rs | 21 +++++----- packages/std/src/ibc.rs | 20 +++++++++ packages/vm/src/calls.rs | 11 +++-- 6 files changed, 82 insertions(+), 64 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index f812aec5d..c6354e364 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -18,7 +18,7 @@ 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<()> { - let channel = msg.channel; + let channel = msg.channel(); if channel.order != IbcOrder::Ordered { return Err(StdError::generic_err("Only supports ordered channels")); @@ -29,10 +29,9 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> St IBC_VERSION ))); } - // TODO: do we need to check counterparty version as well? - // This flow needs to be well documented - if let Some(counter_version) = msg.counterparty_version { - if counter_version.as_str() != IBC_VERSION { + + if let Some(counter_version) = msg.counterparty_version() { + if counter_version != IBC_VERSION { return Err(StdError::generic_err(format!( "Counterparty version must be `{}`", IBC_VERSION @@ -50,9 +49,9 @@ pub fn ibc_channel_connect( env: Env, msg: IbcChannelConnectMsg, ) -> StdResult { - let channel = msg.channel; + let channel = msg.channel(); - let channel_id = channel.endpoint.channel_id; + let channel_id = &channel.endpoint.channel_id; // create an account holder the channel exists (not found if not registered) let data = AccountData::default(); @@ -83,10 +82,10 @@ pub fn ibc_channel_close( _env: Env, msg: IbcChannelCloseMsg, ) -> StdResult { - let channel = msg.channel; + let channel = msg.channel(); // remove the channel - let channel_id = channel.endpoint.channel_id; + let channel_id = &channel.endpoint.channel_id; accounts(deps.storage).remove(channel_id.as_bytes()); Ok(IbcBasicResponse { @@ -260,8 +259,9 @@ mod tests { use crate::msg::{AccountResponse, ExecuteMsg, InstantiateMsg, QueryMsg}; use cosmwasm_std::testing::{ - mock_dependencies, mock_env, mock_ibc_channel_connect, mock_ibc_channel_open, - mock_ibc_packet_ack, mock_info, MockApi, MockQuerier, MockStorage, + mock_dependencies, mock_env, mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, + mock_ibc_channel_open_try, mock_ibc_packet_ack, mock_info, MockApi, MockQuerier, + MockStorage, }; use cosmwasm_std::{coin, coins, BankMsg, CosmosMsg, IbcAcknowledgement, OwnedDeps}; @@ -279,15 +279,13 @@ mod tests { // connect will run through the entire handshake to set up a proper connect and // save the account (tested in detail in `proper_handshake_flow`) fn connect(mut deps: DepsMut, channel_id: &str) { - // open packet has no counterparty version, connect does - let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let handshake_open = mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_VERSION); // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) let handshake_connect = - mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + mock_ibc_channel_connect_ack(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); // this should send a WhoAmI request, which is received some blocks later @@ -316,13 +314,14 @@ mod tests { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = mock_ibc_channel_open_try("channel-12", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, "reflect"); + let wrong_version = mock_ibc_channel_open_try("channel-12", IbcOrder::Ordered, "reflect"); ibc_channel_open(deps.as_mut(), mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = + mock_ibc_channel_open_try("channel-12", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), valid_handshake).unwrap(); } diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 3df2c0e1f..b66827cda 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -17,7 +17,10 @@ //! }); //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) -use cosmwasm_std::testing::{mock_ibc_channel_connect, mock_ibc_channel_open, mock_ibc_packet_ack}; +use cosmwasm_std::testing::{ + mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, mock_ibc_channel_open_try, + mock_ibc_packet_ack, +}; use cosmwasm_std::{ attr, coin, coins, BankMsg, CosmosMsg, Empty, IbcAcknowledgement, IbcBasicResponse, IbcMsg, IbcOrder, Response, @@ -53,13 +56,13 @@ fn setup() -> Instance { // save the account (tested in detail in `proper_handshake_flow`) fn connect(deps: &mut Instance, channel_id: &str) { // open packet has no counterparty version, connect does - let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let handshake_open = mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_VERSION); // first we try to open with a valid handshake ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + mock_ibc_channel_connect_ack(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); // this should send a WhoAmI request, which is received some blocks later @@ -100,13 +103,13 @@ fn instantiate_works() { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = mock_ibc_channel_open_try("channel-12", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, "reflect"); + let wrong_version = mock_ibc_channel_open_try("channel-12", IbcOrder::Ordered, "reflect"); ibc_channel_open(&mut deps, mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = mock_ibc_channel_open_try("channel-12", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), valid_handshake).unwrap(); } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 7502d9b5e..86fc498ec 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -127,7 +127,7 @@ pub fn query_list_accounts(deps: Deps) -> StdResult { #[entry_point] /// enforces ordering and versioing constraints pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> StdResult<()> { - let channel = msg.channel; + let channel = msg.channel(); if channel.order != IbcOrder::Ordered { return Err(StdError::generic_err("Only supports ordered channels")); @@ -138,10 +138,9 @@ pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> St IBC_VERSION ))); } - // TODO: do we need to check counterparty version as well? - // This flow needs to be well documented - if let Some(counter_version) = msg.counterparty_version { - if counter_version.as_str() != IBC_VERSION { + + if let Some(counter_version) = msg.counterparty_version() { + if counter_version != IBC_VERSION { return Err(StdError::generic_err(format!( "Counterparty version must be `{}`", IBC_VERSION @@ -159,9 +158,9 @@ pub fn ibc_channel_connect( _env: Env, msg: IbcChannelConnectMsg, ) -> StdResult { - let channel = msg.channel; + let channel = msg.channel(); let cfg = config(deps.storage).load()?; - let chan_id = channel.endpoint.channel_id; + let chan_id = &channel.endpoint.channel_id; let msg = WasmMsg::Instantiate { admin: None, @@ -190,7 +189,7 @@ pub fn ibc_channel_close( env: Env, msg: IbcChannelCloseMsg, ) -> StdResult { - let channel = msg.channel; + 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())?; @@ -362,9 +361,9 @@ pub fn ibc_packet_timeout( mod tests { use super::*; use cosmwasm_std::testing::{ - mock_dependencies, mock_env, mock_ibc_channel_close, mock_ibc_channel_connect, - mock_ibc_channel_open, mock_ibc_packet_recv, mock_info, MockApi, MockQuerier, MockStorage, - MOCK_CONTRACT_ADDR, + mock_dependencies, mock_env, mock_ibc_channel_close_init, mock_ibc_channel_connect_ack, + mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_recv, mock_info, + MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, }; use cosmwasm_std::{coin, coins, from_slice, BankMsg, OwnedDeps, WasmMsg}; @@ -403,16 +402,13 @@ mod tests { fn connect>(mut deps: DepsMut, channel_id: &str, account: T) { let account: String = account.into(); - // open packet has no counterparty versin, connect does - // TODO: validate this with alpe - let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let handshake_open = mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_VERSION); // first we try to open with a valid handshake ibc_channel_open(deps.branch(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) let handshake_connect = - mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + mock_ibc_channel_connect_ack(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); assert_eq!(1, res.events.len()); @@ -446,13 +442,14 @@ mod tests { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = mock_ibc_channel_open_try("channel-12", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, "reflect"); + let wrong_version = mock_ibc_channel_open_try("channel-12", IbcOrder::Ordered, "reflect"); ibc_channel_open(deps.as_mut(), mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel_open("channel-12", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = + mock_ibc_channel_open_try("channel-12", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), valid_handshake).unwrap(); } @@ -462,13 +459,12 @@ mod tests { let channel_id = "channel-1234"; // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let handshake_open = mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(deps.as_mut(), mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) let handshake_connect = - mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + mock_ibc_channel_connect_ack(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_connect(deps.as_mut(), mock_env(), handshake_connect).unwrap(); // and set up a reflect account assert_eq!(1, res.messages.len()); @@ -628,7 +624,7 @@ mod tests { assert_eq!(funds, balance); // close the channel - let channel = mock_ibc_channel_close(channel_id, IbcOrder::Ordered, IBC_VERSION); + let channel = mock_ibc_channel_close_init(channel_id, IbcOrder::Ordered, IBC_VERSION); let res = ibc_channel_close(deps.as_mut(), mock_env(), channel).unwrap(); // it pulls out all money from the reflect contract diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index dc78cd4f9..6cb1cbc3e 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -18,7 +18,8 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::testing::{ - mock_ibc_channel_connect, mock_ibc_channel_open, mock_ibc_packet_recv, + mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, mock_ibc_channel_open_try, + mock_ibc_packet_recv, }; use cosmwasm_std::{ attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, @@ -80,12 +81,12 @@ fn connect>( ) { let account: String = account.into(); // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let handshake_open = mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + mock_ibc_channel_connect_ack(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); assert_eq!(1, res.events.len()); @@ -120,13 +121,13 @@ fn instantiate_works() { fn enforce_version_in_handshake() { let mut deps = setup(); - let wrong_order = mock_ibc_channel_open("channel-1234", IbcOrder::Unordered, IBC_VERSION); + let wrong_order = mock_ibc_channel_open_try("channel-1234", IbcOrder::Unordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); - let wrong_version = mock_ibc_channel_open("channel-1234", IbcOrder::Ordered, "reflect"); + let wrong_version = mock_ibc_channel_open_try("channel-1234", IbcOrder::Ordered, "reflect"); ibc_channel_open(&mut deps, mock_env(), wrong_version).unwrap_err(); - let valid_handshake = mock_ibc_channel_open("channel-1234", IbcOrder::Ordered, IBC_VERSION); + let valid_handshake = mock_ibc_channel_open_try("channel-1234", IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), valid_handshake).unwrap(); } @@ -136,12 +137,12 @@ fn proper_handshake_flow() { let channel_id = "channel-432"; // first we try to open with a valid handshake - let mut handshake_open = mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let handshake_open = mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_VERSION); ibc_channel_open(&mut deps, mock_env(), handshake_open).unwrap(); // then we connect (with counter-party version set) - let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + let handshake_connect = + mock_ibc_channel_connect_ack(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = ibc_channel_connect(&mut deps, mock_env(), handshake_connect).unwrap(); // and set up a reflect account diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index c2a64d85d..370d14c0e 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -239,6 +239,16 @@ impl IbcChannelOpenMsg { Self::OpenTry { channel, .. } => channel, } } + + pub fn counterparty_version(&self) -> Option<&str> { + match self { + Self::OpenTry { + counterparty_version, + .. + } => Some(counterparty_version), + _ => None, + } + } } impl From for IbcChannel { @@ -280,6 +290,16 @@ impl IbcChannelConnectMsg { Self::OpenConfirm { channel } => channel, } } + + pub fn counterparty_version(&self) -> Option<&str> { + match self { + Self::OpenAck { + counterparty_version, + .. + } => Some(counterparty_version), + _ => None, + } + } } impl From for IbcChannel { diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index ae56ef6f3..cb1bf58cd 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -679,7 +679,7 @@ mod tests { mock_env, mock_info, mock_instance, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::testing::{ - mock_ibc_channel_close, mock_ibc_channel_connect, mock_ibc_channel_open, + 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, }; use cosmwasm_std::{ @@ -700,15 +700,14 @@ mod tests { .unwrap() .unwrap(); // first we try to open with a valid handshake - let mut handshake_open = - mock_ibc_channel_open(channel_id, IbcOrder::Ordered, IBC_VERSION); - handshake_open.counterparty_version = None; + let handshake_open = + mock_ibc_channel_open_init(channel_id, IbcOrder::Ordered, IBC_VERSION); call_ibc_channel_open(instance, &mock_env(), &handshake_open) .unwrap() .unwrap(); // then we connect (with counter-party version set) let handshake_connect = - mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); + mock_ibc_channel_connect_ack(channel_id, IbcOrder::Ordered, IBC_VERSION); let res: IbcBasicResponse = call_ibc_channel_connect::<_, _, _, Empty>( instance, &mock_env(), @@ -747,7 +746,7 @@ mod tests { let mut instance = mock_instance(&CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let handshake_close = - mock_ibc_channel_close(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); + mock_ibc_channel_close_init(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); call_ibc_channel_close::<_, _, _, Empty>(&mut instance, &mock_env(), &handshake_close) .unwrap() .unwrap(); From 8bc7ae9bcc9107d4217931b07c67e2b797224801 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Fri, 16 Jul 2021 08:07:34 +0200 Subject: [PATCH 222/402] Fix clippy +1.53.0 warnings --- contracts/crypto-verify/src/ethereum.rs | 2 +- packages/schema/src/remove.rs | 54 +++++++++---------- packages/std/src/addresses.rs | 8 +-- packages/std/src/math/decimal.rs | 12 ++--- packages/std/src/math/uint128.rs | 8 +-- packages/std/src/math/uint64.rs | 8 +-- packages/vm/src/checksum.rs | 2 +- packages/vm/src/environment.rs | 8 +-- packages/vm/src/instance.rs | 8 +-- .../vm/src/modules/pinned_memory_cache.rs | 6 +-- packages/vm/src/static_analysis.rs | 6 +-- 11 files changed, 61 insertions(+), 61 deletions(-) diff --git a/contracts/crypto-verify/src/ethereum.rs b/contracts/crypto-verify/src/ethereum.rs index 242b6dbdb..5ee78ea57 100644 --- a/contracts/crypto-verify/src/ethereum.rs +++ b/contracts/crypto-verify/src/ethereum.rs @@ -167,7 +167,7 @@ mod tests { &api, from, to, nonce, gas_limit, gas_price, value, &data, chain_id, &r, &s, v, ) .unwrap(); - assert_eq!(valid, true); + assert!(valid); } #[test] diff --git a/packages/schema/src/remove.rs b/packages/schema/src/remove.rs index 19c530c9f..2b7c2359e 100644 --- a/packages/schema/src/remove.rs +++ b/packages/schema/src/remove.rs @@ -42,58 +42,58 @@ mod tests { #[test] fn is_hidden_works() { - assert_eq!(is_hidden(Path::new("/foo")), false); - assert_eq!(is_hidden(Path::new("/foo/bar")), false); - assert_eq!(is_hidden(Path::new("/foo/bar.txt")), false); - assert_eq!(is_hidden(Path::new("~foo")), false); - assert_eq!(is_hidden(Path::new("foo")), false); + assert!(!is_hidden(Path::new("/foo"))); + assert!(!is_hidden(Path::new("/foo/bar"))); + assert!(!is_hidden(Path::new("/foo/bar.txt"))); + assert!(!is_hidden(Path::new("~foo"))); + assert!(!is_hidden(Path::new("foo"))); - assert_eq!(is_hidden(Path::new("/.foo")), true); - assert_eq!(is_hidden(Path::new("/foo/.bar")), true); - assert_eq!(is_hidden(Path::new("/foo/.bar.txt")), true); - assert_eq!(is_hidden(Path::new(".foo")), true); + assert!(is_hidden(Path::new("/.foo"))); + assert!(is_hidden(Path::new("/foo/.bar"))); + assert!(is_hidden(Path::new("/foo/.bar.txt"))); + assert!(is_hidden(Path::new(".foo"))); // no filename - assert_eq!(is_hidden(Path::new("/")), false); - assert_eq!(is_hidden(Path::new("")), false); + assert!(!is_hidden(Path::new("/"))); + assert!(!is_hidden(Path::new(""))); // invalid UTF-8 #[cfg(any(unix, target_os = "redox"))] { use std::os::unix::ffi::OsStrExt; let non_hidden = OsStr::from_bytes(&[0x66, 0x6f, 0x80, 0x6f]); // fo�o - assert_eq!(is_hidden(Path::new(non_hidden)), false); + assert!(!is_hidden(Path::new(non_hidden))); let hidden = OsStr::from_bytes(&[0x2e, 0x66, 0x6f, 0x80, 0x6f]); // .fo�o - assert_eq!(is_hidden(Path::new(hidden)), true); + assert!(is_hidden(Path::new(hidden))); } } #[test] fn is_json_works() { - assert_eq!(is_json(Path::new("/foo")), false); - assert_eq!(is_json(Path::new("/foo/bar")), false); - assert_eq!(is_json(Path::new("/foo/bar.txt")), false); - assert_eq!(is_json(Path::new("~foo")), false); - assert_eq!(is_json(Path::new("foo")), false); - assert_eq!(is_json(Path::new("foo.json5")), false); + assert!(!is_json(Path::new("/foo"))); + assert!(!is_json(Path::new("/foo/bar"))); + assert!(!is_json(Path::new("/foo/bar.txt"))); + assert!(!is_json(Path::new("~foo"))); + assert!(!is_json(Path::new("foo"))); + assert!(!is_json(Path::new("foo.json5"))); - assert_eq!(is_json(Path::new("/.json")), true); - assert_eq!(is_json(Path::new("/foo/.bar.json")), true); - assert_eq!(is_json(Path::new("/foo/bar.json")), true); - assert_eq!(is_json(Path::new("foo.json")), true); + assert!(is_json(Path::new("/.json"))); + assert!(is_json(Path::new("/foo/.bar.json"))); + assert!(is_json(Path::new("/foo/bar.json"))); + assert!(is_json(Path::new("foo.json"))); // no filename - assert_eq!(is_json(Path::new("/")), false); - assert_eq!(is_json(Path::new("")), false); + assert!(!is_json(Path::new("/"))); + assert!(!is_json(Path::new(""))); // invalid UTF-8 #[cfg(any(unix, target_os = "redox"))] { use std::os::unix::ffi::OsStrExt; let non_hidden = OsStr::from_bytes(&[0x66, 0x6f, 0x80, 0x6f]); // fo�o - assert_eq!(is_json(Path::new(non_hidden)), false); + assert!(!is_json(Path::new(non_hidden))); let hidden = OsStr::from_bytes(&[0x66, 0x6f, 0x80, 0x6f, 0x2e, 0x6a, 0x73, 0x6f, 0x6e]); // fo�o.json - assert_eq!(is_json(Path::new(hidden)), true); + assert!(is_json(Path::new(hidden))); } } } diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index faad8ee73..8ba68a487 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -480,9 +480,9 @@ mod tests { #[test] fn human_addr_is_empty() { let human_addr = HumanAddr::from("Hello, world!"); - assert_eq!(false, human_addr.is_empty()); + assert!(!human_addr.is_empty()); let empty_human_addr = HumanAddr::from(""); - assert_eq!(true, empty_human_addr.is_empty()); + assert!(empty_human_addr.is_empty()); } // Test CanonicalAddr as_slice() for each CanonicalAddr::from input type @@ -544,9 +544,9 @@ mod tests { fn canonical_addr_is_empty() { let bytes: &[u8] = &[0u8, 187, 61, 11, 250, 0]; let canonical_addr = CanonicalAddr::from(bytes); - assert_eq!(false, canonical_addr.is_empty()); + assert!(!canonical_addr.is_empty()); let empty_canonical_addr = CanonicalAddr::from(vec![]); - assert_eq!(true, empty_canonical_addr.is_empty()); + assert!(empty_canonical_addr.is_empty()); } #[test] diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index b4fe188cc..30cf8f797 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -468,13 +468,13 @@ mod tests { #[test] fn decimal_is_zero_works() { - assert_eq!(Decimal::zero().is_zero(), true); - assert_eq!(Decimal::percent(0).is_zero(), true); - assert_eq!(Decimal::permille(0).is_zero(), true); + assert!(Decimal::zero().is_zero()); + assert!(Decimal::percent(0).is_zero()); + assert!(Decimal::permille(0).is_zero()); - assert_eq!(Decimal::one().is_zero(), false); - assert_eq!(Decimal::percent(123).is_zero(), false); - assert_eq!(Decimal::permille(1234).is_zero(), false); + assert!(!Decimal::one().is_zero()); + assert!(!Decimal::percent(123).is_zero()); + assert!(!Decimal::permille(1234).is_zero()); } #[test] diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index ab7ba7d1e..51dcf617f 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -388,11 +388,11 @@ mod tests { #[test] fn uint128_is_zero_works() { - assert_eq!(Uint128::zero().is_zero(), true); - assert_eq!(Uint128(0).is_zero(), true); + assert!(Uint128::zero().is_zero()); + assert!(Uint128(0).is_zero()); - assert_eq!(Uint128(1).is_zero(), false); - assert_eq!(Uint128(123).is_zero(), false); + assert!(!Uint128(1).is_zero()); + assert!(!Uint128(123).is_zero()); } #[test] diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index abaf2778b..33067a779 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -336,11 +336,11 @@ mod tests { #[test] fn uint64_is_zero_works() { - assert_eq!(Uint64::zero().is_zero(), true); - assert_eq!(Uint64(0).is_zero(), true); + assert!(Uint64::zero().is_zero()); + assert!(Uint64(0).is_zero()); - assert_eq!(Uint64(1).is_zero(), false); - assert_eq!(Uint64(123).is_zero(), false); + assert!(!Uint64(1).is_zero()); + assert!(!Uint64(123).is_zero()); } #[test] diff --git a/packages/vm/src/checksum.rs b/packages/vm/src/checksum.rs index c52d904a7..b251a2844 100644 --- a/packages/vm/src/checksum.rs +++ b/packages/vm/src/checksum.rs @@ -19,7 +19,7 @@ impl Checksum { } /// Creates a lowercase hex encoded copy of this checksum - pub fn to_hex(&self) -> String { + pub fn to_hex(self) -> String { self.to_string() } } diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index e983f80e3..ccefc5f1b 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -639,7 +639,7 @@ mod tests { let (env, _instance) = make_instance(TESTING_GAS_LIMIT); leave_default_data(&env); - assert_eq!(env.is_storage_readonly(), true); + assert!(env.is_storage_readonly()); } #[test] @@ -649,15 +649,15 @@ mod tests { // change env.set_storage_readonly(false); - assert_eq!(env.is_storage_readonly(), false); + assert!(!env.is_storage_readonly()); // still false env.set_storage_readonly(false); - assert_eq!(env.is_storage_readonly(), false); + assert!(!env.is_storage_readonly()); // change back env.set_storage_readonly(true); - assert_eq!(env.is_storage_readonly(), true); + assert!(env.is_storage_readonly()); } #[test] diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b8dd46eb4..b1ec320a6 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -617,16 +617,16 @@ mod tests { fn set_storage_readonly_works() { let mut instance = mock_instance(&CONTRACT, &[]); - assert_eq!(instance.env.is_storage_readonly(), true); + assert!(instance.env.is_storage_readonly()); instance.set_storage_readonly(false); - assert_eq!(instance.env.is_storage_readonly(), false); + assert!(!instance.env.is_storage_readonly()); instance.set_storage_readonly(false); - assert_eq!(instance.env.is_storage_readonly(), false); + assert!(!instance.env.is_storage_readonly()); instance.set_storage_readonly(true); - assert_eq!(instance.env.is_storage_readonly(), true); + assert!(instance.env.is_storage_readonly()); } #[test] diff --git a/packages/vm/src/modules/pinned_memory_cache.rs b/packages/vm/src/modules/pinned_memory_cache.rs index 82df59fb9..4efa5d497 100644 --- a/packages/vm/src/modules/pinned_memory_cache.rs +++ b/packages/vm/src/modules/pinned_memory_cache.rs @@ -131,18 +131,18 @@ mod tests { .unwrap(); let checksum = Checksum::generate(&wasm); - assert_eq!(cache.has(&checksum), false); + assert!(!cache.has(&checksum)); // Add let original = compile(&wasm, None).unwrap(); cache.store(&checksum, original, 0).unwrap(); - assert_eq!(cache.has(&checksum), true); + assert!(cache.has(&checksum)); // Remove cache.remove(&checksum).unwrap(); - assert_eq!(cache.has(&checksum), false); + assert!(!cache.has(&checksum)); } #[test] diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 1ddf3eb99..085a5d683 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -132,7 +132,7 @@ mod tests { ) .unwrap(); let module = deserialize_wasm(&wasm).unwrap(); - assert_eq!(has_ibc_entry_points(&module), false); + assert!(!has_ibc_entry_points(&module)); // IBC contract let wasm = wat::parse_str( @@ -157,7 +157,7 @@ mod tests { ) .unwrap(); let module = deserialize_wasm(&wasm).unwrap(); - assert_eq!(has_ibc_entry_points(&module), true); + assert!(has_ibc_entry_points(&module)); // Missing packet ack let wasm = wat::parse_str( @@ -181,6 +181,6 @@ mod tests { ) .unwrap(); let module = deserialize_wasm(&wasm).unwrap(); - assert_eq!(has_ibc_entry_points(&module), false); + assert!(!has_ibc_entry_points(&module)); } } From d797d6ed0567b52a70126a02b2959f03f89de6e5 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Fri, 16 Jul 2021 12:15:15 +0200 Subject: [PATCH 223/402] Add changelog entry for to_hex() change --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 290a06a47..afa2d5dec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and this project adheres to ### 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 From f28520d834c762829ad7bbbd168f69525f218fba Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Jul 2021 12:00:03 +0200 Subject: [PATCH 224/402] style --- packages/std/src/mock.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 4ea56fe8b..6452dab01 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -220,9 +220,9 @@ pub fn mock_info(sender: &str, funds: &[Coin]) -> MessageInfo { } } -#[cfg(feature = "stargate")] /// Creates an IbcChannel for testing. You set a few key parameters for handshaking, /// If you want to set more, use this as a default and mutate other fields +#[cfg(feature = "stargate")] fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcChannel { IbcChannel { endpoint: IbcEndpoint { @@ -239,8 +239,8 @@ fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcC } } -#[cfg(feature = "stargate")] /// Creates a IbcChannelOpenMsg::OpenInit for testing ibc_channel_open. +#[cfg(feature = "stargate")] pub fn mock_ibc_channel_open_init( my_channel_id: &str, order: IbcOrder, @@ -249,8 +249,8 @@ pub fn mock_ibc_channel_open_init( IbcChannelOpenMsg::new_init(mock_ibc_channel(my_channel_id, order, version)) } -#[cfg(feature = "stargate")] /// Creates a IbcChannelOpenMsg::OpenTry for testing ibc_channel_open. +#[cfg(feature = "stargate")] pub fn mock_ibc_channel_open_try( my_channel_id: &str, order: IbcOrder, @@ -259,8 +259,8 @@ pub fn mock_ibc_channel_open_try( IbcChannelOpenMsg::new_try(mock_ibc_channel(my_channel_id, order, version), version) } +/// Creates a IbcChannelConnectMsg::ConnectAck for testing ibc_channel_connect. #[cfg(feature = "stargate")] -/// Creates a IbcChannelConnectMsg for testing ibc_channel_connect. pub fn mock_ibc_channel_connect_ack( my_channel_id: &str, order: IbcOrder, @@ -269,8 +269,8 @@ pub fn mock_ibc_channel_connect_ack( IbcChannelConnectMsg::new_ack(mock_ibc_channel(my_channel_id, order, version), version) } +/// Creates a IbcChannelConnectMsg::ConnectConfirm for testing ibc_channel_connect. #[cfg(feature = "stargate")] -/// Creates a IbcChannelConnectMsg for testing ibc_channel_connect. pub fn mock_ibc_channel_connect_confirm( my_channel_id: &str, order: IbcOrder, @@ -279,8 +279,8 @@ pub fn mock_ibc_channel_connect_confirm( IbcChannelConnectMsg::new_confirm(mock_ibc_channel(my_channel_id, order, version)) } +/// Creates a IbcChannelCloseMsg::CloseInit for testing ibc_channel_close. #[cfg(feature = "stargate")] -/// Creates a IbcChannelCloseMsg for testing ibc_channel_close. pub fn mock_ibc_channel_close_init( my_channel_id: &str, order: IbcOrder, @@ -289,8 +289,8 @@ pub fn mock_ibc_channel_close_init( IbcChannelCloseMsg::new_init(mock_ibc_channel(my_channel_id, order, version)) } +/// Creates a IbcChannelCloseMsg::CloseConfirm for testing ibc_channel_close. #[cfg(feature = "stargate")] -/// Creates a IbcChannelCloseMsg for testing ibc_channel_close. pub fn mock_ibc_channel_close_confirm( my_channel_id: &str, order: IbcOrder, @@ -299,9 +299,9 @@ pub fn mock_ibc_channel_close_confirm( IbcChannelCloseMsg::new_confirm(mock_ibc_channel(my_channel_id, order, version)) } -#[cfg(feature = "stargate")] /// 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")] pub fn mock_ibc_packet_recv( my_channel_id: &str, data: &T, @@ -325,10 +325,10 @@ pub fn mock_ibc_packet_recv( })) } -#[cfg(feature = "stargate")] /// 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")] fn mock_ibc_packet(my_channel_id: &str, data: &T) -> StdResult { Ok(IbcPacket { data: to_binary(data)?, @@ -349,10 +349,10 @@ fn mock_ibc_packet(my_channel_id: &str, data: &T) -> StdResult( my_channel_id: &str, data: &T, @@ -366,10 +366,10 @@ pub fn mock_ibc_packet_ack( })) } -#[cfg(feature = "stargate")] /// Creates a IbcPacketTimeoutMsg for testing ibc_packet_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")] pub fn mock_ibc_packet_timeout( my_channel_id: &str, data: &T, From 71ead80ea46419712602ebd0fb90aed4bcac108d Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Jul 2021 12:13:31 +0200 Subject: [PATCH 225/402] Update vm test contracts --- packages/vm/testdata/ibc_reflect_0.16.wasm | Bin 269976 -> 282290 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/ibc_reflect_0.16.wasm b/packages/vm/testdata/ibc_reflect_0.16.wasm index d7fcf59ac076281811e7aadb36308579a5c70558..1822eb465fc5df13985eb0d9b589e3bb1ba1b212 100644 GIT binary patch delta 86041 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Ν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 CIA&o0 From c9d8088194176bce3bbf25227bd7c73208391a99 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Jul 2021 12:13:56 +0200 Subject: [PATCH 226/402] Update docs re IBC channel entrypoint changes --- CHANGELOG.md | 6 +++-- IBC.md | 4 +++- MIGRATING.md | 63 +++------------------------------------------------- 3 files changed, 10 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 290a06a47..b39a6c1e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,9 @@ and this project adheres to `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`, `mock_ibc_channel_connect`, `mock_ibc_channel_close`. + `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`. @@ -38,7 +40,7 @@ and this project adheres to 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` now returns an +- cosmwasm-std::testing: `mock_ibc_packet_recv` functions now return an `IbcPacketReceiveMsg`, `mock_ibc_packet_ack` requires an acknowledgement to be passed and returns an `IbcPacketAckMsg`. - cosmwasm-std: `IbcBasicResponse` and `IbcReceiveResponse` now both support diff --git a/IBC.md b/IBC.md index 79ecc85cd..b151890d9 100644 --- a/IBC.md +++ b/IBC.md @@ -133,7 +133,9 @@ pub struct IbcEndpoint { This `IbcChannel` value has to be wrapped in the `IbcChannelOpenMsg` type. ```rust -let msg = IbcChannelOpenMsg::new(channel); +let msg = IbcChannelOpenMsg::new_init(channel); +// or +let msg = IbcChannelOpenMsg::new_try(channel, counterparty_version); ``` Note that neither `counterparty_version` nor `counterparty_endpoint` is set in diff --git a/MIGRATING.md b/MIGRATING.md index ad7f025f9..85c20e081 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -55,7 +55,7 @@ major releases of `cosmwasm`. Note that you can also view the #[entry_point] - pub fn ibc_channel_open(_deps: DepsMut, _env: Env, channel: IbcChannel) -> StdResult<()> { + pub fn ibc_channel_open(_deps: DepsMut, _env: Env, msg: IbcChannelOpenMsg) -> StdResult<()> { - + let channel = msg.channel; + + let channel = msg.channel(); // do things } @@ -69,7 +69,7 @@ major releases of `cosmwasm`. Note that you can also view the - channel: IbcChannel, + msg: IbcChannelConnectMsg, ) -> StdResult { - + let channel = msg.channel; + + let channel = msg.channel(); // do things } @@ -83,7 +83,7 @@ major releases of `cosmwasm`. Note that you can also view the - channel: IbcChannel, + msg: IbcChannelCloseMsg, ) -> StdResult { - + let channel = msg.channel; + + let channel = msg.channel(); // do things } @@ -131,63 +131,6 @@ major releases of `cosmwasm`. Note that you can also view the } ``` -- IBC-related mocking functions have changed somewhat to accomodate creating the - new entry-point-specific `Msg` types, rather than just channels, packets and - acknowledgements. - - For the channel ones, we now have three distinct helpers. - - ```diff - - let wrong_order = mock_ibc_channel("channel-12", IbcOrder::Unordered, IBC_VERSION); - + let wrong_order = mock_ibc_channel_open("channel-12", IbcOrder::Unordered, IBC_VERSION); - ibc_channel_open(&mut deps, mock_env(), wrong_order).unwrap_err(); - ``` - - ```diff - - let handshake_connect = mock_ibc_channel(channel_id, IbcOrder::Ordered, IBC_VERSION); - + let handshake_connect = mock_ibc_channel_connect(channel_id, IbcOrder::Ordered, IBC_VERSION); - let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); - ``` - - ```diff - - let handshake_close = mock_ibc_channel(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); - + let handshake_close = mock_ibc_channel_close(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); - ibc_channel_close(deps, mock_env(), handshake_close).unwrap(); - ``` - - When testing against `ibc_packet_receive`, in most cases no change should be - necessary - `mock_ibc_packet_recv` now returns the `IbcPacketReceiveMsg`, - which is exactly what `ibc_packet_receive` now expects. - - ```rust - let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); - let res: IbcReceiveResponse = ibc_packet_receive(&mut deps, mock_env(), msg).unwrap(); - ``` - - `mock_ibc_packet_ack` is now only usable for `ibc_packet_ack` and requires an - `Acknowledgement`. It will internally construct an - `IbcAcknowledgementWithPacket` so that you no longer have to do it yourself. - - ```diff - - let ack = IbcAcknowledgementWithPacket { - - acknowledgement: IbcAcknowledgement::encode_json(&response).unwrap(), - - original_packet: mock_ibc_packet_ack(channel_id, &packet).unwrap(), - - }; - - let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), ack).unwrap(); - + let ack = IbcAcknowledgement::encode_json(&response).unwrap(); - + let msg = mock_ibc_packet_ack(channel_id, &packet, ack).unwrap(); - + let res: IbcBasicResponse = ibc_packet_ack(deps, mock_env(), msg).unwrap(); - ``` - - For `ibc_packet_timeout`, use the new `mock_ibc_packet_timeout` helper: - - ```diff - - let packet = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#)?; - - ibc_packet_timeout(deps, mock_env(), packet)?; - + let msg = mock_ibc_packet_timeout(CHANNEL_ID, br#"{}"#)?; - + ibc_packet_timeout(deps, mock_env(), msg)?; - ``` - ## 0.14 -> 0.15 - Update CosmWasm dependencies in Cargo.toml (skip the ones you don't use): From ed2f744e43cdbd6a250962a882e7ca72349bda16 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Jul 2021 13:39:32 +0200 Subject: [PATCH 227/402] Update docs --- CHANGELOG.md | 2 +- packages/std/src/ibc.rs | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b39a6c1e8..5567650cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to 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` functions now return an +- 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 diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 370d14c0e..b319dfff4 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -212,9 +212,9 @@ impl IbcAcknowledgement { /// The message that is passed into `ibc_channel_open` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub enum IbcChannelOpenMsg { - OpenInit { - channel: IbcChannel, - }, + /// The ChanOpenInit step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management + OpenInit { channel: IbcChannel }, + /// The ChanOpenTry step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management OpenTry { channel: IbcChannel, counterparty_version: String, @@ -263,13 +263,13 @@ impl From for IbcChannel { /// The message that is passed into `ibc_channel_connect` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub enum IbcChannelConnectMsg { + /// The ChanOpenAck step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management OpenAck { channel: IbcChannel, counterparty_version: String, }, - OpenConfirm { - channel: IbcChannel, - }, + /// The ChanOpenConfirm step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management + OpenConfirm { channel: IbcChannel }, } impl IbcChannelConnectMsg { @@ -314,7 +314,9 @@ impl From for IbcChannel { /// The message that is passed into `ibc_channel_close` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub enum IbcChannelCloseMsg { + /// The ChanCloseInit step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management CloseInit { channel: IbcChannel }, + /// The ChanCloseConfirm step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management CloseConfirm { channel: IbcChannel }, // pub channel: IbcChannel, } From 87b905f0b13c9c593ca70637e33b7be9ec6159c8 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 19 Jul 2021 14:39:15 +0200 Subject: [PATCH 228/402] Set version: 0.16.0-rc1 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 123b52a69..ad168b31a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index b947100e6..07c40480b 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -113,7 +113,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -124,14 +124,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -153,7 +153,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index d8190f57f..276915f15 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -115,7 +115,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -126,14 +126,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -141,7 +141,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -155,7 +155,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 67382a5d1..4cb9818c7 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 97b9a835f..a81123997 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index d31b5fde5..2c43e24d6 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index a3607f8d3..19d15eaec 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index e5f820053..fca1b6066 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index db832083c..11260eebf 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 17b256498..dfc354c7f 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 8f627aa99..d5b5beee9 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.16.0-rc1" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index dfc79c6b2..b95f34611 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.16.0-rc1" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 3f34b0bd3..7b487cb73 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.16.0-rc1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 8025161fa..ab895a0be 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.15.0" +version = "0.16.0-rc1" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.15.0" } +cosmwasm-derive = { path = "../derive", version = "0.16.0-rc1" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.15.0" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 3f5308dcb..6adad83b1 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.16.0-rc1" authors = ["Ethan Frey "] edition = "2018" 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 = "0.15.0", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.0-rc1", 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 a10d539f8..49008ec34 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.16.0-rc1" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.15.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.15.0" } +cosmwasm-std = { path = "../std", version = "0.16.0-rc1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 17693a6f45fd017d436319a4425062b60ac76eb7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Jul 2021 09:59:47 +0200 Subject: [PATCH 229/402] Update NOTICE file --- NOTICE | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NOTICE b/NOTICE index a46c2c16d..40383b7ff 100644 --- a/NOTICE +++ b/NOTICE @@ -1,6 +1,7 @@ Copyright 2019 Jehan Tremback -Copyright 2019-2020 Confio UO +Copyright 2019-2021 Confio OÃœ Copyright 2019-2020 Simon Warta +Copyright 2021 Confio GmbH Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 442c5d6828e910e410cd4294ee3ac934b83a68e3 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 20 Jul 2021 11:22:14 +0200 Subject: [PATCH 230/402] Export GovMsg --- CHANGELOG.md | 2 ++ packages/std/src/lib.rs | 2 ++ packages/std/src/results/mod.rs | 2 ++ 3 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e6eb2759..403b30a2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +- cosmwasm-std: Export `GovMsg` as a top-level type of the crate. + ## [0.15.0] - 2021-06-24 ### Added diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index bd3b18b0e..63ffbaa48 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -51,6 +51,8 @@ pub use crate::query::{ }; #[cfg(feature = "stargate")] pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; +#[cfg(feature = "stargate")] +pub use crate::results::GovMsg; pub use crate::results::{ attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgExecutionResponse, SystemResult, diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 6321503f7..77a4d8270 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -11,6 +11,8 @@ mod system_result; pub use attribute::{attr, Attribute}; pub use contract_result::ContractResult; +#[cfg(feature = "stargate")] +pub use cosmos_msg::GovMsg; pub use cosmos_msg::{wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, WasmMsg}; #[cfg(feature = "staking")] pub use cosmos_msg::{DistributionMsg, StakingMsg}; From 63905b1d40b03fc84fa54f06aa1e332a0636be35 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 20 Jul 2021 12:09:15 +0200 Subject: [PATCH 231/402] Make IBC Msg types serialize as snake case --- packages/std/src/ibc.rs | 3 +++ packages/vm/testdata/ibc_reflect_0.16.wasm | Bin 282290 -> 282305 bytes 2 files changed, 3 insertions(+) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index b319dfff4..a4382eb4b 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -211,6 +211,7 @@ impl IbcAcknowledgement { /// The message that is passed into `ibc_channel_open` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] pub enum IbcChannelOpenMsg { /// The ChanOpenInit step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management OpenInit { channel: IbcChannel }, @@ -262,6 +263,7 @@ impl From for IbcChannel { /// The message that is passed into `ibc_channel_connect` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] pub enum IbcChannelConnectMsg { /// The ChanOpenAck step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management OpenAck { @@ -313,6 +315,7 @@ impl From for IbcChannel { /// The message that is passed into `ibc_channel_close` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] pub enum IbcChannelCloseMsg { /// The ChanCloseInit step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management CloseInit { channel: IbcChannel }, diff --git a/packages/vm/testdata/ibc_reflect_0.16.wasm b/packages/vm/testdata/ibc_reflect_0.16.wasm index 1822eb465fc5df13985eb0d9b589e3bb1ba1b212..7c0ed2917639c7f3115a2b9ad3a2db7d0dec9948 100644 GIT binary patch delta 10929 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 g^M71j82$98AHK) Date: Tue, 20 Jul 2021 12:14:01 +0200 Subject: [PATCH 232/402] CHANGELOG update --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 403b30a2b..438fede34 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). -## [Unreleased] +## [0.15.1] - 2021-07-20 + +### Fixed - cosmwasm-std: Export `GovMsg` as a top-level type of the crate. @@ -985,7 +987,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.0...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.1...HEAD +[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 From 44010d7670f97fafa77cdcfec49de132c44f7f7a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 20 Jul 2021 13:19:53 +0200 Subject: [PATCH 233/402] Set version: 0.15.1 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a199615de..6a5fc7e66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -186,7 +186,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "criterion", @@ -206,7 +206,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "syn", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "chrono", @@ -240,7 +240,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 82fd171a4..d44ec15e2 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -122,7 +122,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -133,14 +133,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -162,7 +162,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index cdde06684..a552df055 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -124,7 +124,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -135,14 +135,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -164,7 +164,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -172,7 +172,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index edc543786..d00cd7d3d 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -100,7 +100,7 @@ checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a17e182a7..2b594e6bd 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 6f5502fad..a61a0d013 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 51268ca57..cad9a5cdc 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 3de10e960..ec9234771 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 72db8bd6d..52c43cc30 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index c4660f3f9..87b55f9cf 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 76f63816c..27160bbc3 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.15.0" +version = "0.15.1" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index dfc79c6b2..4afda0e3d 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.15.0" +version = "0.15.1" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 3f34b0bd3..b0ad5b996 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.15.0" +version = "0.15.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 5202270d4..414bf03b5 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.15.0" +version = "0.15.1" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.15.0" } +cosmwasm-derive = { path = "../derive", version = "0.15.1" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.15.0" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 0d79f2c96..b4fbe970c 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.15.0" +version = "0.15.1" authors = ["Ethan Frey "] edition = "2018" description = "CosmWasm library with useful helpers for Storage patterns" @@ -15,5 +15,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 = "0.15.0" } +cosmwasm-std = { path = "../std", version = "0.15.1" } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 4edcc58af..34207d024 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.15.0" +version = "0.15.1" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.15.0" } -cosmwasm-crypto = { path = "../crypto", version = "0.15.0" } +cosmwasm-std = { path = "../std", version = "0.15.1" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 68c6aec29fc3c07de408c440d9836698cd930d32 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 20 Jul 2021 14:45:39 +0200 Subject: [PATCH 234/402] Set version: 0.16.0-rc2 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad168b31a..bffc952e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 07c40480b..7a7fdacbc 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -113,7 +113,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -124,14 +124,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -153,7 +153,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 276915f15..c2c8a6904 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -115,7 +115,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -126,14 +126,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -141,7 +141,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -155,7 +155,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -163,7 +163,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 4cb9818c7..9d1f36b38 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index a81123997..f8d6774a2 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 2c43e24d6..037937a66 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 19d15eaec..d74f3f5ce 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index fca1b6066..80af2e541 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 11260eebf..6f4a2b96f 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index dfc354c7f..1b2281ab5 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -102,7 +102,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index d5b5beee9..0054f8c5d 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.0-rc1" +version = "0.16.0-rc2" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index b95f34611..a3cc2c886 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.0-rc1" +version = "0.16.0-rc2" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 7b487cb73..95fc3ea95 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.0-rc1" +version = "0.16.0-rc2" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index ab895a0be..82e0f9dcc 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.0-rc1" +version = "0.16.0-rc2" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.0-rc1" } +cosmwasm-derive = { path = "../derive", version = "0.16.0-rc2" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc1" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc2" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 6adad83b1..11bbfe16b 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.0-rc1" +version = "0.16.0-rc2" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.0-rc1", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.0-rc2", 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 49008ec34..bebfb0344 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.0-rc1" +version = "0.16.0-rc2" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.0-rc1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc1" } +cosmwasm-std = { path = "../std", version = "0.16.0-rc2", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc2" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 715158363afcc5c28b453f8048a7d86e2bd6c54f Mon Sep 17 00:00:00 2001 From: Giancarlos Salas Date: Tue, 20 Jul 2021 12:20:08 -0500 Subject: [PATCH 235/402] Export VoteOption --- packages/std/src/lib.rs | 2 +- packages/std/src/results/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 63ffbaa48..e592d0330 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -52,7 +52,7 @@ pub use crate::query::{ #[cfg(feature = "stargate")] pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; #[cfg(feature = "stargate")] -pub use crate::results::GovMsg; +pub use crate::results::{GovMsg, VoteOption}; pub use crate::results::{ attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgExecutionResponse, SystemResult, diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index 77a4d8270..eb1b841a4 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -12,7 +12,7 @@ mod system_result; pub use attribute::{attr, Attribute}; pub use contract_result::ContractResult; #[cfg(feature = "stargate")] -pub use cosmos_msg::GovMsg; +pub use cosmos_msg::{GovMsg, VoteOption}; pub use cosmos_msg::{wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, WasmMsg}; #[cfg(feature = "staking")] pub use cosmos_msg::{DistributionMsg, StakingMsg}; From 6ba2262ceac597c946926415efa159329ddb5c50 Mon Sep 17 00:00:00 2001 From: Giancarlos Salas Date: Tue, 20 Jul 2021 12:38:41 -0500 Subject: [PATCH 236/402] Run format on std --- packages/std/src/lib.rs | 4 ++-- packages/std/src/results/mod.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index e592d0330..6fa2eead4 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -51,8 +51,6 @@ pub use crate::query::{ }; #[cfg(feature = "stargate")] pub use crate::query::{ChannelResponse, IbcQuery, ListChannelsResponse, PortIdResponse}; -#[cfg(feature = "stargate")] -pub use crate::results::{GovMsg, VoteOption}; pub use crate::results::{ attr, wasm_execute, wasm_instantiate, Attribute, BankMsg, ContractResult, CosmosMsg, Empty, Event, QueryResponse, Reply, ReplyOn, Response, SubMsg, SubMsgExecutionResponse, SystemResult, @@ -60,6 +58,8 @@ pub use crate::results::{ }; #[cfg(feature = "staking")] 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::storage::MemoryStorage; pub use crate::timestamp::Timestamp; diff --git a/packages/std/src/results/mod.rs b/packages/std/src/results/mod.rs index eb1b841a4..c165b101f 100644 --- a/packages/std/src/results/mod.rs +++ b/packages/std/src/results/mod.rs @@ -11,11 +11,11 @@ mod system_result; pub use attribute::{attr, Attribute}; pub use contract_result::ContractResult; -#[cfg(feature = "stargate")] -pub use cosmos_msg::{GovMsg, VoteOption}; pub use cosmos_msg::{wasm_execute, wasm_instantiate, BankMsg, CosmosMsg, WasmMsg}; #[cfg(feature = "staking")] pub use cosmos_msg::{DistributionMsg, StakingMsg}; +#[cfg(feature = "stargate")] +pub use cosmos_msg::{GovMsg, VoteOption}; pub use empty::Empty; pub use query::QueryResponse; pub use response::Response; From 82029015b139ad499a0edc25a52270d228274c48 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 21 Jul 2021 07:34:30 +0200 Subject: [PATCH 237/402] Builder-esque pattern for Response --- contracts/floaty/src/contract.rs | 23 +++++----- packages/std/src/results/events.rs | 6 +++ packages/std/src/results/response.rs | 63 +++++++++++++++++----------- 3 files changed, 56 insertions(+), 36 deletions(-) diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index f474a3596..44c0bab19 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -28,8 +28,7 @@ pub fn instantiate( ); // This adds some unrelated event attribute for testing purposes - let mut resp = Response::new(); - resp.add_attribute("Let the", "hacking begin"); + let resp = Response::new().with_attribute(("Let the", "hacking begin")); Ok(resp) } @@ -53,16 +52,16 @@ pub fn execute( let mut fl = balance[0].amount.u128() as f64; fl *= 0.3; - let mut resp = Response::new(); - resp.add_attribute("action", "release"); - resp.add_attribute("destination", to_addr.clone()); - resp.add_attribute("foo", fl.to_string()); - resp.add_event(Event::new("hackatom").attr("action", "release")); - resp.add_message(BankMsg::Send { - to_address: to_addr.into(), - amount: balance, - }); - resp.set_data(&[0xF0, 0x0B, 0xAA]); + let resp = Response::new() + .with_attribute(("action", "release")) + .with_attribute(("destination", to_addr.clone())) + .with_attribute(("foo", fl.to_string())) + .with_event(Event::new("hackatom").attr("action", "release")) + .with_message(BankMsg::Send { + to_address: to_addr.into(), + amount: balance, + }) + .with_data(&[0xF0, 0x0B, 0xAA]); Ok(resp) } else { Err(HackError::Unauthorized {}) diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 31a2e4d82..3eb0b270b 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -62,6 +62,12 @@ impl Attribute { } } +impl, V: Into> From<(K, V)> for Attribute { + fn from((k, v): (K, V)) -> Self { + Attribute::new(k, v) + } +} + /// Creates a new Attribute. `Attribute::new` is an alias for this. #[inline] pub fn attr(key: impl Into, value: impl Into) -> Attribute { diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 48784ac08..217fb5d19 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -39,7 +39,7 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// } /// ``` /// -/// Mutating: +/// Builder-esque: /// /// ``` /// # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; @@ -54,17 +54,14 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// info: MessageInfo, /// msg: InstantiateMsg, /// ) -> Result { -/// let mut response = Response::new(); -/// // ... -/// response.add_attribute("Let the", "hacking begin"); -/// // ... -/// response.add_message(BankMsg::Send { -/// to_address: String::from("recipient"), -/// amount: coins(128, "uint"), -/// }); -/// response.add_attribute("foo", "bar"); -/// // ... -/// response.set_data(Binary::from(b"the result data")); +/// let response = Response::new() +/// .with_attribute(("Let the", "hacking begin")) +/// .with_message(BankMsg::Send { +/// to_address: String::from("recipient"), +/// amount: coins(128, "uint"), +/// }) +/// .with_attribute(("foo", "bar")) +/// .with_data(b"the result data" ); /// Ok(response) /// } /// ``` @@ -107,24 +104,24 @@ where Self::default() } - /// Add an attribute included in the main `wasm` event. - pub fn add_attribute, V: Into>(&mut self, key: K, value: V) { - self.attributes.push(Attribute { - key: key.into(), - value: value.into(), - }); - } - /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, /// and adds it to the list of messages to process. - pub fn add_message>>(&mut self, msg: U) { + pub fn with_message(mut self, msg: impl Into>) -> Self { self.messages.push(SubMsg::new(msg)); + self + } + + /// Add an attribute included in the main `wasm` event. + pub fn with_attribute(mut self, attr: impl Into) -> Self { + self.attributes.push(attr.into()); + self } /// This takes an explicit SubMsg (creates via eg. `reply_on_error`) /// and adds it to the list of messages to process. - pub fn add_submessage(&mut self, msg: SubMsg) { + pub fn with_submessage(mut self, msg: SubMsg) -> Self { self.messages.push(msg); + self } /// Adds an extra event to the response, separate from the main `wasm` event @@ -132,12 +129,30 @@ where /// /// The `wasm-` prefix will be appended by the runtime to the provided type /// of event. - pub fn add_event(&mut self, event: Event) { + pub fn with_event(mut self, event: Event) -> Self { self.events.push(event); + self } - pub fn set_data>(&mut self, data: U) { + pub fn with_data(mut self, data: impl Into) -> Self { self.data = Some(data.into()); + self + } + + pub fn messages(&self) -> impl Iterator> { + self.messages.iter() + } + + pub fn attributes(&self) -> impl Iterator { + self.attributes.iter() + } + + pub fn events(&self) -> impl Iterator { + self.events.iter() + } + + pub fn data(&self) -> Option<&Binary> { + self.data.as_ref() } } From d13b440e8e93111ad1b9720f127b770c669fa719 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 21 Jul 2021 08:30:37 +0200 Subject: [PATCH 238/402] Revert "Builder-esque pattern for Response" (oops) This reverts commit 82029015b139ad499a0edc25a52270d228274c48. --- contracts/floaty/src/contract.rs | 23 +++++----- packages/std/src/results/events.rs | 6 --- packages/std/src/results/response.rs | 63 +++++++++++----------------- 3 files changed, 36 insertions(+), 56 deletions(-) diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 44c0bab19..f474a3596 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -28,7 +28,8 @@ pub fn instantiate( ); // This adds some unrelated event attribute for testing purposes - let resp = Response::new().with_attribute(("Let the", "hacking begin")); + let mut resp = Response::new(); + resp.add_attribute("Let the", "hacking begin"); Ok(resp) } @@ -52,16 +53,16 @@ pub fn execute( let mut fl = balance[0].amount.u128() as f64; fl *= 0.3; - let resp = Response::new() - .with_attribute(("action", "release")) - .with_attribute(("destination", to_addr.clone())) - .with_attribute(("foo", fl.to_string())) - .with_event(Event::new("hackatom").attr("action", "release")) - .with_message(BankMsg::Send { - to_address: to_addr.into(), - amount: balance, - }) - .with_data(&[0xF0, 0x0B, 0xAA]); + let mut resp = Response::new(); + resp.add_attribute("action", "release"); + resp.add_attribute("destination", to_addr.clone()); + resp.add_attribute("foo", fl.to_string()); + resp.add_event(Event::new("hackatom").attr("action", "release")); + resp.add_message(BankMsg::Send { + to_address: to_addr.into(), + amount: balance, + }); + resp.set_data(&[0xF0, 0x0B, 0xAA]); Ok(resp) } else { Err(HackError::Unauthorized {}) diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 3eb0b270b..31a2e4d82 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -62,12 +62,6 @@ impl Attribute { } } -impl, V: Into> From<(K, V)> for Attribute { - fn from((k, v): (K, V)) -> Self { - Attribute::new(k, v) - } -} - /// Creates a new Attribute. `Attribute::new` is an alias for this. #[inline] pub fn attr(key: impl Into, value: impl Into) -> Attribute { diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 217fb5d19..48784ac08 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -39,7 +39,7 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// } /// ``` /// -/// Builder-esque: +/// Mutating: /// /// ``` /// # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; @@ -54,14 +54,17 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// info: MessageInfo, /// msg: InstantiateMsg, /// ) -> Result { -/// let response = Response::new() -/// .with_attribute(("Let the", "hacking begin")) -/// .with_message(BankMsg::Send { -/// to_address: String::from("recipient"), -/// amount: coins(128, "uint"), -/// }) -/// .with_attribute(("foo", "bar")) -/// .with_data(b"the result data" ); +/// let mut response = Response::new(); +/// // ... +/// response.add_attribute("Let the", "hacking begin"); +/// // ... +/// response.add_message(BankMsg::Send { +/// to_address: String::from("recipient"), +/// amount: coins(128, "uint"), +/// }); +/// response.add_attribute("foo", "bar"); +/// // ... +/// response.set_data(Binary::from(b"the result data")); /// Ok(response) /// } /// ``` @@ -104,24 +107,24 @@ where Self::default() } + /// Add an attribute included in the main `wasm` event. + pub fn add_attribute, V: Into>(&mut self, key: K, value: V) { + self.attributes.push(Attribute { + key: key.into(), + value: value.into(), + }); + } + /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, /// and adds it to the list of messages to process. - pub fn with_message(mut self, msg: impl Into>) -> Self { + pub fn add_message>>(&mut self, msg: U) { self.messages.push(SubMsg::new(msg)); - self - } - - /// Add an attribute included in the main `wasm` event. - pub fn with_attribute(mut self, attr: impl Into) -> Self { - self.attributes.push(attr.into()); - self } /// This takes an explicit SubMsg (creates via eg. `reply_on_error`) /// and adds it to the list of messages to process. - pub fn with_submessage(mut self, msg: SubMsg) -> Self { + pub fn add_submessage(&mut self, msg: SubMsg) { self.messages.push(msg); - self } /// Adds an extra event to the response, separate from the main `wasm` event @@ -129,30 +132,12 @@ where /// /// The `wasm-` prefix will be appended by the runtime to the provided type /// of event. - pub fn with_event(mut self, event: Event) -> Self { + pub fn add_event(&mut self, event: Event) { self.events.push(event); - self } - pub fn with_data(mut self, data: impl Into) -> Self { + pub fn set_data>(&mut self, data: U) { self.data = Some(data.into()); - self - } - - pub fn messages(&self) -> impl Iterator> { - self.messages.iter() - } - - pub fn attributes(&self) -> impl Iterator { - self.attributes.iter() - } - - pub fn events(&self) -> impl Iterator { - self.events.iter() - } - - pub fn data(&self) -> Option<&Binary> { - self.data.as_ref() } } From 15b4e804bdad531371c1301d0e261090cb998d62 Mon Sep 17 00:00:00 2001 From: Giancarlos Salas Date: Wed, 21 Jul 2021 10:24:47 -0500 Subject: [PATCH 239/402] CHANGELOG update --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 438fede34..2a617c71b 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). +## [Unreleased] + +### Fixed + +- cosmwasm-std: Export `VoteOption` as a top-level type. + ## [0.15.1] - 2021-07-20 ### Fixed From 924ebe87ecd707853d09af951d363b92b5c622fe Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 21 Jul 2021 19:06:29 +0200 Subject: [PATCH 240/402] Set version: 0.15.2 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6a5fc7e66..5f8bb5ad1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -186,7 +186,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "criterion", @@ -206,7 +206,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "syn", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "chrono", @@ -240,7 +240,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index d44ec15e2..4a0f6a2b1 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -122,7 +122,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -133,14 +133,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -162,7 +162,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index a552df055..ff0ac59a9 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -124,7 +124,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -135,14 +135,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -164,7 +164,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -172,7 +172,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index d00cd7d3d..1341ad6d3 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -100,7 +100,7 @@ checksum = "9f6b64db6932c7e49332728e3a6bd82c6b7e16016607d20923b537c3bc4c0d5f" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 2b594e6bd..b7167c09e 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index a61a0d013..ea270a24b 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index cad9a5cdc..9987e009e 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index ec9234771..723da8de7 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 52c43cc30..d607e138f 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 87b55f9cf..25632bdd8 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -111,7 +111,7 @@ checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" [[package]] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" dependencies = [ "digest", "ed25519-zebra", @@ -122,14 +122,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" dependencies = [ "schemars", "serde_json", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" dependencies = [ "cosmwasm-std", "serde", @@ -159,7 +159,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 27160bbc3..fa24e4340 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.15.1" +version = "0.15.2" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 4afda0e3d..42e609cdf 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.15.1" +version = "0.15.2" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index b0ad5b996..59bdba718 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.15.1" +version = "0.15.2" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 414bf03b5..8712d7e7f 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.15.1" +version = "0.15.2" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.15.1" } +cosmwasm-derive = { path = "../derive", version = "0.15.2" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.15.1" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.2" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index b4fbe970c..68e5b7deb 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.15.1" +version = "0.15.2" authors = ["Ethan Frey "] edition = "2018" description = "CosmWasm library with useful helpers for Storage patterns" @@ -15,5 +15,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 = "0.15.1" } +cosmwasm-std = { path = "../std", version = "0.15.2" } serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 34207d024..04c45dc70 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.15.1" +version = "0.15.2" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.15.1" } -cosmwasm-crypto = { path = "../crypto", version = "0.15.1" } +cosmwasm-std = { path = "../std", version = "0.15.2" } +cosmwasm-crypto = { path = "../crypto", version = "0.15.2" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 92be20d4b6db9dede677ab2dc72e344da8bb9057 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 21 Jul 2021 19:08:30 +0200 Subject: [PATCH 241/402] CHANGELOG update - 0.15.2 --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a617c71b..d42bf4f6c 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] +## [0.15.2] - 2021-07-21 ### Fixed @@ -993,7 +993,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.1...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.2...HEAD +[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 From a4752c20a200bc88368bbb9c4b5dd9705b7bcf59 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 21 Jul 2021 20:36:16 +0200 Subject: [PATCH 242/402] Fix CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb90e0096..09d345d20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ and this project adheres to - 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 From f86a62a46873c782d4ba4a0d3a865e21212c898d Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 21 Jul 2021 21:06:16 +0200 Subject: [PATCH 243/402] Set version: 0.16.0-rc3 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bffc952e3..32b09ee04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 74fc759ab..d111bedad 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -100,7 +100,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index dc7c0a44b..f3b8b0aeb 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -102,7 +102,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index a1a3bfdef..bd4dccdc1 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index b8d7f0ddf..656a1e32f 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 03e9d41a4..8cbee73f9 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 4d43c6197..65b48e433 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index d4d823b1e..21bd8246b 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index b209b49e0..f7435eaeb 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 644bbd7cb..e6a51ed78 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 0054f8c5d..5ae45c67f 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.0-rc2" +version = "0.16.0-rc3" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index a3cc2c886..6a211d649 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.0-rc2" +version = "0.16.0-rc3" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 95fc3ea95..da0488a7f 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.0-rc2" +version = "0.16.0-rc3" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 82e0f9dcc..568dd7c50 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.0-rc2" +version = "0.16.0-rc3" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.0-rc2" } +cosmwasm-derive = { path = "../derive", version = "0.16.0-rc3" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc2" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc3" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 11bbfe16b..0a972f17a 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.0-rc2" +version = "0.16.0-rc3" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.0-rc2", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.0-rc3", 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 bebfb0344..e76cb12da 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.0-rc2" +version = "0.16.0-rc3" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.0-rc2", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc2" } +cosmwasm-std = { path = "../std", version = "0.16.0-rc3", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc3" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 839feab5b4471b3b0872b1ce17be1daaecf01e6f Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 10:37:35 +0200 Subject: [PATCH 244/402] Use _contract_address rather than contract_address --- contracts/ibc-reflect/src/contract.rs | 12 ++++++++---- contracts/ibc-reflect/tests/integration.rs | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 86fc498ec..745f5033e 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -55,7 +55,7 @@ fn parse_contract_from_event(events: Vec) -> Option { .and_then(|ev| { ev.attributes .into_iter() - .find(|a| a.key == "contract_address") + .find(|a| a.key == "_contract_address") }) .map(|a| a.value) } @@ -72,7 +72,7 @@ pub fn handle_init_callback( let contract_addr = match parse_contract_from_event(response.events) { Some(addr) => deps.api.addr_validate(&addr), None => Err(StdError::generic_err( - "No contract_address found in callback events", + "No _contract_address found in callback events", )), }?; @@ -365,7 +365,7 @@ mod tests { mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_recv, mock_info, MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, }; - use cosmwasm_std::{coin, coins, from_slice, BankMsg, OwnedDeps, WasmMsg}; + use cosmwasm_std::{coin, coins, from_slice, Attribute, BankMsg, OwnedDeps, WasmMsg}; const CREATOR: &str = "creator"; // code id of the reflect contract @@ -391,7 +391,11 @@ mod tests { attr("module", "wasm"), attr("signer", MOCK_CONTRACT_ADDR), attr("code_id", "17"), - attr("contract_address", reflect_addr), + // We have to force this one to avoid the debug assertion against _ + Attribute { + key: "_contract_address".to_string(), + value: reflect_addr.to_string(), + }, ], }; vec![event] diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 6cb1cbc3e..d9060bf7d 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -22,7 +22,7 @@ use cosmwasm_std::testing::{ mock_ibc_packet_recv, }; use cosmwasm_std::{ - attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, + attr, coins, Attribute, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, WasmMsg, }; use cosmwasm_vm::testing::{ @@ -66,7 +66,11 @@ fn fake_events(reflect_addr: &str) -> Vec { attr("module", "wasm"), attr("signer", MOCK_CONTRACT_ADDR), attr("code_id", "17"), - attr("contract_address", reflect_addr), + // We have to force this one to avoid the debug assertion against _ + Attribute { + key: "_contract_address".to_string(), + value: reflect_addr.to_string(), + }, ], }; vec![event] From 7e9f00bb954f3842b5d76e9f14a2321417561d18 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 11:10:31 +0200 Subject: [PATCH 245/402] Rebuild vm test contracts --- packages/vm/README.md | 4 ++-- packages/vm/testdata/hackatom_0.16.wasm | Bin 177717 -> 177773 bytes packages/vm/testdata/ibc_reflect_0.16.wasm | Bin 282305 -> 282305 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vm/README.md b/packages/vm/README.md index 6a380e73f..b987806b3 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -53,13 +53,13 @@ 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.11.4 ./contracts/hackatom \ - && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_0.15.wasm + && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_0.16.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.11.4 ./contracts/ibc-reflect \ - && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_0.15.wasm + && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_0.16.wasm docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_floaty",target=/code/contracts/floaty/target \ diff --git a/packages/vm/testdata/hackatom_0.16.wasm b/packages/vm/testdata/hackatom_0.16.wasm index ac187e227f72a117b7096947166201eaf8beb01a..1787fc84a6a429a9b1ba4d82b16fd2490a6b6096 100644 GIT binary patch delta 15741 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 diff --git a/packages/vm/testdata/ibc_reflect_0.16.wasm b/packages/vm/testdata/ibc_reflect_0.16.wasm index 7c0ed2917639c7f3115a2b9ad3a2db7d0dec9948..b9ae0dc4000e0132a1816db9fe0bbe62d1d56c2a 100644 GIT binary patch delta 4812 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 delta 4786 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 wvd)M9Bl%xPJwxR`;3I#rI8-k5hdx3dE$ Date: Thu, 22 Jul 2021 11:13:50 +0200 Subject: [PATCH 246/402] Update event attributes for test (_contract_address) --- packages/vm/src/calls.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index cb1bf58cd..6d2f54c54 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -722,7 +722,10 @@ mod tests { let id = res.messages[0].id; let event = Event { ty: "message".into(), - attributes: vec![attr("contract_address", account)], + attributes: vec![Attribute { + key: "_contract_address".to_string(), + value: account.into(), + }], }; // which creates a reflect account. here we get the callback let response = Reply { From a7273d21ef2e6f5d30e05701f02d5c986a67822e Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 11:31:45 +0200 Subject: [PATCH 247/402] Fix compiler errors --- packages/vm/src/calls.rs | 2 +- packages/vm/src/environment.rs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 6d2f54c54..801c3762a 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -683,7 +683,7 @@ mod tests { mock_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, }; use cosmwasm_std::{ - attr, Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, + Attribute, Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, SubMsgExecutionResponse, }; static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index ccefc5f1b..b6882f2c5 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -718,6 +718,7 @@ mod tests { function_name, expected, actual, + .. } => { assert_eq!(function_name, "allocate"); assert_eq!(expected, 0); @@ -752,6 +753,7 @@ mod tests { function_name, expected, actual, + .. } => { assert_eq!(function_name, "deallocate"); assert_eq!(expected, 1); From 207b0ac6b5431e436550df545858315b8c6fd5c6 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 11:42:47 +0200 Subject: [PATCH 248/402] Add mock_wasmd_attr helper --- contracts/ibc-reflect/src/contract.rs | 9 +++------ contracts/ibc-reflect/tests/integration.rs | 9 +++------ packages/std/src/lib.rs | 4 ++-- packages/std/src/mock.rs | 10 ++++++++++ packages/vm/src/calls.rs | 13 ++++++------- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 745f5033e..d4ef8d8e8 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -363,9 +363,9 @@ mod tests { use cosmwasm_std::testing::{ mock_dependencies, mock_env, mock_ibc_channel_close_init, mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_recv, mock_info, - MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, + mock_wasmd_attr, MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, }; - use cosmwasm_std::{coin, coins, from_slice, Attribute, BankMsg, OwnedDeps, WasmMsg}; + use cosmwasm_std::{coin, coins, from_slice, BankMsg, OwnedDeps, WasmMsg}; const CREATOR: &str = "creator"; // code id of the reflect contract @@ -392,10 +392,7 @@ mod tests { attr("signer", MOCK_CONTRACT_ADDR), attr("code_id", "17"), // We have to force this one to avoid the debug assertion against _ - Attribute { - key: "_contract_address".to_string(), - value: reflect_addr.to_string(), - }, + mock_wasmd_attr("_contract_address", reflect_addr), ], }; vec![event] diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index d9060bf7d..2c0ce89e5 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -19,10 +19,10 @@ use cosmwasm_std::testing::{ mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, mock_ibc_channel_open_try, - mock_ibc_packet_recv, + mock_ibc_packet_recv, mock_wasmd_attr, }; use cosmwasm_std::{ - attr, coins, Attribute, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, + attr, coins, BankMsg, ContractResult, CosmosMsg, Event, IbcBasicResponse, IbcOrder, IbcReceiveResponse, Reply, Response, SubMsgExecutionResponse, WasmMsg, }; use cosmwasm_vm::testing::{ @@ -67,10 +67,7 @@ fn fake_events(reflect_addr: &str) -> Vec { attr("signer", MOCK_CONTRACT_ADDR), attr("code_id", "17"), // We have to force this one to avoid the debug assertion against _ - Attribute { - key: "_contract_address".to_string(), - value: reflect_addr.to_string(), - }, + mock_wasmd_attr("_contract_address", reflect_addr), ], }; vec![event] diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index d62a9d45c..0acc5a027 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -101,8 +101,8 @@ pub mod testing { pub use crate::mock::StakingQuerier; pub use crate::mock::{ digit_sum, mock_dependencies, mock_dependencies_with_balances, mock_env, mock_info, - riffle_shuffle, BankQuerier, MockApi, MockQuerier, MockQuerierCustomHandlerResult, - MockStorage, MOCK_CONTRACT_ADDR, + mock_wasmd_attr, riffle_shuffle, BankQuerier, MockApi, MockQuerier, + MockQuerierCustomHandlerResult, MockStorage, MOCK_CONTRACT_ADDR, }; #[cfg(feature = "stargate")] pub use crate::mock::{ diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 6452dab01..7a574dd20 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -28,6 +28,7 @@ use crate::storage::MemoryStorage; use crate::timestamp::Timestamp; use crate::traits::{Api, Querier, QuerierResult}; use crate::types::{BlockInfo, ContractInfo, Env, MessageInfo}; +use crate::Attribute; pub const MOCK_CONTRACT_ADDR: &str = "cosmos2contract"; @@ -672,6 +673,15 @@ 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 { + Attribute { + key: key.into(), + value: value.into(), + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 801c3762a..b37abe407 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -680,11 +680,10 @@ mod tests { }; 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_ibc_packet_ack, mock_ibc_packet_recv, mock_ibc_packet_timeout, mock_wasmd_attr, }; use cosmwasm_std::{ - Attribute, Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, - SubMsgExecutionResponse, + Empty, Event, IbcAcknowledgement, IbcOrder, Reply, ReplyOn, SubMsgExecutionResponse, }; static CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); const IBC_VERSION: &str = "ibc-reflect-v1"; @@ -722,10 +721,10 @@ mod tests { let id = res.messages[0].id; let event = Event { ty: "message".into(), - attributes: vec![Attribute { - key: "_contract_address".to_string(), - value: account.into(), - }], + attributes: vec![ + // We have to force this one to avoid the debug assertion against _ + mock_wasmd_attr("_contract_address", account), + ], }; // which creates a reflect account. here we get the callback let response = Reply { From 2b01441f65a03ebd41af5258ac15b92eeabd50af Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 11:20:03 +0200 Subject: [PATCH 249/402] cosmwasm-std: Rename IbcAcknowledgementWithPacket -> IbcPacketAckMsg --- packages/std/src/ibc.rs | 16 +++++++--------- packages/std/src/lib.rs | 7 +++---- packages/std/src/mock.rs | 11 ++++------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index a4382eb4b..8771c73ee 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -184,12 +184,6 @@ pub struct IbcPacket { pub timeout: IbcTimeout, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct IbcAcknowledgementWithPacket { - pub acknowledgement: IbcAcknowledgement, - pub original_packet: IbcPacket, -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct IbcAcknowledgement { pub data: Binary, @@ -364,12 +358,16 @@ impl IbcPacketReceiveMsg { /// The message that is passed into `ibc_packet_ack` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct IbcPacketAckMsg { - pub ack: IbcAcknowledgementWithPacket, + pub acknowledgement: IbcAcknowledgement, + pub original_packet: IbcPacket, } impl IbcPacketAckMsg { - pub fn new(ack: IbcAcknowledgementWithPacket) -> Self { - Self { ack } + pub fn new(acknowledgement: IbcAcknowledgement, original_packet: IbcPacket) -> Self { + Self { + acknowledgement, + original_packet, + } } } diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 0acc5a027..b9cb3b7dc 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -34,10 +34,9 @@ pub use crate::errors::{ }; #[cfg(feature = "stargate")] pub use crate::ibc::{ - IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcBasicResponse, IbcChannel, - IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcMsg, IbcOrder, - IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, - IbcTimeout, IbcTimeoutBlock, + IbcAcknowledgement, IbcBasicResponse, IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcEndpoint, IbcMsg, IbcOrder, IbcPacket, IbcPacketAckMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, IbcTimeout, IbcTimeoutBlock, }; #[cfg(feature = "iterator")] #[allow(deprecated)] diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 7a574dd20..1688e001b 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -10,9 +10,9 @@ use crate::deps::OwnedDeps; use crate::errors::{RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError}; #[cfg(feature = "stargate")] use crate::ibc::{ - IbcAcknowledgement, IbcAcknowledgementWithPacket, IbcChannel, IbcChannelCloseMsg, - IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcOrder, IbcPacket, IbcPacketAckMsg, - IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcTimeoutBlock, + IbcAcknowledgement, IbcChannel, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, + IbcEndpoint, IbcOrder, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, + IbcTimeoutBlock, }; use crate::query::{ AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery, @@ -361,10 +361,7 @@ pub fn mock_ibc_packet_ack( ) -> StdResult { let packet = mock_ibc_packet(my_channel_id, data)?; - Ok(IbcPacketAckMsg::new(IbcAcknowledgementWithPacket { - acknowledgement: ack, - original_packet: packet, - })) + Ok(IbcPacketAckMsg::new(ack, packet)) } /// Creates a IbcPacketTimeoutMsg for testing ibc_packet_timeout. You set a few key parameters that are From 91e7a1633bcdc4c6dc93e37a2f2d50d5870e388e Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 11:26:36 +0200 Subject: [PATCH 250/402] Update ibc-reflect-send contract --- contracts/ibc-reflect-send/src/ibc.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index c6354e364..3ca963dbc 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -116,22 +116,21 @@ pub fn ibc_packet_ack( env: Env, msg: IbcPacketAckMsg, ) -> StdResult { - let ack = msg.ack; // which local channel was this packet send from - let caller = ack.original_packet.src.channel_id; + let caller = msg.original_packet.src.channel_id; // we need to parse the ack based on our request - let msg: PacketMsg = from_slice(&ack.original_packet.data)?; - match msg { + let packet: PacketMsg = from_slice(&msg.original_packet.data)?; + match packet { PacketMsg::Dispatch { .. } => { - let res: AcknowledgementMsg = from_slice(&ack.acknowledgement.data)?; + let res: AcknowledgementMsg = from_slice(&msg.acknowledgement.data)?; acknowledge_dispatch(deps, caller, res) } PacketMsg::WhoAmI {} => { - let res: AcknowledgementMsg = from_slice(&ack.acknowledgement.data)?; + let res: AcknowledgementMsg = from_slice(&msg.acknowledgement.data)?; acknowledge_who_am_i(deps, caller, res) } PacketMsg::Balances {} => { - let res: AcknowledgementMsg = from_slice(&ack.acknowledgement.data)?; + let res: AcknowledgementMsg = from_slice(&msg.acknowledgement.data)?; acknowledge_balances(deps, env, caller, res) } } @@ -388,7 +387,7 @@ mod tests { }) => { let ack = IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(); let mut msg = mock_ibc_packet_ack(&channel_id, &1, ack).unwrap(); - msg.ack.original_packet.data = data; + msg.original_packet.data = data; msg } o => panic!("Unexpected message: {:?}", o), From f8516c917ea295c6470a5ea0cae9041f1277b530 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 11:49:40 +0200 Subject: [PATCH 251/402] Update test contract for vm --- packages/vm/testdata/ibc_reflect_0.16.wasm | Bin 282305 -> 281021 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/vm/testdata/ibc_reflect_0.16.wasm b/packages/vm/testdata/ibc_reflect_0.16.wasm index b9ae0dc4000e0132a1816db9fe0bbe62d1d56c2a..310364abfd23890f64b30e3b930fc2e118d3be99 100644 GIT binary patch delta 15171 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 From b53ed48116970612c149008db04e5330d9914226 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 12:15:08 +0200 Subject: [PATCH 252/402] Update CHANGELOG and MIGRATING --- CHANGELOG.md | 4 ++++ MIGRATING.md | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09d345d20..9557115ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,10 @@ and this project adheres to `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. ### Changed diff --git a/MIGRATING.md b/MIGRATING.md index 85c20e081..7ffc0528c 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -111,7 +111,8 @@ major releases of `cosmwasm`. Note that you can also view the - ack: IbcAcknowledgementWithPacket, + msg: IbcPacketReceiveMsg, ) -> StdResult { - + let ack = msg.ack; + // They are the same struct just a different name + let ack = msg; // do things } From db7cea82cffa7276e9f631723f429afd58ae2c2b Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 22 Jul 2021 12:17:50 +0200 Subject: [PATCH 253/402] Fixed integration tests --- contracts/ibc-reflect-send/tests/integration.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index b66827cda..7ee192fdf 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -179,7 +179,7 @@ fn dispatch_message_send_and_ack() { }) => { let ack = IbcAcknowledgement::encode_json(&AcknowledgementMsg::Ok(())).unwrap(); let mut msg = mock_ibc_packet_ack(&channel_id, &1, ack).unwrap(); - msg.ack.original_packet.data = data; + msg.original_packet.data = data; msg } o => panic!("Unexpected message: {:?}", o), From 6c924475aafeb91fa487dbb700762706babccf11 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 22 Jul 2021 12:28:48 +0200 Subject: [PATCH 254/402] Set version: 0.16.0-rc4 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 32b09ee04..3dea45406 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index d111bedad..5115e255f 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -100,7 +100,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index f3b8b0aeb..79a5e6141 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -102,7 +102,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index bd4dccdc1..f079a516b 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 656a1e32f..bfbec0eba 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 8cbee73f9..87b74c729 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 65b48e433..7f8e256d0 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 21bd8246b..bbe89c7ad 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index f7435eaeb..62b0595a2 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index e6a51ed78..da226d9ca 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 5ae45c67f..bcbf63cad 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.0-rc3" +version = "0.16.0-rc4" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 6a211d649..d820aacf7 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.0-rc3" +version = "0.16.0-rc4" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index da0488a7f..bacba8108 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.0-rc3" +version = "0.16.0-rc4" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 568dd7c50..659de7992 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.0-rc3" +version = "0.16.0-rc4" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.0-rc3" } +cosmwasm-derive = { path = "../derive", version = "0.16.0-rc4" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc3" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc4" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 0a972f17a..3b6d46b8c 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.0-rc3" +version = "0.16.0-rc4" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.0-rc3", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.0-rc4", 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 e76cb12da..d91e6b4f6 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.0-rc3" +version = "0.16.0-rc4" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.0-rc3", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc3" } +cosmwasm-std = { path = "../std", version = "0.16.0-rc4", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc4" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 6346db5d9cdcf397e6bfa72a4fa3bbd91576c10e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 22 Jul 2021 17:17:23 +0200 Subject: [PATCH 255/402] Response: builder pattern instead of literals --- contracts/hackatom/src/contract.rs | 31 +++++++----------- packages/std/src/results/response.rs | 47 +++++++++++++--------------- 2 files changed, 33 insertions(+), 45 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 141a324ac..1e42a4c18 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -30,9 +30,7 @@ pub fn instantiate( ); // This adds some unrelated event attribute for testing purposes - let mut resp = Response::new(); - resp.add_attribute("Let the", "hacking begin"); - Ok(resp) + Ok(Response::new().add_attribute("Let the", "hacking begin")) } pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { @@ -55,9 +53,7 @@ pub fn sudo(_deps: DepsMut, _env: Env, msg: SudoMsg) -> Result Result Result { if old_size == usize::max_value() { return Err(StdError::generic_err("memory.grow failed").into()); } - Ok(Response { - data: Some((old_size as u32).to_be_bytes().into()), - ..Response::default() - }) + Ok(Response::new().set_data((old_size as u32).to_be_bytes())) } #[cfg(not(target_arch = "wasm32"))] diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 48784ac08..ecf333e01 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -30,12 +30,7 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// ) -> StdResult { /// // ... /// -/// Ok(Response { -/// messages: vec![], -/// attributes: vec![attr("action", "instantiate")], -/// events: vec![], -/// data: None, -/// }) +/// Ok(Response::new().add_attribute("action", "instantiate")) /// } /// ``` /// @@ -54,21 +49,19 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// info: MessageInfo, /// msg: InstantiateMsg, /// ) -> Result { -/// let mut response = Response::new(); -/// // ... -/// response.add_attribute("Let the", "hacking begin"); -/// // ... -/// response.add_message(BankMsg::Send { -/// to_address: String::from("recipient"), -/// amount: coins(128, "uint"), -/// }); -/// response.add_attribute("foo", "bar"); -/// // ... -/// response.set_data(Binary::from(b"the result data")); +/// let mut response = Response::new() +/// .add_attribute("Let the", "hacking begin") +/// .add_message(BankMsg::Send { +/// to_address: String::from("recipient"), +/// amount: coins(128, "uint"), +/// }) +/// .add_attribute("foo", "bar") +/// .set_data(Binary::from(b"the result data")); /// Ok(response) /// } /// ``` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct Response where T: Clone + fmt::Debug + PartialEq + JsonSchema, @@ -108,23 +101,23 @@ where } /// Add an attribute included in the main `wasm` event. - pub fn add_attribute, V: Into>(&mut self, key: K, value: V) { - self.attributes.push(Attribute { - key: key.into(), - value: value.into(), - }); + pub fn add_attribute, V: Into>(mut self, key: K, value: V) -> Self { + self.attributes.push(Attribute::new(key, value)); + self } /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, /// and adds it to the list of messages to process. - pub fn add_message>>(&mut self, msg: U) { + pub fn add_message>>(mut self, msg: U) -> Self { self.messages.push(SubMsg::new(msg)); + self } /// This takes an explicit SubMsg (creates via eg. `reply_on_error`) /// and adds it to the list of messages to process. - pub fn add_submessage(&mut self, msg: SubMsg) { + pub fn add_submessage(mut self, msg: SubMsg) -> Self { self.messages.push(msg); + self } /// Adds an extra event to the response, separate from the main `wasm` event @@ -132,12 +125,14 @@ where /// /// The `wasm-` prefix will be appended by the runtime to the provided type /// of event. - pub fn add_event(&mut self, event: Event) { + pub fn add_event(mut self, event: Event) -> Self { self.events.push(event); + self } - pub fn set_data>(&mut self, data: U) { + pub fn set_data>(mut self, data: U) -> Self { self.data = Some(data.into()); + self } } From 648f0b687e3b8644570bf592da19cee6082fe38a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 22 Jul 2021 17:19:35 +0200 Subject: [PATCH 256/402] Handy traits for Attribute --- contracts/hackatom/src/contract.rs | 8 ++-- contracts/hackatom/tests/integration.rs | 8 ++-- packages/std/src/results/events.rs | 52 +++++++++++++++++++++---- packages/vm/src/calls.rs | 3 +- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 1e42a4c18..77c4dcb6b 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -280,7 +280,7 @@ mod tests { mock_dependencies, mock_dependencies_with_balances, mock_env, mock_info, MOCK_CONTRACT_ADDR, }; // import trait Storage to get access to read - use cosmwasm_std::{attr, coins, Binary, Storage, SubMsg}; + use cosmwasm_std::{coins, Binary, Storage, SubMsg}; #[test] fn proper_initialization() { @@ -302,9 +302,7 @@ mod tests { 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"); + assert_eq!(res.attributes, [("Let the", "hacking begin")]); // it worked, let's check the state let data = deps.storage.get(CONFIG_KEY).expect("no data stored"); @@ -448,7 +446,7 @@ mod tests { ); assert_eq!( execute_res.attributes, - vec![attr("action", "release"), attr("destination", "benefits")], + vec![("action", "release"), ("destination", "benefits")], ); assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); } diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 67c87c75d..ce13b7576 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -18,7 +18,7 @@ //! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...) use cosmwasm_std::{ - attr, coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, ContractResult, + coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, ContractResult, Empty, Response, SubMsg, }; use cosmwasm_vm::{ @@ -71,9 +71,7 @@ fn proper_initialization() { let info = mock_info(&creator, &coins(1000, "earth")); let res: Response = instantiate(&mut deps, 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"); + assert_eq!(res.attributes, [("Let the", "hacking begin")]); // it worked, let's check the state let state: State = deps @@ -249,7 +247,7 @@ fn execute_release_works() { ); assert_eq!( execute_res.attributes, - vec![attr("action", "release"), attr("destination", "benefits")], + vec![("action", "release"), ("destination", "benefits")], ); assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into())); } diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 31a2e4d82..f4c4a9b5e 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -62,6 +62,48 @@ impl Attribute { } } +impl, V: Into> From<(K, V)> for Attribute { + fn from((k, v): (K, V)) -> Self { + Attribute::new(k, v) + } +} + +impl, V: AsRef> PartialEq<(K, V)> for Attribute { + fn eq(&self, (k, v): &(K, V)) -> bool { + (self.key.as_str(), self.value.as_str()) == (k.as_ref(), v.as_ref()) + } +} + +impl, V: AsRef> PartialEq for (K, V) { + fn eq(&self, attr: &Attribute) -> bool { + attr == self + } +} + +impl, V: AsRef> PartialEq<(K, V)> for &Attribute { + fn eq(&self, (k, v): &(K, V)) -> bool { + (self.key.as_str(), self.value.as_str()) == (k.as_ref(), v.as_ref()) + } +} + +impl, V: AsRef> PartialEq<&Attribute> for (K, V) { + fn eq(&self, attr: &&Attribute) -> bool { + attr == self + } +} + +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 { @@ -98,15 +140,11 @@ mod tests { #[test] fn attr_works_for_different_types() { - let expected = Attribute { - key: "foo".to_string(), - value: "42".to_string(), - }; + let expected = ("foo", "42"); assert_eq!(attr("foo", "42"), expected); - assert_eq!(attr("foo".to_string(), "42"), expected); - assert_eq!(attr("foo", "42".to_string()), expected); + assert_eq!(attr("foo", "42"), expected); + assert_eq!(attr("foo", "42"), expected); assert_eq!(attr("foo", Uint128::new(42)), expected); - assert_eq!(attr("foo", 42.to_string()), expected); } } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index b37abe407..6fafe1034 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -715,8 +715,7 @@ mod tests { .unwrap() .unwrap(); assert_eq!(1, res.messages.len()); - assert_eq!(1, res.events.len()); - assert_eq!(Event::new("ibc").attr("channel", "connect"), res.events[0]); + assert_eq!(res.events, [Event::new("ibc").attr("channel", "connect")]); assert_eq!(ReplyOn::Success, res.messages[0].reply_on); let id = res.messages[0].id; let event = Event { From 1b3133b7320efafe6829d5b00f15017b98708d69 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 22 Jul 2021 18:01:04 +0200 Subject: [PATCH 257/402] Make Response::add_attribute more flexible --- contracts/hackatom/src/contract.rs | 6 +++--- packages/std/src/results/response.rs | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 77c4dcb6b..0bfff2260 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -30,7 +30,7 @@ pub fn instantiate( ); // This adds some unrelated event attribute for testing purposes - Ok(Response::new().add_attribute("Let the", "hacking begin")) + Ok(Response::new().add_attribute(("Let the", "hacking begin"))) } pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { @@ -87,8 +87,8 @@ fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result StdResult { /// // ... /// -/// Ok(Response::new().add_attribute("action", "instantiate")) +/// Ok(Response::new().add_attribute(("action", "instantiate"))) /// } /// ``` /// @@ -50,13 +50,13 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// msg: InstantiateMsg, /// ) -> Result { /// let mut response = Response::new() -/// .add_attribute("Let the", "hacking begin") +/// .add_attribute(("Let the", "hacking begin")) /// .add_message(BankMsg::Send { /// to_address: String::from("recipient"), /// amount: coins(128, "uint"), /// }) -/// .add_attribute("foo", "bar") -/// .set_data(Binary::from(b"the result data")); +/// .add_attribute(("foo", "bar")) +/// .set_data(b"the result data"); /// Ok(response) /// } /// ``` @@ -101,14 +101,14 @@ where } /// Add an attribute included in the main `wasm` event. - pub fn add_attribute, V: Into>(mut self, key: K, value: V) -> Self { - self.attributes.push(Attribute::new(key, value)); + pub fn add_attribute(mut self, attr: impl Into) -> Self { + self.attributes.push(attr.into()); self } /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, /// and adds it to the list of messages to process. - pub fn add_message>>(mut self, msg: U) -> Self { + pub fn add_message(mut self, msg: impl Into>) -> Self { self.messages.push(SubMsg::new(msg)); self } @@ -130,7 +130,7 @@ where self } - pub fn set_data>(mut self, data: U) -> Self { + pub fn set_data(mut self, data: impl Into) -> Self { self.data = Some(data.into()); self } From 5ee348e38014bd1b88d3eb7c6eb4822492d76fe9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 22 Jul 2021 18:16:39 +0200 Subject: [PATCH 258/402] cargo fmt --- contracts/hackatom/tests/integration.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index ce13b7576..055bcc2a1 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::{ - coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, ContractResult, - Empty, Response, SubMsg, + coins, from_binary, to_vec, Addr, AllBalanceResponse, BankMsg, Binary, ContractResult, Empty, + Response, SubMsg, }; use cosmwasm_vm::{ call_execute, from_slice, From ab2629de8fb6105a49ab5cf99288b3ad619eff39 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 12:07:51 +0200 Subject: [PATCH 259/402] Add bulk setters for Response --- packages/std/src/results/response.rs | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index e627a2254..805d1c439 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -130,6 +130,37 @@ where self } + /// Bulk add attributes included in the main `wasm` event. + pub fn add_attributes>( + mut self, + attrs: impl IntoIterator, + ) -> Self { + self.attributes.extend(attrs.into_iter().map(A::into)); + self + } + + /// Bulk add "fire and forget" messages to the list of messages to process. + pub fn add_messages>>(self, msgs: impl IntoIterator) -> Self { + self.add_submessages(msgs.into_iter().map(SubMsg::new)) + } + + /// Bulk add explicit SubMsg structs to the list of messages to process. + pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { + self.messages.extend(msgs.into_iter()); + self + } + + /// Bulk add custom events to the response. These are separate from the main + /// `wasm` event. + /// + /// 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 + } + + /// Set the binary data included in the response. pub fn set_data(mut self, data: impl Into) -> Self { self.data = Some(data.into()); self From 402e3281ff5bc1cd7b4b3e36c2bb9914f07eaaf6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 10:30:58 +0200 Subject: [PATCH 260/402] Update contracts --- contracts/burner/src/contract.rs | 16 ++- contracts/floaty/src/contract.rs | 24 ++-- contracts/ibc-reflect-send/src/contract.rs | 35 +++--- contracts/ibc-reflect/src/contract.rs | 17 +-- .../schema/response_for__custom_msg.json | 2 +- contracts/reflect/src/contract.rs | 32 ++--- contracts/staking/src/contract.rs | 113 ++++++++---------- 7 files changed, 98 insertions(+), 141 deletions(-) diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index 3ddebad83..fa7c2eb8f 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -1,6 +1,5 @@ use cosmwasm_std::{ - attr, entry_point, BankMsg, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, - SubMsg, + entry_point, BankMsg, DepsMut, Env, MessageInfo, Order, Response, StdError, StdResult, }; use crate::msg::{InstantiateMsg, MigrateMsg}; @@ -39,19 +38,18 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult let data_msg = format!("burnt {} keys", count).into_bytes(); - Ok(Response { - messages: vec![SubMsg::new(send)], - attributes: vec![attr("action", "burn"), attr("payout", msg.payout)], - events: vec![], - data: Some(data_msg.into()), - }) + Ok(Response::new() + .add_message(send) + .add_attribute(("action", "burn")) + .add_attribute(("payout", msg.payout)) + .set_data(data_msg)) } #[cfg(test)] mod tests { use super::*; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; - use cosmwasm_std::{coins, StdError, Storage}; + use cosmwasm_std::{coins, StdError, Storage, SubMsg}; #[test] fn instantiate_fails() { diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index f474a3596..cf0768df4 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -28,9 +28,7 @@ pub fn instantiate( ); // This adds some unrelated event attribute for testing purposes - let mut resp = Response::new(); - resp.add_attribute("Let the", "hacking begin"); - Ok(resp) + Ok(Response::new().add_attribute(("Let the", "hacking begin"))) } #[entry_point] @@ -53,16 +51,16 @@ pub fn execute( let mut fl = balance[0].amount.u128() as f64; fl *= 0.3; - let mut resp = Response::new(); - resp.add_attribute("action", "release"); - resp.add_attribute("destination", to_addr.clone()); - resp.add_attribute("foo", fl.to_string()); - resp.add_event(Event::new("hackatom").attr("action", "release")); - resp.add_message(BankMsg::Send { - to_address: to_addr.into(), - amount: balance, - }); - resp.set_data(&[0xF0, 0x0B, 0xAA]); + 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").attr("action", "release")) + .add_message(BankMsg::Send { + to_address: to_addr.into(), + amount: balance, + }) + .set_data(&[0xF0, 0x0B, 0xAA]); Ok(resp) } else { Err(HackError::Unauthorized {}) diff --git a/contracts/ibc-reflect-send/src/contract.rs b/contracts/ibc-reflect-send/src/contract.rs index 169ae2a46..3c3cc6b63 100644 --- a/contracts/ibc-reflect-send/src/contract.rs +++ b/contracts/ibc-reflect-send/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - attr, entry_point, to_binary, CosmosMsg, Deps, DepsMut, Env, IbcMsg, MessageInfo, Order, + entry_point, to_binary, CosmosMsg, Deps, DepsMut, Env, IbcMsg, MessageInfo, Order, QueryResponse, Response, StdError, StdResult, }; @@ -22,10 +22,7 @@ pub fn instantiate( let cfg = Config { admin: info.sender }; config(deps.storage).save(&cfg)?; - Ok(Response { - attributes: vec![attr("action", "instantiate")], - ..Response::default() - }) + Ok(Response::new().add_attribute(("action", "instantiate"))) } #[entry_point] @@ -58,13 +55,9 @@ pub fn handle_update_admin( cfg.admin = deps.api.addr_validate(&new_admin)?; config(deps.storage).save(&cfg)?; - Ok(Response { - attributes: vec![ - attr("action", "handle_update_admin"), - attr("new_admin", cfg.admin), - ], - ..Response::default() - }) + Ok(Response::new() + .add_attribute(("action", "handle_update_admin")) + .add_attribute(("new_admin", cfg.admin))) } pub fn handle_send_msgs( @@ -90,9 +83,9 @@ pub fn handle_send_msgs( timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; - let mut res = Response::new(); - res.add_message(msg); - res.add_attribute("action", "handle_send_msgs"); + let res = Response::new() + .add_message(msg) + .add_attribute(("action", "handle_send_msgs")); Ok(res) } @@ -118,9 +111,9 @@ pub fn handle_check_remote_balance( timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; - let mut res = Response::new(); - res.add_message(msg); - res.add_attribute("action", "handle_check_remote_balance"); + let res = Response::new() + .add_message(msg) + .add_attribute(("action", "handle_check_remote_balance")); Ok(res) } @@ -166,9 +159,9 @@ pub fn handle_send_funds( timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; - let mut res = Response::new(); - res.add_message(msg); - res.add_attribute("action", "handle_send_funds"); + let res = Response::new() + .add_message(msg) + .add_attribute(("action", "handle_send_funds")); Ok(res) } diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index d4ef8d8e8..1fa4d31c8 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -29,19 +29,15 @@ pub fn instantiate( }; config(deps.storage).save(&cfg)?; - Ok(Response { - attributes: vec![attr("action", "instantiate")], - ..Response::default() - }) + Ok(Response::new().add_attribute(("action", "instantiate"))) } #[entry_point] pub fn reply(deps: DepsMut, _env: Env, reply: Reply) -> StdResult { match (reply.id, reply.result) { - (RECEIVE_DISPATCH_ID, ContractResult::Err(err)) => Ok(Response { - data: Some(encode_ibc_error(err)), - ..Response::default() - }), + (RECEIVE_DISPATCH_ID, ContractResult::Err(err)) => { + Ok(Response::new().set_data(encode_ibc_error(err))) + } (INIT_CALLBACK_ID, ContractResult::Ok(response)) => handle_init_callback(deps, response), _ => Err(StdError::generic_err("invalid reply id or result")), } @@ -87,10 +83,7 @@ pub fn handle_init_callback( } })?; - Ok(Response { - attributes: vec![attr("action", "execute_init_callback")], - ..Response::default() - }) + Ok(Response::new().add_attribute(("action", "execute_init_callback"))) } #[entry_point] diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index d822a0649..474ef139d 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Response_for_CustomMsg", - "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response { messages: vec![], attributes: vec![attr(\"action\", \"instantiate\")], events: vec![], data: None, }) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new(); // ... response.add_attribute(\"Let the\", \"hacking begin\"); // ... response.add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }); response.add_attribute(\"foo\", \"bar\"); // ... response.set_data(Binary::from(b\"the result data\")); Ok(response) } ```", + "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response::new().add_attribute((\"action\", \"instantiate\"))) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new() .add_attribute((\"Let the\", \"hacking begin\")) .add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }) .add_attribute((\"foo\", \"bar\")) .set_data(b\"the result data\"); Ok(response) } ```", "type": "object", "required": [ "attributes", diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index fa15f0a78..b5a71b31c 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - attr, entry_point, to_binary, to_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Env, + entry_point, to_binary, to_vec, Binary, ContractResult, CosmosMsg, Deps, DepsMut, Env, MessageInfo, QueryRequest, QueryResponse, Reply, Response, StdError, StdResult, SubMsg, SystemResult, }; @@ -53,14 +53,10 @@ pub fn try_reflect( if msgs.is_empty() { return Err(ReflectError::MessagesEmpty); } - let messages = msgs.into_iter().map(SubMsg::new).collect(); - let res = Response { - messages, - attributes: vec![attr("action", "reflect")], - events: vec![], - data: None, - }; - Ok(res) + + Ok(Response::new() + .add_attribute(("action", "reflect")) + .add_messages(msgs)) } pub fn try_reflect_subcall( @@ -80,13 +76,10 @@ pub fn try_reflect_subcall( if msgs.is_empty() { return Err(ReflectError::MessagesEmpty); } - let res = Response { - messages: msgs, - attributes: vec![attr("action", "reflect_subcall")], - events: vec![], - data: None, - }; - Ok(res) + + Ok(Response::new() + .add_attribute(("action", "reflect_subcall")) + .add_submessages(msgs)) } pub fn try_change_owner( @@ -106,10 +99,9 @@ pub fn try_change_owner( state.owner = api.addr_validate(&new_owner)?; Ok(state) })?; - Ok(Response { - attributes: vec![attr("action", "change_owner"), attr("owner", new_owner)], - ..Response::default() - }) + Ok(Response::new() + .add_attribute(("action", "change_owner")) + .add_attribute(("owner", new_owner))) } /// This just stores the result for future query diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 7ab9eff37..41cf0b27e 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - attr, coin, entry_point, to_binary, BankMsg, Decimal, Deps, DepsMut, DistributionMsg, Env, + coin, entry_point, to_binary, BankMsg, Decimal, Deps, DepsMut, DistributionMsg, Env, MessageInfo, QuerierWrapper, QueryResponse, Response, StakingMsg, StdError, StdResult, Uint128, WasmMsg, }; @@ -93,15 +93,11 @@ pub fn transfer( Ok(balance.unwrap_or_default() + send) })?; - let res = Response { - attributes: vec![ - attr("action", "transfer"), - attr("from", info.sender), - attr("to", recipient), - attr("amount", send), - ], - ..Response::default() - }; + let res = Response::new() + .add_attribute(("action", "transfer")) + .add_attribute(("from", info.sender)) + .add_attribute(("to", recipient)) + .add_attribute(("amount", send.to_string())); Ok(res) } @@ -172,19 +168,15 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { })?; // bond them to the validator - let mut res = Response { - attributes: vec![ - attr("action", "bond"), - attr("from", info.sender), - attr("bonded", payment.amount), - attr("minted", to_mint), - ], - ..Response::default() - }; - res.add_message(StakingMsg::Delegate { - validator: invest.validator, - amount: payment.clone(), - }); + let res = Response::new() + .add_attribute(("action", "bond")) + .add_attribute(("from", info.sender)) + .add_attribute(("bonded", payment.amount)) + .add_attribute(("minted", to_mint)) + .add_message(StakingMsg::Delegate { + validator: invest.validator, + amount: payment.clone(), + }); Ok(res) } @@ -238,19 +230,15 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St })?; // unbond them - let mut res = Response { - attributes: vec![ - attr("action", "unbond"), - attr("to", info.sender), - attr("unbonded", unbond), - attr("burnt", amount), - ], - ..Response::default() - }; - res.add_message(StakingMsg::Undelegate { - validator: invest.validator, - amount: coin(unbond.u128(), &invest.bond_denom), - }); + let res = Response::new() + .add_attribute(("action", "unbond")) + .add_attribute(("to", info.sender)) + .add_attribute(("unbonded", unbond)) + .add_attribute(("burnt", amount)) + .add_message(StakingMsg::Undelegate { + validator: invest.validator, + amount: coin(unbond.u128(), &invest.bond_denom), + }); Ok(res) } @@ -283,18 +271,14 @@ pub fn claim(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult // transfer tokens to the sender balance.amount = to_send; - let mut res = Response { - attributes: vec![ - attr("action", "claim"), - attr("from", &info.sender), - attr("amount", to_send), - ], - ..Response::default() - }; - res.add_message(BankMsg::Send { - to_address: info.sender.into(), - amount: vec![balance], - }); + let res = Response::new() + .add_attribute(("action", "claim")) + .add_attribute(("from", &info.sender)) + .add_attribute(("amount", to_send)) + .add_message(BankMsg::Send { + to_address: info.sender.into(), + amount: vec![balance], + }); Ok(res) } @@ -307,15 +291,15 @@ pub fn reinvest(deps: DepsMut, env: Env, _info: MessageInfo) -> StdResult Date: Mon, 26 Jul 2021 12:28:41 +0200 Subject: [PATCH 261/402] Docs update --- CHANGELOG.md | 3 +++ MIGRATING.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9557115ed..7cc64b78d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,9 @@ and this project adheres to - 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` can no longer be constructed using a struct literal. + Use `Response::new()` and appropriate builder-style functions instead + (`response.add_message`, `response.set_data`, etc). [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 diff --git a/MIGRATING.md b/MIGRATING.md index 7ffc0528c..e562d263d 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -46,6 +46,59 @@ major releases of `cosmwasm`. Note that you can also view the + cosmwasm-std = { version = "0.16.0", default-features = false } ``` +- `Response` can no longer be built using a struct literal. Please use + `Response::new` as well as relevant + [builder-style setters](https://github.com/CosmWasm/cosmwasm/blob/402e3281ff5bc1cd7b4b3e36c2bb9914f07eaaf6/packages/std/src/results/response.rs#L103-L167) + to set the data. + + This is a step toward better API stability. + + ```diff + #[entry_point] + pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult { + // ... + + let send = BankMsg::Send { + to_address: msg.payout.clone(), + amount: balance, + }; + let data_msg = format!("burnt {} keys", count).into_bytes(); + + - Ok(Response { + - messages: vec![SubMsg::new(send)], + - attributes: vec![attr("action", "burn"), attr("payout", msg.payout)], + - events: vec![], + - data: Some(data_msg.into()), + - }) + + Ok(Response::new() + + .add_message(send) + + .add_attribute(("action", "burn")) + + .add_attribute(("payout", msg.payout)) + + .set_data(data_msg)) + } + ``` + + ```diff + - Ok(Response { + - data: Some((old_size as u32).to_be_bytes().into()), + - ..Response::default() + - }) + + Ok(Response::new().set_data((old_size as u32).to_be_bytes())) + ``` + + ```diff + - let res = Response { + - messages: msgs, + - attributes: vec![attr("action", "reflect_subcall")], + - events: vec![], + - data: None, + - }; + - Ok(res) + + Ok(Response::new() + + .add_attribute(("action", "reflect_subcall")) + + .add_submessages(msgs)) + ``` + - For IBC-enabled contracts only: IBC entry points have different signatures. Instead of accepting bare packets, channels and acknowledgements, all of those are wrapped in a `Msg` type specific to the given entry point. Channels, From 582380a9a87741c82844d9c9f30d27718f0a0ab4 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 17:09:24 +0200 Subject: [PATCH 262/402] Switch back to `add_attribute` accepting 2 params --- MIGRATING.md | 6 ++-- contracts/burner/src/contract.rs | 4 +-- contracts/floaty/src/contract.rs | 8 ++--- contracts/hackatom/src/contract.rs | 6 ++-- contracts/ibc-reflect-send/src/contract.rs | 12 +++---- contracts/ibc-reflect/src/contract.rs | 4 +-- .../schema/response_for__custom_msg.json | 2 +- contracts/reflect/src/contract.rs | 8 ++--- contracts/staking/src/contract.rs | 34 +++++++++---------- packages/std/src/results/response.rs | 10 +++--- packages/std/src/types.rs | 1 + 11 files changed, 48 insertions(+), 47 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index e562d263d..73815848d 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -72,8 +72,8 @@ major releases of `cosmwasm`. Note that you can also view the - }) + Ok(Response::new() + .add_message(send) - + .add_attribute(("action", "burn")) - + .add_attribute(("payout", msg.payout)) + + .add_attribute("action", "burn") + + .add_attribute("payout", msg.payout) + .set_data(data_msg)) } ``` @@ -95,7 +95,7 @@ major releases of `cosmwasm`. Note that you can also view the - }; - Ok(res) + Ok(Response::new() - + .add_attribute(("action", "reflect_subcall")) + + .add_attribute("action", "reflect_subcall") + .add_submessages(msgs)) ``` diff --git a/contracts/burner/src/contract.rs b/contracts/burner/src/contract.rs index fa7c2eb8f..b80594cf5 100644 --- a/contracts/burner/src/contract.rs +++ b/contracts/burner/src/contract.rs @@ -40,8 +40,8 @@ pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> StdResult Ok(Response::new() .add_message(send) - .add_attribute(("action", "burn")) - .add_attribute(("payout", msg.payout)) + .add_attribute("action", "burn") + .add_attribute("payout", msg.payout) .set_data(data_msg)) } diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index cf0768df4..506a05b01 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -28,7 +28,7 @@ pub fn instantiate( ); // This adds some unrelated event attribute for testing purposes - Ok(Response::new().add_attribute(("Let the", "hacking begin"))) + Ok(Response::new().add_attribute("Let the", "hacking begin")) } #[entry_point] @@ -52,9 +52,9 @@ pub fn execute( fl *= 0.3; let resp = Response::new() - .add_attribute(("action", "release")) - .add_attribute(("destination", to_addr.clone())) - .add_attribute(("foo", fl.to_string())) + .add_attribute("action", "release") + .add_attribute("destination", to_addr.clone()) + .add_attribute("foo", fl.to_string()) .add_event(Event::new("hackatom").attr("action", "release")) .add_message(BankMsg::Send { to_address: to_addr.into(), diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 0bfff2260..77c4dcb6b 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -30,7 +30,7 @@ pub fn instantiate( ); // This adds some unrelated event attribute for testing purposes - Ok(Response::new().add_attribute(("Let the", "hacking begin"))) + Ok(Response::new().add_attribute("Let the", "hacking begin")) } pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { @@ -87,8 +87,8 @@ fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result StdResult { // ...\n\nOk(Response::new().add_attribute((\"action\", \"instantiate\"))) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new() .add_attribute((\"Let the\", \"hacking begin\")) .add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }) .add_attribute((\"foo\", \"bar\")) .set_data(b\"the result data\"); Ok(response) } ```", + "description": "A response of a contract entry point, such as `instantiate`, `execute` or `migrate`.\n\nThis type can be constructed directly at the end of the call. Alternatively a mutable response instance can be created early in the contract's logic and incrementally be updated.\n\n## Examples\n\nDirect:\n\n``` # use cosmwasm_std::{Binary, DepsMut, Env, MessageInfo}; # type InstantiateMsg = (); # use cosmwasm_std::{attr, Response, StdResult};\n\npub fn instantiate( deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { // ...\n\nOk(Response::new().add_attribute(\"action\", \"instantiate\")) } ```\n\nMutating:\n\n``` # use cosmwasm_std::{coins, BankMsg, Binary, DepsMut, Env, MessageInfo, SubMsg}; # type InstantiateMsg = (); # type MyError = (); # use cosmwasm_std::Response;\n\npub fn instantiate( deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, ) -> Result { let mut response = Response::new() .add_attribute(\"Let the\", \"hacking begin\") .add_message(BankMsg::Send { to_address: String::from(\"recipient\"), amount: coins(128, \"uint\"), }) .add_attribute(\"foo\", \"bar\") .set_data(b\"the result data\"); Ok(response) } ```", "type": "object", "required": [ "attributes", diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index b5a71b31c..806a07c4b 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -55,7 +55,7 @@ pub fn try_reflect( } Ok(Response::new() - .add_attribute(("action", "reflect")) + .add_attribute("action", "reflect") .add_messages(msgs)) } @@ -78,7 +78,7 @@ pub fn try_reflect_subcall( } Ok(Response::new() - .add_attribute(("action", "reflect_subcall")) + .add_attribute("action", "reflect_subcall") .add_submessages(msgs)) } @@ -100,8 +100,8 @@ pub fn try_change_owner( Ok(state) })?; Ok(Response::new() - .add_attribute(("action", "change_owner")) - .add_attribute(("owner", new_owner))) + .add_attribute("action", "change_owner") + .add_attribute("owner", new_owner)) } /// This just stores the result for future query diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 41cf0b27e..8e29c7203 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -94,10 +94,10 @@ pub fn transfer( })?; let res = Response::new() - .add_attribute(("action", "transfer")) - .add_attribute(("from", info.sender)) - .add_attribute(("to", recipient)) - .add_attribute(("amount", send.to_string())); + .add_attribute("action", "transfer") + .add_attribute("from", info.sender) + .add_attribute("to", recipient) + .add_attribute("amount", send.to_string()); Ok(res) } @@ -169,10 +169,10 @@ pub fn bond(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { // bond them to the validator let res = Response::new() - .add_attribute(("action", "bond")) - .add_attribute(("from", info.sender)) - .add_attribute(("bonded", payment.amount)) - .add_attribute(("minted", to_mint)) + .add_attribute("action", "bond") + .add_attribute("from", info.sender) + .add_attribute("bonded", payment.amount) + .add_attribute("minted", to_mint) .add_message(StakingMsg::Delegate { validator: invest.validator, amount: payment.clone(), @@ -231,10 +231,10 @@ pub fn unbond(deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128) -> St // unbond them let res = Response::new() - .add_attribute(("action", "unbond")) - .add_attribute(("to", info.sender)) - .add_attribute(("unbonded", unbond)) - .add_attribute(("burnt", amount)) + .add_attribute("action", "unbond") + .add_attribute("to", info.sender) + .add_attribute("unbonded", unbond) + .add_attribute("burnt", amount) .add_message(StakingMsg::Undelegate { validator: invest.validator, amount: coin(unbond.u128(), &invest.bond_denom), @@ -272,9 +272,9 @@ pub fn claim(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult // transfer tokens to the sender balance.amount = to_send; let res = Response::new() - .add_attribute(("action", "claim")) - .add_attribute(("from", &info.sender)) - .add_attribute(("amount", to_send)) + .add_attribute("action", "claim") + .add_attribute("from", &info.sender) + .add_attribute("amount", to_send) .add_message(BankMsg::Send { to_address: info.sender.into(), amount: vec![balance], @@ -336,8 +336,8 @@ pub fn _bond_all_tokens( // and bond them to the validator let res = Response::new() - .add_attribute(("action", "reinvest")) - .add_attribute(("bonded", balance.amount)) + .add_attribute("action", "reinvest") + .add_attribute("bonded", balance.amount) .add_message(StakingMsg::Delegate { validator: invest.validator, amount: balance, diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 805d1c439..23505c0dd 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -30,7 +30,7 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// ) -> StdResult { /// // ... /// -/// Ok(Response::new().add_attribute(("action", "instantiate"))) +/// Ok(Response::new().add_attribute("action", "instantiate")) /// } /// ``` /// @@ -50,12 +50,12 @@ use super::{Attribute, CosmosMsg, Empty, Event, SubMsg}; /// msg: InstantiateMsg, /// ) -> Result { /// let mut response = Response::new() -/// .add_attribute(("Let the", "hacking begin")) +/// .add_attribute("Let the", "hacking begin") /// .add_message(BankMsg::Send { /// to_address: String::from("recipient"), /// amount: coins(128, "uint"), /// }) -/// .add_attribute(("foo", "bar")) +/// .add_attribute("foo", "bar") /// .set_data(b"the result data"); /// Ok(response) /// } @@ -101,8 +101,8 @@ where } /// Add an attribute included in the main `wasm` event. - pub fn add_attribute(mut self, attr: impl Into) -> Self { - self.attributes.push(attr.into()); + pub fn add_attribute(mut self, key: impl Into, value: impl Into) -> Self { + self.attributes.push(Attribute::new(key, value)); self } diff --git a/packages/std/src/types.rs b/packages/std/src/types.rs index 2a92bce2a..9b182ec80 100644 --- a/packages/std/src/types.rs +++ b/packages/std/src/types.rs @@ -12,6 +12,7 @@ pub struct Env { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] pub struct BlockInfo { + /// The height of a block is the number of blocks preceding it in the blockchain. pub height: u64, /// Absolute time of the block creation in seconds since the UNIX epoch (00:00:00 on 1970-01-01 UTC). /// From 390c12ad7c004bf0ce047a8320dc652010ae3fe4 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 17:22:51 +0200 Subject: [PATCH 263/402] Improve docs --- packages/std/src/results/response.rs | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 23505c0dd..02f925f9c 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -131,6 +131,23 @@ where } /// Bulk add attributes included in the main `wasm` event. + /// + /// Anything that can be turned into an iterator and yields something + /// that can be converted into an `Attribute` is accepted. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{attr, Response}; + /// + /// let attrs = vec![ + /// ("action", "reaction"), + /// ("answer", "42"), + /// ("another", "attribute"), + /// ]; + /// let res: Response = Response::new().add_attributes(attrs.clone()); + /// assert_eq!(res.attributes, attrs); + /// ``` pub fn add_attributes>( mut self, attrs: impl IntoIterator, @@ -140,11 +157,33 @@ where } /// Bulk add "fire and forget" messages to the list of messages to process. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{CosmosMsg, Response}; + /// + /// fn make_response_with_msgs(msgs: Vec) -> Response { + /// Response::new() + /// .add_messages(msgs) + /// } + /// ``` pub fn add_messages>>(self, msgs: impl IntoIterator) -> Self { self.add_submessages(msgs.into_iter().map(SubMsg::new)) } /// Bulk add explicit SubMsg structs to the list of messages to process. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{SubMsg, Response}; + /// + /// fn make_response_with_submsgs(msgs: Vec) -> Response { + /// Response::new() + /// .add_submessages(msgs) + /// } + /// ``` pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { self.messages.extend(msgs.into_iter()); self From c1a34f1fac5309cf87c1380a4d918575d12ed52f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 17:24:56 +0200 Subject: [PATCH 264/402] style --- packages/std/src/results/response.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 02f925f9c..91751a941 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -164,8 +164,7 @@ where /// use cosmwasm_std::{CosmosMsg, Response}; /// /// fn make_response_with_msgs(msgs: Vec) -> Response { - /// Response::new() - /// .add_messages(msgs) + /// Response::new().add_messages(msgs) /// } /// ``` pub fn add_messages>>(self, msgs: impl IntoIterator) -> Self { @@ -180,8 +179,7 @@ where /// use cosmwasm_std::{SubMsg, Response}; /// /// fn make_response_with_submsgs(msgs: Vec) -> Response { - /// Response::new() - /// .add_submessages(msgs) + /// Response::new().add_submessages(msgs) /// } /// ``` pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { From 2b23022bd974f8335467d7db6cd21fc015c016af Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 18:21:17 +0200 Subject: [PATCH 265/402] Apply the new "builder" pattern to IBC responses --- contracts/ibc-reflect-send/src/ibc.rs | 75 +++------ contracts/ibc-reflect/src/contract.rs | 85 ++++------ packages/std/src/ibc.rs | 222 +++++++++++++++++++++++++- 3 files changed, 275 insertions(+), 107 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 3ca963dbc..82ce92102 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -1,7 +1,7 @@ use cosmwasm_std::{ - attr, entry_point, from_slice, to_binary, DepsMut, Env, IbcBasicResponse, IbcChannelCloseMsg, + entry_point, from_slice, to_binary, DepsMut, Env, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, IbcMsg, IbcOrder, IbcPacketAckMsg, - IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, StdError, StdResult, SubMsg, + IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, StdError, StdResult, }; use crate::ibc_msg::{ @@ -65,14 +65,10 @@ pub fn ibc_channel_connect( timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(), }; - Ok(IbcBasicResponse { - messages: vec![SubMsg::new(msg)], - attributes: vec![ - attr("action", "ibc_connect"), - attr("channel_id", channel_id), - ], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new() + .add_message(msg) + .add_attribute("action", "ibc_connect") + .add_attribute("channel_id", channel_id)) } #[entry_point] @@ -88,11 +84,9 @@ pub fn ibc_channel_close( let channel_id = &channel.endpoint.channel_id; accounts(deps.storage).remove(channel_id.as_bytes()); - Ok(IbcBasicResponse { - attributes: vec![attr("action", "ibc_close"), attr("channel_id", channel_id)], - messages: vec![], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new() + .add_attribute("action", "ibc_close") + .add_attribute("channel_id", channel_id)) } #[entry_point] @@ -102,12 +96,9 @@ pub fn ibc_packet_receive( _env: Env, _packet: IbcPacketReceiveMsg, ) -> StdResult { - Ok(IbcReceiveResponse { - acknowledgement: b"{}".into(), - messages: vec![], - attributes: vec![attr("action", "ibc_packet_ack")], - ..IbcReceiveResponse::default() - }) + Ok(IbcReceiveResponse::new() + .set_ack(b"{}") + .add_attribute("action", "ibc_packet_ack")) } #[entry_point] @@ -144,11 +135,7 @@ fn acknowledge_dispatch( _ack: AcknowledgementMsg, ) -> StdResult { // TODO: actually handle success/error? - Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "acknowledge_dispatch")], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new().add_attribute("action", "acknowledge_dispatch")) } // receive PacketMsg::WhoAmI response @@ -162,11 +149,9 @@ fn acknowledge_who_am_i( let WhoAmIResponse { account } = match ack { AcknowledgementMsg::Ok(res) => res, AcknowledgementMsg::Err(e) => { - return Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "acknowledge_who_am_i"), attr("error", e)], - ..IbcBasicResponse::default() - }) + return Ok(IbcBasicResponse::new() + .add_attribute("action", "acknowledge_who_am_i") + .add_attribute("error", e)) } }; @@ -183,11 +168,7 @@ fn acknowledge_who_am_i( } })?; - Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "acknowledge_who_am_i")], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new().add_attribute("action", "acknowledge_who_am_i")) } // receive PacketMsg::Balances response @@ -201,11 +182,9 @@ fn acknowledge_balances( let BalancesResponse { account, balances } = match ack { AcknowledgementMsg::Ok(res) => res, AcknowledgementMsg::Err(e) => { - return Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "acknowledge_balances"), attr("error", e)], - ..IbcBasicResponse::default() - }) + return Ok(IbcBasicResponse::new() + .add_attribute("action", "acknowledge_balances") + .add_attribute("error", e)) } }; @@ -230,11 +209,7 @@ fn acknowledge_balances( } })?; - Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "acknowledge_balances")], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new().add_attribute("action", "acknowledge_balances")) } #[entry_point] @@ -244,11 +219,7 @@ pub fn ibc_packet_timeout( _env: Env, _msg: IbcPacketTimeoutMsg, ) -> StdResult { - Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "ibc_packet_timeout")], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new().add_attribute("action", "ibc_packet_timeout")) } #[cfg(test)] @@ -395,7 +366,7 @@ mod tests { 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 assert_eq!(0, res.messages.len()); - assert_eq!(vec![attr("action", "acknowledge_dispatch")], res.attributes) + assert_eq!(vec![("action", "acknowledge_dispatch")], res.attributes) } #[test] diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index 9b2bfd274..3e4e6d014 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -1,9 +1,9 @@ use cosmwasm_std::{ - attr, entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, - CosmosMsg, Deps, DepsMut, Empty, Env, Event, IbcBasicResponse, IbcChannelCloseMsg, - IbcChannelConnectMsg, IbcChannelOpenMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, - IbcPacketTimeoutMsg, IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, Response, - StdError, StdResult, SubMsg, SubMsgExecutionResponse, WasmMsg, + entry_point, from_slice, to_binary, wasm_execute, BankMsg, Binary, ContractResult, CosmosMsg, + Deps, DepsMut, Empty, Env, Event, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, + IbcReceiveResponse, MessageInfo, Order, QueryResponse, Reply, Response, StdError, StdResult, + SubMsg, SubMsgExecutionResponse, WasmMsg, }; use crate::msg::{ @@ -167,11 +167,11 @@ pub fn ibc_channel_connect( // store the channel id for the reply handler pending_channel(deps.storage).save(&chan_id)?; - Ok(IbcBasicResponse { - messages: vec![msg], - attributes: vec![attr("action", "ibc_connect"), attr("channel_id", chan_id)], - events: vec![Event::new("ibc").attr("channel", "connect")], - }) + Ok(IbcBasicResponse::new() + .add_submessage(msg) + .add_attribute("action", "ibc_connect") + .add_attribute("channel_id", chan_id) + .add_event(Event::new("ibc").attr("channel", "connect"))) } #[entry_point] @@ -205,15 +205,11 @@ pub fn ibc_channel_close( }; let steal_funds = !messages.is_empty(); - Ok(IbcBasicResponse { - messages, - attributes: vec![ - attr("action", "ibc_close"), - attr("channel_id", channel_id), - attr("steal_funds", steal_funds.to_string()), - ], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new() + .add_submessages(messages) + .add_attribute("action", "ibc_close") + .add_attribute("channel_id", channel_id) + .add_attribute("steal_funds", steal_funds.to_string())) } /// this is a no-op just to test how this integrates with wasmd @@ -253,12 +249,9 @@ 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 { - acknowledgement, - messages: vec![], - attributes: vec![], - events: vec![Event::new("ibc").attr("packet", "receive")], - }) + Ok(IbcReceiveResponse::new() + .set_ack(acknowledgement) + .add_event(Event::new("ibc").attr("packet", "receive"))) }) } @@ -270,12 +263,9 @@ fn receive_who_am_i(deps: DepsMut, caller: String) -> StdResult StdResult StdResult { - Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "ibc_packet_ack")], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new().add_attribute("action", "ibc_packet_ack")) } #[entry_point] @@ -343,11 +324,7 @@ pub fn ibc_packet_timeout( _env: Env, _msg: IbcPacketTimeoutMsg, ) -> StdResult { - Ok(IbcBasicResponse { - messages: vec![], - attributes: vec![attr("action", "ibc_packet_timeout")], - ..IbcBasicResponse::default() - }) + Ok(IbcBasicResponse::new().add_attribute("action", "ibc_packet_timeout")) } #[cfg(test)] @@ -358,7 +335,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::{coin, coins, from_slice, BankMsg, OwnedDeps, WasmMsg}; + use cosmwasm_std::{attr, coin, coins, from_slice, BankMsg, OwnedDeps, WasmMsg}; const CREATOR: &str = "creator"; // code id of the reflect contract diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 8771c73ee..20d802038 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -10,7 +10,7 @@ use std::fmt; use crate::binary::Binary; use crate::coins::Coin; use crate::errors::StdResult; -use crate::results::{Attribute, Empty, Event, SubMsg}; +use crate::results::{Attribute, CosmosMsg, Empty, Event, SubMsg}; use crate::serde::to_binary; use crate::timestamp::Timestamp; @@ -391,6 +391,7 @@ impl IbcPacketTimeoutMsg { /// or that cannot redispatch messages (like the handshake callbacks) /// will use other Response types #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct IbcBasicResponse where T: Clone + fmt::Debug + PartialEq + JsonSchema, @@ -420,12 +421,119 @@ where } } +impl IbcBasicResponse +where + T: Clone + fmt::Debug + PartialEq + JsonSchema, +{ + pub fn new() -> Self { + Self::default() + } + + /// 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)); + self + } + + /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, + /// and adds it to the list of messages to process. + pub fn add_message(mut self, msg: impl Into>) -> Self { + self.messages.push(SubMsg::new(msg)); + self + } + + /// This takes an explicit SubMsg (creates via eg. `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); + self + } + + /// Adds an extra event to the response, separate from the main `wasm` event + /// that is always created. + /// + /// The `wasm-` prefix will be appended by the runtime to the provided type + /// of event. + pub fn add_event(mut self, event: Event) -> Self { + self.events.push(event); + self + } + + /// Bulk add attributes included in the main `wasm` event. + /// + /// Anything that can be turned into an iterator and yields something + /// that can be converted into an `Attribute` is accepted. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{attr, IbcBasicResponse}; + /// + /// let attrs = vec![ + /// ("action", "reaction"), + /// ("answer", "42"), + /// ("another", "attribute"), + /// ]; + /// let res: IbcBasicResponse = IbcBasicResponse::new().add_attributes(attrs.clone()); + /// assert_eq!(res.attributes, attrs); + /// ``` + pub fn add_attributes>( + mut self, + attrs: impl IntoIterator, + ) -> Self { + self.attributes.extend(attrs.into_iter().map(A::into)); + self + } + + /// Bulk add "fire and forget" messages to the list of messages to process. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{CosmosMsg, IbcBasicResponse}; + /// + /// fn make_response_with_msgs(msgs: Vec) -> IbcBasicResponse { + /// IbcBasicResponse::new().add_messages(msgs) + /// } + /// ``` + pub fn add_messages>>(self, msgs: impl IntoIterator) -> Self { + self.add_submessages(msgs.into_iter().map(SubMsg::new)) + } + + /// Bulk add explicit SubMsg structs to the list of messages to process. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{SubMsg, IbcBasicResponse}; + /// + /// fn make_response_with_submsgs(msgs: Vec) -> IbcBasicResponse { + /// IbcBasicResponse::new().add_submessages(msgs) + /// } + /// ``` + pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { + self.messages.extend(msgs.into_iter()); + self + } + + /// Bulk add custom events to the response. These are separate from the main + /// `wasm` event. + /// + /// 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 + } +} + // 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, JsonSchema)] +#[non_exhaustive] pub struct IbcReceiveResponse where T: Clone + fmt::Debug + PartialEq + JsonSchema, @@ -459,6 +567,118 @@ where } } +impl IbcReceiveResponse +where + T: Clone + fmt::Debug + PartialEq + JsonSchema, +{ + pub fn new() -> Self { + Self::default() + } + + /// Set the acknowledgement for this response. + 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)); + self + } + + /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, + /// and adds it to the list of messages to process. + pub fn add_message(mut self, msg: impl Into>) -> Self { + self.messages.push(SubMsg::new(msg)); + self + } + + /// This takes an explicit SubMsg (creates via eg. `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); + self + } + + /// Adds an extra event to the response, separate from the main `wasm` event + /// that is always created. + /// + /// The `wasm-` prefix will be appended by the runtime to the provided type + /// of event. + pub fn add_event(mut self, event: Event) -> Self { + self.events.push(event); + self + } + + /// Bulk add attributes included in the main `wasm` event. + /// + /// Anything that can be turned into an iterator and yields something + /// that can be converted into an `Attribute` is accepted. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{attr, IbcReceiveResponse}; + /// + /// let attrs = vec![ + /// ("action", "reaction"), + /// ("answer", "42"), + /// ("another", "attribute"), + /// ]; + /// let res: IbcReceiveResponse = IbcReceiveResponse::new().add_attributes(attrs.clone()); + /// assert_eq!(res.attributes, attrs); + /// ``` + pub fn add_attributes>( + mut self, + attrs: impl IntoIterator, + ) -> Self { + self.attributes.extend(attrs.into_iter().map(A::into)); + self + } + + /// Bulk add "fire and forget" messages to the list of messages to process. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{CosmosMsg, IbcReceiveResponse}; + /// + /// fn make_response_with_msgs(msgs: Vec) -> IbcReceiveResponse { + /// IbcReceiveResponse::new().add_messages(msgs) + /// } + /// ``` + pub fn add_messages>>(self, msgs: impl IntoIterator) -> Self { + self.add_submessages(msgs.into_iter().map(SubMsg::new)) + } + + /// Bulk add explicit SubMsg structs to the list of messages to process. + /// + /// ## Examples + /// + /// ``` + /// use cosmwasm_std::{SubMsg, IbcReceiveResponse}; + /// + /// fn make_response_with_submsgs(msgs: Vec) -> IbcReceiveResponse { + /// IbcReceiveResponse::new().add_submessages(msgs) + /// } + /// ``` + pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { + self.messages.extend(msgs.into_iter()); + self + } + + /// Bulk add custom events to the response. These are separate from the main + /// `wasm` event. + /// + /// 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 + } +} + #[cfg(test)] mod tests { use super::*; From b16db90678089d377d98cd863966c5b174a9d49a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 19:11:32 +0200 Subject: [PATCH 266/402] Make `Event` non_exhaustive --- contracts/floaty/src/contract.rs | 2 +- contracts/hackatom/src/contract.rs | 2 +- contracts/ibc-reflect/src/contract.rs | 31 ++++++++++++---------- contracts/ibc-reflect/tests/integration.rs | 27 ++++++++++--------- contracts/reflect/src/contract.rs | 2 +- contracts/reflect/tests/integration.rs | 2 +- packages/std/src/results/events.rs | 19 +++++++++++-- packages/vm/src/calls.rs | 16 +++++------ 8 files changed, 61 insertions(+), 40 deletions(-) diff --git a/contracts/floaty/src/contract.rs b/contracts/floaty/src/contract.rs index 506a05b01..477e3822c 100644 --- a/contracts/floaty/src/contract.rs +++ b/contracts/floaty/src/contract.rs @@ -55,7 +55,7 @@ pub fn execute( .add_attribute("action", "release") .add_attribute("destination", to_addr.clone()) .add_attribute("foo", fl.to_string()) - .add_event(Event::new("hackatom").attr("action", "release")) + .add_event(Event::new("hackatom").add_attribute("action", "release")) .add_message(BankMsg::Send { to_address: to_addr.into(), amount: balance, diff --git a/contracts/hackatom/src/contract.rs b/contracts/hackatom/src/contract.rs index 77c4dcb6b..9155f5899 100644 --- a/contracts/hackatom/src/contract.rs +++ b/contracts/hackatom/src/contract.rs @@ -89,7 +89,7 @@ fn do_release(deps: DepsMut, env: Env, info: MessageInfo) -> Result Vec { - let event = Event { - ty: "message".into(), - attributes: vec![ - attr("module", "wasm"), - attr("signer", MOCK_CONTRACT_ADDR), - attr("code_id", "17"), - // We have to force this one to avoid the debug assertion against _ - mock_wasmd_attr("_contract_address", reflect_addr), - ], - }; + let event = Event::new("message").add_attributes(vec![ + attr("module", "wasm"), + attr("signer", MOCK_CONTRACT_ADDR), + attr("code_id", "17"), + // We have to force this one to avoid the debug assertion against _ + mock_wasmd_attr("_contract_address", reflect_addr), + ]); vec![event] } @@ -383,7 +380,10 @@ mod tests { let res = ibc_channel_connect(deps.branch(), mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); assert_eq!(1, res.events.len()); - assert_eq!(Event::new("ibc").attr("channel", "connect"), res.events[0]); + assert_eq!( + Event::new("ibc").add_attribute("channel", "connect"), + res.events[0] + ); let id = res.messages[0].id; // fake a reply and ensure this works @@ -517,7 +517,10 @@ mod tests { // we didn't dispatch anything assert_eq!(0, res.messages.len()); assert_eq!(1, res.events.len()); - assert_eq!(Event::new("ibc").attr("packet", "receive"), res.events[0]); + assert_eq!( + Event::new("ibc").add_attribute("packet", "receive"), + res.events[0] + ); // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement).unwrap(); assert_eq!( diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 2c0ce89e5..2ac0cbed5 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -60,16 +60,13 @@ fn setup() -> Instance { } fn fake_events(reflect_addr: &str) -> Vec { - let event = Event { - ty: "message".into(), - attributes: vec![ - attr("module", "wasm"), - attr("signer", MOCK_CONTRACT_ADDR), - attr("code_id", "17"), - // We have to force this one to avoid the debug assertion against _ - mock_wasmd_attr("_contract_address", reflect_addr), - ], - }; + let event = Event::new("message").add_attributes(vec![ + attr("module", "wasm"), + attr("signer", MOCK_CONTRACT_ADDR), + attr("code_id", "17"), + // We have to force this one to avoid the debug assertion against _ + mock_wasmd_attr("_contract_address", reflect_addr), + ]); vec![event] } @@ -91,7 +88,10 @@ fn connect>( let res: IbcBasicResponse = ibc_channel_connect(deps, mock_env(), handshake_connect).unwrap(); assert_eq!(1, res.messages.len()); assert_eq!(1, res.events.len()); - assert_eq!(Event::new("ibc").attr("channel", "connect"), res.events[0]); + assert_eq!( + Event::new("ibc").add_attribute("channel", "connect"), + res.events[0] + ); let id = res.messages[0].id; // fake a reply and ensure this works @@ -227,7 +227,10 @@ fn handle_dispatch_packet() { // we didn't dispatch anything assert_eq!(0, res.messages.len()); assert_eq!(1, res.events.len()); - assert_eq!(Event::new("ibc").attr("packet", "receive"), res.events[0]); + assert_eq!( + Event::new("ibc").add_attribute("packet", "receive"), + res.events[0] + ); // acknowledgement is an error let ack: AcknowledgementMsg = from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap(); diff --git a/contracts/reflect/src/contract.rs b/contracts/reflect/src/contract.rs index 806a07c4b..02bfa51d8 100644 --- a/contracts/reflect/src/contract.rs +++ b/contracts/reflect/src/contract.rs @@ -428,7 +428,7 @@ mod tests { let id = 123u64; let data = Binary::from(b"foobar"); - let events = vec![Event::new("message").attr("signer", "caller-addr")]; + let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; let result = ContractResult::Ok(SubMsgExecutionResponse { events: events.clone(), data: Some(data.clone()), diff --git a/contracts/reflect/tests/integration.rs b/contracts/reflect/tests/integration.rs index 8e113c830..90b6d9d53 100644 --- a/contracts/reflect/tests/integration.rs +++ b/contracts/reflect/tests/integration.rs @@ -225,7 +225,7 @@ fn reply_and_query() { let id = 123u64; let data = Binary::from(b"foobar"); - let events = vec![Event::new("message").attr("signer", "caller-addr")]; + let events = vec![Event::new("message").add_attribute("signer", "caller-addr")]; let result = ContractResult::Ok(SubMsgExecutionResponse { events: events.clone(), data: Some(data.clone()), diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index f4c4a9b5e..ad5dd43b2 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -9,6 +9,7 @@ use serde::{Deserialize, Serialize}; /// which then get magically converted to bytes for Tendermint somewhere between /// the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct Event { /// The event type. This is renamed to "ty" because "type" is reserved in Rust. This sucks, we know. #[serde(rename = "type")] @@ -26,13 +27,25 @@ impl Event { } /// Add an attribute to the event. - pub fn attr(mut self, key: impl Into, value: impl Into) -> Self { + pub fn add_attribute(mut self, key: impl Into, value: impl Into) -> Self { self.attributes.push(Attribute { key: key.into(), value: value.into(), }); self } + + /// Bulk add attributes to the event. + /// + /// Anything that can be turned into an iterator and yields something + /// that can be converted into an `Attribute` is accepted. + pub fn add_attributes>( + mut self, + attrs: impl IntoIterator, + ) -> Self { + self.attributes.extend(attrs.into_iter().map(A::into)); + self + } } /// An key value pair that is used in the context of event attributes in logs @@ -121,7 +134,9 @@ mod tests { ty: "test".to_string(), attributes: vec![attr("foo", "bar"), attr("bar", "baz")], }; - let event_builder = Event::new("test").attr("foo", "bar").attr("bar", "baz"); + let event_builder = Event::new("test") + .add_attribute("foo", "bar") + .add_attribute("bar", "baz"); assert_eq!(event_direct, event_builder); } diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 6fafe1034..151cdfe14 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -715,16 +715,16 @@ mod tests { .unwrap() .unwrap(); assert_eq!(1, res.messages.len()); - assert_eq!(res.events, [Event::new("ibc").attr("channel", "connect")]); + assert_eq!( + res.events, + [Event::new("ibc").add_attribute("channel", "connect")] + ); assert_eq!(ReplyOn::Success, res.messages[0].reply_on); let id = res.messages[0].id; - let event = Event { - ty: "message".into(), - attributes: vec![ - // We have to force this one to avoid the debug assertion against _ - mock_wasmd_attr("_contract_address", account), - ], - }; + let event = Event::new("message").add_attributes(vec![ + // We have to force this one to avoid the debug assertion against _ + mock_wasmd_attr("_contract_address", account), + ]); // which creates a reflect account. here we get the callback let response = Reply { id, From 4eb9c7cec23b55abd0b50bdc9d5a273f054885f9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 19:14:02 +0200 Subject: [PATCH 267/402] CHANGELOG update --- CHANGELOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc64b78d..2057f21bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,9 +54,10 @@ and this project adheres to - 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` can no longer be constructed using a struct literal. - Use `Response::new()` and appropriate builder-style functions instead - (`response.add_message`, `response.set_data`, etc). +- 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). [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 From 64f4fe56645804a20e6acca9aa11e928c21ff38e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 22:43:50 +0200 Subject: [PATCH 268/402] Make IBC Msgs non_exhaustive --- packages/std/src/ibc.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 20d802038..ecee99379 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -206,6 +206,7 @@ impl IbcAcknowledgement { /// The message that is passed into `ibc_channel_open` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub enum IbcChannelOpenMsg { /// The ChanOpenInit step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management OpenInit { channel: IbcChannel }, @@ -258,6 +259,7 @@ impl From for IbcChannel { /// The message that is passed into `ibc_channel_connect` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub enum IbcChannelConnectMsg { /// The ChanOpenAck step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management OpenAck { @@ -310,6 +312,7 @@ impl From for IbcChannel { /// The message that is passed into `ibc_channel_close` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] +#[non_exhaustive] pub enum IbcChannelCloseMsg { /// The ChanCloseInit step from https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#channel-lifecycle-management CloseInit { channel: IbcChannel }, @@ -345,6 +348,7 @@ impl From for IbcChannel { /// The message that is passed into `ibc_packet_receive` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct IbcPacketReceiveMsg { pub packet: IbcPacket, } @@ -357,6 +361,7 @@ impl IbcPacketReceiveMsg { /// The message that is passed into `ibc_packet_ack` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct IbcPacketAckMsg { pub acknowledgement: IbcAcknowledgement, pub original_packet: IbcPacket, @@ -373,6 +378,7 @@ impl IbcPacketAckMsg { /// The message that is passed into `ibc_packet_timeout` #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct IbcPacketTimeoutMsg { pub packet: IbcPacket, } From 64788915ec4f285239237155dcb0673a8a4282da Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 22:48:41 +0200 Subject: [PATCH 269/402] Mark IbcAcknowledgement non_exhaustive --- packages/std/src/ibc.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index ecee99379..2d9522e59 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -185,6 +185,7 @@ pub struct IbcPacket { } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct IbcAcknowledgement { pub data: Binary, // we may add more info here in the future (meta-data from the acknowledgement) From f67d466d12f0ad176925fcb0121658daf711c6dc Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 26 Jul 2021 23:18:07 +0200 Subject: [PATCH 270/402] Mark IbcChannel and IbcPacket as non_exhaustive --- packages/std/src/ibc.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 2d9522e59..29d22fb88 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -115,6 +115,7 @@ impl From for IbcTimeout { /// IbcChannel defines all information on a channel. /// This is generally used in the hand-shake process, but can be queried directly. #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct IbcChannel { pub endpoint: IbcEndpoint, pub counterparty_endpoint: IbcEndpoint, @@ -172,6 +173,7 @@ impl Ord for IbcTimeoutBlock { } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[non_exhaustive] pub struct IbcPacket { /// The raw data send from the other side in the packet pub data: Binary, From 39d2060a0b18f7b2dd49964f4723cc96e62a86ae Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 27 Jul 2021 10:02:55 +0200 Subject: [PATCH 271/402] Make `mock_ibc_channel` public again --- packages/std/src/lib.rs | 7 ++++--- packages/std/src/mock.rs | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index b9cb3b7dc..9a62c1141 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -105,9 +105,10 @@ pub mod testing { }; #[cfg(feature = "stargate")] pub use crate::mock::{ - 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, 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, }; } diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 1688e001b..498f64441 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -224,7 +224,7 @@ pub fn mock_info(sender: &str, funds: &[Coin]) -> MessageInfo { /// Creates an IbcChannel for testing. You set a few key parameters for handshaking, /// If you want to set more, use this as a default and mutate other fields #[cfg(feature = "stargate")] -fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcChannel { +pub fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> IbcChannel { IbcChannel { endpoint: IbcEndpoint { port_id: "my_port".to_string(), From d672cdcb9ed5e6b6592e24d3fb795813ea1c853a Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 27 Jul 2021 10:03:51 +0200 Subject: [PATCH 272/402] CHANGELOG update --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc64b78d..7c6f35432 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ and this project adheres to 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. ### Changed @@ -57,6 +59,12 @@ and this project adheres to - cosmwasm-std: `Response` can no longer be constructed using a struct literal. Use `Response::new()` and appropriate builder-style functions instead (`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`. +- [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 From da0a20e5ee5efb6ebc16318ec99c8b78c98fcc32 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 27 Jul 2021 10:19:17 +0200 Subject: [PATCH 273/402] Update MIGRATING --- MIGRATING.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/MIGRATING.md b/MIGRATING.md index 73815848d..f8ec8855d 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -46,6 +46,14 @@ major releases of `cosmwasm`. Note that you can also view the + cosmwasm-std = { version = "0.16.0", default-features = false } ``` +- The `Event::attr` setter has been renamed to `Event::add_attribute` - this is + for consistency with other types, like `Response`. + + ```diff + - let event = Event::new("ibc").attr("channel", "connect"); + + let event = Event::new("ibc").add_attribute("channel", "connect"); + ``` + - `Response` can no longer be built using a struct literal. Please use `Response::new` as well as relevant [builder-style setters](https://github.com/CosmWasm/cosmwasm/blob/402e3281ff5bc1cd7b4b3e36c2bb9914f07eaaf6/packages/std/src/results/response.rs#L103-L167) @@ -99,6 +107,29 @@ major releases of `cosmwasm`. Note that you can also view the + .add_submessages(msgs)) ``` +- For IBC-enabled contracts only: constructing `IbcReceiveResponse` and + `IbcBasicResponse` follows the same principles now as `Response` above. + + ```diff + pub fn ibc_packet_receive( + deps: DepsMut, + env: Env, + msg: IbcPacketReceiveMsg, + ) -> StdResult { + // ... + + - Ok(IbcReceiveResponse { + - acknowledgement, + - messages: vec![], + - attributes: vec![], + - events: vec![Event::new("ibc").attr("packet", "receive")], + - }) + + Ok(IbcReceiveResponse::new() + + .set_ack(acknowledgement) + + .add_event(Event::new("ibc").add_attribute("packet", "receive"))) + } + ``` + - For IBC-enabled contracts only: IBC entry points have different signatures. Instead of accepting bare packets, channels and acknowledgements, all of those are wrapped in a `Msg` type specific to the given entry point. Channels, From 92c02ff58ba488277e625720658064ad53fbab3e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 27 Jul 2021 13:04:30 +0200 Subject: [PATCH 274/402] Add constructors for IbcChannel and IbcPacket --- packages/std/src/ibc.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 29d22fb88..4ced2cc8c 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -126,6 +126,25 @@ pub struct IbcChannel { pub connection_id: String, } +impl IbcChannel { + /// Construct a new IbcChannel. + pub fn new( + endpoint: IbcEndpoint, + counterparty_endpoint: IbcEndpoint, + order: IbcOrder, + version: impl Into, + connection_id: impl Into, + ) -> Self { + Self { + endpoint, + counterparty_endpoint, + order, + version: version.into(), + connection_id: connection_id.into(), + } + } +} + /// IbcOrder defines if a channel is ORDERED or UNORDERED /// Values come from https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/ibc/core/channel/v1/channel.proto#L69-L80 /// Naming comes from the protobuf files and go translations. @@ -186,6 +205,25 @@ pub struct IbcPacket { pub timeout: IbcTimeout, } +impl IbcPacket { + /// Construct a new IbcPacket. + pub fn new( + data: impl Into, + src: IbcEndpoint, + dest: IbcEndpoint, + sequence: u64, + timeout: IbcTimeout, + ) -> Self { + Self { + data: data.into(), + src, + dest, + sequence, + timeout, + } + } +} + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[non_exhaustive] pub struct IbcAcknowledgement { From 3ce4511ec3bc9f0fd82849069f73301ecb573b64 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 27 Jul 2021 14:08:25 +0200 Subject: [PATCH 275/402] Refactor event construction test --- packages/std/src/results/events.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index ad5dd43b2..89f99e5af 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -134,9 +134,7 @@ mod tests { ty: "test".to_string(), attributes: vec![attr("foo", "bar"), attr("bar", "baz")], }; - let event_builder = Event::new("test") - .add_attribute("foo", "bar") - .add_attribute("bar", "baz"); + let event_builder = Event::new("test").add_attributes(vec![("foo", "bar"), ("bar", "baz")]); assert_eq!(event_direct, event_builder); } From 4817c835f54e64fd3b2d168cdd5fe6328c9cf34b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 27 Jul 2021 14:24:13 +0200 Subject: [PATCH 276/402] Set version: 0.16.0-rc5 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3dea45406..f5f5b458c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 5115e255f..f13d6b010 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -100,7 +100,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +111,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -126,7 +126,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +140,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 79a5e6141..0701a441c 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -102,7 +102,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index f079a516b..8a754aa3a 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index bfbec0eba..520e4cb98 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 87b74c729..3e0eeca6f 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 7f8e256d0..a56753ffe 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index bbe89c7ad..ba066f1c8 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 62b0595a2..8e0164903 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index da226d9ca..e07734cd0 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -89,7 +89,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +100,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "schemars", "serde_json", @@ -115,7 +115,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index bcbf63cad..85e1b4ce0 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.0-rc4" +version = "0.16.0-rc5" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index d820aacf7..c6cfeaef6 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.0-rc4" +version = "0.16.0-rc5" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index bacba8108..dba107365 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.0-rc4" +version = "0.16.0-rc5" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 659de7992..23b392154 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.0-rc4" +version = "0.16.0-rc5" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -29,7 +29,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.0-rc4" } +cosmwasm-derive = { path = "../derive", version = "0.16.0-rc5" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -37,7 +37,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc4" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc5" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 3b6d46b8c..01cadcde6 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.0-rc4" +version = "0.16.0-rc5" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.0-rc4", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.0-rc5", 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 d91e6b4f6..614e870b5 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.0-rc4" +version = "0.16.0-rc5" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.0-rc4", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc4" } +cosmwasm-std = { path = "../std", version = "0.16.0-rc5", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc5" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 1e1eec10520ac10e8b1ca239d92c454d0e535395 Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 28 Jul 2021 15:21:50 +0900 Subject: [PATCH 277/402] fix a typo --- 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 da0efe412..7a67e3be2 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -27,7 +27,7 @@ where Staking(StakingMsg), #[cfg(feature = "staking")] Distribution(DistributionMsg), - /// A Stargate message encoded the same way as a protobof [Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). + /// 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 { From ee2aa827874091c76a17889c170946eaa718ecd6 Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 28 Jul 2021 20:06:03 +0900 Subject: [PATCH 278/402] execute cargo schema in some contracts --- contracts/ibc-reflect-send/schema/execute_msg.json | 2 +- contracts/ibc-reflect-send/schema/packet_msg.json | 2 +- contracts/ibc-reflect/schema/packet_msg.json | 2 +- contracts/reflect/schema/execute_msg.json | 2 +- contracts/reflect/schema/response_for__custom_msg.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/ibc-reflect-send/schema/execute_msg.json b/contracts/ibc-reflect-send/schema/execute_msg.json index 8242748da..3dff0731d 100644 --- a/contracts/ibc-reflect-send/schema/execute_msg.json +++ b/contracts/ibc-reflect-send/schema/execute_msg.json @@ -226,7 +226,7 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobof [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": "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" diff --git a/contracts/ibc-reflect-send/schema/packet_msg.json b/contracts/ibc-reflect-send/schema/packet_msg.json index 528cd2507..876d96bd1 100644 --- a/contracts/ibc-reflect-send/schema/packet_msg.json +++ b/contracts/ibc-reflect-send/schema/packet_msg.json @@ -179,7 +179,7 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobof [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": "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" diff --git a/contracts/ibc-reflect/schema/packet_msg.json b/contracts/ibc-reflect/schema/packet_msg.json index 4ac17df91..9d05aadaa 100644 --- a/contracts/ibc-reflect/schema/packet_msg.json +++ b/contracts/ibc-reflect/schema/packet_msg.json @@ -178,7 +178,7 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobof [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": "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" diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index e418a12be..f92b97182 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -197,7 +197,7 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobof [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": "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" diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index b63bcfd72..cbc1942e2 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -184,7 +184,7 @@ "additionalProperties": false }, { - "description": "A Stargate message encoded the same way as a protobof [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": "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" From 3733d06389d1caf84394e9ba7dd4790e4fbb0190 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 28 Jul 2021 16:27:43 +0200 Subject: [PATCH 279/402] Make sure all features are enabled for docs.rs --- packages/std/Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 23b392154..f1398e3bd 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -8,6 +8,9 @@ repository = "https://github.com/CosmWasm/cosmwasm/tree/main/packages/std" license = "Apache-2.0" readme = "README.md" +[package.metadata.docs.rs] +all-features = true + [features] default = ["iterator"] # iterator allows us to iterate over all DB items in a given range From 1877efc84689f8e881e80ff1861b2f2ccc2fae44 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 28 Jul 2021 16:43:16 +0200 Subject: [PATCH 280/402] Improve events documentation --- packages/std/src/ibc.rs | 20 ++++++++++++++++++-- packages/std/src/results/events.rs | 14 ++++++++++---- packages/std/src/results/response.rs | 13 ++++++++++++- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 4ced2cc8c..c2af6213a 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -194,7 +194,7 @@ impl Ord for IbcTimeoutBlock { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[non_exhaustive] pub struct IbcPacket { - /// The raw data send from the other side in the packet + /// The raw data sent from the other side in the packet pub data: Binary, /// identifies the channel and port on the sending chain. pub src: IbcEndpoint, @@ -449,9 +449,17 @@ where /// Use `SubMsg::new` to create messages with the older "fire and forget" semantics. pub messages: Vec>, /// The attributes that will be emitted as part of a `wasm` event. + /// + /// 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 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 pub events: Vec, } @@ -593,10 +601,18 @@ where /// after execution. Otherwise, they act like "fire and forget". /// Use `call` or `msg.into()` to create messages with the older "fire and forget" semantics. pub messages: Vec>, - /// The attributes that will be emitted as part of a "wasm" event + /// The attributes that will be emitted as part of a "wasm" event. + /// + /// 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 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 pub events: Vec, } diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 89f99e5af..96f027644 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -1,19 +1,25 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -/// A full Cosmos SDK event as documented in -/// https://docs.cosmos.network/v0.42/core/events.html. +/// A full [*Cosmos SDK* event]. /// -/// This version uses string attributes (similar to -/// https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70), +/// This 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. +/// +/// [*Cosmos SDK* event]: https://docs.cosmos.network/v0.42/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 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[non_exhaustive] pub struct Event { /// The event type. This is renamed to "ty" because "type" is reserved in Rust. This sucks, we know. #[serde(rename = "type")] pub ty: String, + /// The attributes to be included in the event. + /// + /// You can learn more about these from [*Cosmos SDK* docs]. + /// + /// [*Cosmos SDK* docs]: https://docs.cosmos.network/v0.42/core/events.html pub attributes: Vec, } diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 91751a941..5f37d3635 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -72,9 +72,20 @@ where /// after execution. Otherwise, they act like "fire and forget". /// Use `SubMsg::new` to create messages with the older "fire and forget" semantics. pub messages: Vec>, - /// The attributes that will be emitted as part of a "wasm" event + /// The attributes that will be emitted as part of a "wasm" event. + /// + /// 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 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 pub events: Vec, + /// The binary payload to include in the response. pub data: Option, } From 06c6f52657d589121aa15c0d293328075b86928b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 28 Jul 2021 16:59:21 +0200 Subject: [PATCH 281/402] Fix broken docs link --- packages/std/src/traits.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index f6b842a98..2bbb749a9 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -84,7 +84,9 @@ pub trait Api { fn addr_canonicalize(&self, human: &str) -> StdResult; /// Takes a canonical address and returns a human readble address. - /// This is the inverse of [addr_canonicalize]. + /// This is the inverse of [`addr_canonicalize`]. + /// + /// [`addr_canonicalize`]: Api::addr_canonicalize fn addr_humanize(&self, canonical: &CanonicalAddr) -> StdResult; fn secp256k1_verify( From e0c08eb0866d026e13ca1299cd79fe2ae2d5cbe8 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 28 Jul 2021 16:59:34 +0200 Subject: [PATCH 282/402] Disable `backtraces` feature in docs builds --- 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 f1398e3bd..cb5b25b6b 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] -all-features = true +features = ["stargate", "staking"] [features] default = ["iterator"] From 108fc248e30501483e6f1548d64ef19608c294c0 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 28 Jul 2021 17:08:38 +0200 Subject: [PATCH 283/402] update schemas --- contracts/reflect/schema/response_for__custom_msg.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index cbc1942e2..774d364f4 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -10,13 +10,14 @@ ], "properties": { "attributes": { - "description": "The attributes that will be emitted as part of a \"wasm\" event", + "description": "The attributes that will be emitted as part of a \"wasm\" event.\n\nMore info about events (and their attributes) can be found in [*Cosmos SDK* docs].\n\n[*Cosmos SDK* docs]: https://docs.cosmos.network/v0.42/core/events.html", "type": "array", "items": { "$ref": "#/definitions/Attribute" } }, "data": { + "description": "The binary payload to include in the response.", "anyOf": [ { "$ref": "#/definitions/Binary" @@ -27,6 +28,7 @@ ] }, "events": { + "description": "Extra, custom events separate from the main `wasm` one. These will have `wasm-` prepended to the type.\n\nMore info about events can be found in [*Cosmos SDK* docs].\n\n[*Cosmos SDK* docs]: https://docs.cosmos.network/v0.42/core/events.html", "type": "array", "items": { "$ref": "#/definitions/Event" @@ -325,7 +327,7 @@ ] }, "Event": { - "description": "A full Cosmos SDK event as documented in https://docs.cosmos.network/v0.42/core/events.html.\n\nThis version uses string attributes (similar to https://github.com/cosmos/cosmos-sdk/blob/v0.42.5/proto/cosmos/base/abci/v1beta1/abci.proto#L56-L70), which then get magically converted to bytes for Tendermint somewhere between the Rust-Go interface, JSON deserialization and the `NewEvent` call in Cosmos SDK.", + "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/v0.42/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", @@ -333,6 +335,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/v0.42/core/events.html", "type": "array", "items": { "$ref": "#/definitions/Attribute" From 312b31cda2a6dd83eb401f17ebf1f06be7c7dee1 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Wed, 28 Jul 2021 22:37:42 -0500 Subject: [PATCH 284/402] Fully removed all generic implementations of Into, and some others --- contracts/ibc-reflect-send/src/ibc.rs | 2 +- contracts/ibc-reflect-send/tests/integration.rs | 4 ++-- contracts/ibc-reflect/src/contract.rs | 4 ++-- contracts/ibc-reflect/tests/integration.rs | 4 ++-- packages/std/src/addresses.rs | 2 +- packages/std/src/errors/std_error.rs | 2 +- packages/std/src/ibc.rs | 4 ++-- packages/std/src/mock.rs | 6 ++++-- packages/std/src/results/cosmos_msg.rs | 9 +++------ packages/std/src/traits.rs | 12 ++++++------ packages/vm/src/errors/vm_error.rs | 2 +- 11 files changed, 25 insertions(+), 26 deletions(-) diff --git a/contracts/ibc-reflect-send/src/ibc.rs b/contracts/ibc-reflect-send/src/ibc.rs index 516f14a35..2f9ac5901 100644 --- a/contracts/ibc-reflect-send/src/ibc.rs +++ b/contracts/ibc-reflect-send/src/ibc.rs @@ -284,7 +284,7 @@ mod tests { }; } - fn who_am_i_response>(deps: DepsMut, channel_id: &str, account: T) { + fn who_am_i_response(deps: DepsMut, channel_id: &str, account: impl Into) { let packet = PacketMsg::WhoAmI {}; let response = AcknowledgementMsg::Ok(WhoAmIResponse { account: account.into(), diff --git a/contracts/ibc-reflect-send/tests/integration.rs b/contracts/ibc-reflect-send/tests/integration.rs index 781bc21ae..0bb43f3f6 100644 --- a/contracts/ibc-reflect-send/tests/integration.rs +++ b/contracts/ibc-reflect-send/tests/integration.rs @@ -73,10 +73,10 @@ fn connect(deps: &mut Instance, channel_id: & }; } -fn who_am_i_response>( +fn who_am_i_response( deps: &mut Instance, channel_id: &str, - account: T, + account: impl Into, ) { let packet = PacketMsg::WhoAmI {}; let response = AcknowledgementMsg::Ok(WhoAmIResponse { diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index d3db9275f..2d313be79 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: T) -> Binary { +fn encode_ibc_error(msg: impl Into) -> Binary { // this cannot error, unwrap to keep the interface simple to_binary(&AcknowledgementMsg::<()>::Err(msg.into())).unwrap() } @@ -385,7 +385,7 @@ mod tests { // connect will run through the entire handshake to set up a proper connect and // save the account (tested in detail in `proper_handshake_flow`) - fn connect>(mut deps: DepsMut, channel_id: &str, account: T) { + fn connect(mut deps: DepsMut, channel_id: &str, account: impl Into) { let account: String = account.into(); // open packet has no counterparty versin, connect does diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index e1f3e07ff..2b6989975 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -71,10 +71,10 @@ fn fake_events(reflect_addr: &str) -> Vec { // connect will run through the entire handshake to set up a proper connect and // save the account (tested in detail in `proper_handshake_flow`) -fn connect>( +fn connect( deps: &mut Instance, channel_id: &str, - account: T, + account: impl Into, ) { let account: String = account.into(); // first we try to open with a valid handshake diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index faad8ee73..01a02eb3e 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -44,7 +44,7 @@ impl Addr { /// let address = Addr::unchecked("foobar"); /// assert_eq!(address, "foobar"); /// ``` - pub fn unchecked>(input: T) -> Addr { + pub fn unchecked(input: impl Into) -> Addr { Addr(input.into()) } diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index ba61a0532..a6ca4d391 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -156,7 +156,7 @@ impl StdError { } } - pub fn parse_err, M: ToString>(target: T, msg: M) -> Self { + pub fn parse_err(target: impl Into, msg: impl ToString) -> Self { StdError::ParseErr { target_type: target.into(), msg: msg.to_string(), diff --git a/packages/std/src/ibc.rs b/packages/std/src/ibc.rs index 4cede60e1..1f92d8101 100644 --- a/packages/std/src/ibc.rs +++ b/packages/std/src/ibc.rs @@ -200,11 +200,11 @@ pub struct IbcAcknowledgement { } impl IbcAcknowledgement { - pub fn new>(data: T) -> Self { + pub fn new(data: impl Into) -> Self { IbcAcknowledgement { data: data.into() } } - pub fn encode_json(data: &T) -> StdResult { + pub fn encode_json(data: &impl Serialize) -> StdResult { Ok(IbcAcknowledgement { data: to_binary(data)?, }) diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 1fb58c66d..f173cbe4b 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -239,7 +239,7 @@ pub fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> #[cfg(feature = "stargate")] /// Creates a IbcPacket 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 -pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &T) -> StdResult { +pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &impl Serialize) -> StdResult { Ok(IbcPacket { data: to_binary(data)?, src: IbcEndpoint { @@ -263,7 +263,9 @@ pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &T) -> StdR /// 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 between mock_ibc_packet_recv is if `my_channel_id` is src or dest. -pub fn mock_ibc_packet_ack(my_channel_id: &str, data: &T) -> StdResult { +pub fn mock_ibc_packet_ack(my_channel_id: &str, data: &impl Serialize) -> StdResult { + use serde::Serialize; + Ok(IbcPacket { data: to_binary(data)?, src: IbcEndpoint { diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index da0efe412..5ae24a42c 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -183,15 +183,12 @@ pub enum VoteOption { /// 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. -pub fn wasm_instantiate( +pub fn wasm_instantiate( code_id: u64, - msg: &T, + msg: &impl Serialize, funds: Vec, label: String, -) -> StdResult -where - T: Serialize, -{ +) -> StdResult { let payload = to_binary(msg)?; Ok(WasmMsg::Instantiate { admin: None, diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index f6b842a98..363f5b5b6 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -207,10 +207,10 @@ impl<'a> QuerierWrapper<'a> { // 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>( + pub fn query_wasm_smart( &self, - contract_addr: V, - msg: &U, + contract_addr: impl Into, + msg: &impl Serialize, ) -> StdResult { let request = WasmQuery::Smart { contract_addr: contract_addr.into(), @@ -227,10 +227,10 @@ impl<'a> QuerierWrapper<'a> { // // 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, U: Into>( + pub fn query_wasm_raw( &self, - contract_addr: T, - key: U, + contract_addr: impl Into, + key: impl Into, ) -> StdResult>> { let request: QueryRequest = WasmQuery::Raw { contract_addr: contract_addr.into(), diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index b9bb506c7..66017752f 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -218,7 +218,7 @@ impl VmError { } } - pub(crate) fn parse_err, M: Display>(target: T, msg: M) -> Self { + pub(crate) fn parse_err(target: impl Into, msg: impl Display) -> Self { VmError::ParseErr { target_type: target.into(), msg: msg.to_string(), From 98530066df7bdf0d9d95ea9b8c81a9ad90404d0c Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Wed, 28 Jul 2021 22:41:36 -0500 Subject: [PATCH 285/402] Resolve merge conflict --- packages/std/src/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index f173cbe4b..1d9efcf7b 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -239,7 +239,7 @@ pub fn mock_ibc_channel(my_channel_id: &str, order: IbcOrder, version: &str) -> #[cfg(feature = "stargate")] /// Creates a IbcPacket 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 -pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &impl Serialize) -> StdResult { +pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &T) -> StdResult { Ok(IbcPacket { data: to_binary(data)?, src: IbcEndpoint { From ace2c368850f3e5cb6bf535d8a32f070f3c233fd Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Wed, 28 Jul 2021 22:43:57 -0500 Subject: [PATCH 286/402] Remove merge conflict #2 im rlly stupid --- packages/std/src/mock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 1d9efcf7b..645937338 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -263,7 +263,7 @@ pub fn mock_ibc_packet_recv(my_channel_id: &str, data: &T) -> StdR /// 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 between mock_ibc_packet_recv is if `my_channel_id` is src or dest. -pub fn mock_ibc_packet_ack(my_channel_id: &str, data: &impl Serialize) -> StdResult { +pub fn mock_ibc_packet_ack(my_channel_id: &str, data: &T) -> StdResult { use serde::Serialize; Ok(IbcPacket { From ef5664694ed3477d7fdba95fa293a5d729122171 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Thu, 29 Jul 2021 09:10:52 -0500 Subject: [PATCH 287/402] Got all of them (I think) --- contracts/staking/src/contract.rs | 2 +- packages/crypto/src/errors.rs | 4 +-- packages/std/src/coins.rs | 6 ++-- packages/std/src/errors/std_error.rs | 6 ++-- packages/std/src/mock.rs | 28 ++++++++--------- packages/std/src/traits.rs | 20 ++++++------- packages/vm/src/errors/communication_error.rs | 2 +- packages/vm/src/errors/vm_error.rs | 30 +++++++++---------- packages/vm/src/testing/querier.rs | 4 +-- 9 files changed, 51 insertions(+), 51 deletions(-) diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 8e29c7203..99849ce1f 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -103,7 +103,7 @@ pub fn transfer( // get_bonded returns the total amount of delegations from contract // it ensures they are all the same denom -fn get_bonded>(querier: &QuerierWrapper, contract_addr: U) -> StdResult { +fn get_bonded(querier: &QuerierWrapper, contract_addr: impl Into) -> StdResult { let bonds = querier.query_all_delegations(contract_addr)?; if bonds.is_empty() { return Ok(Uint128::new(0)); diff --git a/packages/crypto/src/errors.rs b/packages/crypto/src/errors.rs index 3244187ef..b48f154ed 100644 --- a/packages/crypto/src/errors.rs +++ b/packages/crypto/src/errors.rs @@ -42,7 +42,7 @@ pub enum CryptoError { } impl CryptoError { - pub fn batch_err>(msg: S) -> Self { + pub fn batch_err(msg: impl Into) -> Self { CryptoError::BatchErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -50,7 +50,7 @@ impl CryptoError { } } - pub fn generic_err>(msg: S) -> Self { + pub fn generic_err(msg: impl Into) -> Self { CryptoError::GenericErr { msg: msg.into(), #[cfg(feature = "backtraces")] diff --git a/packages/std/src/coins.rs b/packages/std/src/coins.rs index 2b05d67cd..a84799b3d 100644 --- a/packages/std/src/coins.rs +++ b/packages/std/src/coins.rs @@ -11,7 +11,7 @@ pub struct Coin { } impl Coin { - pub fn new>(amount: u128, denom: S) -> Self { + pub fn new(amount: u128, denom: impl Into) -> Self { Coin { amount: Uint128::new(amount), denom: denom.into(), @@ -46,7 +46,7 @@ impl fmt::Display for Coin { /// amount: tip, /// })]; /// ``` -pub fn coins>(amount: u128, denom: S) -> Vec { +pub fn coins(amount: u128, denom: impl Into) -> Vec { vec![coin(amount, denom)] } @@ -70,7 +70,7 @@ pub fn coins>(amount: u128, denom: S) -> Vec { /// amount: tip, /// })]; /// ``` -pub fn coin>(amount: u128, denom: S) -> Coin { +pub fn coin(amount: u128, denom: impl Into) -> Coin { Coin::new(amount, denom) } diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index a6ca4d391..2a58e10a4 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -114,7 +114,7 @@ impl StdError { } } - pub fn generic_err>(msg: S) -> Self { + pub fn generic_err(msg: impl Into) -> Self { StdError::GenericErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -148,7 +148,7 @@ impl StdError { } } - pub fn not_found>(kind: S) -> Self { + pub fn not_found(kind: impl Into) -> Self { StdError::NotFound { kind: kind.into(), #[cfg(feature = "backtraces")] @@ -165,7 +165,7 @@ impl StdError { } } - pub fn serialize_err, M: ToString>(source: S, msg: M) -> Self { + pub fn serialize_err(source: impl Into, msg: impl ToString) -> Self { StdError::SerializeErr { source_type: source.into(), msg: msg.to_string(), diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 498f64441..70eb6f688 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -303,9 +303,9 @@ 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")] -pub fn mock_ibc_packet_recv( +pub fn mock_ibc_packet_recv( my_channel_id: &str, - data: &T, + data: &impl Serialize, ) -> StdResult { Ok(IbcPacketReceiveMsg::new(IbcPacket { data: to_binary(data)?, @@ -330,7 +330,7 @@ pub fn mock_ibc_packet_recv( /// 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")] -fn mock_ibc_packet(my_channel_id: &str, data: &T) -> StdResult { +fn mock_ibc_packet(my_channel_id: &str, data: &impl Serialize) -> StdResult { Ok(IbcPacket { data: to_binary(data)?, src: IbcEndpoint { @@ -354,9 +354,9 @@ fn mock_ibc_packet(my_channel_id: &str, data: &T) -> StdResult( +pub fn mock_ibc_packet_ack( my_channel_id: &str, - data: &T, + data: &impl Serialize, ack: IbcAcknowledgement, ) -> StdResult { let packet = mock_ibc_packet(my_channel_id, data)?; @@ -368,9 +368,9 @@ pub fn mock_ibc_packet_ack( /// 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")] -pub fn mock_ibc_packet_timeout( +pub fn mock_ibc_packet_timeout( my_channel_id: &str, - data: &T, + data: &impl Serialize, ) -> StdResult { mock_ibc_packet(my_channel_id, data).map(IbcPacketTimeoutMsg::new) } @@ -411,9 +411,9 @@ impl MockQuerier { } // set a new balance for the given address and return the old balance - pub fn update_balance>( + pub fn update_balance( &mut self, - addr: U, + addr: impl Into, balance: Vec, ) -> Option> { self.bank.balances.insert(addr.into(), balance) @@ -1112,9 +1112,9 @@ mod tests { #[cfg(feature = "staking")] // gets delegators from query or panic - fn get_all_delegators>( + fn get_all_delegators( staking: &StakingQuerier, - delegator: U, + delegator: impl Into, ) -> Vec { let raw = staking .query(&StakingQuery::AllDelegations { @@ -1128,10 +1128,10 @@ mod tests { #[cfg(feature = "staking")] // gets full delegators from query or panic - fn get_delegator, V: Into>( + fn get_delegator( staking: &StakingQuerier, - delegator: U, - validator: V, + delegator: impl Into, + validator: impl Into, ) -> Option { let raw = staking .query(&StakingQuery::Delegation { diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 363f5b5b6..3a33a7967 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -182,10 +182,10 @@ impl<'a> QuerierWrapper<'a> { } } - pub fn query_balance, V: Into>( + pub fn query_balance( &self, - address: U, - denom: V, + address: impl Into, + denom: impl Into, ) -> StdResult { let request = BankQuery::Balance { address: address.into(), @@ -196,7 +196,7 @@ impl<'a> QuerierWrapper<'a> { Ok(res.amount) } - pub fn query_all_balances>(&self, address: U) -> StdResult> { + pub fn query_all_balances(&self, address: impl Into) -> StdResult> { let request = BankQuery::AllBalances { address: address.into(), } @@ -268,7 +268,7 @@ impl<'a> QuerierWrapper<'a> { } #[cfg(feature = "staking")] - pub fn query_validator>(&self, address: U) -> StdResult> { + pub fn query_validator(&self, address: impl Into) -> StdResult> { let request = StakingQuery::Validator { address: address.into(), } @@ -285,9 +285,9 @@ impl<'a> QuerierWrapper<'a> { } #[cfg(feature = "staking")] - pub fn query_all_delegations>( + pub fn query_all_delegations( &self, - delegator: U, + delegator: impl Into, ) -> StdResult> { let request = StakingQuery::AllDelegations { delegator: delegator.into(), @@ -298,10 +298,10 @@ impl<'a> QuerierWrapper<'a> { } #[cfg(feature = "staking")] - pub fn query_delegation, V: Into>( + pub fn query_delegation( &self, - delegator: U, - validator: V, + delegator: impl Into, + validator: impl Into, ) -> StdResult> { let request = StakingQuery::Delegation { delegator: delegator.into(), diff --git a/packages/vm/src/errors/communication_error.rs b/packages/vm/src/errors/communication_error.rs index ccaa1cfa7..fa05ec82c 100644 --- a/packages/vm/src/errors/communication_error.rs +++ b/packages/vm/src/errors/communication_error.rs @@ -37,7 +37,7 @@ pub enum CommunicationError { } impl CommunicationError { - pub(crate) fn deref_err>(offset: u32, msg: S) -> Self { + pub(crate) fn deref_err(offset: u32, msg: impl Into) -> Self { CommunicationError::DerefErr { offset, msg: msg.into(), diff --git a/packages/vm/src/errors/vm_error.rs b/packages/vm/src/errors/vm_error.rs index 66017752f..80d969328 100644 --- a/packages/vm/src/errors/vm_error.rs +++ b/packages/vm/src/errors/vm_error.rs @@ -150,7 +150,7 @@ impl VmError { } } - pub(crate) fn cache_err>(msg: S) -> Self { + pub(crate) fn cache_err(msg: impl Into) -> Self { VmError::CacheErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -158,7 +158,7 @@ impl VmError { } } - pub(crate) fn compile_err>(msg: S) -> Self { + pub(crate) fn compile_err(msg: impl Into) -> Self { VmError::CompileErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -166,10 +166,10 @@ impl VmError { } } - pub(crate) fn conversion_err, T: Into, U: Into>( - from_type: S, - to_type: T, - input: U, + pub(crate) fn conversion_err( + from_type: impl Into, + to_type: impl Into, + input: impl Into, ) -> Self { VmError::ConversionErr { from_type: from_type.into(), @@ -195,7 +195,7 @@ impl VmError { } } - pub(crate) fn generic_err>(msg: S) -> Self { + pub(crate) fn generic_err(msg: impl Into) -> Self { VmError::GenericErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -203,7 +203,7 @@ impl VmError { } } - pub(crate) fn instantiation_err>(msg: S) -> Self { + pub(crate) fn instantiation_err(msg: impl Into) -> Self { VmError::InstantiationErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -236,7 +236,7 @@ impl VmError { } } - pub(crate) fn serialize_err, M: Display>(source: S, msg: M) -> Self { + pub(crate) fn serialize_err(source: impl Into, msg: impl Display) -> Self { VmError::SerializeErr { source_type: source.into(), msg: msg.to_string(), @@ -245,7 +245,7 @@ impl VmError { } } - pub(crate) fn resolve_err>(msg: S) -> Self { + pub(crate) fn resolve_err(msg: impl Into) -> Self { VmError::ResolveErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -253,8 +253,8 @@ impl VmError { } } - pub(crate) fn result_mismatch>( - function_name: S, + pub(crate) fn result_mismatch( + function_name: impl Into, expected: usize, actual: usize, ) -> Self { @@ -267,7 +267,7 @@ impl VmError { } } - pub(crate) fn runtime_err>(msg: S) -> Self { + pub(crate) fn runtime_err(msg: impl Into) -> Self { VmError::RuntimeErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -275,7 +275,7 @@ impl VmError { } } - pub(crate) fn static_validation_err>(msg: S) -> Self { + pub(crate) fn static_validation_err(msg: impl Into) -> Self { VmError::StaticValidationErr { msg: msg.into(), #[cfg(feature = "backtraces")] @@ -283,7 +283,7 @@ impl VmError { } } - pub(crate) fn uninitialized_context_data>(kind: S) -> Self { + pub(crate) fn uninitialized_context_data(kind: impl Into) -> Self { VmError::UninitializedContextData { kind: kind.into(), #[cfg(feature = "backtraces")] diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index a6d6c36bb..4e9b8bbcd 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -28,9 +28,9 @@ impl MockQuerier { } // set a new balance for the given address and return the old balance - pub fn update_balance>( + pub fn update_balance( &mut self, - addr: U, + addr: impl Into, balance: Vec, ) -> Option> { self.querier.update_balance(addr, balance) From fbba526846c4fe33d944f98cae5e965fd46bc071 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 29 Jul 2021 17:14:17 +0200 Subject: [PATCH 288/402] Fixed links to other CosmWasm projects --- README.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 8b18598e6..11c31f252 100644 --- a/README.md +++ b/README.md @@ -32,16 +32,25 @@ This code is compiled into Wasm bytecode as part of the 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. +- [cw-storage-plus](https://github.com/CosmWasm/cosmwasm-plus/tree/main/packages/storage-plus) - + A crate in `cosmwasm-plus`, which fills the same role as `cosmwasm-storage`, but with much + more powerful types supporting composite primary keys, secondary indexes, automatic + snapshotting, and more. This is newer and a bit less stable than `cosmwasm-storage` but used + in most modern contracts. **Building contracts:** - [cosmwasm-template](https://github.com/CosmWasm/cosmwasm-template) - A starter-pack to get you quickly building your custom contract compatible with the cosmwasm system. -- [cosmwasm-examples](https://github.com/CosmWasm/cosmwasm-examples) - Some - sample contracts (build with cosmwasm-template) for use and inspiration. - Please submit your contract via PR. -- [cosmwasm-opt](https://github.com/CosmWasm/cosmwasm-opt) - A docker image and +- [cosmwasm-plus](https://github.com/CosmWasm/cosmwasm-plus) - Some + sample contracts for use and inspiration. + These provide usable primitives and interfaces for many use cases, such as + fungible tokens, NFTs, multisigs, governance votes, staking derivatives, and more. + Look in `packages` for docs on the various standard interfaces, and + `contracts` for the implementations. + Please submit your contract or interface via PR. +- [rust-optimizer](https://github.com/cosmwasm/rust-optimizer) - A docker image and scripts to take your Rust code and produce the smallest possible Wasm output, deterministically. This is designed both for preparing contracts for deployment as well as validating that a given deployed contract is based on @@ -59,16 +68,14 @@ This code is compiled into Wasm bytecode as part of the smart contract. crate in this workspace. Uses the [wasmer](https://github.com/wasmerio/wasmer) engine to execute a given smart contract. Also contains code for gas metering, storing, and caching wasm artifacts. -- [go-cosmwasm](https://github.com/CosmWasm/go-cosmwasm) - High-level go +- [wasmvm](https://github.com/CosmWasm/wasmvm) - High-level go bindings to all the power inside `cosmwasm-vm`. Easily allows you to upload, instantiate and execute contracts, making use of all the optimizations and caching available inside `cosmwasm-vm`. - [wasmd](https://github.com/CosmWasm/wasmd) - A basic Cosmos SDK app to host - WebAssembly smart contracts. - -Ongoing work is currently tracked -[on this project board](https://github.com/orgs/CosmWasm/projects/1) for all of -the blockchain / contract work. + WebAssembly smart contracts. It can be run as is, or you can import the `x/wasm` + module from it and use it in your blockchain. It is designed to be imported + and customized for other blockchains, rather than forked. ## Creating a Smart Contract From 9a7d15a1f2887ca7499a75d3cf00c924c2953c59 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 29 Jul 2021 17:20:23 +0200 Subject: [PATCH 289/402] Improved the "Creating a Smart Contract" section --- README.md | 68 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 11c31f252..8c00074a8 100644 --- a/README.md +++ b/README.md @@ -33,26 +33,25 @@ This code is compiled into Wasm bytecode as part of the smart contract. A crate in this workspace. This optional addition to `cosmwasm-std` includes convenience helpers for interacting with storage. - [cw-storage-plus](https://github.com/CosmWasm/cosmwasm-plus/tree/main/packages/storage-plus) - - A crate in `cosmwasm-plus`, which fills the same role as `cosmwasm-storage`, but with much - more powerful types supporting composite primary keys, secondary indexes, automatic - snapshotting, and more. This is newer and a bit less stable than `cosmwasm-storage` but used - in most modern contracts. + A crate in `cosmwasm-plus`, which fills the same role as `cosmwasm-storage`, + but with much more powerful types supporting composite primary keys, secondary + indexes, automatic snapshotting, and more. This is newer and a bit less stable + than `cosmwasm-storage` but used in most modern contracts. **Building contracts:** - [cosmwasm-template](https://github.com/CosmWasm/cosmwasm-template) - A starter-pack to get you quickly building your custom contract compatible with the cosmwasm system. -- [cosmwasm-plus](https://github.com/CosmWasm/cosmwasm-plus) - Some - sample contracts for use and inspiration. - These provide usable primitives and interfaces for many use cases, such as - fungible tokens, NFTs, multisigs, governance votes, staking derivatives, and more. - Look in `packages` for docs on the various standard interfaces, and - `contracts` for the implementations. +- [cosmwasm-plus](https://github.com/CosmWasm/cosmwasm-plus) - Some sample + contracts for use and inspiration. These provide usable primitives and + interfaces for many use cases, such as fungible tokens, NFTs, multisigs, + governance votes, staking derivatives, and more. Look in `packages` for docs + on the various standard interfaces, and `contracts` for the implementations. Please submit your contract or interface via PR. -- [rust-optimizer](https://github.com/cosmwasm/rust-optimizer) - A docker image and - scripts to take your Rust code and produce the smallest possible Wasm output, - deterministically. This is designed both for preparing contracts for +- [rust-optimizer](https://github.com/cosmwasm/rust-optimizer) - A docker image + and scripts to take your Rust code and produce the smallest possible Wasm + output, deterministically. This is designed both for preparing contracts for deployment as well as validating that a given deployed contract is based on some given source code, allowing a [similar contract verification algorithm](https://medium.com/coinmonks/how-to-verify-and-publish-on-etherscan-52cf25312945) @@ -68,25 +67,40 @@ This code is compiled into Wasm bytecode as part of the smart contract. crate in this workspace. Uses the [wasmer](https://github.com/wasmerio/wasmer) engine to execute a given smart contract. Also contains code for gas metering, storing, and caching wasm artifacts. -- [wasmvm](https://github.com/CosmWasm/wasmvm) - High-level go - bindings to all the power inside `cosmwasm-vm`. Easily allows you to upload, - instantiate and execute contracts, making use of all the optimizations and - caching available inside `cosmwasm-vm`. +- [wasmvm](https://github.com/CosmWasm/wasmvm) - High-level go bindings to all + the power inside `cosmwasm-vm`. Easily allows you to upload, instantiate and + execute contracts, making use of all the optimizations and caching available + inside `cosmwasm-vm`. - [wasmd](https://github.com/CosmWasm/wasmd) - A basic Cosmos SDK app to host - WebAssembly smart contracts. It can be run as is, or you can import the `x/wasm` - module from it and use it in your blockchain. It is designed to be imported - and customized for other blockchains, rather than forked. + WebAssembly smart contracts. It can be run as is, or you can import the + `x/wasm` module from it and use it in your blockchain. It is designed to be + imported and customized for other blockchains, rather than forked. ## Creating a Smart Contract You can see some examples of contracts under the `contracts` directory, which -you can look at. - -If you want to get started building you own, the simplest way is to go to the -[cosmwasm-template](https://github.com/CosmWasm/cosmwasm-template) repository -and follow the instructions. This will give you a simple contract along with -tests, and a properly configured build environment. From there you can edit the -code to add your desired logic and publish it as an independent repo. +you can look at. They are simple and self-contained, primarily meant for testing +purposes, but that also makes them easier to understand. + +You can also look at [cosmwasm-plus](https://github.com/CosmWasm/cosmwasm-plus) +for examples and inspiration on more production-like contracts and also how we +call one contract from another. If you are working on DeFi or Tokens, please +look at the `cw20`, `cw721` and/or `cw1155` packages that define standard +interfaces as analogues to some popular ERC designs. (`cw20` is also inspired by +`erc777`). + +If you want to get started building you own contract, the simplest way is to go +to the [cosmwasm-template](https://github.com/CosmWasm/cosmwasm-template) +repository and follow the instructions. This will give you a simple contract +along with tests, and a properly configured build environment. From there you +can edit the code to add your desired logic and publish it as an independent +repo. + +We also recommend you review our [documentation site](https://docs.cosmwasm.com) +which contains a few tutorials to guide you in building your first contracts. We +also do public workshops on various topics about once a month. You can find +[past recordings under the "Videos" section](https://cosmwasm.com/resources), or +[join our Discord server](https://docs.cosmwasm.com/chat) to ask for help. ## API entry points From 0462e869630a6d11c6357523812d212944b259ff Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 29 Jul 2021 17:27:31 +0200 Subject: [PATCH 290/402] Update Wasm entry points --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index 8c00074a8..f18bcba06 100644 --- a/README.md +++ b/README.md @@ -116,13 +116,39 @@ If you haven't worked with WebAssembly before, please read an overview on The required exports provided by the cosmwasm smart contract are: ```rust +// signal for 0.16 compatibility +extern "C" fn interface_version_7() -> () {} + +// copy memory to/from host, so we can pass in/out Vec extern "C" fn allocate(size: usize) -> u32; extern "C" fn deallocate(pointer: u32); +// main contract entry points extern "C" fn instantiate(env_ptr: u32, info_ptr: u32, msg_ptr: u32) -> u32; extern "C" fn execute(env_ptr: u32, info_ptr: u32, msg_ptr: u32) -> u32; extern "C" fn query(env_ptr: u32, msg_ptr: u32) -> u32; +``` + +Contracts may also implement one or more of the following to extend their +functionality: + +```rust +// in-place contract migrations extern "C" fn migrate(env_ptr: u32, info_ptr: u32, msg_ptr: u32) -> u32; + +// support submessage callbacks +extern "C" fn reply(env_ptr: u32, msg_ptr: u32) -> u32; + +// expose privileged entry points to Cosmos SDK modules, not external accounts +extern "C" fn sudo(env_ptr: u32, msg_ptr: u32) -> u32; + +// and to write an IBC application as a contract, implement these: +extern "C" fn ibc_channel_open(env_ptr: u32, msg_ptr: u32) -> u32; +extern "C" fn ibc_channel_connect(env_ptr: u32, msg_ptr: u32) -> u32; +extern "C" fn ibc_channel_close(env_ptr: u32, msg_ptr: u32) -> u32; +extern "C" fn ibc_packet_receive(env_ptr: u32, msg_ptr: u32) -> u32; +extern "C" fn ibc_packet_ack(env_ptr: u32, msg_ptr: u32) -> u32; +extern "C" fn ibc_packet_timeout(env_ptr: u32, msg_ptr: u32) -> u32; ``` `allocate`/`deallocate` allow the host to manage data within the Wasm VM. If From 0a2368e8dfd8cfd2c8273cdefe3f28bf5f51f4fb Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Thu, 29 Jul 2021 17:32:32 +0200 Subject: [PATCH 291/402] Update Rust entry points --- README.md | 61 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index f18bcba06..c24accbf3 100644 --- a/README.md +++ b/README.md @@ -244,32 +244,27 @@ defining your custom `InstantiateMsg` and `ExecuteMsg` structs for parsing your custom message types (as json): ```rust -pub fn instantiate( - deps: &mut Deps, - env: Env, - info: MessageInfo, - msg: InstantiateMsg, -) -> StdResult {} - -pub fn execute( - deps: &mut Deps, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, -) -> Result { } - -pub fn migrate( - deps: &mut Deps, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, -) -> Result { } - -pub fn query( - deps: &Deps, - env: Env, - msg: QueryMsg, -) -> StdResult { } +#[entry_point] +pub fn instantiate( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: InstantiateMsg, +) -> Result {} + +#[entry_point] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> Result {} + +#[entry_point] +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result {} + +#[entry_point] +pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> Result {} ``` The low-level `c_read` and `c_write` imports are nicely wrapped for you by a @@ -280,8 +275,18 @@ determine which data you want to store here: ```rust pub trait Storage { - fn get(&self, key: &[u8]) -> Option>; - fn set(&mut self, key: &[u8], value: &[u8]); + fn get(&self, key: &[u8]) -> Option>; + fn set(&mut self, key: &[u8], value: &[u8]); + fn remove(&mut self, key: &[u8]); + + // and for iterating over a range of values + #[cfg(feature = "iterator")] + fn range<'a>( + &'a self, + start: Option<&[u8]>, + end: Option<&[u8]>, + order: Order, + ) -> Box + 'a>; } ``` From 49e9e3f3f9dfe79bd0276d86a4ac124952d749aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kuras?= Date: Thu, 29 Jul 2021 16:39:08 +0200 Subject: [PATCH 292/402] Added `into_string` function to `Addr` --- CHANGELOG.md | 1 + packages/std/src/addresses.rs | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f4470bde..96e20d5d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres 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 diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 8ba68a487..47aade374 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -60,6 +60,12 @@ impl Addr { pub fn as_bytes(&self) -> &[u8] { self.0.as_bytes() } + + /// Utility for explicit conversion to `String`. + #[inline] + pub fn into_string(self) -> String { + self.0 + } } impl fmt::Display for Addr { From 42ebbeffb69564541a01f9684a80ec1ec1f1dee6 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Thu, 29 Jul 2021 12:12:42 -0500 Subject: [PATCH 293/402] Removed the final ones --- packages/std/src/errors/std_error.rs | 6 +++--- packages/vm/src/backend.rs | 4 ++-- packages/vm/src/errors/communication_error.rs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 2a58e10a4..4abfc7003 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -122,7 +122,7 @@ impl StdError { } } - pub fn invalid_base64(msg: S) -> Self { + pub fn invalid_base64(msg: impl ToString) -> Self { StdError::InvalidBase64 { msg: msg.to_string(), #[cfg(feature = "backtraces")] @@ -140,7 +140,7 @@ impl StdError { } } - pub fn invalid_utf8(msg: S) -> Self { + pub fn invalid_utf8(msg: impl ToString) -> Self { StdError::InvalidUtf8 { msg: msg.to_string(), #[cfg(feature = "backtraces")] @@ -462,7 +462,7 @@ pub struct DivideByZeroError { } impl DivideByZeroError { - pub fn new(operand: U) -> Self { + pub fn new(operand: impl ToString) -> Self { Self { operand: operand.to_string(), } diff --git a/packages/vm/src/backend.rs b/packages/vm/src/backend.rs index 11771bc36..238ac5f4f 100644 --- a/packages/vm/src/backend.rs +++ b/packages/vm/src/backend.rs @@ -187,7 +187,7 @@ impl BackendError { BackendError::OutOfGas {} } - pub fn unknown(msg: S) -> Self { + pub fn unknown(msg: impl ToString) -> Self { BackendError::Unknown { msg: Some(msg.to_string()), } @@ -198,7 +198,7 @@ impl BackendError { BackendError::Unknown { msg: None } } - pub fn user_err(msg: S) -> Self { + pub fn user_err(msg: impl ToString) -> Self { BackendError::UserErr { msg: msg.to_string(), } diff --git a/packages/vm/src/errors/communication_error.rs b/packages/vm/src/errors/communication_error.rs index fa05ec82c..a5fb88e0e 100644 --- a/packages/vm/src/errors/communication_error.rs +++ b/packages/vm/src/errors/communication_error.rs @@ -50,7 +50,7 @@ impl CommunicationError { } #[allow(dead_code)] - pub(crate) fn invalid_utf8(msg: S) -> Self { + pub(crate) fn invalid_utf8(msg: impl ToString) -> Self { CommunicationError::InvalidUtf8 { msg: msg.to_string(), } From 5df1252a00e843d436c566ba1d6927b435d3c8b4 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Thu, 29 Jul 2021 12:52:20 -0500 Subject: [PATCH 294/402] Removed all of them!!!! --- packages/std/src/math/decimal.rs | 5 +---- packages/std/src/math/uint128.rs | 5 +---- packages/std/src/math/uint64.rs | 5 +---- packages/std/src/results/cosmos_msg.rs | 6 +----- packages/std/src/results/submessages.rs | 8 ++++---- packages/vm/src/cache.rs | 4 ++-- packages/vm/src/modules/file_system_cache.rs | 2 +- 7 files changed, 11 insertions(+), 24 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 30cf8f797..5331d5225 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -252,10 +252,7 @@ impl<'de> de::Visitor<'de> for DecimalVisitor { formatter.write_str("string-encoded decimal") } - fn visit_str(self, v: &str) -> Result - where - E: de::Error, - { + fn visit_str(self, v: &str) -> Result { match Decimal::from_str(v) { Ok(d) => Ok(d), Err(e) => Err(E::custom(format!("Error parsing decimal '{}': {}", v, e))), diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 51dcf617f..c0b8be7e1 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -299,10 +299,7 @@ impl<'de> de::Visitor<'de> for Uint128Visitor { formatter.write_str("string-encoded integer") } - fn visit_str(self, v: &str) -> Result - where - E: de::Error, - { + fn visit_str(self, v: &str) -> Result { match v.parse::() { Ok(u) => Ok(Uint128(u)), Err(e) => Err(E::custom(format!("invalid Uint128 '{}' - {}", v, e))), diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 33067a779..ed7b283ff 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -263,10 +263,7 @@ impl<'de> de::Visitor<'de> for Uint64Visitor { formatter.write_str("string-encoded integer") } - fn visit_str(self, v: &str) -> Result - where - E: de::Error, - { + fn visit_str(self, v: &str) -> Result { match v.parse::() { Ok(u) => Ok(Uint64(u)), Err(e) => Err(E::custom(format!("invalid Uint64 '{}' - {}", v, e))), diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 80cef7df6..c3b2a4552 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -200,11 +200,7 @@ pub fn wasm_instantiate( } /// Shortcut helper as the construction of WasmMsg::Instantiate can be quite verbose in contract code -pub fn wasm_execute(contract_addr: T, msg: &U, funds: Vec) -> StdResult -where - T: Into, - U: Serialize, -{ +pub fn wasm_execute(contract_addr: impl Into, msg: &impl Serialize, funds: Vec) -> StdResult { let payload = to_binary(msg)?; Ok(WasmMsg::Execute { contract_addr: contract_addr.into(), diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index c7b3163f9..e1ad9dcf4 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -49,7 +49,7 @@ where T: Clone + fmt::Debug + PartialEq + JsonSchema, { /// new creates a "fire and forget" message with the pre-0.14 semantics - pub fn new>>(msg: M) -> Self { + pub fn new(msg: impl Into>) -> Self { SubMsg { id: UNUSED_MSG_ID, msg: msg.into(), @@ -59,17 +59,17 @@ where } /// create a `SubMsg` that will provide a `reply` with the given id if the message returns `Ok` - pub fn reply_on_success>>(msg: M, id: u64) -> Self { + 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` - pub fn reply_on_error>>(msg: M, id: u64) -> Self { + 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 - pub fn reply_always>>(msg: M, id: u64) -> Self { + pub fn reply_always(msg: impl Into>, id: u64) -> Self { Self::reply_on(msg.into(), id, ReplyOn::Always) } diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 310bdf38c..da9ffac06 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -313,7 +313,7 @@ where /// save stores the wasm code in the given directory and returns an ID for lookup. /// It will create the directory if it doesn't exist. /// Saving the same byte code multiple times is allowed. -fn save_wasm_to_disk>(dir: P, wasm: &[u8]) -> VmResult { +fn save_wasm_to_disk(dir: impl Into, wasm: &[u8]) -> VmResult { // calculate filename let checksum = Checksum::generate(wasm); let filename = checksum.to_hex(); @@ -333,7 +333,7 @@ fn save_wasm_to_disk>(dir: P, wasm: &[u8]) -> VmResult>(dir: P, checksum: &Checksum) -> 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) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 036c61cad..dcd25fd48 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -31,7 +31,7 @@ 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: P) -> io::Result { + pub unsafe fn new(path: impl Into) -> io::Result { let path: PathBuf = path.into(); if path.exists() { let metadata = path.metadata()?; From 0e983146ac1c53d7e9a1bc457f2962d3c698bad1 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Thu, 29 Jul 2021 12:55:31 -0500 Subject: [PATCH 295/402] Fixed formatting --- packages/std/src/results/cosmos_msg.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index c3b2a4552..2b0d6d48a 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -200,7 +200,11 @@ pub fn wasm_instantiate( } /// Shortcut helper as the construction of WasmMsg::Instantiate can be quite verbose in contract code -pub fn wasm_execute(contract_addr: impl Into, msg: &impl Serialize, funds: Vec) -> StdResult { +pub fn wasm_execute( + contract_addr: impl Into, + msg: &impl Serialize, + funds: Vec +) -> StdResult { let payload = to_binary(msg)?; Ok(WasmMsg::Execute { contract_addr: contract_addr.into(), From 4ed505da404ff679e15d5934f0bcd4bc5ed92f91 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Thu, 29 Jul 2021 12:58:48 -0500 Subject: [PATCH 296/402] Fixed the return type things... idk why they aren't working --- packages/std/src/math/decimal.rs | 5 ++++- packages/std/src/math/uint128.rs | 5 ++++- packages/std/src/math/uint64.rs | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 5331d5225..858a26367 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -252,7 +252,10 @@ impl<'de> de::Visitor<'de> for DecimalVisitor { formatter.write_str("string-encoded decimal") } - fn visit_str(self, v: &str) -> Result { + fn visit_str(self, v: &str) -> Result + where + E: de::Error + { match Decimal::from_str(v) { Ok(d) => Ok(d), Err(e) => Err(E::custom(format!("Error parsing decimal '{}': {}", v, e))), diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index c0b8be7e1..84d98ce9b 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -299,7 +299,10 @@ impl<'de> de::Visitor<'de> for Uint128Visitor { formatter.write_str("string-encoded integer") } - fn visit_str(self, v: &str) -> Result { + fn visit_str(self, v: &str) -> Result + where + E: de::Error + { match v.parse::() { Ok(u) => Ok(Uint128(u)), Err(e) => Err(E::custom(format!("invalid Uint128 '{}' - {}", v, e))), diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index ed7b283ff..54b182a59 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -263,7 +263,10 @@ impl<'de> de::Visitor<'de> for Uint64Visitor { formatter.write_str("string-encoded integer") } - fn visit_str(self, v: &str) -> Result { + fn visit_str(self, v: &str) -> Result + where + E: de::Error + { match v.parse::() { Ok(u) => Ok(Uint64(u)), Err(e) => Err(E::custom(format!("invalid Uint64 '{}' - {}", v, e))), From 75bfd00bdcfa64313d57fac6c4a272e0c2b7f378 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Thu, 29 Jul 2021 14:16:58 -0500 Subject: [PATCH 297/402] Format --- packages/std/src/math/decimal.rs | 2 +- packages/std/src/math/uint128.rs | 2 +- packages/std/src/results/cosmos_msg.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 858a26367..30cf8f797 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -254,7 +254,7 @@ impl<'de> de::Visitor<'de> for DecimalVisitor { fn visit_str(self, v: &str) -> Result where - E: de::Error + E: de::Error, { match Decimal::from_str(v) { Ok(d) => Ok(d), diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 84d98ce9b..51dcf617f 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -301,7 +301,7 @@ impl<'de> de::Visitor<'de> for Uint128Visitor { fn visit_str(self, v: &str) -> Result where - E: de::Error + E: de::Error, { match v.parse::() { Ok(u) => Ok(Uint128(u)), diff --git a/packages/std/src/results/cosmos_msg.rs b/packages/std/src/results/cosmos_msg.rs index 2b0d6d48a..639890ac3 100644 --- a/packages/std/src/results/cosmos_msg.rs +++ b/packages/std/src/results/cosmos_msg.rs @@ -203,7 +203,7 @@ pub fn wasm_instantiate( pub fn wasm_execute( contract_addr: impl Into, msg: &impl Serialize, - funds: Vec + funds: Vec, ) -> StdResult { let payload = to_binary(msg)?; Ok(WasmMsg::Execute { From 8f972e2f1a7cce37ff891b96f7f60055e7640c68 Mon Sep 17 00:00:00 2001 From: lukerhoads Date: Thu, 29 Jul 2021 15:54:46 -0500 Subject: [PATCH 298/402] Thanks for the tip, forgot abt cargo fmt :) --- packages/std/src/math/uint64.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 54b182a59..33067a779 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -265,7 +265,7 @@ impl<'de> de::Visitor<'de> for Uint64Visitor { fn visit_str(self, v: &str) -> Result where - E: de::Error + E: de::Error, { match v.parse::() { Ok(u) => Ok(Uint64(u)), From 703b8740bb70b4082e454fe907a2b764a103ef7e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Aug 2021 16:30:24 +0200 Subject: [PATCH 299/402] Document Minimum Supported Rust Version (MSRV) --- README.md | 4 ++++ docs/MSRV.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 docs/MSRV.md diff --git a/README.md b/README.md index c24accbf3..001425e1e 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,10 @@ also do public workshops on various topics about once a month. You can find [past recordings under the "Videos" section](https://cosmwasm.com/resources), or [join our Discord server](https://docs.cosmwasm.com/chat) to ask for help. +## Minimum Supported Rust Version (MSRV) + +See [Minimum Supported Rust Version (MSRV)](./docs/MSRV.md). + ## API entry points WebAssembly contracts are basically black boxes. The have no default entry diff --git a/docs/MSRV.md b/docs/MSRV.md new file mode 100644 index 000000000..9c47c15ec --- /dev/null +++ b/docs/MSRV.md @@ -0,0 +1,52 @@ +# Minimum Supported Rust Version (MSRV) + +This repository has two independent MSRVs, one for the standard library that is +compiled into contracts (cosmwasm-std MSRV) and one for the virtual machine +executing contracts (cosmwasm-vm MSRV). The other packages belong to one of the +two: + +| Crate | MSRV | +| ---------------- | ----------------- | +| cosmwasm-crypto | cosmwasm-std MSRV | +| cosmwasm-derive | cosmwasm-std MSRV | +| cosmwasm-schema | cosmwasm-std MSRV | +| cosmwasm-std | cosmwasm-std MSRV | +| cosmwasm-storage | cosmwasm-std MSRV | +| cosmwasm-vm | cosmwasm-vm MSRV | + +The reason for this is that cosmwasm-std has a wider audience than cosmwasm-vm +and we try to change the MSRV less frequently, allowing contract developers to +pick their favourite compiler version without getting disrupted. Another reason +is that cosmwasm-vm depends on [Wasmer], which bump their MSRV frequently. +Please note that as soon as you start using integration tests for contract +development, you will depends on the cosmwasm-vm MSRV. + +[wasmer]: https://github.com/wasmerio/wasmer + +## Latest changes + +| Version | cosmwasm-std MSRV | cosmwasm-vm MSRV | Notes | +| ------- | ----------------- | ---------------- | -------------------------------- | +| 0.14.0 | 1.51.0 | 1.51.0 | Added support for const generics | +| 0.13.2 | 1.47.0 | 1.48.0 | Through [Wasmer 1.0.1] | +| 0.13.0 | 1.47.0 | 1.47.0 | | +| 0.11.0 | 1.45.2 | 1.45.2 | | + +[wasmer 1.0.1]: + https://github.com/wasmerio/wasmer/blob/master/CHANGELOG.md#101---2021-01-12 + +## Policy + +**cosmwasm-std MSRV** + +- Is always be at least one minor version behind latest stable. E.g. with stable + Rust 1.33.3 it must not exceed 1.32.0. +- Can be bumped without a semver major release. However, a minor version bump is + required. + +**cosmwasm-vm MSRV** + +- Can be bumped without a semver major release. However, a minor version bump is + required. +- Is always higher or equal to cosmwasm-std MSRV because the VM depends on + cosmwasm-std and related packages. From 051c61846e96c969539b2c441148ff68f536721a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 2 Aug 2021 16:55:37 +0200 Subject: [PATCH 300/402] Turn bullet points into real sentences --- docs/MSRV.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/MSRV.md b/docs/MSRV.md index 9c47c15ec..012d343f1 100644 --- a/docs/MSRV.md +++ b/docs/MSRV.md @@ -39,14 +39,14 @@ development, you will depends on the cosmwasm-vm MSRV. **cosmwasm-std MSRV** -- Is always be at least one minor version behind latest stable. E.g. with stable - Rust 1.33.3 it must not exceed 1.32.0. -- Can be bumped without a semver major release. However, a minor version bump is - required. +- It must always be at least one minor version behind latest stable. E.g. with + stable Rust 1.33.3 it must not exceed 1.32.0. +- It can be bumped without a semver major release of the crates. However, a + minor version bump is required. **cosmwasm-vm MSRV** -- Can be bumped without a semver major release. However, a minor version bump is - required. -- Is always higher or equal to cosmwasm-std MSRV because the VM depends on +- It can be bumped without a semver major release of the crate. However, a minor + version bump is required. +- It is always higher or equal to cosmwasm-std MSRV because the VM depends on cosmwasm-std and related packages. From f7f4b8535939bc22ddbd15167e930034e8ac8943 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Aug 2021 15:55:42 +0200 Subject: [PATCH 301/402] Implement exported_function_names for both Wasmer and parity --- packages/vm/src/compatibility.rs | 4 +- packages/vm/src/static_analysis.rs | 162 +++++++++++++++++++++++++---- 2 files changed, 145 insertions(+), 21 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index dcacfda0d..0318252dc 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -5,7 +5,7 @@ use std::collections::HashSet; use crate::errors::{VmError, VmResult}; use crate::features::required_features_from_module; use crate::limited::LimitedDisplay; -use crate::static_analysis::{deserialize_wasm, exported_functions}; +use crate::static_analysis::{deserialize_wasm, ExportInfo}; /// Lists all imports we provide upon instantiating the instance in Instance::from_module() /// This should be updated when new imports are added @@ -87,7 +87,7 @@ fn check_wasm_memories(module: &Module) -> VmResult<()> { } fn check_wasm_exports(module: &Module) -> VmResult<()> { - let available_exports: HashSet = exported_functions(module); + 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!( diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 085a5d683..748d6cbd1 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -21,26 +21,62 @@ pub fn deserialize_wasm(wasm_code: &[u8]) -> VmResult { }) } -pub fn exported_functions(module: &Module) -> HashSet { - module - .export_section() - .map_or(HashSet::default(), |export_section| { - export_section - .entries() - .iter() - .filter_map(|entry| match entry.internal() { - Internal::Function(_) => Some(entry.field().to_string()), - _ => None, - }) - .collect() - }) +/// 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; +} + +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 wasmer::Module { + fn exported_function_names(&self, prefix: Option<&str>) -> HashSet { + self.exports() + .functions() + .filter_map(|function_export| { + let name = function_export.name(); + if let Some(required_prefix) = prefix { + if name.starts_with(required_prefix) { + Some(name.to_string()) + } else { + None + } + } else { + Some(name.to_string()) + } + }) + .collect() + } } /// 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: &Module) -> bool { - let available_exports = exported_functions(module); +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)) @@ -51,6 +87,7 @@ mod tests { use super::*; use parity_wasm::elements::Internal; use std::iter::FromIterator; + use wasmer::{Cranelift, Store, Universal}; static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); static CORRUPTED: &[u8] = include_bytes!("../testdata/corrupted.wasm"); @@ -88,10 +125,37 @@ mod tests { } #[test] - fn exported_functions_works() { + 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 exports = module.exported_function_names(None); + assert_eq!(exports, HashSet::new()); + + let wasm = wat::parse_str( + r#"(module + (memory 3) + (export "memory" (memory 0)) + + (type (func)) + (func (type 0) nop) + (export "foo" (func 0)) + (export "bar" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); + let exports = module.exported_function_names(None); + assert_eq!( + exports, + HashSet::from_iter(vec!["foo".to_string(), "bar".to_string()]) + ); + } + + #[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 exports = exported_functions(&module); + let exports = module.exported_function_names(Some("b")); assert_eq!(exports, HashSet::new()); let wasm = wat::parse_str( @@ -103,14 +167,74 @@ mod tests { (func (type 0) nop) (export "foo" (func 0)) (export "bar" (func 0)) + (export "baz" (func 0)) )"#, ) .unwrap(); let module = deserialize_wasm(&wasm).unwrap(); - let exports = exported_functions(&module); + let exports = module.exported_function_names(Some("b")); + assert_eq!( + exports, + HashSet::from_iter(vec!["bar".to_string(), "baz".to_string()]) + ); + } + + #[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 exports = module.exported_function_names(None); + assert_eq!(exports, HashSet::new()); + + let wasm = wat::parse_str( + r#"(module + (memory 3) + (export "memory" (memory 0)) + + (type (func)) + (func (type 0) nop) + (export "foo" (func 0)) + (export "bar" (func 0)) + )"#, + ) + .unwrap(); + let store = Store::new(&Universal::new(Cranelift::default()).engine()); + let module = wasmer::Module::new(&store, wasm).unwrap(); + let exports = module.exported_function_names(None); + assert_eq!( + exports, + HashSet::from_iter(vec!["foo".to_string(), "bar".to_string()]) + ); + } + + #[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 exports = module.exported_function_names(Some("b")); + assert_eq!(exports, HashSet::new()); + + let wasm = wat::parse_str( + r#"(module + (memory 3) + (export "memory" (memory 0)) + + (type (func)) + (func (type 0) nop) + (export "foo" (func 0)) + (export "bar" (func 0)) + (export "baz" (func 0)) + )"#, + ) + .unwrap(); + let store = Store::new(&Universal::new(Cranelift::default()).engine()); + let module = wasmer::Module::new(&store, wasm).unwrap(); + let exports = module.exported_function_names(Some("b")); assert_eq!( exports, - HashSet::from_iter(vec!["foo".to_string(), "bar".to_string(),]) + HashSet::from_iter(vec!["bar".to_string(), "baz".to_string()]) ); } From 33e3add16c5ea92adfd68672c15cf82ab9117eef Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Aug 2021 16:08:37 +0200 Subject: [PATCH 302/402] Use exported_function_names in required_features_from_module --- packages/vm/src/features.rs | 54 +++++++++++++------------------------ 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/packages/vm/src/features.rs b/packages/vm/src/features.rs index daeb9fffa..eb7b8817a 100644 --- a/packages/vm/src/features.rs +++ b/packages/vm/src/features.rs @@ -1,6 +1,7 @@ -use parity_wasm::elements::{Internal, Module}; use std::collections::HashSet; -use wasmer::{ExternType, Instance as WasmerInstance}; +use wasmer::Instance as WasmerInstance; + +use crate::static_analysis::ExportInfo; const REQUIRES_PREFIX: &str = "requires_"; @@ -15,47 +16,30 @@ pub fn features_from_csv(csv: &str) -> HashSet { pub fn required_features_from_wasmer_instance(wasmer_instance: &WasmerInstance) -> HashSet { let module = wasmer_instance.module(); - module - .exports() - .filter_map(|export| { - if let ExternType::Function { .. } = export.ty() { - let name = export.name(); - if name.starts_with(REQUIRES_PREFIX) && name.len() > REQUIRES_PREFIX.len() { - let required_feature = name.to_string().split_off(REQUIRES_PREFIX.len()); - return Some(required_feature); - } - } - None - }) - .collect() + required_features_from_module(module) } /// 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_features_from_module(module: &Module) -> HashSet { - match module.export_section() { - None => HashSet::new(), - Some(export_section) => export_section - .entries() - .iter() - .filter_map(|entry| { - if let Internal::Function(_) = entry.internal() { - let name = entry.field(); - if name.starts_with(REQUIRES_PREFIX) && name.len() > REQUIRES_PREFIX.len() { - let (_, required_feature) = name.split_at(REQUIRES_PREFIX.len()); - return Some(required_feature.to_string()); - } - } +pub fn required_features_from_module(module: &impl ExportInfo) -> HashSet { + module + .exported_function_names(Some(REQUIRES_PREFIX)) + .into_iter() + .filter_map(|name| { + if name.len() > REQUIRES_PREFIX.len() { + let (_, required_feature) = name.split_at(REQUIRES_PREFIX.len()); + Some(required_feature.to_string()) + } else { None - }) - .collect(), - } + } + }) + .collect() } #[cfg(test)] mod tests { use super::*; - use parity_wasm::elements::deserialize_buffer; + use crate::static_analysis::deserialize_wasm; #[test] fn features_from_csv_works() { @@ -95,7 +79,7 @@ mod tests { )"#, ) .unwrap(); - let module = deserialize_buffer(&wasm).unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); let required_features = required_features_from_module(&module); assert_eq!(required_features.len(), 3); @@ -107,7 +91,7 @@ mod tests { #[test] fn required_features_from_module_works_without_exports_section() { let wasm = wat::parse_str(r#"(module)"#).unwrap(); - let module = deserialize_buffer(&wasm).unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); let required_features = required_features_from_module(&module); assert_eq!(required_features.len(), 0); } From 0110c7837d2006a89c0321f553e9ad644a649b54 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Aug 2021 16:10:52 +0200 Subject: [PATCH 303/402] Inline required_features_from_wasmer_instance --- packages/vm/src/features.rs | 6 ------ packages/vm/src/instance.rs | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/vm/src/features.rs b/packages/vm/src/features.rs index eb7b8817a..4de16d0c9 100644 --- a/packages/vm/src/features.rs +++ b/packages/vm/src/features.rs @@ -1,5 +1,4 @@ use std::collections::HashSet; -use wasmer::Instance as WasmerInstance; use crate::static_analysis::ExportInfo; @@ -14,11 +13,6 @@ pub fn features_from_csv(csv: &str) -> HashSet { .collect() } -pub fn required_features_from_wasmer_instance(wasmer_instance: &WasmerInstance) -> HashSet { - let module = wasmer_instance.module(); - required_features_from_module(module) -} - /// 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_features_from_module(module: &impl ExportInfo) -> HashSet { diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index b1ec320a6..89a6ddbf8 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -7,7 +7,7 @@ use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::conversion::{ref_to_u32, to_u32}; use crate::environment::Environment; use crate::errors::{CommunicationError, VmError, VmResult}; -use crate::features::required_features_from_wasmer_instance; +use crate::features::required_features_from_module; use crate::imports::{ 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, @@ -207,7 +207,7 @@ where }, )?); - let required_features = required_features_from_wasmer_instance(wasmer_instance.as_ref()); + let required_features = required_features_from_module(wasmer_instance.module()); let instance_ptr = NonNull::from(wasmer_instance.as_ref()); env.set_wasmer_instance(Some(instance_ptr)); env.set_gas_left(gas_limit); From 6715af969b54e6b26d72cb567773c1aaea84bc94 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Aug 2021 17:55:03 +0200 Subject: [PATCH 304/402] Change Instance::required_features --- CHANGELOG.md | 2 ++ contracts/hackatom/tests/integration.rs | 2 +- contracts/staking/tests/integration.rs | 4 ++-- packages/vm/src/instance.rs | 22 ++++++++++++++-------- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96e20d5d8..0eef57a1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,6 +66,8 @@ and this project adheres to 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. [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 diff --git a/contracts/hackatom/tests/integration.rs b/contracts/hackatom/tests/integration.rs index 055bcc2a1..7f13e484e 100644 --- a/contracts/hackatom/tests/integration.rs +++ b/contracts/hackatom/tests/integration.rs @@ -53,7 +53,7 @@ fn make_init_msg() -> (InstantiateMsg, String) { #[test] fn proper_initialization() { let mut deps = mock_instance(WASM, &[]); - assert_eq!(deps.required_features.len(), 0); + assert_eq!(deps.required_features().len(), 0); let verifier = String::from("verifies"); let beneficiary = String::from("benefits"); diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index 102eff94f..c638be08f 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -86,8 +86,8 @@ fn proper_initialization() { ); let (instance_options, memory_limit) = mock_instance_options(); let mut deps = Instance::from_code(WASM, backend, instance_options, memory_limit).unwrap(); - assert_eq!(deps.required_features.len(), 1); - assert!(deps.required_features.contains("staking")); + assert_eq!(deps.required_features().len(), 1); + assert!(deps.required_features().contains("staking")); let creator = String::from("creator"); let msg = InstantiateMsg { diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 89a6ddbf8..39a89ca1d 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -46,7 +46,6 @@ pub struct Instance { /// This instance should only be accessed via the Environment, which provides safe access. _inner: Box, env: Environment, - pub required_features: HashSet, } impl Instance @@ -207,7 +206,6 @@ where }, )?); - let required_features = required_features_from_module(wasmer_instance.module()); let instance_ptr = NonNull::from(wasmer_instance.as_ref()); env.set_wasmer_instance(Some(instance_ptr)); env.set_gas_left(gas_limit); @@ -215,7 +213,6 @@ where let instance = Instance { _inner: wasmer_instance, env, - required_features, }; Ok(instance) } @@ -239,6 +236,15 @@ 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 + /// only kept because it can be handy for integration testing. + pub fn required_features(&self) -> HashSet { + required_features_from_module(self._inner.module()) + } + /// Returns the size of the default memory in pages. /// 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 @@ -357,7 +363,7 @@ mod tests { let (instance_options, memory_limit) = mock_instance_options(); let instance = Instance::from_code(CONTRACT, backend, instance_options, memory_limit).unwrap(); - assert_eq!(instance.required_features.len(), 0); + assert_eq!(instance.required_features().len(), 0); } #[test] @@ -379,10 +385,10 @@ mod tests { let backend = mock_backend(&[]); let (instance_options, memory_limit) = mock_instance_options(); let instance = Instance::from_code(&wasm, backend, instance_options, memory_limit).unwrap(); - assert_eq!(instance.required_features.len(), 3); - assert!(instance.required_features.contains("nutrients")); - assert!(instance.required_features.contains("sun")); - assert!(instance.required_features.contains("water")); + assert_eq!(instance.required_features().len(), 3); + assert!(instance.required_features().contains("nutrients")); + assert!(instance.required_features().contains("sun")); + assert!(instance.required_features().contains("water")); } #[test] From f3a3f7bfa1adfcf3d33c0803d5259f3b3e75bdae Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 3 Aug 2021 18:17:42 +0200 Subject: [PATCH 305/402] Add required_features field to AnalysisReport --- CHANGELOG.md | 2 ++ packages/vm/src/cache.rs | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0eef57a1d..1c7bf1c14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,8 @@ and this project adheres to 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`. [#995]: https://github.com/CosmWasm/cosmwasm/pull/995 diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index da9ffac06..81d27a62b 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -9,6 +9,7 @@ use crate::backend::{Backend, BackendApi, Querier, Storage}; use crate::checksum::Checksum; use crate::compatibility::check_wasm; use crate::errors::{VmError, VmResult}; +use crate::features::required_features_from_module; use crate::instance::{Instance, InstanceOptions}; use crate::modules::{FileSystemCache, InMemoryCache, PinnedMemoryCache}; use crate::size::Size; @@ -72,8 +73,10 @@ pub struct Cache { type_querier: PhantomData, } +#[derive(PartialEq, Debug)] pub struct AnalysisReport { pub has_ibc_entry_points: bool, + pub required_features: HashSet, } impl Cache @@ -185,6 +188,7 @@ where let module = deserialize_wasm(&wasm)?; Ok(AnalysisReport { has_ibc_entry_points: has_ibc_entry_points(&module), + required_features: required_features_from_module(&module), }) } @@ -355,6 +359,7 @@ mod tests { use cosmwasm_std::{coins, Empty}; use std::fs::OpenOptions; use std::io::Write; + use std::iter::FromIterator; use tempfile::TempDir; const TESTING_GAS_LIMIT: u64 = 4_000_000; @@ -366,6 +371,7 @@ mod tests { const TESTING_MEMORY_CACHE_SIZE: Size = Size::mebi(200); static CONTRACT: &[u8] = include_bytes!("../testdata/hackatom.wasm"); + static IBC_CONTRACT: &[u8] = include_bytes!("../testdata/ibc_reflect.wasm"); fn default_features() -> HashSet { features_from_csv("staking") @@ -380,6 +386,15 @@ mod tests { } } + fn make_stargate_testing_options() -> CacheOptions { + CacheOptions { + base_dir: TempDir::new().unwrap().into_path(), + supported_features: features_from_csv("staking,stargate"), + memory_cache_size: TESTING_MEMORY_CACHE_SIZE, + instance_memory_limit: TESTING_MEMORY_LIMIT, + } + } + #[test] fn save_wasm_works() { let cache: Cache = @@ -943,6 +958,35 @@ mod tests { assert_eq!(code, loaded); } + #[test] + fn analyze_works() { + let cache: Cache = + unsafe { Cache::new(make_stargate_testing_options()).unwrap() }; + + let checksum1 = cache.save_wasm(CONTRACT).unwrap(); + let report1 = cache.analyze(&checksum1).unwrap(); + assert_eq!( + report1, + AnalysisReport { + has_ibc_entry_points: false, + required_features: HashSet::new(), + } + ); + + let checksum2 = cache.save_wasm(IBC_CONTRACT).unwrap(); + let report2 = cache.analyze(&checksum2).unwrap(); + assert_eq!( + report2, + AnalysisReport { + has_ibc_entry_points: true, + required_features: HashSet::from_iter(vec![ + "staking".to_string(), + "stargate".to_string() + ]), + } + ); + } + #[test] fn pin_unpin_works() { let cache = unsafe { Cache::new(make_testing_options()).unwrap() }; From ac25bdb5d941aa6ff53335c1c3903a05475e8ac0 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 10:24:37 +0200 Subject: [PATCH 306/402] Pull out check_interface_version check --- CHANGELOG.md | 3 + packages/vm/src/compatibility.rs | 153 ++++++++++++++++++++++++++----- 2 files changed, 131 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c7bf1c14..8d2f0a915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,9 @@ and this project adheres to 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 diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 0318252dc..cfba9071e 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -30,12 +30,14 @@ const SUPPORTED_IMPORTS: &[&str] = &[ /// Lists all entry points we expect to be present when calling a contract. /// Other optional exports exist, e.g. "execute", "migrate" and "query". +/// The marker export interface_version_* is checked separately. /// This is unlikely to change much, must be frozen at 1.0 to avoid breaking existing contracts const REQUIRED_EXPORTS: &[&str] = &[ - "interface_version_7", - "instantiate", + // IO "allocate", "deallocate", + // Required entry points + "instantiate", ]; const MEMORY_LIMIT: u32 = 512; // in pages @@ -44,6 +46,7 @@ const MEMORY_LIMIT: u32 = 512; // in pages pub fn check_wasm(wasm_code: &[u8], supported_features: &HashSet) -> VmResult<()> { let module = deserialize_wasm(wasm_code)?; check_wasm_memories(&module)?; + check_interface_version(&module)?; check_wasm_exports(&module)?; check_wasm_imports(&module, SUPPORTED_IMPORTS)?; check_wasm_features(&module, supported_features)?; @@ -86,6 +89,42 @@ fn check_wasm_memories(module: &Module) -> VmResult<()> { Ok(()) } +fn check_interface_version(module: &Module) -> VmResult<()> { + let mut interface_version_exports: Vec = module + .exported_function_names(Some("interface_version_")) + .into_iter() + .collect(); + if let Some(interface_version_export) = interface_version_exports.pop() { + if !interface_version_exports.is_empty() { + Err(VmError::static_validation_err( + "Wasm contract contains more than one marker export: interface_version_*", + )) + } else { + // Exactly one interface version found + + match interface_version_export.as_str() { + // Ok + "interface_version_7" => Ok(()), + // Well known old versions for better error messages + "interface_version_6" => Err(VmError::static_validation_err( + "Wasm contract has incompatible CosmWasm 0.15 marker export interface_version_6 (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)" + )), + "interface_version_5" => Err(VmError::static_validation_err( + "Wasm contract has incompatible CosmWasm 0.14 marker export interface_version_5 (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)" + )), + // Unknown version + _ => Err(VmError::static_validation_err( + "Wasm contract has unknown interface_version_* marker export (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)", + )), + } + } + } else { + Err(VmError::static_validation_err( + "Wasm contract missing a required marker export: interface_version_*", + )) + } +} + fn check_wasm_exports(module: &Module) -> VmResult<()> { let available_exports: HashSet = module.exported_function_names(None); for required_export in REQUIRED_EXPORTS { @@ -153,6 +192,9 @@ mod tests { static CONTRACT_0_6: &[u8] = include_bytes!("../testdata/hackatom_0.6.wasm"); 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"); fn default_features() -> HashSet { @@ -167,18 +209,47 @@ mod tests { #[test] fn check_wasm_old_contract() { + match check_wasm(CONTRACT_0_15, &default_features()) { + Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( + msg, + "Wasm contract has incompatible CosmWasm 0.15 marker export interface_version_6 (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)" + ), + Err(e) => panic!("Unexpected error {:?}", e), + Ok(_) => panic!("This must not succeeed"), + }; + + match check_wasm(CONTRACT_0_14, &default_features()) { + Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( + msg, + "Wasm contract has incompatible CosmWasm 0.14 marker export interface_version_5 (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)" + ), + Err(e) => panic!("Unexpected error {:?}", e), + Ok(_) => panic!("This must not succeeed"), + }; + + match check_wasm(CONTRACT_0_12, &default_features()) { + Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( + msg, + "Wasm contract missing a required marker export: interface_version_*" + ), + Err(e) => panic!("Unexpected error {:?}", e), + Ok(_) => panic!("This must not succeeed"), + }; + match check_wasm(CONTRACT_0_7, &default_features()) { - Err(VmError::StaticValidationErr { msg, .. }) => assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_7\"" - )), + Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( + msg, + "Wasm contract missing a required marker export: interface_version_*" + ), Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("This must not succeeed"), }; match check_wasm(CONTRACT_0_6, &default_features()) { - Err(VmError::StaticValidationErr { msg, .. }) => assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_7\"" - )), + Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( + msg, + "Wasm contract missing a required marker export: interface_version_*" + ), Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("This must not succeeed"), }; @@ -276,23 +347,55 @@ mod tests { #[test] fn check_wasm_exports_works() { + // valid + let wasm = wat::parse_str( + r#"(module + (type (func)) + (func (type 0) nop) + (export "add_one" (func 0)) + (export "allocate" (func 0)) + (export "deallocate" (func 0)) + (export "instantiate" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); + check_wasm_exports(&module).unwrap(); + + // this is invalid, as it doesn't any required export + let wasm = wat::parse_str( + r#"(module + (type (func)) + (func (type 0) nop) + (export "add_one" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); + match check_wasm_exports(&module) { + Err(VmError::StaticValidationErr { msg, .. }) => { + assert!(msg.starts_with("Wasm contract doesn't have required export: \"allocate\"")); + } + Err(e) => panic!("Unexpected error {:?}", e), + Ok(_) => panic!("Didn't reject wasm with invalid api"), + } + // this is invalid, as it doesn't contain all required exports - const WAT_MISSING_EXPORTS: &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)) - "#; - let wasm_missing_exports = wat::parse_str(WAT_MISSING_EXPORTS).unwrap(); - - let module = deserialize_wasm(&wasm_missing_exports).unwrap(); + let wasm = wat::parse_str( + r#"(module + (type (func)) + (func (type 0) nop) + (export "add_one" (func 0)) + (export "allocate" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { - assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_7\"" - )); + assert!( + msg.starts_with("Wasm contract doesn't have required export: \"deallocate\"") + ); } Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("Didn't reject wasm with invalid api"), @@ -304,9 +407,9 @@ mod tests { let module = deserialize_wasm(CONTRACT_0_7).unwrap(); match check_wasm_exports(&module) { Err(VmError::StaticValidationErr { msg, .. }) => { - assert!(msg.starts_with( - "Wasm contract doesn't have required export: \"interface_version_7\"" - )); + 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"), From ad4d5c34dccd4cdf8db696b33d4c82bd990f84e7 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 10:25:44 +0200 Subject: [PATCH 307/402] Remove too old test contract --- packages/vm/src/compatibility.rs | 10 ---------- packages/vm/testdata/hackatom_0.6.wasm | Bin 66907 -> 0 bytes 2 files changed, 10 deletions(-) delete mode 100644 packages/vm/testdata/hackatom_0.6.wasm diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index cfba9071e..655d98245 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -190,7 +190,6 @@ mod tests { use super::*; use crate::errors::VmError; - static CONTRACT_0_6: &[u8] = include_bytes!("../testdata/hackatom_0.6.wasm"); 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"); @@ -244,15 +243,6 @@ mod tests { Err(e) => panic!("Unexpected error {:?}", e), Ok(_) => panic!("This must not succeeed"), }; - - match check_wasm(CONTRACT_0_6, &default_features()) { - Err(VmError::StaticValidationErr { msg, .. }) => assert_eq!( - msg, - "Wasm contract missing a required marker export: interface_version_*" - ), - Err(e) => panic!("Unexpected error {:?}", e), - Ok(_) => panic!("This must not succeeed"), - }; } #[test] diff --git a/packages/vm/testdata/hackatom_0.6.wasm b/packages/vm/testdata/hackatom_0.6.wasm deleted file mode 100644 index cf773511db60d90b48c08d89ac53bd4f80ddc3db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66907 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 From 32fda1f9cef6d1c45ea2798967b6f5d7ebe520b1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 10:27:20 +0200 Subject: [PATCH 308/402] Update compatibility table for CosmWasm 0.16 --- packages/vm/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vm/README.md b/packages/vm/README.md index b987806b3..8c033a5c4 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -16,7 +16,8 @@ compatibility list: | cosmwasm-vm | Supported interface versions | cosmwasm-std | | ----------- | ---------------------------- | ------------ | -| 1.0 | `interface_version_7` | 1.0 | +| 1.0 | TBD | 1.0 | +| 0.16 | `interface_version_7` | 0.16 | | 0.15 | `interface_version_6` | 0.15 | | 0.14 | `interface_version_5` | 0.14 | | 0.13 | `cosmwasm_vm_version_4` | 0.11-0.13 | From d018775ba1d23344f280ac692226486cfbf0c147 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 10:35:58 +0200 Subject: [PATCH 309/402] Pull out INTERFACE_VERSION_PREFIX and SUPPORTED_INTERFACE_VERSION --- packages/vm/src/compatibility.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 655d98245..98237c06a 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -40,6 +40,11 @@ const REQUIRED_EXPORTS: &[&str] = &[ "instantiate", ]; +const INTERFACE_VERSION_PREFIX: &str = "interface_version_"; +/// Only one version is supported right now. This could potentially turn into a list +/// later, but maybe this never happens and new functionality is only added via features. +const SUPPORTED_INTERFACE_VERSION: &str = "interface_version_7"; + const MEMORY_LIMIT: u32 = 512; // in pages /// Checks if the data is valid wasm and compatibility with the CosmWasm API (imports and exports) @@ -91,7 +96,7 @@ fn check_wasm_memories(module: &Module) -> VmResult<()> { fn check_interface_version(module: &Module) -> VmResult<()> { let mut interface_version_exports: Vec = module - .exported_function_names(Some("interface_version_")) + .exported_function_names(Some(INTERFACE_VERSION_PREFIX)) .into_iter() .collect(); if let Some(interface_version_export) = interface_version_exports.pop() { @@ -104,7 +109,7 @@ fn check_interface_version(module: &Module) -> VmResult<()> { match interface_version_export.as_str() { // Ok - "interface_version_7" => Ok(()), + SUPPORTED_INTERFACE_VERSION => Ok(()), // Well known old versions for better error messages "interface_version_6" => Err(VmError::static_validation_err( "Wasm contract has incompatible CosmWasm 0.15 marker export interface_version_6 (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)" From 79a7595369d548d286f5fd7dbae2a652973c637d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 10:58:56 +0200 Subject: [PATCH 310/402] Remove misleading hint from error message --- 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 98237c06a..9ed25d973 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -135,7 +135,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: {:?}. Contract version too old for this VM?", + "Wasm contract doesn't have required export: \"{}\". Exports required by VM: {:?}.", required_export, REQUIRED_EXPORTS ))); } From d33a3afbfe95fed0d5d9b3c916b9eeac39778e30 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Aug 2021 11:01:38 +0200 Subject: [PATCH 311/402] Switch to loupe to estimate the module size in bytes --- packages/vm/Cargo.toml | 2 +- packages/vm/src/modules/file_system_cache.rs | 24 ++++++-------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/packages/vm/Cargo.toml b/packages/vm/Cargo.toml index 614e870b5..0a4097c15 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -47,7 +47,7 @@ sha2 = "0.9.1" thiserror = "1.0" wasmer = { version = "2.0.0", default-features = false, features = ["cranelift", "universal", "singlepass"] } wasmer-middlewares = "2.0.0" -loupe = "0.1.2" +loupe = "0.1.3" # Wasmer git/local (used for quick local debugging or patching) # wasmer = { git = "https://github.com/wasmerio/wasmer", rev = "1.0.2", default-features = false, features = ["jit", "singlepass"] } diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index dcd25fd48..0dd1ab9ba 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -64,8 +64,7 @@ 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. + /// Uses loupe to get a value for the module size (artifact + store) in bytes. pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { let filename = checksum.to_hex(); let file_path = self.latest_modules_path().join(filename); @@ -73,13 +72,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 = loupe::size_of_val(&module); + Ok(Some((module, module_size))) } Err(DeserializeError::Io(err)) => match err.kind() { io::ErrorKind::NotFound => Ok(None), @@ -96,8 +90,7 @@ 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. + /// Uses loupe to get a value for the module size (artifact + store) in bytes. pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult { let modules_dir = self.latest_modules_path(); fs::create_dir_all(&modules_dir) @@ -107,11 +100,8 @@ impl FileSystemCache { module .serialize_to_file(path.clone()) .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 = loupe::size_of_val(&module); + Ok(module_size) } /// The path to the latest version of the modules. @@ -168,7 +158,7 @@ mod tests { // 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()); + assert!(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 4be12cc9a1068feb910e1dba07d1030408df921d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Aug 2021 11:09:27 +0200 Subject: [PATCH 312/402] Add loupe to module_size reporting --- packages/vm/examples/module_size.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index 8f489f993..cdc83d116 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -11,7 +11,7 @@ use wasmer::Module; pub fn main() { let matches = App::new("Module size estimation") - .version("0.0.2") + .version("0.0.3") .author("Mauro Lacy ") .arg( Arg::with_name("WASM") @@ -41,6 +41,10 @@ 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); @@ -53,6 +57,10 @@ 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 From 1e819399c2969f973fe15e8db85d584da2358a29 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Aug 2021 11:11:45 +0200 Subject: [PATCH 313/402] Add clarifying comment --- packages/vm/examples/module_size.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/vm/examples/module_size.sh b/packages/vm/examples/module_size.sh index 55f352858..80ed757a4 100755 --- a/packages/vm/examples/module_size.sh +++ b/packages/vm/examples/module_size.sh @@ -1,5 +1,8 @@ #!/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 +# of the module significanty. +# Use loupe::size_of_val instead, to get a better estimation. set -e MAX_SNAPSHOTS=1000 From c1dec354ebe9209936f94313839a77017260b76f Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Aug 2021 11:16:21 +0200 Subject: [PATCH 314/402] Fix clippy warning --- 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 0dd1ab9ba..97a45e490 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -98,7 +98,7 @@ 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 = loupe::size_of_val(&module); Ok(module_size) From 2cd5fe70816424dbb48b78bbff0fdc725d503d26 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 4 Aug 2021 11:43:40 +0200 Subject: [PATCH 315/402] Move module_size out of fs_cache --- packages/vm/src/cache.rs | 12 ++++++++---- packages/vm/src/modules/file_system_cache.rs | 17 +++++------------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/vm/src/cache.rs b/packages/vm/src/cache.rs index 81d27a62b..775cd574a 100644 --- a/packages/vm/src/cache.rs +++ b/packages/vm/src/cache.rs @@ -214,8 +214,9 @@ where // 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)? { + if let Some(module) = cache.fs_cache.load(checksum, &store)? { cache.stats.hits_fs_cache += 1; + let module_size = loupe::size_of_val(&module); return cache .pinned_memory_cache .store(checksum, module, module_size); @@ -225,7 +226,8 @@ 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 - let module_size = cache.fs_cache.store(checksum, &module)?; + cache.fs_cache.store(checksum, &module)?; + let module_size = loupe::size_of_val(&module); cache .pinned_memory_cache .store(checksum, module, module_size) @@ -274,10 +276,11 @@ 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)? { + if let Some(module) = cache.fs_cache.load(checksum, &store)? { cache.stats.hits_fs_cache += 1; let instance = Instance::from_module(&module, backend, options.gas_limit, options.print_debug)?; + let module_size = loupe::size_of_val(&module); cache.memory_cache.store(checksum, module, module_size)?; return Ok(instance); } @@ -292,7 +295,8 @@ where let module = compile(&wasm, Some(cache.instance_memory_limit))?; let instance = Instance::from_module(&module, backend, options.gas_limit, options.print_debug)?; - let module_size = cache.fs_cache.store(checksum, &module)?; + cache.fs_cache.store(checksum, &module)?; + let module_size = loupe::size_of_val(&module); cache.memory_cache.store(checksum, module, module_size)?; Ok(instance) } diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 97a45e490..1fc8b4b9f 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -64,17 +64,13 @@ 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. - /// Uses loupe to get a value for the module size (artifact + store) in bytes. - pub fn load(&self, checksum: &Checksum, store: &Store) -> VmResult> { + 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) }; match result { - Ok(module) => { - let module_size = loupe::size_of_val(&module); - Ok(Some((module, module_size))) - } + Ok(module) => Ok(Some(module)), Err(DeserializeError::Io(err)) => match err.kind() { io::ErrorKind::NotFound => Ok(None), _ => Err(VmError::cache_err(format!( @@ -90,8 +86,7 @@ impl FileSystemCache { } /// Stores a serialized module to the file system. Returns the size of the serialized module. - /// Uses loupe to get a value for the module size (artifact + store) in bytes. - pub fn store(&mut self, checksum: &Checksum, module: &Module) -> VmResult { + 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)))?; @@ -100,8 +95,7 @@ impl FileSystemCache { module .serialize_to_file(path) .map_err(|e| VmError::cache_err(format!("Error writing module to disk: {}", e)))?; - let module_size = loupe::size_of_val(&module); - Ok(module_size) + Ok(()) } /// The path to the latest version of the modules. @@ -157,8 +151,7 @@ mod tests { // 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!(module_size > module.serialize().unwrap().len()); + let cached_module = cached.unwrap(); let import_object = imports! {}; let instance = WasmerInstance::new(&cached_module, &import_object).unwrap(); set_remaining_points(&instance, TESTING_GAS_LIMIT); From 25b08d09351bf45ae4f2202851e1868cb4de2b12 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 12:05:31 +0200 Subject: [PATCH 316/402] Add test check_interface_version_works --- packages/vm/src/compatibility.rs | 109 +++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index 9ed25d973..aa621985f 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -340,6 +340,115 @@ mod tests { } } + #[test] + fn check_interface_version_works() { + // valid + 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 = deserialize_wasm(&wasm).unwrap(); + check_interface_version(&module).unwrap(); + + // missing + let wasm = wat::parse_str( + r#"(module + (type (func)) + (func (type 0) nop) + (export "add_one" (func 0)) + (export "allocate" (func 0)) + (export "deallocate" (func 0)) + (export "instantiate" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); + match check_interface_version(&module).unwrap_err() { + VmError::StaticValidationErr { msg, .. } => { + assert_eq!( + msg, + "Wasm contract missing a required marker export: interface_version_*" + ); + } + err => panic!("Unexpected error {:?}", err), + } + + // multiple + 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 "interface_version_8" (func 0)) + (export "deallocate" (func 0)) + (export "instantiate" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); + match check_interface_version(&module).unwrap_err() { + VmError::StaticValidationErr { msg, .. } => { + assert_eq!( + msg, + "Wasm contract contains more than one marker export: interface_version_*" + ); + } + err => panic!("Unexpected error {:?}", err), + } + + // CosmWasm 0.15 + 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_6" (func 0)) + (export "deallocate" (func 0)) + (export "instantiate" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&wasm).unwrap(); + match check_interface_version(&module).unwrap_err() { + VmError::StaticValidationErr { msg, .. } => { + assert_eq!(msg, "Wasm contract has incompatible CosmWasm 0.15 marker export interface_version_6 (see https://github.com/CosmWasm/cosmwasm/blob/main/packages/vm/README.md)"); + } + err => panic!("Unexpected error {:?}", err), + } + + // Unknown value + 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_broken" (func 0)) + (export "deallocate" (func 0)) + (export "instantiate" (func 0)) + )"#, + ) + .unwrap(); + let module = deserialize_wasm(&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)"); + } + err => panic!("Unexpected error {:?}", err), + } + } + #[test] fn check_wasm_exports_works() { // valid From b8072def47a3865ec2cbaeac6170a0db642cdc22 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 11:58:56 +0200 Subject: [PATCH 317/402] Avoid unnecessary vector when working with iterator --- packages/vm/src/compatibility.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index aa621985f..c2ca76ae2 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -95,19 +95,18 @@ fn check_wasm_memories(module: &Module) -> VmResult<()> { } fn check_interface_version(module: &Module) -> VmResult<()> { - let mut interface_version_exports: Vec = module + let mut interface_version_exports = module .exported_function_names(Some(INTERFACE_VERSION_PREFIX)) - .into_iter() - .collect(); - if let Some(interface_version_export) = interface_version_exports.pop() { - if !interface_version_exports.is_empty() { + .into_iter(); + if let Some(first_interface_version_export) = interface_version_exports.next() { + if interface_version_exports.next().is_some() { Err(VmError::static_validation_err( "Wasm contract contains more than one marker export: interface_version_*", )) } else { // Exactly one interface version found - match interface_version_export.as_str() { + match first_interface_version_export.as_str() { // Ok SUPPORTED_INTERFACE_VERSION => Ok(()), // Well known old versions for better error messages From 67c69f9d68ba01ddfc6fc83063e014411197fcb4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 4 Aug 2021 12:19:40 +0200 Subject: [PATCH 318/402] Set version: 0.16.0-rc6 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 12 +++++++----- contracts/crypto-verify/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/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 87 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f5f5b458c..7b33ef289 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index f13d6b010..64f51dbf9 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -100,7 +102,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -111,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -126,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -140,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 0701a441c..eda88dbce 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -102,7 +104,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +115,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -128,7 +130,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +144,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -150,7 +152,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 8a754aa3a..21f0bec2e 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -89,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -115,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 520e4cb98..34ab60fa2 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -89,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -115,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 3e0eeca6f..6c8ffe695 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -89,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -115,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index a56753ffe..a63769a98 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -89,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -115,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index ba066f1c8..61ecfde46 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -89,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -115,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 8e0164903..8001477da 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -89,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -115,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index e07734cd0..be2a848d8 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.15.2" @@ -89,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "digest", "ed25519-zebra", @@ -100,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "schemars", "serde_json", @@ -115,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "base64", "cosmwasm-crypto", @@ -129,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "cosmwasm-std", "serde", @@ -137,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 85e1b4ce0..4aa4b51b3 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.0-rc5" +version = "0.16.0-rc6" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index c6cfeaef6..0cfb37785 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.0-rc5" +version = "0.16.0-rc6" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index dba107365..791c0ad0e 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.0-rc5" +version = "0.16.0-rc6" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index cb5b25b6b..b93ca1722 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.0-rc5" +version = "0.16.0-rc6" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -32,7 +32,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.0-rc5" } +cosmwasm-derive = { path = "../derive", version = "0.16.0-rc6" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -40,7 +40,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc5" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc6" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 01cadcde6..3fa22fef7 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.0-rc5" +version = "0.16.0-rc6" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.0-rc5", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.0-rc6", 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 0a4097c15..8ddaebb3b 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.0-rc5" +version = "0.16.0-rc6" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.0-rc5", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc5" } +cosmwasm-std = { path = "../std", version = "0.16.0-rc6", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc6" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From c14937849cedf7c70f85c15b90053bdcf01e8a1c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Aug 2021 15:04:27 +0200 Subject: [PATCH 319/402] Set version: 0.16.0 --- CHANGELOG.md | 5 ++++- Cargo.lock | 12 ++++++------ MIGRATING.md | 2 +- contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 18 files changed, 74 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d2f0a915..7853159dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [0.16.0] - 2021-08-05 + ### Added - cosmwasm-std: Added the `IbcChannelOpenMsg`, `IbcChannelConnectMsg`, @@ -1071,7 +1073,8 @@ Some main points: All future Changelog entries will reference this base -[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.15.2...HEAD +[unreleased]: https://github.com/CosmWasm/cosmwasm/compare/v0.16.0...HEAD +[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 diff --git a/Cargo.lock b/Cargo.lock index 7b33ef289..45af8a159 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clap", "clru", diff --git a/MIGRATING.md b/MIGRATING.md index f8ec8855d..e49f415d7 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,7 +4,7 @@ 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. -## 0.15 -> 0.16 (unreleased) +## 0.15 -> 0.16 - Update CosmWasm dependencies in Cargo.toml (skip the ones you don't use): diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 64f51dbf9..b3661e665 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -102,7 +102,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index eda88dbce..c19e423d5 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -104,7 +104,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -115,14 +115,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -130,7 +130,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -144,7 +144,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -152,7 +152,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 21f0bec2e..5ab518b6a 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 34ab60fa2..02337ea31 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index 6c8ffe695..f2bf323f4 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index a63769a98..30ae6b041 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 61ecfde46..43943a5d9 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 8001477da..45309fd16 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index be2a848d8..f66c2a6ec 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 4aa4b51b3..1b76a80c5 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.0-rc6" +version = "0.16.0" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 0cfb37785..09ef299d7 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.0-rc6" +version = "0.16.0" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index 791c0ad0e..c922f23ce 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.0-rc6" +version = "0.16.0" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index b93ca1722..39373269b 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.0-rc6" +version = "0.16.0" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -32,7 +32,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.0-rc6" } +cosmwasm-derive = { path = "../derive", version = "0.16.0" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -40,7 +40,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc6" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 3fa22fef7..7e00e4430 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.0-rc6" +version = "0.16.0" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.0-rc6", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.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 8ddaebb3b..b423f65bc 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.0-rc6" +version = "0.16.0" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.0-rc6", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.0-rc6" } +cosmwasm-std = { path = "../std", version = "0.16.0", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.0" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 992012d9e5e51c29401b00913ce2b8dd5f9ee2e9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 10 Aug 2021 17:52:17 +0200 Subject: [PATCH 320/402] Add `From` conversions for `Cow` --- CHANGELOG.md | 4 ++++ packages/std/src/addresses.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7853159dc..b7824ec32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to ## [Unreleased] +### Added + +- Added `From` and `From<&Addr>` conversions for `Cow`. + ## [0.16.0] - 2021-08-05 ### Added diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index 0a8cd6f26..f922c29df 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -2,6 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use std::borrow::Cow; use std::fmt; use std::ops::Deref; @@ -136,6 +137,18 @@ impl From<&Addr> for HumanAddr { } } +impl From for Cow<'_, Addr> { + fn from(addr: Addr) -> Self { + Cow::Owned(addr) + } +} + +impl<'a> From<&'a Addr> for Cow<'a, Addr> { + fn from(addr: &'a Addr) -> Self { + Cow::Borrowed(addr) + } +} + #[deprecated( since = "0.14.0", note = "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." @@ -623,4 +636,21 @@ mod tests { 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() + } + + #[test] + fn addr_into_cow() { + // owned Addr + let value = "wasmeucn0ur0ncny2308ry"; + let addr = Addr::unchecked(value); + + // pass by ref + assert_eq!(value, &flexible(&addr)); + // pass by value + assert_eq!(value, &flexible(addr)); + } } From 6650cba54cbefa51d669fac7324d85c6d18e00ee Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 10 Aug 2021 22:53:45 +0200 Subject: [PATCH 321/402] Parse contract address from instantiate event, not message event --- contracts/ibc-reflect/src/contract.rs | 8 +++----- contracts/ibc-reflect/tests/integration.rs | 4 +--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index a4493f7f4..c2ff44a18 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -43,11 +43,11 @@ pub fn reply(deps: DepsMut, _env: Env, reply: Reply) -> StdResult { } } -// see https://github.com/CosmWasm/wasmd/blob/408bba14a5c6d583abe32ffb235a364130136298/x/wasm/keeper/msg_server.go#L63-L69 +// updated with https://github.com/CosmWasm/wasmd/pull/586 (emitted in keeper.Instantiate) fn parse_contract_from_event(events: Vec) -> Option { events .into_iter() - .find(|e| e.ty == "message") + .find(|e| e.ty == "instantiate") .and_then(|ev| { ev.attributes .into_iter() @@ -355,9 +355,7 @@ mod tests { } fn fake_events(reflect_addr: &str) -> Vec { - let event = Event::new("message").add_attributes(vec![ - attr("module", "wasm"), - attr("signer", MOCK_CONTRACT_ADDR), + let event = Event::new("instantiate").add_attributes(vec![ attr("code_id", "17"), // We have to force this one to avoid the debug assertion against _ mock_wasmd_attr("_contract_address", reflect_addr), diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index b9adb9f9a..ca96bf135 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -60,9 +60,7 @@ fn setup() -> Instance { } fn fake_events(reflect_addr: &str) -> Vec { - let event = Event::new("message").add_attributes(vec![ - attr("module", "wasm"), - attr("signer", MOCK_CONTRACT_ADDR), + let event = Event::new("instantiate").add_attributes(vec![ attr("code_id", "17"), // We have to force this one to avoid the debug assertion against _ mock_wasmd_attr("_contract_address", reflect_addr), From 82dd0df58bd1a8bfd10413a117c63d0f92c9b6f6 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 10 Aug 2021 23:02:49 +0200 Subject: [PATCH 322/402] Fix linting error --- contracts/ibc-reflect/tests/integration.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index ca96bf135..3c16cf83f 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -27,7 +27,7 @@ use cosmwasm_std::{ }; use cosmwasm_vm::testing::{ ibc_channel_connect, ibc_channel_open, ibc_packet_receive, instantiate, mock_env, mock_info, - mock_instance, query, reply, MockApi, MockQuerier, MockStorage, MOCK_CONTRACT_ADDR, + mock_instance, query, reply, MockApi, MockQuerier, MockStorage, }; use cosmwasm_vm::{from_slice, Instance}; From 031c3fbf9947dc4567960345343bd51236c6865f Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 11 Aug 2021 10:53:50 +0200 Subject: [PATCH 323/402] Rebuild ibc-reflect test contract --- packages/vm/src/calls.rs | 2 +- packages/vm/testdata/ibc_reflect_0.16.wasm | Bin 281021 -> 283900 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index 151cdfe14..f341ea906 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -721,7 +721,7 @@ mod tests { ); assert_eq!(ReplyOn::Success, res.messages[0].reply_on); let id = res.messages[0].id; - let event = Event::new("message").add_attributes(vec![ + 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), ]); diff --git a/packages/vm/testdata/ibc_reflect_0.16.wasm b/packages/vm/testdata/ibc_reflect_0.16.wasm index 310364abfd23890f64b30e3b930fc2e118d3be99..5c4ced50472d949a7e79b9a174e1d1011548dab5 100644 GIT binary patch delta 81671 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

    rtZj@jI%yO%iK(%fP< zREXH_dSVGiYPhZ}aq_G`=!FQixeAG#u#+cWa>2P5oHL126?AV=)y5K3lfABkq1kWa zn~c2g>6}vMl(e254Qn`3&nShh!NmxY`bF_27=QJ@_uxy4|IYx+-(N3HYq(>r9O-@8*Vnk8~0euDu|9HGUHfm+RyDVMxmKlzz^6xuqH#vZMNvF{?3(Fp}w)dGdNmUV#xRH$V)C2grCIkJ`KX* zgm4vp4{8u*4}$XF;Wwu@2-o2^8C+r*lNpUg{D4H_UXX!du7Dui0+`*SL6}1kq~{<# zF`UsLKf{UXnFwcv+Q%zs)*wSx5Z3=5;0y*5Mg}?st#V2YEeVF0L z1HNqSBK^04PMnE^!mANa(iqRad!X}IE3fLB!=1mTl&tRMhOWZj z5%{a?>4sM0?<)M&^~Ya7{Po3OAN=*kpB~~lrQU>r21~o6`ib~Wgd2}9IurX&3{Sm; zLQfEX71FsLB&@SLI79TK{hVaI%Y#U}Naqf7F3&#WaI^TnKt*KpXXv|zIj`BNgLL^( zkVziU?;Hj4yFup;cTR70^k7#gdQW`07a}T*q~7?8;IB|$J<=Ix-KAe2>3oOJ zi$^;h6<2)7=$v)bDMQ!6i7g!o-oQeD(%>zrlm9WU89`5w7Cefxij^%qd;et zBS=#6lHNTEP}b@W$2fh`^2=PI_PzC_W1Jh47hs#3(MRt-#%ZH7M?3l05O*Bybewde z=Z4y#@U{3OeF(x=;y2@i@YM~%GZ1EPg7oqR>63$W{qSgKz+s=GnG8hj#h0+A4$vGWPr+}(aYEIl6P#J<{{i0{Fn0g| From adb76f3cf2aace8c377ea3bcc0c542aaa38edf1d Mon Sep 17 00:00:00 2001 From: loloicci Date: Thu, 12 Aug 2021 16:25:58 +0900 Subject: [PATCH 324/402] fix a test for std with backtraces --- packages/std/src/errors/std_error.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 4abfc7003..20dd98d2b 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -655,9 +655,13 @@ mod tests { fn implements_debug() { let error: StdError = StdError::from(OverflowError::new(OverflowOperation::Sub, 3, 5)); 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")] + let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub, operand1: "3", operand2: "5" }, backtrace: }"#; assert_eq!( embedded, - r#"Debug: Overflow { source: OverflowError { operation: Sub, operand1: "3", operand2: "5" } }"# + expected ); } From 85825496b4c3ea5a4f60d54607ed6610461d87c7 Mon Sep 17 00:00:00 2001 From: loloicci Date: Thu, 12 Aug 2021 18:34:45 +0900 Subject: [PATCH 325/402] execute cargo fmt --- packages/std/src/errors/std_error.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 20dd98d2b..7a1f60130 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -659,10 +659,7 @@ mod tests { let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub, operand1: "3", operand2: "5" } }"#; #[cfg(feature = "backtraces")] let expected = r#"Debug: Overflow { source: OverflowError { operation: Sub, operand1: "3", operand2: "5" }, backtrace: }"#; - assert_eq!( - embedded, - expected - ); + assert_eq!(embedded, expected); } #[test] From ae7be5fa59862b7a554ed7531dd49db97befcb29 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 24 Aug 2021 08:32:56 +0200 Subject: [PATCH 326/402] Run multiple clippy jobs in CI --- .circleci/config.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d4909b4e2..c73c5edc1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -20,7 +20,11 @@ workflows: - contract_staking - fmt - fmt_extra - - clippy + - clippy: + matrix: + parameters: + # Run with MSRV and some modern stable Rust + rust-version: ["1.51.0", "1.54.0"] - benchmarking: requires: - package_vm @@ -746,10 +750,13 @@ jobs: command: devtools/format_yml.sh -c clippy: + parameters: + rust-version: + type: string docker: # In this job we use the latest Rust stable in order to check against the # most recent code style recommendations. - - image: rust:1.51.0 + - image: rust:<< parameters.rust-version >> steps: - checkout - run: @@ -757,7 +764,7 @@ jobs: command: rustc --version && cargo --version - restore_cache: keys: - - cargocache-v2-clippy-rust:1.51.0-{{ 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" }} + - 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" }} - run: name: Add clippy component command: rustup component add clippy @@ -892,7 +899,7 @@ jobs: - contracts/staking/target/debug/.fingerprint - contracts/staking/target/debug/build - contracts/staking/target/debug/deps - key: cargocache-v2-clippy-rust:1.51.0-{{ 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: 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" }} benchmarking: docker: From ecc4edcd5d41e083a9c1f2153cfd798380fb3a21 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 24 Aug 2021 08:46:48 +0200 Subject: [PATCH 327/402] Use config version 2.1 --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c73c5edc1..529f31431 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,6 +1,6 @@ -version: 2 +version: 2.1 + workflows: - version: 2 test: # Keep those job names in sync with .mergify.yml jobs: From 9aaa7938d184d027f38bffffd7ea7a5550dba9aa Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 24 Aug 2021 08:50:44 +0200 Subject: [PATCH 328/402] Fix needless borrow warnings --- contracts/ibc-reflect/src/contract.rs | 8 ++--- contracts/ibc-reflect/tests/integration.rs | 4 +-- contracts/reflect/src/testing.rs | 2 +- packages/crypto/src/ed25519.rs | 12 ++++---- packages/schema/src/export.rs | 4 +-- packages/std/src/addresses.rs | 2 +- packages/std/src/errors/system_error.rs | 4 +-- packages/std/src/mock.rs | 6 ++-- packages/storage/src/sequence.rs | 2 +- packages/storage/src/type_helpers.rs | 4 +-- packages/vm/examples/module_size.rs | 2 +- packages/vm/src/calls.rs | 18 +++++------ packages/vm/src/compatibility.rs | 2 +- packages/vm/src/environment.rs | 30 +++++++++--------- packages/vm/src/imports.rs | 30 +++++++++--------- packages/vm/src/instance.rs | 36 +++++++++++----------- packages/vm/src/static_analysis.rs | 2 +- 17 files changed, 84 insertions(+), 84 deletions(-) diff --git a/contracts/ibc-reflect/src/contract.rs b/contracts/ibc-reflect/src/contract.rs index c2ff44a18..9de3d45d3 100644 --- a/contracts/ibc-reflect/src/contract.rs +++ b/contracts/ibc-reflect/src/contract.rs @@ -160,12 +160,12 @@ 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); // store the channel id for the reply handler - pending_channel(deps.storage).save(&chan_id)?; + pending_channel(deps.storage).save(chan_id)?; Ok(IbcBasicResponse::new() .add_submessage(msg) @@ -463,7 +463,7 @@ mod tests { let response = Reply { id, result: ContractResult::Ok(SubMsgExecutionResponse { - events: fake_events(&REFLECT_ADDR), + events: fake_events(REFLECT_ADDR), data: None, }), }; @@ -551,7 +551,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_slice(msg).unwrap(); assert_eq!( rmsg, ReflectExecuteMsg::ReflectMsg { diff --git a/contracts/ibc-reflect/tests/integration.rs b/contracts/ibc-reflect/tests/integration.rs index 3c16cf83f..62a86eb2b 100644 --- a/contracts/ibc-reflect/tests/integration.rs +++ b/contracts/ibc-reflect/tests/integration.rs @@ -172,7 +172,7 @@ fn proper_handshake_flow() { let response = Reply { id, result: ContractResult::Ok(SubMsgExecutionResponse { - events: fake_events(&REFLECT_ADDR), + events: fake_events(REFLECT_ADDR), data: None, }), }; @@ -263,7 +263,7 @@ fn handle_dispatch_packet() { 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, DESERIALIZATION_LIMIT).unwrap(); + let rmsg: ReflectExecuteMsg = from_slice(msg, DESERIALIZATION_LIMIT).unwrap(); assert_eq!( rmsg, ReflectExecuteMsg::ReflectMsg { diff --git a/contracts/reflect/src/testing.rs b/contracts/reflect/src/testing.rs index 32ccedaaf..8237329b1 100644 --- a/contracts/reflect/src/testing.rs +++ b/contracts/reflect/src/testing.rs @@ -10,7 +10,7 @@ pub fn mock_dependencies_with_custom_querier( ) -> OwnedDeps> { let custom_querier: MockQuerier = MockQuerier::new(&[(MOCK_CONTRACT_ADDR, contract_balance)]) - .with_custom_handler(|query| SystemResult::Ok(custom_query_execute(&query))); + .with_custom_handler(|query| SystemResult::Ok(custom_query_execute(query))); OwnedDeps { storage: MockStorage::default(), api: MockApi::default(), diff --git a/packages/crypto/src/ed25519.rs b/packages/crypto/src/ed25519.rs index 3ada6918e..ad642c307 100644 --- a/packages/crypto/src/ed25519.rs +++ b/packages/crypto/src/ed25519.rs @@ -25,7 +25,7 @@ pub fn ed25519_verify(message: &[u8], signature: &[u8], public_key: &[u8]) -> Cr // Verification match VerificationKey::try_from(pubkey) - .and_then(|vk| vk.verify(&Signature::from(signature), &message)) + .and_then(|vk| vk.verify(&Signature::from(signature), message)) { Ok(()) => Ok(true), Err(_) => Ok(false), @@ -184,7 +184,7 @@ mod tests { let message = MSG.as_bytes(); // Signing let secret_key = SigningKey::new(&mut OsRng); - let signature = secret_key.sign(&message); + let signature = secret_key.sign(message); let public_key = VerificationKey::from(&secret_key); @@ -193,7 +193,7 @@ mod tests { let public_key_bytes: [u8; 32] = public_key.into(); // Verification - assert!(ed25519_verify(&message, &signature_bytes, &public_key_bytes).unwrap()); + assert!(ed25519_verify(message, &signature_bytes, &public_key_bytes).unwrap()); // Wrong message fails let bad_message = [message, b"\0"].concat(); @@ -203,7 +203,7 @@ mod tests { let other_secret_key = SigningKey::new(&mut OsRng); let other_public_key = VerificationKey::from(&other_secret_key); let other_public_key_bytes: [u8; 32] = other_public_key.into(); - assert!(!ed25519_verify(&message, &signature_bytes, &other_public_key_bytes).unwrap()); + assert!(!ed25519_verify(message, &signature_bytes, &other_public_key_bytes).unwrap()); } #[test] @@ -220,7 +220,7 @@ mod tests { .as_slice(), ) .unwrap(); - let signature = secret_key.sign(&COSMOS_ED25519_MSG.as_bytes()); + let signature = secret_key.sign(COSMOS_ED25519_MSG.as_bytes()); let signature_bytes: [u8; 64] = signature.into(); let public_key_bytes: [u8; 32] = public_key.into(); @@ -233,7 +233,7 @@ mod tests { ); assert!(ed25519_verify( - &COSMOS_ED25519_MSG.as_bytes(), + COSMOS_ED25519_MSG.as_bytes(), &signature_bytes, &public_key_bytes ) diff --git a/packages/schema/src/export.rs b/packages/schema/src/export.rs index e11ea66ce..2e5c7dcd1 100644 --- a/packages/schema/src/export.rs +++ b/packages/schema/src/export.rs @@ -26,14 +26,14 @@ pub fn export_schema_with_title(schema: &RootSchema, out_dir: &Path, title: &str if let Some(metadata) = &mut schema.schema.metadata { metadata.title = Some(title.to_string()); } - write_schema(&schema, out_dir, &title); + write_schema(&schema, out_dir, title); } /// Writes schema to file. Overwrites existing file. /// Panics on any error writing out the schema. fn write_schema(schema: &RootSchema, out_dir: &Path, title: &str) { // first, we set the title as we wish - let path = out_dir.join(format!("{}.json", to_snake_case(&title))); + let path = out_dir.join(format!("{}.json", to_snake_case(title))); let json = serde_json::to_string_pretty(schema).unwrap(); write(&path, json + "\n").unwrap(); println!("Created {}", path.to_str().unwrap()); diff --git a/packages/std/src/addresses.rs b/packages/std/src/addresses.rs index f922c29df..16f5f36ed 100644 --- a/packages/std/src/addresses.rs +++ b/packages/std/src/addresses.rs @@ -278,7 +278,7 @@ impl Deref for CanonicalAddr { impl CanonicalAddr { pub fn as_slice(&self) -> &[u8] { - &self.0.as_slice() + self.0.as_slice() } } diff --git a/packages/std/src/errors/system_error.rs b/packages/std/src/errors/system_error.rs index e04a6bbcd..e6480ae0c 100644 --- a/packages/std/src/errors/system_error.rs +++ b/packages/std/src/errors/system_error.rs @@ -43,13 +43,13 @@ impl std::fmt::Display for SystemError { f, "Cannot parse request: {} in: {}", error, - String::from_utf8_lossy(&request) + String::from_utf8_lossy(request) ), SystemError::InvalidResponse { error, response } => write!( f, "Cannot parse response: {} in: {}", error, - String::from_utf8_lossy(&response) + String::from_utf8_lossy(response) ), SystemError::NoSuchContract { addr } => write!(f, "No such contract: {}", addr), SystemError::Unknown {} => write!(f, "Unknown system error"), diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 70eb6f688..a43e1957e 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -747,7 +747,7 @@ mod tests { api.addr_canonicalize(&input).unwrap(); let input = "foobar456"; - api.addr_canonicalize(&input).unwrap(); + api.addr_canonicalize(input).unwrap(); } #[test] @@ -955,8 +955,8 @@ mod tests { let signature = hex::decode(ED25519_SIG_HEX).unwrap(); let public_key: Vec = vec![0u8; 0]; - let msgs: Vec<&[u8]> = vec![&msg.as_slice()]; - let signatures: Vec<&[u8]> = vec![&signature.as_slice()]; + let msgs: Vec<&[u8]> = vec![msg.as_slice()]; + let signatures: Vec<&[u8]> = vec![signature.as_slice()]; let public_keys: Vec<&[u8]> = vec![&public_key]; let res = api.ed25519_batch_verify(&msgs, &signatures, &public_keys); diff --git a/packages/storage/src/sequence.rs b/packages/storage/src/sequence.rs index 6d81de2b7..30f9491cb 100644 --- a/packages/storage/src/sequence.rs +++ b/packages/storage/src/sequence.rs @@ -16,7 +16,7 @@ pub fn currval(seq: &Singleton) -> StdResult { /// 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. pub fn nextval(seq: &mut Singleton) -> StdResult { - let val = currval(&seq)? + 1; + let val = currval(seq)? + 1; seq.save(&val)?; Ok(val) } diff --git a/packages/storage/src/type_helpers.rs b/packages/storage/src/type_helpers.rs index 2bcdb0b1d..a32bc3776 100644 --- a/packages/storage/src/type_helpers.rs +++ b/packages/storage/src/type_helpers.rs @@ -13,7 +13,7 @@ pub(crate) fn may_deserialize( value: &Option>, ) -> StdResult> { match value { - Some(vec) => Ok(Some(from_slice(&vec)?)), + Some(data) => Ok(Some(from_slice(data)?)), None => Ok(None), } } @@ -21,7 +21,7 @@ pub(crate) fn may_deserialize( /// 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(vec) => from_slice(&vec), + Some(data) => from_slice(data), None => Err(StdError::not_found(type_name::())), } } diff --git a/packages/vm/examples/module_size.rs b/packages/vm/examples/module_size.rs index cdc83d116..1cbbe0c6c 100644 --- a/packages/vm/examples/module_size.rs +++ b/packages/vm/examples/module_size.rs @@ -69,7 +69,7 @@ pub fn main() { #[inline(never)] fn module_compile(wasm: &[u8], memory_limit: Option) -> Module { - compile(&wasm, memory_limit).unwrap() + compile(wasm, memory_limit).unwrap() } #[inline(never)] diff --git a/packages/vm/src/calls.rs b/packages/vm/src/calls.rs index f341ea906..e27f5abb6 100644 --- a/packages/vm/src/calls.rs +++ b/packages/vm/src/calls.rs @@ -599,7 +599,7 @@ mod tests { #[test] fn call_instantiate_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // init let info = mock_info("creator", &coins(1000, "earth")); @@ -611,7 +611,7 @@ mod tests { #[test] fn call_execute_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // init let info = mock_info("creator", &coins(1000, "earth")); @@ -630,7 +630,7 @@ mod tests { #[test] fn call_migrate_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // init let info = mock_info("creator", &coins(1000, "earth")); @@ -655,7 +655,7 @@ mod tests { #[test] fn call_query_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // init let info = mock_info("creator", &coins(1000, "earth")); @@ -739,12 +739,12 @@ mod tests { const ACCOUNT: &str = "account-456"; #[test] fn call_ibc_channel_open_and_connect_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); } #[test] fn call_ibc_channel_close_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let handshake_close = mock_ibc_channel_close_init(CHANNEL_ID, IbcOrder::Ordered, IBC_VERSION); @@ -754,7 +754,7 @@ mod tests { } #[test] fn call_ibc_packet_ack_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let ack = IbcAcknowledgement::new(br#"{}"#); let msg = mock_ibc_packet_ack(CHANNEL_ID, br#"{}"#, ack).unwrap(); @@ -764,7 +764,7 @@ mod tests { } #[test] fn call_ibc_packet_timeout_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let msg = mock_ibc_packet_timeout(CHANNEL_ID, br#"{}"#).unwrap(); call_ibc_packet_timeout::<_, _, _, Empty>(&mut instance, &mock_env(), &msg) @@ -773,7 +773,7 @@ mod tests { } #[test] fn call_ibc_packet_receive_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); setup(&mut instance, CHANNEL_ID, ACCOUNT); let who_am_i = br#"{"who_am_i":{}}"#; let msg = mock_ibc_packet_recv(CHANNEL_ID, who_am_i).unwrap(); diff --git a/packages/vm/src/compatibility.rs b/packages/vm/src/compatibility.rs index c2ca76ae2..e0c485cf5 100644 --- a/packages/vm/src/compatibility.rs +++ b/packages/vm/src/compatibility.rs @@ -180,7 +180,7 @@ fn check_wasm_features(module: &Module, supported_features: &HashSet) -> let required_features = required_features_from_module(module); if !required_features.is_subset(supported_features) { // We switch to BTreeSet to get a sorted error message - let unsupported: BTreeSet<_> = required_features.difference(&supported_features).collect(); + let unsupported: BTreeSet<_> = required_features.difference(supported_features).collect(); return Err(VmError::static_validation_err(format!( "Wasm contract requires unsupported features: {}", unsupported.to_string_limited(200) diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index b6882f2c5..179f6c1e2 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -418,25 +418,25 @@ mod tests { ) { let env = Environment::new(MockApi::default(), gas_limit, false); - let module = compile(&CONTRACT, TESTING_MEMORY_LIMIT).unwrap(); + let module = compile(CONTRACT, TESTING_MEMORY_LIMIT).unwrap(); let store = module.store(); // 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| {}), + "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| {}), }, }; 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 70a97b381..b1a4c9890 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -479,25 +479,25 @@ mod tests { let gas_limit = TESTING_GAS_LIMIT; let env = Environment::new(api, gas_limit, false); - let module = compile(&CONTRACT, TESTING_MEMORY_LIMIT).unwrap(); + let module = compile(CONTRACT, TESTING_MEMORY_LIMIT).unwrap(); let store = module.store(); // 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| {}), + "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| {}), }, }; let instance = Box::from(WasmerInstance::new(&module, &import_obj).unwrap()); diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index 39a89ca1d..6a29f11d8 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -393,7 +393,7 @@ mod tests { #[test] fn call_function0_works() { - let instance = mock_instance(&CONTRACT, &[]); + let instance = mock_instance(CONTRACT, &[]); instance .call_function0("interface_version_7", &[]) @@ -402,7 +402,7 @@ mod tests { #[test] fn call_function1_works() { - let instance = mock_instance(&CONTRACT, &[]); + let instance = mock_instance(CONTRACT, &[]); // can call function few times let result = instance @@ -424,7 +424,7 @@ mod tests { #[test] fn allocate_deallocate_works() { let mut instance = mock_instance_with_options( - &CONTRACT, + CONTRACT, MockInstanceOptions { memory_limit: Some(Size::mebi(500)), ..Default::default() @@ -451,7 +451,7 @@ mod tests { #[test] fn write_and_read_memory_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); let sizes: Vec = vec![ 0, @@ -484,7 +484,7 @@ mod tests { fn errors_in_imports() { // set up an instance that will experience an error in an import let error_message = "Api failed intentionally"; - let mut instance = mock_instance_with_failing_api(&CONTRACT, &[], error_message); + let mut instance = mock_instance_with_failing_api(CONTRACT, &[], error_message); let init_result = call_instantiate::<_, _, _, serde_json::Value>( &mut instance, &mock_env(), @@ -502,7 +502,7 @@ mod tests { fn read_memory_errors_when_when_length_is_too_long() { let length = 6; let max_length = 5; - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // Allocate sets length to 0. Write some data to increase length. let region_ptr = instance.allocate(length).expect("error allocating"); @@ -570,7 +570,7 @@ mod tests { #[test] fn memory_pages_grows_with_usage() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); assert_eq!(instance.memory_pages(), 17); @@ -586,7 +586,7 @@ mod tests { #[test] fn get_gas_left_works() { - let instance = mock_instance_with_gas_limit(&CONTRACT, 123321); + let instance = mock_instance_with_gas_limit(CONTRACT, 123321); let orig_gas = instance.get_gas_left(); assert_eq!(orig_gas, 123321); } @@ -594,7 +594,7 @@ mod tests { #[test] fn create_gas_report_works() { const LIMIT: u64 = 7_000_000; - let mut instance = mock_instance_with_gas_limit(&CONTRACT, LIMIT); + let mut instance = mock_instance_with_gas_limit(CONTRACT, LIMIT); let report1 = instance.create_gas_report(); assert_eq!(report1.used_externally, 0); @@ -621,7 +621,7 @@ mod tests { #[test] fn set_storage_readonly_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); assert!(instance.env.is_storage_readonly()); @@ -637,7 +637,7 @@ mod tests { #[test] fn with_storage_works() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // initial check instance @@ -668,7 +668,7 @@ mod tests { #[should_panic] fn with_storage_safe_for_panic() { // this should fail with the assertion, but not cause a double-free crash (issue #59) - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); instance .with_storage::<_, ()>(|_store| panic!("trigger failure")) .unwrap(); @@ -678,7 +678,7 @@ mod tests { fn with_querier_works_readonly() { let rich_addr = String::from("foobar"); let rich_balance = vec![coin(10000, "gold"), coin(8000, "silver")]; - let mut instance = mock_instance_with_balances(&CONTRACT, &[(&rich_addr, &rich_balance)]); + let mut instance = mock_instance_with_balances(CONTRACT, &[(&rich_addr, &rich_balance)]); // query one instance @@ -734,7 +734,7 @@ mod tests { let rich_addr = String::from("foobar"); let rich_balance1 = vec![coin(10000, "gold"), coin(500, "silver")]; let rich_balance2 = vec![coin(10000, "gold"), coin(8000, "silver")]; - let mut instance = mock_instance_with_balances(&CONTRACT, &[(&rich_addr, &rich_balance1)]); + let mut instance = mock_instance_with_balances(CONTRACT, &[(&rich_addr, &rich_balance1)]); // Get initial state instance @@ -799,7 +799,7 @@ mod singlepass_tests { #[test] fn contract_deducts_gas_init() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); let orig_gas = instance.get_gas_left(); // init contract @@ -815,7 +815,7 @@ mod singlepass_tests { #[test] fn contract_deducts_gas_execute() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // init contract let info = mock_info("creator", &coins(1000, "earth")); @@ -838,7 +838,7 @@ mod singlepass_tests { #[test] fn contract_enforces_gas_limit() { - let mut instance = mock_instance_with_gas_limit(&CONTRACT, 20_000); + let mut instance = mock_instance_with_gas_limit(CONTRACT, 20_000); // init contract let info = mock_info("creator", &coins(1000, "earth")); @@ -849,7 +849,7 @@ mod singlepass_tests { #[test] fn query_works_with_gas_metering() { - let mut instance = mock_instance(&CONTRACT, &[]); + let mut instance = mock_instance(CONTRACT, &[]); // init contract let info = mock_info("creator", &coins(1000, "earth")); diff --git a/packages/vm/src/static_analysis.rs b/packages/vm/src/static_analysis.rs index 748d6cbd1..4be596ff8 100644 --- a/packages/vm/src/static_analysis.rs +++ b/packages/vm/src/static_analysis.rs @@ -13,7 +13,7 @@ pub const REQUIRED_IBC_EXPORTS: &[&str] = &[ ]; pub fn deserialize_wasm(wasm_code: &[u8]) -> VmResult { - deserialize_buffer(&wasm_code).map_err(|err| { + deserialize_buffer(wasm_code).map_err(|err| { VmError::static_validation_err(format!( "Wasm bytecode could not be deserialized. Deserialization error: \"{}\"", err From 1cf756786d4fbc7efe5a065cc36c932851ef1fcf Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 5 Aug 2021 16:01:44 +0200 Subject: [PATCH 329/402] Don't pass too long input to VM in addr_validate/addr_canonicalize --- CHANGELOG.md | 6 ++++++ packages/std/src/imports.rs | 26 +++++++++++++++++++++----- packages/vm/src/imports.rs | 5 ++++- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7824ec32..a2d3c4ae8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ and this project adheres to - Added `From` and `From<&Addr>` conversions for `Cow`. +### 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. + ## [0.16.0] - 2021-08-05 ### Added diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index b4c983d1d..8a7f4e4c0 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -156,8 +156,15 @@ impl ExternalApi { } impl Api for ExternalApi { - fn addr_validate(&self, human: &str) -> StdResult { - let source = build_region(human.as_bytes()); + fn addr_validate(&self, input: &str) -> StdResult { + let input_bytes = input.as_bytes(); + if input_bytes.len() > 90 { + // See MAX_LENGTH_HUMAN_ADDRESS in the VM. + // In this case, the VM will refuse to read the input from the contract. + // Stop here to allow handling the error in the contract. + return Err(StdError::generic_err("input too long for addr_validate")); + } + let source = build_region(input_bytes); let source_ptr = &*source as *const Region as u32; let result = unsafe { addr_validate(source_ptr) }; @@ -169,11 +176,20 @@ impl Api for ExternalApi { ))); } - Ok(Addr::unchecked(human)) + Ok(Addr::unchecked(input)) } - fn addr_canonicalize(&self, human: &str) -> StdResult { - let send = build_region(human.as_bytes()); + fn addr_canonicalize(&self, input: &str) -> StdResult { + let input_bytes = input.as_bytes(); + if input_bytes.len() > 90 { + // See MAX_LENGTH_HUMAN_ADDRESS in the VM. + // In this case, the VM will refuse to read the input from the contract. + // Stop here to allow handling the error in the contract. + return Err(StdError::generic_err( + "input too long for addr_canonicalize", + )); + } + let send = build_region(input_bytes); let send_ptr = &*send as *const Region as u32; let canon = alloc(CANONICAL_ADDRESS_BUFFER_LENGTH); diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index b1a4c9890..f8af91d9d 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -36,7 +36,10 @@ const MAX_LENGTH_DB_KEY: usize = 64 * KI; const MAX_LENGTH_DB_VALUE: usize = 128 * KI; /// Typically 20 (Cosmos SDK, Ethereum), 32 (Nano, Substrate) or 54 (MockApi) const MAX_LENGTH_CANONICAL_ADDRESS: usize = 64; -/// The maximum allowed size for bech32 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32) +/// The max length of human address inputs (in bytes). +/// The maximum allowed size for [bech32](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32) +/// is 90 characters. +/// This value will increase with https://github.com/CosmWasm/cosmwasm/issues/1056. const MAX_LENGTH_HUMAN_ADDRESS: usize = 90; const MAX_LENGTH_QUERY_CHAIN_REQUEST: usize = 64 * KI; /// Length of a serialized Ed25519 signature From 9d68ac290a96f511c902f970c8d43bfa1e3bb4ae Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Fri, 27 Aug 2021 15:45:43 +0200 Subject: [PATCH 330/402] Implement Isqrt for Uint128 --- packages/std/src/math/isqrt.rs | 12 +++++-- packages/std/src/math/uint128.rs | 56 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 4e8c0888c..c7e969b3a 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -1,5 +1,7 @@ use std::{cmp, ops}; +use crate::Uint128; + /// A trait for calculating the /// [integer square root](https://en.wikipedia.org/wiki/Integer_square_root). pub trait Isqrt { @@ -12,7 +14,7 @@ where I: Unsigned + ops::Add + ops::Div - + ops::Shr + + ops::Shr + cmp::PartialOrd + Copy + From, @@ -43,6 +45,7 @@ impl Unsigned for u16 {} impl Unsigned for u32 {} impl Unsigned for u64 {} impl Unsigned for u128 {} +impl Unsigned for Uint128 {} impl Unsigned for usize {} #[cfg(test)] @@ -50,7 +53,7 @@ mod tests { use super::*; #[test] - fn isqrts() { + fn isqrt_primitives() { // Let's check correctness. assert_eq!(0u8.isqrt(), 0); assert_eq!(1u8.isqrt(), 1); @@ -66,4 +69,9 @@ mod tests { assert_eq!(26u64.isqrt(), 5); assert_eq!(26u128.isqrt(), 5); } + + #[test] + fn isqrt_uint128() { + assert_eq!(Uint128::new(24).isqrt(), Uint128::new(4)); + } } diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 51dcf617f..80a11e6b5 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -222,6 +222,38 @@ impl<'a> ops::Sub<&'a Uint128> for Uint128 { } } +impl ops::Div for Uint128 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.u128().checked_div(rhs.u128()).unwrap()) + } +} + +impl<'a> ops::Div<&'a Uint128> for Uint128 { + type Output = Self; + + fn div(self, rhs: &'a Uint128) -> Self::Output { + Self(self.u128().checked_div(rhs.u128()).unwrap()) + } +} + +impl ops::Shr for Uint128 { + type Output = Self; + + fn shr(self, rhs: u32) -> Self::Output { + Self(self.u128().checked_shr(rhs).unwrap()) + } +} + +impl<'a> ops::Shr<&'a u32> for Uint128 { + type Output = Self; + + fn shr(self, rhs: &'a u32) -> Self::Output { + Self(self.u128().checked_shr(*rhs).unwrap()) + } +} + impl ops::AddAssign for Uint128 { fn add_assign(&mut self, rhs: Uint128) { self.0 = self.0.checked_add(rhs.u128()).unwrap(); @@ -246,6 +278,30 @@ impl<'a> ops::SubAssign<&'a Uint128> for Uint128 { } } +impl ops::DivAssign for Uint128 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.u128()).unwrap(); + } +} + +impl<'a> ops::DivAssign<&'a Uint128> for Uint128 { + fn div_assign(&mut self, rhs: &'a Uint128) { + self.0 = self.0.checked_div(rhs.u128()).unwrap(); + } +} + +impl ops::ShrAssign for Uint128 { + fn shr_assign(&mut self, rhs: u32) { + self.0 = self.0.checked_shr(rhs).unwrap(); + } +} + +impl<'a> ops::ShrAssign<&'a u32> for Uint128 { + fn shr_assign(&mut self, rhs: &'a u32) { + self.0 = self.0.checked_shr(*rhs).unwrap(); + } +} + impl Uint128 { /// Returns `self * numerator / denominator` pub fn multiply_ratio, B: Into>( From ee4ba6872b935ce0e4f95db2656bfb6578a0dbd1 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Fri, 27 Aug 2021 16:03:52 +0200 Subject: [PATCH 331/402] Implement Isqrt for Uint64 --- packages/std/src/math/isqrt.rs | 8 ++++- packages/std/src/math/uint64.rs | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index c7e969b3a..dbe6b7566 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -1,6 +1,6 @@ use std::{cmp, ops}; -use crate::Uint128; +use crate::{Uint128, Uint64}; /// A trait for calculating the /// [integer square root](https://en.wikipedia.org/wiki/Integer_square_root). @@ -45,6 +45,7 @@ impl Unsigned for u16 {} impl Unsigned for u32 {} impl Unsigned for u64 {} impl Unsigned for u128 {} +impl Unsigned for Uint64 {} impl Unsigned for Uint128 {} impl Unsigned for usize {} @@ -70,6 +71,11 @@ mod tests { assert_eq!(26u128.isqrt(), 5); } + #[test] + fn isqrt_uint64() { + assert_eq!(Uint64::new(24).isqrt(), Uint64::new(4)); + } + #[test] fn isqrt_uint128() { assert_eq!(Uint128::new(24).isqrt(), Uint128::new(4)); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 33067a779..b0faa40cc 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -197,6 +197,38 @@ impl<'a> ops::Add<&'a Uint64> for Uint64 { } } +impl ops::Div for Uint64 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.u64().checked_div(rhs.u64()).unwrap()) + } +} + +impl<'a> ops::Div<&'a Uint64> for Uint64 { + type Output = Self; + + fn div(self, rhs: &'a Uint64) -> Self::Output { + Self(self.u64().checked_div(rhs.u64()).unwrap()) + } +} + +impl ops::Shr for Uint64 { + type Output = Self; + + fn shr(self, rhs: u32) -> Self::Output { + Self(self.u64().checked_shr(rhs).unwrap()) + } +} + +impl<'a> ops::Shr<&'a u32> for Uint64 { + type Output = Self; + + fn shr(self, rhs: &'a u32) -> Self::Output { + Self(self.u64().checked_shr(*rhs).unwrap()) + } +} + impl ops::AddAssign for Uint64 { fn add_assign(&mut self, rhs: Uint64) { self.0 = self.0.checked_add(rhs.u64()).unwrap(); @@ -209,6 +241,30 @@ impl<'a> ops::AddAssign<&'a Uint64> for Uint64 { } } +impl ops::DivAssign for Uint64 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.u64()).unwrap(); + } +} + +impl<'a> ops::DivAssign<&'a Uint64> for Uint64 { + fn div_assign(&mut self, rhs: &'a Uint64) { + self.0 = self.0.checked_div(rhs.u64()).unwrap(); + } +} + +impl ops::ShrAssign for Uint64 { + fn shr_assign(&mut self, rhs: u32) { + self.0 = self.0.checked_shr(rhs).unwrap(); + } +} + +impl<'a> ops::ShrAssign<&'a u32> for Uint64 { + fn shr_assign(&mut self, rhs: &'a u32) { + self.0 = self.0.checked_shr(*rhs).unwrap(); + } +} + impl Uint64 { /// Returns `self * numerator / denominator` pub fn multiply_ratio, B: Into>( From b1f0b38d059509a68b445303af73a400697bef5f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Fri, 27 Aug 2021 22:28:33 +0200 Subject: [PATCH 332/402] Implement Uint256 --- CHANGELOG.md | 6 +- packages/std/src/lib.rs | 2 +- packages/std/src/math/isqrt.rs | 8 +- packages/std/src/math/mod.rs | 2 + packages/std/src/math/uint256.rs | 560 +++++++++++++++++++++++++++++++ 5 files changed, 575 insertions(+), 3 deletions(-) create mode 100644 packages/std/src/math/uint256.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index b7824ec32..817d5c8dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,11 @@ and this project adheres to ### Added -- Added `From` and `From<&Addr>` conversions for `Cow`. +- cosmwasm-std: Added `From` and `From<&Addr>` conversions for + `Cow`. +- cosmwasm-std: Added a new `Uint256` type. +- cosmwasm-std: Added implementations of `Isqrt` (integer square root) for + `Uint64`, `Uint128`, and `Uint256`. ## [0.16.0] - 2021-08-05 diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 9a62c1141..5235f1d64 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -41,7 +41,7 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] #[allow(deprecated)] pub use crate::iterator::{Order, Pair, KV}; -pub use crate::math::{Decimal, Fraction, Uint128, Uint64}; +pub use crate::math::{Decimal, Fraction, Uint128, Uint256, Uint64}; pub use crate::query::{ AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery, }; diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index dbe6b7566..2c4d97a27 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -1,6 +1,6 @@ use std::{cmp, ops}; -use crate::{Uint128, Uint64}; +use crate::{Uint128, Uint256, Uint64}; /// A trait for calculating the /// [integer square root](https://en.wikipedia.org/wiki/Integer_square_root). @@ -47,6 +47,7 @@ impl Unsigned for u64 {} impl Unsigned for u128 {} impl Unsigned for Uint64 {} impl Unsigned for Uint128 {} +impl Unsigned for Uint256 {} impl Unsigned for usize {} #[cfg(test)] @@ -80,4 +81,9 @@ mod tests { fn isqrt_uint128() { assert_eq!(Uint128::new(24).isqrt(), Uint128::new(4)); } + + #[test] + fn isqrt_uint256() { + assert_eq!(Uint256::from(24u32).isqrt(), Uint256::from(4u32)); + } } diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 53b9818ca..81d8cbd12 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -2,10 +2,12 @@ mod decimal; mod fraction; mod isqrt; mod uint128; +mod uint256; mod uint64; pub use decimal::Decimal; pub use fraction::Fraction; pub use isqrt::Isqrt; pub use uint128::Uint128; +pub use uint256::Uint256; pub use uint64::Uint64; diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs new file mode 100644 index 000000000..1550f50de --- /dev/null +++ b/packages/std/src/math/uint256.rs @@ -0,0 +1,560 @@ +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::convert::TryFrom; +use std::fmt; +use std::iter::Sum; +use std::ops::{self, Shr}; + +use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; + +/// 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; + +/// 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. +/// +/// # Examples +/// +/// Use `from` to create instances out of primitive uint types or `new` to provide big +/// endian bytes: +/// +/// ``` +/// # use cosmwasm_std::Uint256; +/// let a = Uint256::from(258u128); +/// let b = Uint256::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 Uint256(#[schemars(with = "String")] U256); + +impl Uint256 { + pub const MAX: Uint256 = Uint256(U256::MAX); + + /// Creates a Uint256(value) from a big endian representation. It's just an alias for + /// `from_big_endian`. + pub fn new(value: [u8; 32]) -> Self { + Self::from_big_endian(value) + } + + /// Creates a Uint256(0) + pub const fn zero() -> Self { + Uint256(U256::zero()) + } + + pub fn from_big_endian(value: [u8; 32]) -> Self { + Uint256(U256::from_big_endian(&value)) + } + + pub fn from_little_endian(value: [u8; 32]) -> Self { + Uint256(U256::from_little_endian(&value)) + } + + /// Returns a copy of the number as big endian bytes. + pub fn big_endian(&self) -> [u8; 32] { + let mut result = [0u8; 32]; + self.0.to_big_endian(&mut result); + result + } + + /// Returns a copy of the number as little endian bytes. + pub fn little_endian(&self) -> [u8; 32] { + let mut result = [0u8; 32]; + self.0.to_little_endian(&mut result); + result + } + + pub fn is_zero(&self) -> bool { + self.0.is_zero() + } + + 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_div(self, other: Self) -> Result { + self.0 + .checked_div(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + pub fn checked_rem(self, other: Self) -> Result { + self.0 + .checked_rem(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + pub fn saturating_add(self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)) + } + + pub fn saturating_sub(self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + + pub fn saturating_mul(self, other: Self) -> Self { + Self(self.0.saturating_mul(other.0)) + } +} + +impl From for Uint256 { + fn from(val: u128) -> Self { + Uint256(val.into()) + } +} + +impl From for Uint256 { + fn from(val: u64) -> Self { + Uint256(val.into()) + } +} + +impl From for Uint256 { + fn from(val: u32) -> Self { + Uint256(val.into()) + } +} + +impl From for Uint256 { + fn from(val: u16) -> Self { + Uint256(val.into()) + } +} + +impl From for Uint256 { + fn from(val: u8) -> Self { + Uint256(val.into()) + } +} + +impl TryFrom<&str> for Uint256 { + type Error = StdError; + + fn try_from(val: &str) -> Result { + match val.parse::() { + Ok(u) => Ok(Uint256(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing u256: {}", e))), + } + } +} + +impl From for String { + fn from(original: Uint256) -> Self { + original.to_string() + } +} + +impl fmt::Display for Uint256 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl ops::Add for Uint256 { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + Uint256(self.0.checked_add(rhs.0).unwrap()) + } +} + +impl<'a> ops::Add<&'a Uint256> for Uint256 { + type Output = Self; + + fn add(self, rhs: &'a Uint256) -> Self { + Uint256(self.0.checked_add(rhs.0).unwrap()) + } +} + +impl ops::Sub for Uint256 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Uint256(self.0.checked_sub(rhs.0).unwrap()) + } +} + +impl<'a> ops::Sub<&'a Uint256> for Uint256 { + type Output = Self; + + fn sub(self, rhs: &'a Uint256) -> Self { + Uint256(self.0.checked_sub(rhs.0).unwrap()) + } +} + +impl ops::Div for Uint256 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} + +impl<'a> ops::Div<&'a Uint256> for Uint256 { + type Output = Self; + + fn div(self, rhs: &'a Uint256) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} + +impl ops::Shr for Uint256 { + type Output = Self; + + fn shr(self, rhs: u32) -> Self::Output { + if rhs > 256 { + panic!( + "right shift error: {} is larger than the number of bits in Uint256", + rhs + ); + } + + Self(self.0.shr(rhs)) + } +} + +impl<'a> ops::Shr<&'a u32> for Uint256 { + type Output = Self; + + fn shr(self, rhs: &'a u32) -> Self::Output { + if *rhs > 256 { + panic!( + "right shift error: {} is larger than the number of bits in Uint256", + rhs + ); + } + + Self(self.0.shr(*rhs)) + } +} + +impl ops::AddAssign for Uint256 { + fn add_assign(&mut self, rhs: Uint256) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} + +impl<'a> ops::AddAssign<&'a Uint256> for Uint256 { + fn add_assign(&mut self, rhs: &'a Uint256) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} + +impl ops::SubAssign for Uint256 { + fn sub_assign(&mut self, rhs: Uint256) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} + +impl<'a> ops::SubAssign<&'a Uint256> for Uint256 { + fn sub_assign(&mut self, rhs: &'a Uint256) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} + +impl ops::DivAssign for Uint256 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} + +impl<'a> ops::DivAssign<&'a Uint256> for Uint256 { + fn div_assign(&mut self, rhs: &'a Uint256) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} + +impl ops::ShrAssign for Uint256 { + fn shr_assign(&mut self, rhs: u32) { + if rhs > 256 { + panic!( + "right shift error: {} is larger than the number of bits in Uint256", + rhs + ); + } + + self.0 = self.0.shr(rhs); + } +} + +impl<'a> ops::ShrAssign<&'a u32> for Uint256 { + fn shr_assign(&mut self, rhs: &'a u32) { + if *rhs > 256 { + panic!( + "right shift error: {} is larger than the number of bits in Uint256", + rhs + ); + } + + self.0 = self.0.shr(*rhs); + } +} + +impl Serialize for Uint256 { + /// 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 Uint256 { + /// Deserialized from an integer string using base 10 + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Uint256Visitor) + } +} + +struct Uint256Visitor; + +impl<'de> de::Visitor<'de> for Uint256Visitor { + type Value = Uint256; + + 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, + { + match U256::from_dec_str(v) { + Ok(u) => Ok(Uint256(u)), + Err(e) => Err(E::custom(format!("invalid Uint256 '{}' - {}", v, e))), + } + } +} + +impl Sum for Uint256 { + fn sum>(iter: I) -> Self { + iter.fold(Uint256::zero(), ops::Add::add) + } +} + +impl<'a> Sum<&'a Uint256> for Uint256 { + fn sum>(iter: I) -> Self { + iter.fold(Uint256::zero(), ops::Add::add) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + #[test] + fn uint256_construct() { + let original = Uint256::new([1; 32]); + let a: [u8; 32] = original.big_endian(); + assert_eq!(a, [1; 32]); + } + + #[test] + fn uint256_convert_from() { + let a = Uint256::from(5u128); + assert_eq!(a.0, U256::from(5)); + + let a = Uint256::from(5u64); + assert_eq!(a.0, U256::from(5)); + + let a = Uint256::from(5u32); + assert_eq!(a.0, U256::from(5)); + + let a = Uint256::from(5u16); + assert_eq!(a.0, U256::from(5)); + + let a = Uint256::from(5u8); + assert_eq!(a.0, U256::from(5)); + + let result = Uint256::try_from("34567"); + assert_eq!(result.unwrap().0, U256::from("34567")); + + let result = Uint256::try_from("1.23"); + assert!(result.is_err()); + } + + #[test] + fn uint256_implements_display() { + let a = Uint256::from(12345u32); + 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!(a.to_string(), "0"); + } + + #[test] + fn uint256_is_zero_works() { + assert!(Uint256::zero().is_zero()); + assert!(Uint256(U256::from(0)).is_zero()); + + assert!(!Uint256::from(1u32).is_zero()); + assert!(!Uint256::from(123u32).is_zero()); + } + + #[test] + fn uint256_json() { + let orig = Uint256::from(1234567890987654321u128); + let serialized = to_vec(&orig).unwrap(); + assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); + let parsed: Uint256 = from_slice(&serialized).unwrap(); + assert_eq!(parsed, orig); + } + + #[test] + fn uint256_compare() { + let a = Uint256::from(12345u32); + let b = Uint256::from(23456u32); + + assert!(a < b); + assert!(b > a); + assert_eq!(a, Uint256::from(12345u32)); + } + + #[test] + #[allow(clippy::op_ref)] + fn uint256_math() { + let a = Uint256::from(12345u32); + let b = Uint256::from(23456u32); + + // test + with owned and reference right hand side + assert_eq!(a + b, Uint256::from(35801u32)); + assert_eq!(a + &b, Uint256::from(35801u32)); + + // test - with owned and reference right hand side + assert_eq!(b - a, Uint256::from(11111u32)); + assert_eq!(b - &a, Uint256::from(11111u32)); + + // test += with owned and reference right hand side + let mut c = Uint256::from(300000u32); + c += b; + assert_eq!(c, Uint256::from(323456u32)); + let mut d = Uint256::from(300000u32); + d += &b; + assert_eq!(d, Uint256::from(323456u32)); + + // test -= with owned and reference right hand side + let mut c = Uint256::from(300000u32); + c -= b; + assert_eq!(c, Uint256::from(276544u32)); + let mut d = Uint256::from(300000u32); + d -= &b; + assert_eq!(d, Uint256::from(276544u32)); + + // 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())); + } + + #[test] + #[should_panic] + fn uint256_add_overflow_panics() { + let max = Uint256::new([255u8; 32]); + let _ = max + Uint256::from(12u32); + } + + #[test] + #[should_panic] + fn uint256_sub_overflow_panics() { + let _ = Uint256::from(1u32) - Uint256::from(2u32); + } + + #[test] + fn sum_works() { + let nums = vec![ + Uint256::from(17u32), + Uint256::from(123u32), + Uint256::from(540u32), + Uint256::from(82u32), + ]; + let expected = Uint256::from(762u32); + + let sum_as_ref = nums.iter().sum(); + assert_eq!(expected, sum_as_ref); + + let sum_as_owned = nums.into_iter().sum(); + assert_eq!(expected, sum_as_owned); + } + + #[test] + fn uint256_methods() { + // checked_* + assert!(matches!( + Uint256::MAX.checked_add(Uint256::from(1u32)), + Err(OverflowError { .. }) + )); + assert!(matches!( + Uint256::from(0u32).checked_sub(Uint256::from(1u32)), + Err(OverflowError { .. }) + )); + assert!(matches!( + Uint256::MAX.checked_mul(Uint256::from(2u32)), + Err(OverflowError { .. }) + )); + assert!(matches!( + Uint256::MAX.checked_div(Uint256::from(0u32)), + Err(DivideByZeroError { .. }) + )); + assert!(matches!( + Uint256::MAX.checked_rem(Uint256::from(0u32)), + Err(DivideByZeroError { .. }) + )); + + // saturating_* + assert_eq!( + Uint256::MAX.saturating_add(Uint256::from(1u32)), + Uint256::MAX + ); + assert_eq!( + Uint256::from(0u32).saturating_sub(Uint256::from(1u32)), + Uint256::from(0u32) + ); + assert_eq!( + Uint256::MAX.saturating_mul(Uint256::from(2u32)), + Uint256::MAX + ); + } +} From 0cecd60dfa96c95cfd2da73aa860754f5726295f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 12:10:33 +0200 Subject: [PATCH 333/402] Expose Uint128::full_mul with a Uint256 result --- packages/std/src/errors/mod.rs | 5 +++- packages/std/src/errors/std_error.rs | 45 ++++++++++++++++++++++++++++ packages/std/src/math/uint128.rs | 25 +++++----------- packages/std/src/math/uint256.rs | 35 ++++++++++++++++++++-- 4 files changed, 89 insertions(+), 21 deletions(-) diff --git a/packages/std/src/errors/mod.rs b/packages/std/src/errors/mod.rs index 7a012e29f..1db1ac62f 100644 --- a/packages/std/src/errors/mod.rs +++ b/packages/std/src/errors/mod.rs @@ -4,6 +4,9 @@ mod system_error; mod verification_error; pub use recover_pubkey_error::RecoverPubkeyError; -pub use std_error::{DivideByZeroError, OverflowError, OverflowOperation, StdError, StdResult}; +pub use std_error::{ + ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, 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 7a1f60130..384acb8b5 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -95,6 +95,13 @@ pub enum StdError { #[cfg(feature = "backtraces")] backtrace: Backtrace, }, + #[error("Conversion error: ")] + ConversionOverflow { + #[from] + source: ConversionOverflowError, + #[cfg(feature = "backtraces")] + backtrace: Backtrace, + }, } impl StdError { @@ -376,6 +383,22 @@ impl PartialEq for StdError { false } } + StdError::ConversionOverflow { + source, + #[cfg(feature = "backtraces")] + backtrace: _, + } => { + if let StdError::ConversionOverflow { + source: rhs_source, + #[cfg(feature = "backtraces")] + backtrace: _, + } = rhs + { + source == rhs_source + } else { + false + } + } } } } @@ -455,6 +478,28 @@ impl OverflowError { } } +#[derive(Error, Debug, PartialEq, Eq)] +#[error("Error converting {source_type} to {target_type} for {value}")] +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 { + Self { + source_type, + target_type, + value: value.into(), + } + } +} + #[derive(Error, Debug, PartialEq, Eq)] #[error("Cannot devide {operand} by zero")] pub struct DivideByZeroError { diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 80a11e6b5..5e922e38e 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -6,6 +6,7 @@ use std::iter::Sum; use std::ops; use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; +use crate::Uint256; /// 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, @@ -314,15 +315,16 @@ impl Uint128 { if denominator == 0 { panic!("Denominator must not be zero"); } - let val: u128 = (self.full_mul(numerator) / denominator) + (self.full_mul(numerator) / Uint256::from(denominator)) .try_into() - .expect("multiplication overflow"); - Uint128::from(val) + .expect("multiplication overflow") } /// Multiplies two u128 values without overflow. - fn full_mul(self, rhs: impl Into) -> U256 { - U256::from(self.u128()) * U256::from(rhs.into()) + pub fn full_mul(self, rhs: impl Into) -> Uint256 { + Uint256::from(self.u128()) + .checked_mul(Uint256::from(rhs.into())) + .unwrap() } } @@ -378,19 +380,6 @@ impl<'a> Sum<&'a Uint128> for Uint128 { } } -/// 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); - } -} - -/// Only used internally - namely to store the intermediate result of -/// multiplying two 128-bit uints. -use uints::U256; - #[cfg(test)] mod tests { use super::*; diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 1550f50de..2225fa69b 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -1,11 +1,14 @@ use schemars::JsonSchema; use serde::{de, ser, Deserialize, Deserializer, Serialize}; -use std::convert::TryFrom; +use std::convert::{TryFrom, TryInto}; use std::fmt; use std::iter::Sum; use std::ops::{self, Shr}; -use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; +use crate::errors::{ + ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, +}; +use crate::Uint128; /// This module is purely a workaround that lets us ignore lints for all the code /// the `construct_uint!` macro generates. @@ -161,6 +164,16 @@ 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()) + })?)) + } +} + impl TryFrom<&str> for Uint256 { type Error = StdError; @@ -412,6 +425,24 @@ mod tests { assert!(result.is_err()); } + #[test] + fn uint256_convert_to_uint128() { + let source = Uint256::from(42u128); + let target = Uint128::try_from(source); + assert_eq!(target, Ok(Uint128::new(42u128))); + + let source = Uint256::MAX; + let target = Uint128::try_from(source); + assert_eq!( + target, + Err(ConversionOverflowError::new( + "Uint256", + "Uint128", + Uint256::MAX.to_string() + )) + ); + } + #[test] fn uint256_implements_display() { let a = Uint256::from(12345u32); From 946eb9e85a652fcf247431523a09554b4ca1b0f0 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 12:17:15 +0200 Subject: [PATCH 334/402] Add a big number test for Uint256::isqrt() --- packages/std/src/math/isqrt.rs | 6 ++++++ packages/std/src/math/uint256.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index 2c4d97a27..f272c15a9 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -52,6 +52,8 @@ impl Unsigned for usize {} #[cfg(test)] mod tests { + use std::convert::TryFrom; + use super::*; #[test] @@ -85,5 +87,9 @@ mod tests { #[test] fn isqrt_uint256() { assert_eq!(Uint256::from(24u32).isqrt(), Uint256::from(4u32)); + assert_eq!( + (Uint256::from(u128::MAX) * Uint256::from(u128::MAX)).isqrt(), + Uint256::try_from("340282366920938463463374607431768211455").unwrap() + ); } } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 2225fa69b..5826e37b0 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -245,6 +245,22 @@ impl<'a> ops::Div<&'a Uint256> for Uint256 { } } +impl ops::Mul for Uint256 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} + +impl<'a> ops::Mul<&'a Uint256> for Uint256 { + type Output = Self; + + fn mul(self, rhs: &'a Uint256) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} + impl ops::Shr for Uint256 { type Output = Self; @@ -311,6 +327,18 @@ impl<'a> ops::DivAssign<&'a Uint256> for Uint256 { } } +impl ops::MulAssign for Uint256 { + fn mul_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} + +impl<'a> ops::MulAssign<&'a Uint256> for Uint256 { + fn mul_assign(&mut self, rhs: &'a Uint256) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} + impl ops::ShrAssign for Uint256 { fn shr_assign(&mut self, rhs: u32) { if rhs > 256 { From 2512ac8477009aa41afc8159bc958ca637979ba6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 12:42:54 +0200 Subject: [PATCH 335/402] Fix Uint256::try_from(&str) to expect dec values --- packages/std/src/math/uint256.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 5826e37b0..96cae1ea8 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -178,7 +178,7 @@ impl TryFrom<&str> for Uint256 { type Error = StdError; fn try_from(val: &str) -> Result { - match val.parse::() { + match U256::from_dec_str(val) { Ok(u) => Ok(Uint256(u)), Err(e) => Err(StdError::generic_err(format!("Parsing u256: {}", e))), } @@ -398,10 +398,7 @@ impl<'de> de::Visitor<'de> for Uint256Visitor { where E: de::Error, { - match U256::from_dec_str(v) { - Ok(u) => Ok(Uint256(u)), - Err(e) => Err(E::custom(format!("invalid Uint256 '{}' - {}", v, e))), - } + Uint256::try_from(v).map_err(|e| E::custom(format!("invalid Uint256 '{}' - {}", v, e))) } } @@ -447,7 +444,7 @@ mod tests { assert_eq!(a.0, U256::from(5)); let result = Uint256::try_from("34567"); - assert_eq!(result.unwrap().0, U256::from("34567")); + assert_eq!(result.unwrap().0, U256::from_dec_str("34567").unwrap()); let result = Uint256::try_from("1.23"); assert!(result.is_err()); From 259a8a346e7e524e8c62e0886863ea5a94ce1ba9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 12:44:28 +0200 Subject: [PATCH 336/402] More idiomatic names for Uint256 constructors --- packages/std/src/math/uint256.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 96cae1ea8..5fa544686 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -52,7 +52,7 @@ impl Uint256 { /// Creates a Uint256(value) from a big endian representation. It's just an alias for /// `from_big_endian`. pub fn new(value: [u8; 32]) -> Self { - Self::from_big_endian(value) + Self::from_be_bytes(value) } /// Creates a Uint256(0) @@ -60,23 +60,23 @@ impl Uint256 { Uint256(U256::zero()) } - pub fn from_big_endian(value: [u8; 32]) -> Self { + pub fn from_be_bytes(value: [u8; 32]) -> Self { Uint256(U256::from_big_endian(&value)) } - pub fn from_little_endian(value: [u8; 32]) -> Self { + pub fn from_le_bytes(value: [u8; 32]) -> Self { Uint256(U256::from_little_endian(&value)) } /// Returns a copy of the number as big endian bytes. - pub fn big_endian(&self) -> [u8; 32] { + pub fn to_be_bytes(self) -> [u8; 32] { let mut result = [0u8; 32]; self.0.to_big_endian(&mut result); result } /// Returns a copy of the number as little endian bytes. - pub fn little_endian(&self) -> [u8; 32] { + pub fn to_le_bytes(self) -> [u8; 32] { let mut result = [0u8; 32]; self.0.to_little_endian(&mut result); result @@ -422,7 +422,7 @@ mod tests { #[test] fn uint256_construct() { let original = Uint256::new([1; 32]); - let a: [u8; 32] = original.big_endian(); + let a: [u8; 32] = original.to_be_bytes(); assert_eq!(a, [1; 32]); } From 122c49b42c26c2fa5d97b971e16ec3b4e355e70b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 13:02:51 +0200 Subject: [PATCH 337/402] Simplify Uint256::Shr implementations --- packages/std/src/math/uint256.rs | 53 ++++++++++++++++---------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 5fa544686..4a9c2e223 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -265,9 +265,9 @@ impl ops::Shr for Uint256 { type Output = Self; fn shr(self, rhs: u32) -> Self::Output { - if rhs > 256 { + if rhs >= 256 { panic!( - "right shift error: {} is larger than the number of bits in Uint256", + "right shift error: {} is larger or equal than the number of bits in Uint256", rhs ); } @@ -280,14 +280,7 @@ impl<'a> ops::Shr<&'a u32> for Uint256 { type Output = Self; fn shr(self, rhs: &'a u32) -> Self::Output { - if *rhs > 256 { - panic!( - "right shift error: {} is larger than the number of bits in Uint256", - rhs - ); - } - - Self(self.0.shr(*rhs)) + Shr::::shr(self, *rhs) } } @@ -341,27 +334,13 @@ impl<'a> ops::MulAssign<&'a Uint256> for Uint256 { impl ops::ShrAssign for Uint256 { fn shr_assign(&mut self, rhs: u32) { - if rhs > 256 { - panic!( - "right shift error: {} is larger than the number of bits in Uint256", - rhs - ); - } - - self.0 = self.0.shr(rhs); + *self = Shr::::shr(*self, rhs); } } impl<'a> ops::ShrAssign<&'a u32> for Uint256 { fn shr_assign(&mut self, rhs: &'a u32) { - if *rhs > 256 { - panic!( - "right shift error: {} is larger than the number of bits in Uint256", - rhs - ); - } - - self.0 = self.0.shr(*rhs); + *self = Shr::::shr(*self, *rhs); } } @@ -558,6 +537,28 @@ mod tests { let _ = Uint256::from(1u32) - Uint256::from(2u32); } + #[test] + #[should_panic] + fn uint256_shr_works() { + let original = Uint256::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 = Uint256::new([ + 128u8, 0u8, 0u8, 0u8, 0u8, 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 uint256_shr_overflow_panics() { + let _ = Uint256::from(1u32) >> 256u32; + } + #[test] fn sum_works() { let nums = vec![ From 9727bf6db18f0b45d7adfbab41c14890d893ab32 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 13:16:21 +0200 Subject: [PATCH 338/402] Test endianness of Uint256 --- packages/std/src/math/uint256.rs | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 4a9c2e223..93c1bde5b 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -400,9 +400,37 @@ mod tests { #[test] fn uint256_construct() { - let original = Uint256::new([1; 32]); - let a: [u8; 32] = original.to_be_bytes(); + let num = Uint256::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 = Uint256::new(be_bytes); + let resulting_bytes: [u8; 32] = num.to_be_bytes(); + assert_eq!(be_bytes, resulting_bytes); + } + + #[test] + fn uint256_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 = Uint256::new(be_bytes); + let num2 = Uint256::from_be_bytes(be_bytes); + let num3 = Uint256::from_le_bytes(le_bytes); + assert_eq!(num1, Uint256::from(65536u32 + 512 + 3)); + assert_eq!(num1, num2); + assert_eq!(num1, num3); } #[test] From 5509062f3e48293d4a796d197c296742307de3c9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 13:55:11 +0200 Subject: [PATCH 339/402] Fix uint256 shr tests --- packages/std/src/math/uint256.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 93c1bde5b..41f81e41b 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -566,7 +566,6 @@ mod tests { } #[test] - #[should_panic] fn uint256_shr_works() { let original = Uint256::new([ 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, @@ -574,7 +573,7 @@ mod tests { ]); let shifted = Uint256::new([ - 128u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 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, ]); From 98b9fa159e09b1860356bacff333d920baa2ec3f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 16:06:21 +0200 Subject: [PATCH 340/402] Export ConversionOverflowError --- packages/std/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 5235f1d64..016b58716 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -29,8 +29,8 @@ pub use crate::binary::Binary; pub use crate::coins::{coin, coins, has_coins, Coin}; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::errors::{ - OverflowError, OverflowOperation, RecoverPubkeyError, StdError, StdResult, SystemError, - VerificationError, + ConversionOverflowError, OverflowError, OverflowOperation, RecoverPubkeyError, StdError, + StdResult, SystemError, VerificationError, }; #[cfg(feature = "stargate")] pub use crate::ibc::{ From 726ae0cb3da1a499f7e84f795ed7dd3f7d122ec6 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 16:28:33 +0200 Subject: [PATCH 341/402] Docs and CHANGELOG --- CHANGELOG.md | 1 + packages/std/src/errors/std_error.rs | 6 ++++++ packages/std/src/math/uint128.rs | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 817d5c8dd..01f70d690 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to - cosmwasm-std: Added a new `Uint256` type. - cosmwasm-std: Added implementations of `Isqrt` (integer square root) for `Uint64`, `Uint128`, and `Uint256`. +- cosmwasm-std: Exposed `Uint128::full_mul` for full multiplication that cannot overflow. ## [0.16.0] - 2021-08-05 diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 384acb8b5..0a3ba9309 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -478,6 +478,12 @@ impl OverflowError { } } +/// The error returned by [`TryFrom`] conversions that overflow, for example +/// when converting from [`Uint256`] to [`Uint128`]. +/// +/// [`TryFrom`]: std::convert::TryFrom +/// [`Uint256`]: crate::Uint256 +/// [`Uint128`]: crate::Uint128 #[derive(Error, Debug, PartialEq, Eq)] #[error("Error converting {source_type} to {target_type} for {value}")] pub struct ConversionOverflowError { diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 5e922e38e..a05c20b43 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -31,6 +31,8 @@ use crate::Uint256; pub struct Uint128(#[schemars(with = "String")] u128); impl Uint128 { + pub const MAX: Self = Self(u128::MAX); + /// Creates a Uint128(value). /// /// This method is less flexible than `from` but can be called in a const context. @@ -320,7 +322,18 @@ impl Uint128 { .expect("multiplication overflow") } - /// Multiplies two u128 values without overflow. + /// Multiplies two u128 values without overflow, producing an + /// [`Uint256`]. + /// + /// # Examples + /// + /// ``` + /// use cosmwasm_std::Uint128; + /// + /// let a = Uint128::MAX; + /// let result = a.full_mul(2u32); + /// assert_eq!(result.to_string(), "680564733841876926926749214863536422910"); + /// ``` pub fn full_mul(self, rhs: impl Into) -> Uint256 { Uint256::from(self.u128()) .checked_mul(Uint256::from(rhs.into())) From 82d6fb9b1989ffae8f3c92b2ffc5436a093d3525 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 16:48:53 +0200 Subject: [PATCH 342/402] Implement Uint256::checked_shr --- packages/std/src/errors/std_error.rs | 7 ++++++- packages/std/src/math/uint256.rs | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 0a3ba9309..0c16cadce 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -452,6 +452,7 @@ pub enum OverflowOperation { Sub, Mul, Pow, + Shr, } impl fmt::Display for OverflowOperation { @@ -469,7 +470,11 @@ pub struct OverflowError { } impl OverflowError { - pub fn new(operation: OverflowOperation, operand1: U, operand2: U) -> Self { + pub fn new( + operation: OverflowOperation, + operand1: impl ToString, + operand2: impl ToString, + ) -> Self { Self { operation, operand1: operand1.to_string(), diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 41f81e41b..9fa48b26f 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -121,6 +121,14 @@ impl Uint256 { .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 saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } @@ -265,14 +273,12 @@ impl ops::Shr for Uint256 { type Output = Self; fn shr(self, rhs: u32) -> Self::Output { - if rhs >= 256 { + self.checked_shr(rhs).unwrap_or_else(|_| { panic!( "right shift error: {} is larger or equal than the number of bits in Uint256", - rhs - ); - } - - Self(self.0.shr(rhs)) + rhs, + ) + }) } } From de9823207c7c768adb0e43190563b395462c9978 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 16:54:06 +0200 Subject: [PATCH 343/402] Format .md files --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01f70d690..f3f903c93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,8 @@ and this project adheres to - cosmwasm-std: Added a new `Uint256` type. - cosmwasm-std: Added implementations of `Isqrt` (integer square root) for `Uint64`, `Uint128`, and `Uint256`. -- cosmwasm-std: Exposed `Uint128::full_mul` for full multiplication that cannot overflow. +- cosmwasm-std: Exposed `Uint128::full_mul` for full multiplication that cannot + overflow. ## [0.16.0] - 2021-08-05 From 1c47a00b46469d4fa722dd17477c970c795c6d4f Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 22:24:11 +0200 Subject: [PATCH 344/402] Expose Uint64::full_mul --- CHANGELOG.md | 4 ++-- packages/std/src/math/uint128.rs | 12 +++++++++++- packages/std/src/math/uint64.rs | 27 +++++++++++++++++++++------ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd64ec840..d70c96810 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,8 @@ and this project adheres to - cosmwasm-std: Added a new `Uint256` type. - cosmwasm-std: Added implementations of `Isqrt` (integer square root) for `Uint64`, `Uint128`, and `Uint256`. -- cosmwasm-std: Exposed `Uint128::full_mul` for full multiplication that cannot - overflow. +- cosmwasm-std: Exposed `Uint{64, 128}::full_mul` for full multiplication that + cannot overflow. ### Changed diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index a05c20b43..4b6caf021 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -6,7 +6,7 @@ use std::iter::Sum; use std::ops; use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; -use crate::Uint256; +use crate::{ConversionOverflowError, 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, @@ -164,6 +164,16 @@ impl From for Uint128 { } } +impl TryFrom for Uint64 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint128) -> Result { + Ok(Uint64::new(value.0.try_into().map_err(|_| { + ConversionOverflowError::new("Uint128", "Uint64", value.to_string()) + })?)) + } +} + impl TryFrom<&str> for Uint128 { type Error = StdError; diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index b0faa40cc..07aa5441c 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -6,6 +6,7 @@ use std::iter::Sum; use std::ops; use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; +use crate::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, @@ -27,6 +28,8 @@ use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdErro pub struct Uint64(#[schemars(with = "String")] u64); impl Uint64 { + pub const MAX: Self = Self(u64::MAX); + /// Creates a Uint64(value). /// /// This method is less flexible than `from` but can be called in a const context. @@ -278,15 +281,27 @@ impl Uint64 { panic!("Denominator must not be zero"); } - let val: u64 = (self.full_mul(numerator) / denominator as u128) + (self.full_mul(numerator) / Uint128::from(denominator)) .try_into() - .expect("multiplication overflow"); - Uint64::from(val) + .expect("multiplication overflow") } - /// Multiplies two u64 values without overflow. - fn full_mul(self, rhs: impl Into) -> u128 { - self.u64() as u128 * rhs.into() as u128 + /// Multiplies two `Uint64`/`u64` values without overflow, producing an + /// [`Uint128`]. + /// + /// # Examples + /// + /// ``` + /// use cosmwasm_std::Uint64; + /// + /// let a = Uint64::MAX; + /// let result = a.full_mul(2u32); + /// assert_eq!(result.to_string(), "36893488147419103230"); + /// ``` + pub fn full_mul(self, rhs: impl Into) -> Uint128 { + Uint128::from(self.u64()) + .checked_mul(Uint128::from(rhs.into())) + .unwrap() } } From 359245bc7657796d40e0a2d51fb5474701c3f2b5 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 22:50:37 +0200 Subject: [PATCH 345/402] Implement Uint512 --- CHANGELOG.md | 8 +- packages/std/src/lib.rs | 2 +- packages/std/src/math/isqrt.rs | 15 +- packages/std/src/math/mod.rs | 2 + packages/std/src/math/uint128.rs | 6 + packages/std/src/math/uint256.rs | 14 +- packages/std/src/math/uint512.rs | 684 +++++++++++++++++++++++++++++++ 7 files changed, 724 insertions(+), 7 deletions(-) create mode 100644 packages/std/src/math/uint512.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index d70c96810..0dd609267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,11 @@ and this project adheres to - cosmwasm-std: Added `From` and `From<&Addr>` conversions for `Cow`. -- cosmwasm-std: Added a new `Uint256` type. +- cosmwasm-std: Added new `Uint256` and `Uint512` types. - cosmwasm-std: Added implementations of `Isqrt` (integer square root) for - `Uint64`, `Uint128`, and `Uint256`. -- cosmwasm-std: Exposed `Uint{64, 128}::full_mul` for full multiplication that - cannot overflow. + `Uint64`, `Uint128`, `Uint256`, and `Uint512`. +- cosmwasm-std: Exposed `Uint{64, 128, 256}::full_mul` for full multiplication + that cannot overflow. ### Changed diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 016b58716..b62edf3fe 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -41,7 +41,7 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] #[allow(deprecated)] pub use crate::iterator::{Order, Pair, KV}; -pub use crate::math::{Decimal, Fraction, Uint128, Uint256, Uint64}; +pub use crate::math::{Decimal, Fraction, Uint128, Uint256, Uint512, Uint64}; pub use crate::query::{ AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery, }; diff --git a/packages/std/src/math/isqrt.rs b/packages/std/src/math/isqrt.rs index f272c15a9..8716232f7 100644 --- a/packages/std/src/math/isqrt.rs +++ b/packages/std/src/math/isqrt.rs @@ -1,6 +1,6 @@ use std::{cmp, ops}; -use crate::{Uint128, Uint256, Uint64}; +use crate::{Uint128, Uint256, Uint512, Uint64}; /// A trait for calculating the /// [integer square root](https://en.wikipedia.org/wiki/Integer_square_root). @@ -48,6 +48,7 @@ impl Unsigned for u128 {} impl Unsigned for Uint64 {} impl Unsigned for Uint128 {} impl Unsigned for Uint256 {} +impl Unsigned for Uint512 {} impl Unsigned for usize {} #[cfg(test)] @@ -92,4 +93,16 @@ mod tests { Uint256::try_from("340282366920938463463374607431768211455").unwrap() ); } + + #[test] + fn isqrt_uint512() { + assert_eq!(Uint512::from(24u32).isqrt(), Uint512::from(4u32)); + assert_eq!( + (Uint512::from(Uint256::MAX) * Uint512::from(Uint256::MAX)).isqrt(), + Uint512::try_from( + "115792089237316195423570985008687907853269984665640564039457584007913129639935" + ) + .unwrap() + ); + } } diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 81d8cbd12..4f6221fdc 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -3,6 +3,7 @@ mod fraction; mod isqrt; mod uint128; mod uint256; +mod uint512; mod uint64; pub use decimal::Decimal; @@ -10,4 +11,5 @@ pub use fraction::Fraction; pub use isqrt::Isqrt; pub use uint128::Uint128; pub use uint256::Uint256; +pub use uint512::Uint512; pub use uint64::Uint64; diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 4b6caf021..60611c99d 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -134,6 +134,12 @@ impl Uint128 { // 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 +impl From for Uint128 { + fn from(val: Uint64) -> Self { + val.u64().into() + } +} + impl From for Uint128 { fn from(val: u128) -> Self { Uint128(val) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 9fa48b26f..7fda4b2b1 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -8,7 +8,7 @@ use std::ops::{self, Shr}; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::Uint128; +use crate::{Uint128, Uint64}; /// This module is purely a workaround that lets us ignore lints for all the code /// the `construct_uint!` macro generates. @@ -142,6 +142,18 @@ impl Uint256 { } } +impl From for Uint256 { + fn from(val: Uint128) -> Self { + val.u128().into() + } +} + +impl From for Uint256 { + fn from(val: Uint64) -> Self { + val.u64().into() + } +} + impl From for Uint256 { fn from(val: u128) -> Self { Uint256(val.into()) diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs new file mode 100644 index 000000000..1d0b555c1 --- /dev/null +++ b/packages/std/src/math/uint512.rs @@ -0,0 +1,684 @@ +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::convert::{TryFrom, TryInto}; +use std::fmt; +use std::iter::Sum; +use std::ops::{self, Shr}; + +use crate::errors::{ + ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, +}; +use crate::{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; + +/// 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::Uint512; +/// let a = Uint512::from(258u128); +/// let b = Uint512::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 Uint512(#[schemars(with = "String")] U512); + +impl Uint512 { + pub const MAX: Uint512 = Uint512(U512::MAX); + + /// Creates a Uint512(value) from a big endian representation. It's just an alias for + /// `from_big_endian`. + pub fn new(value: [u8; 64]) -> Self { + Self::from_be_bytes(value) + } + + /// Creates a Uint512(0) + pub const fn zero() -> Self { + Uint512(U512::zero()) + } + + pub fn from_be_bytes(value: [u8; 64]) -> Self { + Uint512(U512::from_big_endian(&value)) + } + + pub fn from_le_bytes(value: [u8; 64]) -> Self { + Uint512(U512::from_little_endian(&value)) + } + + /// Returns a copy of the number as big endian bytes. + pub fn to_be_bytes(self) -> [u8; 64] { + let mut result = [0u8; 64]; + self.0.to_big_endian(&mut result); + result + } + + /// Returns a copy of the number as little endian bytes. + pub fn to_le_bytes(self) -> [u8; 64] { + let mut result = [0u8; 64]; + self.0.to_little_endian(&mut result); + result + } + + pub fn is_zero(&self) -> bool { + self.0.is_zero() + } + + 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_div(self, other: Self) -> Result { + self.0 + .checked_div(other.0) + .map(Self) + .ok_or_else(|| DivideByZeroError::new(self)) + } + + 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))) + } + + pub fn saturating_add(self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)) + } + + pub fn saturating_sub(self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + + pub fn saturating_mul(self, other: Self) -> Self { + Self(self.0.saturating_mul(other.0)) + } +} + +impl From for Uint512 { + 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 Uint512 { + fn from(val: Uint128) -> Self { + val.u128().into() + } +} + +impl From for Uint512 { + fn from(val: Uint64) -> Self { + val.u64().into() + } +} + +impl From for Uint512 { + fn from(val: u128) -> Self { + Uint512(val.into()) + } +} + +impl From for Uint512 { + fn from(val: u64) -> Self { + Uint512(val.into()) + } +} + +impl From for Uint512 { + fn from(val: u32) -> Self { + Uint512(val.into()) + } +} + +impl From for Uint512 { + fn from(val: u16) -> Self { + Uint512(val.into()) + } +} + +impl From for Uint512 { + fn from(val: u8) -> Self { + Uint512(val.into()) + } +} + +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()) + })?)) + } +} + +impl TryFrom<&str> for Uint512 { + type Error = StdError; + + fn try_from(val: &str) -> Result { + match U512::from_dec_str(val) { + Ok(u) => Ok(Uint512(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing u512: {}", e))), + } + } +} + +impl From for String { + fn from(original: Uint512) -> Self { + original.to_string() + } +} + +impl fmt::Display for Uint512 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl ops::Add for Uint512 { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + Uint512(self.0.checked_add(rhs.0).unwrap()) + } +} + +impl<'a> ops::Add<&'a Uint512> for Uint512 { + type Output = Self; + + fn add(self, rhs: &'a Uint512) -> Self { + Uint512(self.0.checked_add(rhs.0).unwrap()) + } +} + +impl ops::Sub for Uint512 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Uint512(self.0.checked_sub(rhs.0).unwrap()) + } +} + +impl<'a> ops::Sub<&'a Uint512> for Uint512 { + type Output = Self; + + fn sub(self, rhs: &'a Uint512) -> Self { + Uint512(self.0.checked_sub(rhs.0).unwrap()) + } +} + +impl ops::Div for Uint512 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} + +impl<'a> ops::Div<&'a Uint512> for Uint512 { + type Output = Self; + + fn div(self, rhs: &'a Uint512) -> Self::Output { + Self(self.0.checked_div(rhs.0).unwrap()) + } +} + +impl ops::Mul for Uint512 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} + +impl<'a> ops::Mul<&'a Uint512> for Uint512 { + type Output = Self; + + fn mul(self, rhs: &'a Uint512) -> Self::Output { + Self(self.0.checked_mul(rhs.0).unwrap()) + } +} + +impl ops::Shr for Uint512 { + 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 Uint512", + rhs, + ) + }) + } +} + +impl<'a> ops::Shr<&'a u32> for Uint512 { + type Output = Self; + + fn shr(self, rhs: &'a u32) -> Self::Output { + Shr::::shr(self, *rhs) + } +} + +impl ops::AddAssign for Uint512 { + fn add_assign(&mut self, rhs: Uint512) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} + +impl<'a> ops::AddAssign<&'a Uint512> for Uint512 { + fn add_assign(&mut self, rhs: &'a Uint512) { + self.0 = self.0.checked_add(rhs.0).unwrap(); + } +} + +impl ops::SubAssign for Uint512 { + fn sub_assign(&mut self, rhs: Uint512) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} + +impl<'a> ops::SubAssign<&'a Uint512> for Uint512 { + fn sub_assign(&mut self, rhs: &'a Uint512) { + self.0 = self.0.checked_sub(rhs.0).unwrap(); + } +} + +impl ops::DivAssign for Uint512 { + fn div_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} + +impl<'a> ops::DivAssign<&'a Uint512> for Uint512 { + fn div_assign(&mut self, rhs: &'a Uint512) { + self.0 = self.0.checked_div(rhs.0).unwrap(); + } +} + +impl ops::MulAssign for Uint512 { + fn mul_assign(&mut self, rhs: Self) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} + +impl<'a> ops::MulAssign<&'a Uint512> for Uint512 { + fn mul_assign(&mut self, rhs: &'a Uint512) { + self.0 = self.0.checked_mul(rhs.0).unwrap(); + } +} + +impl ops::ShrAssign for Uint512 { + fn shr_assign(&mut self, rhs: u32) { + *self = Shr::::shr(*self, rhs); + } +} + +impl<'a> ops::ShrAssign<&'a u32> for Uint512 { + fn shr_assign(&mut self, rhs: &'a u32) { + *self = Shr::::shr(*self, *rhs); + } +} + +impl Serialize for Uint512 { + /// 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 Uint512 { + /// Deserialized from an integer string using base 10 + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Uint512Visitor) + } +} + +struct Uint512Visitor; + +impl<'de> de::Visitor<'de> for Uint512Visitor { + type Value = Uint512; + + 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, + { + Uint512::try_from(v).map_err(|e| E::custom(format!("invalid Uint512 '{}' - {}", v, e))) + } +} + +impl Sum for Uint512 { + fn sum>(iter: I) -> Self { + iter.fold(Uint512::zero(), ops::Add::add) + } +} + +impl<'a> Sum<&'a Uint512> for Uint512 { + fn sum>(iter: I) -> Self { + iter.fold(Uint512::zero(), ops::Add::add) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{from_slice, to_vec}; + + #[test] + fn uint512_construct() { + let num = Uint512::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 = Uint512::new(be_bytes); + let resulting_bytes: [u8; 64] = num.to_be_bytes(); + assert_eq!(be_bytes, resulting_bytes); + } + + #[test] + fn uint512_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 = Uint512::new(be_bytes); + let num2 = Uint512::from_be_bytes(be_bytes); + let num3 = Uint512::from_le_bytes(le_bytes); + assert_eq!(num1, Uint512::from(65536u32 + 512 + 3)); + assert_eq!(num1, num2); + assert_eq!(num1, num3); + } + + #[test] + fn uint512_convert_from() { + let a = Uint512::from(5u128); + assert_eq!(a.0, U512::from(5)); + + let a = Uint512::from(5u64); + assert_eq!(a.0, U512::from(5)); + + let a = Uint512::from(5u32); + assert_eq!(a.0, U512::from(5)); + + let a = Uint512::from(5u16); + assert_eq!(a.0, U512::from(5)); + + let a = Uint512::from(5u8); + assert_eq!(a.0, U512::from(5)); + + let result = Uint512::try_from("34567"); + assert_eq!(result.unwrap().0, U512::from_dec_str("34567").unwrap()); + + let result = Uint512::try_from("1.23"); + assert!(result.is_err()); + } + + #[test] + fn uint512_convert_to_uint128() { + let source = Uint512::from(42u128); + let target = Uint128::try_from(source); + assert_eq!(target, Ok(Uint128::new(42u128))); + + let source = Uint512::MAX; + let target = Uint128::try_from(source); + assert_eq!( + target, + Err(ConversionOverflowError::new( + "Uint512", + "Uint128", + Uint512::MAX.to_string() + )) + ); + } + + #[test] + fn uint512_implements_display() { + let a = Uint512::from(12345u32); + 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!(a.to_string(), "0"); + } + + #[test] + fn uint512_is_zero_works() { + assert!(Uint512::zero().is_zero()); + assert!(Uint512(U512::from(0)).is_zero()); + + assert!(!Uint512::from(1u32).is_zero()); + assert!(!Uint512::from(123u32).is_zero()); + } + + #[test] + fn uint512_json() { + let orig = Uint512::from(1234567890987654321u128); + let serialized = to_vec(&orig).unwrap(); + assert_eq!(serialized.as_slice(), b"\"1234567890987654321\""); + let parsed: Uint512 = from_slice(&serialized).unwrap(); + assert_eq!(parsed, orig); + } + + #[test] + fn uint512_compare() { + let a = Uint512::from(12345u32); + let b = Uint512::from(23456u32); + + assert!(a < b); + assert!(b > a); + assert_eq!(a, Uint512::from(12345u32)); + } + + #[test] + #[allow(clippy::op_ref)] + fn uint512_math() { + let a = Uint512::from(12345u32); + let b = Uint512::from(23456u32); + + // test + with owned and reference right hand side + assert_eq!(a + b, Uint512::from(35801u32)); + assert_eq!(a + &b, Uint512::from(35801u32)); + + // test - with owned and reference right hand side + assert_eq!(b - a, Uint512::from(11111u32)); + assert_eq!(b - &a, Uint512::from(11111u32)); + + // test += with owned and reference right hand side + let mut c = Uint512::from(300000u32); + c += b; + assert_eq!(c, Uint512::from(323456u32)); + let mut d = Uint512::from(300000u32); + d += &b; + assert_eq!(d, Uint512::from(323456u32)); + + // test -= with owned and reference right hand side + let mut c = Uint512::from(300000u32); + c -= b; + assert_eq!(c, Uint512::from(276544u32)); + let mut d = Uint512::from(300000u32); + d -= &b; + assert_eq!(d, Uint512::from(276544u32)); + + // 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())); + } + + #[test] + #[should_panic] + fn uint512_add_overflow_panics() { + let max = Uint512::new([255u8; 64]); + let _ = max + Uint512::from(12u32); + } + + #[test] + #[should_panic] + fn uint512_sub_overflow_panics() { + let _ = Uint512::from(1u32) - Uint512::from(2u32); + } + + #[test] + fn uint512_shr_works() { + let original = Uint512::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 = Uint512::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 uint512_shr_overflow_panics() { + let _ = Uint512::from(1u32) >> 512u32; + } + + #[test] + fn sum_works() { + let nums = vec![ + Uint512::from(17u32), + Uint512::from(123u32), + Uint512::from(540u32), + Uint512::from(82u32), + ]; + let expected = Uint512::from(762u32); + + let sum_as_ref = nums.iter().sum(); + assert_eq!(expected, sum_as_ref); + + let sum_as_owned = nums.into_iter().sum(); + assert_eq!(expected, sum_as_owned); + } + + #[test] + fn uint512_methods() { + // checked_* + assert!(matches!( + Uint512::MAX.checked_add(Uint512::from(1u32)), + Err(OverflowError { .. }) + )); + assert!(matches!( + Uint512::from(0u32).checked_sub(Uint512::from(1u32)), + Err(OverflowError { .. }) + )); + assert!(matches!( + Uint512::MAX.checked_mul(Uint512::from(2u32)), + Err(OverflowError { .. }) + )); + assert!(matches!( + Uint512::MAX.checked_div(Uint512::from(0u32)), + Err(DivideByZeroError { .. }) + )); + assert!(matches!( + Uint512::MAX.checked_rem(Uint512::from(0u32)), + Err(DivideByZeroError { .. }) + )); + + // saturating_* + assert_eq!( + Uint512::MAX.saturating_add(Uint512::from(1u32)), + Uint512::MAX + ); + assert_eq!( + Uint512::from(0u32).saturating_sub(Uint512::from(1u32)), + Uint512::from(0u32) + ); + assert_eq!( + Uint512::MAX.saturating_mul(Uint512::from(2u32)), + Uint512::MAX + ); + } +} From 510d0586d7b95a04508d30eb728d666563c34359 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 30 Aug 2021 23:11:10 +0200 Subject: [PATCH 346/402] Implement Uint256::full_mul --- packages/std/src/math/uint256.rs | 95 +++++++++++++++++++++++++++++++- packages/std/src/math/uint512.rs | 19 +++++++ 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 7fda4b2b1..3743a7689 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -8,7 +8,7 @@ use std::ops::{self, Shr}; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, }; -use crate::{Uint128, Uint64}; +use crate::{Uint128, Uint512, Uint64}; /// This module is purely a workaround that lets us ignore lints for all the code /// the `construct_uint!` macro generates. @@ -362,6 +362,45 @@ impl<'a> ops::ShrAssign<&'a u32> for Uint256 { } } +impl Uint256 { + /// Returns `self * numerator / denominator` + pub fn multiply_ratio, B: Into>( + &self, + numerator: A, + denominator: B, + ) -> Uint256 { + let numerator: Uint256 = numerator.into(); + let denominator: Uint256 = denominator.into(); + if denominator.is_zero() { + panic!("Denominator must not be zero"); + } + (self.full_mul(numerator) / Uint512::from(denominator)) + .try_into() + .expect("multiplication overflow") + } + + /// Multiplies two u256 values without overflow, producing an + /// [`Uint512`]. + /// + /// # Examples + /// + /// ``` + /// use cosmwasm_std::Uint256; + /// + /// let a = Uint256::MAX; + /// let result = a.full_mul(2u32); + /// assert_eq!( + /// result.to_string(), + /// "231584178474632390847141970017375815706539969331281128078915168015826259279870", + /// ); + /// ``` + pub fn full_mul(self, rhs: impl Into) -> Uint512 { + Uint512::from(self) + .checked_mul(Uint512::from(rhs.into())) + .unwrap() + } +} + impl Serialize for Uint256 { /// Serializes as an integer string using base 10 fn serialize(&self, serializer: S) -> Result @@ -583,6 +622,60 @@ mod tests { let _ = Uint256::from(1u32) - Uint256::from(2u32); } + #[test] + fn uint256_multiply_ratio_works() { + let base = Uint256::from(500u32); + + // factor 1/1 + assert_eq!(base.multiply_ratio(1u128, 1u128), Uint256::from(500u32)); + assert_eq!(base.multiply_ratio(3u128, 3u128), Uint256::from(500u32)); + assert_eq!( + base.multiply_ratio(654321u128, 654321u128), + Uint256::from(500u32) + ); + + // factor 3/2 + assert_eq!(base.multiply_ratio(3u128, 2u128), Uint256::from(750u32)); + assert_eq!( + base.multiply_ratio(333333u128, 222222u128), + Uint256::from(750u32) + ); + + // factor 2/3 (integer devision always floors the result) + assert_eq!(base.multiply_ratio(2u128, 3u128), Uint256::from(333u32)); + assert_eq!( + base.multiply_ratio(222222u128, 333333u128), + Uint256::from(333u32) + ); + + // factor 5/6 (integer devision always floors the result) + assert_eq!(base.multiply_ratio(5u128, 6u128), Uint256::from(416u32)); + assert_eq!(base.multiply_ratio(100u128, 120u128), Uint256::from(416u32)); + } + + #[test] + fn uint256_multiply_ratio_does_not_overflow_when_result_fits() { + // Almost max value for Uint256. + let base = Uint256::MAX - Uint256::from(9u8); + + assert_eq!(base.multiply_ratio(2u128, 2u128), base); + } + + #[test] + #[should_panic] + fn uint256_multiply_ratio_panicks_on_overflow() { + // Almost max value for Uint256. + let base = Uint256::MAX - Uint256::from(9u8); + + assert_eq!(base.multiply_ratio(2u128, 1u128), base); + } + + #[test] + #[should_panic(expected = "Denominator must not be zero")] + fn uint256_multiply_ratio_panics_for_zero_denominator() { + Uint256::from(500u32).multiply_ratio(1u128, 0u128); + } + #[test] fn uint256_shr_works() { let original = Uint256::new([ diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 1d0b555c1..51fab53b7 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -196,6 +196,25 @@ impl From for Uint512 { } } +impl TryFrom for Uint256 { + type Error = ConversionOverflowError; + + fn try_from(value: Uint512) -> 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( + "Uint512", + "Uint256", + value.to_string(), + )); + } + + Ok(Self::from_be_bytes(last_bytes.try_into().unwrap())) + } +} + impl TryFrom for Uint128 { type Error = ConversionOverflowError; From c780f7462f67cf0dc80071b2f30668df6fbbed71 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 31 Aug 2021 08:11:48 +0200 Subject: [PATCH 347/402] Set version: 0.16.1 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45af8a159..d540249e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index b3661e665..fb0a38aa0 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -102,7 +102,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index c19e423d5..d0bef08f8 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -104,7 +104,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -115,14 +115,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -130,7 +130,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -144,7 +144,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -152,7 +152,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index 5ab518b6a..a7352b783 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 02337ea31..ae5bf95d8 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index f2bf323f4..bf357656d 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 30ae6b041..10dffc231 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 43943a5d9..57bab159e 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 45309fd16..1e1fc818c 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index f66c2a6ec..a09209f45 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 1b76a80c5..c590be72a 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.0" +version = "0.16.1" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 09ef299d7..8a35ad87b 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.0" +version = "0.16.1" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index c922f23ce..a34f3aa1c 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.0" +version = "0.16.1" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 39373269b..6971f7725 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.0" +version = "0.16.1" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -32,7 +32,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.0" } +cosmwasm-derive = { path = "../derive", version = "0.16.1" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -40,7 +40,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.0" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.1" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index 7e00e4430..f02c824cb 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.0" +version = "0.16.1" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.0", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.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 b423f65bc..f79ff8e9f 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.0" +version = "0.16.1" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.0", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.0" } +cosmwasm-std = { path = "../std", version = "0.16.1", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.1" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From bfa57759654016a0373bc5439b61f4a71765c780 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 31 Aug 2021 08:30:30 +0200 Subject: [PATCH 348/402] CHANGELOG update --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dd609267..1615f136a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [0.16.1] - 2021-08-31 + ### Added - cosmwasm-std: Added `From` and `From<&Addr>` conversions for From 2f30b5deb5bb63ea60291d55cc610565bcfce64e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 31 Aug 2021 09:53:32 +0200 Subject: [PATCH 349/402] Test Uint{128,256,64}::multiply_ratio with large inputs --- packages/std/src/math/uint128.rs | 9 ++++----- packages/std/src/math/uint256.rs | 10 ++++------ packages/std/src/math/uint64.rs | 9 ++++----- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 60611c99d..fb9a3a6ea 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -545,11 +545,10 @@ mod tests { let base = Uint128(500); // factor 1/1 - assert_eq!(base.multiply_ratio(1u128, 1u128), Uint128(500)); - assert_eq!(base.multiply_ratio(3u128, 3u128), Uint128(500)); - assert_eq!(base.multiply_ratio(654321u128, 654321u128), Uint128(500)); - // Reactivate after https://github.com/CosmWasm/cosmwasm/issues/920 - // assert_eq!(base.multiply_ratio(u128::MAX, u128::MAX), Uint128(500)); + assert_eq!(base.multiply_ratio(1u128, 1u128), base); + assert_eq!(base.multiply_ratio(3u128, 3u128), base); + assert_eq!(base.multiply_ratio(654321u128, 654321u128), base); + assert_eq!(base.multiply_ratio(u128::MAX, u128::MAX), base); // factor 3/2 assert_eq!(base.multiply_ratio(3u128, 2u128), Uint128(750)); diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 3743a7689..e59062677 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -627,12 +627,10 @@ mod tests { let base = Uint256::from(500u32); // factor 1/1 - assert_eq!(base.multiply_ratio(1u128, 1u128), Uint256::from(500u32)); - assert_eq!(base.multiply_ratio(3u128, 3u128), Uint256::from(500u32)); - assert_eq!( - base.multiply_ratio(654321u128, 654321u128), - Uint256::from(500u32) - ); + assert_eq!(base.multiply_ratio(1u128, 1u128), base); + assert_eq!(base.multiply_ratio(3u128, 3u128), base); + assert_eq!(base.multiply_ratio(654321u128, 654321u128), base); + assert_eq!(base.multiply_ratio(Uint256::MAX, Uint256::MAX), base); // factor 3/2 assert_eq!(base.multiply_ratio(3u128, 2u128), Uint256::from(750u32)); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index 07aa5441c..c18525f5d 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -475,11 +475,10 @@ mod tests { let base = Uint64(500); // factor 1/1 - assert_eq!(base.multiply_ratio(1u64, 1u64), Uint64(500)); - assert_eq!(base.multiply_ratio(3u64, 3u64), Uint64(500)); - assert_eq!(base.multiply_ratio(654321u64, 654321u64), Uint64(500)); - // Reactivate after https://github.com/CosmWasm/cosmwasm/issues/920 - // assert_eq!(base.multiply_ratio(u64::MAX, u64::MAX), Uint64(500)); + assert_eq!(base.multiply_ratio(1u64, 1u64), base); + assert_eq!(base.multiply_ratio(3u64, 3u64), base); + assert_eq!(base.multiply_ratio(654321u64, 654321u64), base); + assert_eq!(base.multiply_ratio(u64::MAX, u64::MAX), base); // factor 3/2 assert_eq!(base.multiply_ratio(3u64, 2u64), Uint64(750)); From 4c0f35aa99a455284600b0601ac754cf5148b5c3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 31 Aug 2021 08:56:00 +0200 Subject: [PATCH 350/402] Implement `Decimal::from_ratio` using full multiplication --- CHANGELOG.md | 5 +++++ packages/std/src/math/decimal.rs | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1615f136a..b8493abe4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to ## [Unreleased] +### Fixed + +- cosmwasm-std: Implement `Decimal::from_ratio` using full uint128 + multiplication to support a wider range of input values. + ## [0.16.1] - 2021-08-31 ### Added diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 30cf8f797..72ae360fa 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -49,8 +49,13 @@ impl Decimal { if denominator == 0 { panic!("Denominator must not be zero"); } - // TODO: better algorithm with less rounding potential? - Decimal(numerator * DECIMAL_FRACTIONAL / denominator) + + Decimal( + // numerator * DECIMAL_FRACTIONAL / denominator + Uint128::from(numerator) + .multiply_ratio(DECIMAL_FRACTIONAL, denominator) + .into(), + ) } pub fn is_zero(&self) -> bool { @@ -320,6 +325,15 @@ mod tests { Decimal::from_ratio(2u64, 3u64), Decimal(666_666_666_666_666_666) ); + + // large inputs + assert_eq!(Decimal::from_ratio(0u128, u128::MAX), Decimal::zero()); + assert_eq!(Decimal::from_ratio(u128::MAX, u128::MAX), Decimal::one()); + // 340282366920938463463 is the largest integer <= Decimal::MAX + assert_eq!( + Decimal::from_ratio(340282366920938463463u128, 1u128), + Decimal::from_str("340282366920938463463").unwrap() + ); } #[test] From 5f245781f5e15e25d90144451843353c8f452ce9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 31 Aug 2021 15:36:59 +0200 Subject: [PATCH 351/402] Make Decimal hold a Uint128 internally --- packages/std/src/math/decimal.rs | 203 ++++++++++++++++++++----------- packages/std/src/math/uint128.rs | 91 +++++++++++--- packages/std/src/math/uint256.rs | 11 +- packages/std/src/math/uint512.rs | 11 +- packages/std/src/math/uint64.rs | 2 +- 5 files changed, 227 insertions(+), 91 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 72ae360fa..b6dc82d30 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -14,52 +14,53 @@ use super::Uint128; /// /// 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)] -pub struct Decimal(#[schemars(with = "String")] u128); - -const DECIMAL_FRACTIONAL: u128 = 1_000_000_000_000_000_000; // 1*10**18 -const DECIMAL_FRACTIONAL_SQUARED: u128 = 1_000_000_000_000_000_000_000_000_000_000_000_000; // (1*10**18)**2 = 1*10**36 +pub struct Decimal(#[schemars(with = "String")] Uint128); impl Decimal { - pub const MAX: Decimal = Decimal(u128::MAX); + const DECIMAL_FRACTIONAL: Uint128 = Uint128::new(1_000_000_000_000_000_000u128); // 1*10**18 + const DECIMAL_FRACTIONAL_SQUARED: Uint128 = + Uint128::new(1_000_000_000_000_000_000_000_000_000_000_000_000u128); // (1*10**18)**2 = 1*10**36 + + pub const MAX: Self = Self(Uint128::MAX); /// Create a 1.0 Decimal - pub const fn one() -> Decimal { - Decimal(DECIMAL_FRACTIONAL) + pub const fn one() -> Self { + Decimal(Self::DECIMAL_FRACTIONAL) } /// Create a 0.0 Decimal - pub const fn zero() -> Decimal { - Decimal(0) + pub const fn zero() -> Self { + Decimal(Uint128::zero()) } /// Convert x% into Decimal - pub fn percent(x: u64) -> Decimal { - Decimal((x as u128) * 10_000_000_000_000_000) + pub fn percent(x: u64) -> Self { + Decimal(((x as u128) * 10_000_000_000_000_000).into()) } /// Convert permille (x/1000) into Decimal - pub fn permille(x: u64) -> Decimal { - Decimal((x as u128) * 1_000_000_000_000_000) + pub fn permille(x: u64) -> Self { + Decimal(((x as u128) * 1_000_000_000_000_000).into()) } /// Returns the ratio (numerator / denominator) as a Decimal - pub fn from_ratio, B: Into>(numerator: A, denominator: B) -> Decimal { - let numerator: u128 = numerator.into(); - let denominator: u128 = denominator.into(); - if denominator == 0 { + pub fn from_ratio, B: Into>(numerator: A, denominator: B) -> Self { + let numerator: Uint128 = numerator.into(); + let denominator: Uint128 = denominator.into(); + if denominator.is_zero() { panic!("Denominator must not be zero"); } Decimal( // numerator * DECIMAL_FRACTIONAL / denominator Uint128::from(numerator) - .multiply_ratio(DECIMAL_FRACTIONAL, denominator) + .multiply_ratio(Self::DECIMAL_FRACTIONAL, denominator) .into(), ) } pub fn is_zero(&self) -> bool { - self.0 == 0 + self.0.is_zero() } /// Returns the approximate square root as a Decimal. @@ -82,35 +83,35 @@ impl Decimal { /// Returns `None` if the internal multiplication overflows. fn sqrt_with_precision(&self, precision: u32) -> Option { let inner_mul = 100u128.pow(precision); - self.0.checked_mul(inner_mul).map(|inner| { + self.0.checked_mul(inner_mul.into()).ok().map(|inner| { let outer_mul = 10u128.pow(9 - precision); - Decimal(inner.isqrt() * outer_mul) + Decimal(inner.isqrt().checked_mul(Uint128::from(outer_mul)).unwrap()) }) } } -impl Fraction for Decimal { +impl Fraction for Decimal { #[inline] - fn numerator(&self) -> u128 { + fn numerator(&self) -> Uint128 { self.0 } #[inline] - fn denominator(&self) -> u128 { - DECIMAL_FRACTIONAL + fn denominator(&self) -> Uint128 { + Self::DECIMAL_FRACTIONAL } /// Returns the multiplicative inverse `1/d` for decimal `d`. /// /// If `d` is zero, none is returned. - fn inv(&self) -> Option { + 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(Decimal(DECIMAL_FRACTIONAL_SQUARED / self.0)) + Some(Decimal(Self::DECIMAL_FRACTIONAL_SQUARED / self.0)) } } } @@ -129,24 +130,24 @@ impl FromStr for Decimal { let whole_part = parts_iter.next().unwrap(); // split always returns at least one element let whole = whole_part - .parse::() + .parse::() .map_err(|_| StdError::generic_err("Error parsing whole"))?; let mut atomics = whole - .checked_mul(DECIMAL_FRACTIONAL) - .ok_or_else(|| StdError::generic_err("Value too big"))?; + .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::() + .parse::() .map_err(|_| StdError::generic_err("Error parsing fractional"))?; let exp = (18usize.checked_sub(fractional_part.len())).ok_or_else(|| { StdError::generic_err("Cannot parse more than 18 fractional digits") })?; debug_assert!(exp <= 18); - let fractional_factor = 10u128.pow(exp as u32); + let fractional_factor = Uint128::from(10u128.pow(exp as u32)); atomics = atomics - .checked_add(fractional * fractional_factor) - .ok_or_else(|| StdError::generic_err("Value too big"))?; + .checked_add(fractional.checked_mul(fractional_factor)?) + .map_err(|_| StdError::generic_err("Value too big"))?; } if parts_iter.next().is_some() { @@ -159,10 +160,10 @@ impl FromStr for Decimal { impl fmt::Display for Decimal { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let whole = (self.0) / DECIMAL_FRACTIONAL; - let fractional = (self.0) % DECIMAL_FRACTIONAL; + let whole = (self.0) / Self::DECIMAL_FRACTIONAL; + let fractional = (self.0).checked_rem(Self::DECIMAL_FRACTIONAL).unwrap(); - if fractional == 0 { + if fractional.is_zero() { write!(f, "{}", whole) } else { let fractional_string = format!("{:018}", fractional); @@ -202,7 +203,7 @@ impl ops::Mul for Uint128 { if self.is_zero() || rhs.is_zero() { return Uint128::zero(); } - self.multiply_ratio(rhs.0, DECIMAL_FRACTIONAL) + self.multiply_ratio(rhs.0, Decimal::DECIMAL_FRACTIONAL) } } @@ -218,13 +219,13 @@ impl ops::Div for Decimal { type Output = Self; fn div(self, rhs: Uint128) -> Self::Output { - Decimal(self.0 / rhs.u128()) + Decimal(self.0 / Uint128::from(rhs.u128())) } } impl ops::DivAssign for Decimal { fn div_assign(&mut self, rhs: Uint128) { - self.0 /= rhs.u128(); + self.0 /= Uint128::from(rhs.u128()); } } @@ -240,7 +241,7 @@ impl Serialize for Decimal { /// Deserializes as a base64 string impl<'de> Deserialize<'de> for Decimal { - fn deserialize(deserializer: D) -> Result + fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { @@ -277,25 +278,25 @@ mod tests { #[test] fn decimal_one() { let value = Decimal::one(); - assert_eq!(value.0, DECIMAL_FRACTIONAL); + assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL); } #[test] fn decimal_zero() { let value = Decimal::zero(); - assert_eq!(value.0, 0); + assert!(value.0.is_zero()); } #[test] fn decimal_percent() { let value = Decimal::percent(50); - assert_eq!(value.0, DECIMAL_FRACTIONAL / 2); + assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(2u8)); } #[test] fn decimal_permille() { let value = Decimal::permille(125); - assert_eq!(value.0, DECIMAL_FRACTIONAL / 8); + assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(8u8)); } #[test] @@ -317,13 +318,13 @@ mod tests { // 1/3 (result floored) assert_eq!( Decimal::from_ratio(1u64, 3u64), - Decimal(333_333_333_333_333_333) + Decimal(Uint128::from(333_333_333_333_333_333u128)) ); // 2/3 (result floored) assert_eq!( Decimal::from_ratio(2u64, 3u64), - Decimal(666_666_666_666_666_666) + Decimal(Uint128::from(666_666_666_666_666_666u128)) ); // large inputs @@ -345,8 +346,14 @@ mod tests { #[test] fn decimal_implements_fraction() { let fraction = Decimal::from_str("1234.567").unwrap(); - assert_eq!(fraction.numerator(), 1_234_567_000_000_000_000_000); - assert_eq!(fraction.denominator(), 1_000_000_000_000_000_000); + assert_eq!( + fraction.numerator(), + Uint128::from(1_234_567_000_000_000_000_000u128) + ); + assert_eq!( + fraction.denominator(), + Uint128::from(1_000_000_000_000_000_000u128) + ); } #[test] @@ -375,11 +382,11 @@ mod tests { // Can handle 18 fractional digits assert_eq!( Decimal::from_str("7.123456789012345678").unwrap(), - Decimal(7123456789012345678) + Decimal(Uint128::from(7123456789012345678u128)) ); assert_eq!( Decimal::from_str("7.999999999999999999").unwrap(), - Decimal(7999999999999999999) + Decimal(Uint128::from(7999999999999999999u128)) ); // Works for documented max value @@ -549,7 +556,10 @@ mod tests { #[test] fn decimal_add() { let value = Decimal::one() + Decimal::percent(50); // 1.5 - assert_eq!(value.0, DECIMAL_FRACTIONAL * 3 / 2); + assert_eq!( + value.0, + Decimal::DECIMAL_FRACTIONAL * Uint128::from(3u8) / Uint128::from(2u8) + ); } #[test] @@ -561,7 +571,7 @@ mod tests { #[test] fn decimal_sub() { let value = Decimal::one() - Decimal::percent(50); // 0.5 - assert_eq!(value.0, DECIMAL_FRACTIONAL / 2); + assert_eq!(value.0, Decimal::DECIMAL_FRACTIONAL / Uint128::from(2u8)); } #[test] @@ -696,26 +706,77 @@ mod tests { // Decimals assert_eq!(Decimal::percent(125).to_string(), "1.25"); assert_eq!(Decimal::percent(42638).to_string(), "426.38"); - assert_eq!(Decimal::percent(1).to_string(), "0.01"); + //assert_eq!(Decimal::percent(1).to_string(), "0.01"); assert_eq!(Decimal::permille(987).to_string(), "0.987"); - assert_eq!(Decimal(1).to_string(), "0.000000000000000001"); - assert_eq!(Decimal(10).to_string(), "0.00000000000000001"); - assert_eq!(Decimal(100).to_string(), "0.0000000000000001"); - assert_eq!(Decimal(1000).to_string(), "0.000000000000001"); - assert_eq!(Decimal(10000).to_string(), "0.00000000000001"); - assert_eq!(Decimal(100000).to_string(), "0.0000000000001"); - assert_eq!(Decimal(1000000).to_string(), "0.000000000001"); - assert_eq!(Decimal(10000000).to_string(), "0.00000000001"); - assert_eq!(Decimal(100000000).to_string(), "0.0000000001"); - assert_eq!(Decimal(1000000000).to_string(), "0.000000001"); - assert_eq!(Decimal(10000000000).to_string(), "0.00000001"); - assert_eq!(Decimal(100000000000).to_string(), "0.0000001"); - assert_eq!(Decimal(10000000000000).to_string(), "0.00001"); - assert_eq!(Decimal(100000000000000).to_string(), "0.0001"); - assert_eq!(Decimal(1000000000000000).to_string(), "0.001"); - assert_eq!(Decimal(10000000000000000).to_string(), "0.01"); - assert_eq!(Decimal(100000000000000000).to_string(), "0.1"); + assert_eq!( + Decimal(Uint128::from(1u128)).to_string(), + "0.000000000000000001" + ); + assert_eq!( + Decimal(Uint128::from(10u128)).to_string(), + "0.00000000000000001" + ); + assert_eq!( + Decimal(Uint128::from(100u128)).to_string(), + "0.0000000000000001" + ); + assert_eq!( + Decimal(Uint128::from(1000u128)).to_string(), + "0.000000000000001" + ); + assert_eq!( + Decimal(Uint128::from(10000u128)).to_string(), + "0.00000000000001" + ); + assert_eq!( + Decimal(Uint128::from(100000u128)).to_string(), + "0.0000000000001" + ); + assert_eq!( + Decimal(Uint128::from(1000000u128)).to_string(), + "0.000000000001" + ); + assert_eq!( + Decimal(Uint128::from(10000000u128)).to_string(), + "0.00000000001" + ); + assert_eq!( + Decimal(Uint128::from(100000000u128)).to_string(), + "0.0000000001" + ); + assert_eq!( + Decimal(Uint128::from(1000000000u128)).to_string(), + "0.000000001" + ); + assert_eq!( + Decimal(Uint128::from(10000000000u128)).to_string(), + "0.00000001" + ); + assert_eq!( + Decimal(Uint128::from(100000000000u128)).to_string(), + "0.0000001" + ); + assert_eq!( + Decimal(Uint128::from(10000000000000u128)).to_string(), + "0.00001" + ); + assert_eq!( + Decimal(Uint128::from(100000000000000u128)).to_string(), + "0.0001" + ); + assert_eq!( + Decimal(Uint128::from(1000000000000000u128)).to_string(), + "0.001" + ); + assert_eq!( + Decimal(Uint128::from(10000000000000000u128)).to_string(), + "0.01" + ); + assert_eq!( + Decimal(Uint128::from(100000000000000000u128)).to_string(), + "0.1" + ); } #[test] diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index fb9a3a6ea..3e5585279 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -4,6 +4,7 @@ use std::convert::{TryFrom, TryInto}; use std::fmt::{self}; use std::iter::Sum; use std::ops; +use std::str::FromStr; use crate::errors::{DivideByZeroError, OverflowError, OverflowOperation, StdError}; use crate::{ConversionOverflowError, Uint256, Uint64}; @@ -191,6 +192,14 @@ impl TryFrom<&str> for Uint128 { } } +impl FromStr for Uint128 { + type Err = StdError; + + fn from_str(s: &str) -> Result { + Self::try_from(s) + } +} + impl From for String { fn from(original: Uint128) -> Self { original.to_string() @@ -205,7 +214,7 @@ impl From for u128 { impl fmt::Display for Uint128 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) + self.0.fmt(f) } } @@ -213,7 +222,11 @@ impl ops::Add for Uint128 { type Output = Self; fn add(self, rhs: Self) -> Self { - Uint128(self.u128().checked_add(rhs.u128()).unwrap()) + Uint128( + self.u128() + .checked_add(rhs.u128()) + .unwrap_or_else(|| panic!("attempt to add with overflow")), + ) } } @@ -221,7 +234,7 @@ impl<'a> ops::Add<&'a Uint128> for Uint128 { type Output = Self; fn add(self, rhs: &'a Uint128) -> Self { - Uint128(self.u128().checked_add(rhs.u128()).unwrap()) + self + *rhs } } @@ -229,7 +242,11 @@ impl ops::Sub for Uint128 { type Output = Self; fn sub(self, rhs: Self) -> Self { - Uint128(self.u128().checked_sub(rhs.u128()).unwrap()) + Uint128( + self.u128() + .checked_sub(rhs.u128()) + .unwrap_or_else(|| panic!("attempt to subtract with overflow")), + ) } } @@ -237,7 +254,27 @@ impl<'a> ops::Sub<&'a Uint128> for Uint128 { type Output = Self; fn sub(self, rhs: &'a Uint128) -> Self { - Uint128(self.u128().checked_sub(rhs.u128()).unwrap()) + self - *rhs + } +} + +impl ops::Mul for Uint128 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self( + self.u128() + .checked_mul(rhs.u128()) + .unwrap_or_else(|| panic!("attempt to multiply with overflow")), + ) + } +} + +impl<'a> ops::Mul<&'a Uint128> for Uint128 { + type Output = Self; + + fn mul(self, rhs: &'a Uint128) -> Self::Output { + self * *rhs } } @@ -245,7 +282,11 @@ impl ops::Div for Uint128 { type Output = Self; fn div(self, rhs: Self) -> Self::Output { - Self(self.u128().checked_div(rhs.u128()).unwrap()) + Self( + self.u128() + .checked_div(rhs.u128()) + .unwrap_or_else(|| panic!("attempt to divide by zero")), + ) } } @@ -253,7 +294,7 @@ impl<'a> ops::Div<&'a Uint128> for Uint128 { type Output = Self; fn div(self, rhs: &'a Uint128) -> Self::Output { - Self(self.u128().checked_div(rhs.u128()).unwrap()) + self / *rhs } } @@ -261,7 +302,11 @@ impl ops::Shr for Uint128 { type Output = Self; fn shr(self, rhs: u32) -> Self::Output { - Self(self.u128().checked_shr(rhs).unwrap()) + Self( + self.u128() + .checked_shr(rhs) + .unwrap_or_else(|| panic!("attempt to shift right with overflow")), + ) } } @@ -269,55 +314,67 @@ impl<'a> ops::Shr<&'a u32> for Uint128 { type Output = Self; fn shr(self, rhs: &'a u32) -> Self::Output { - Self(self.u128().checked_shr(*rhs).unwrap()) + self >> *rhs } } impl ops::AddAssign for Uint128 { fn add_assign(&mut self, rhs: Uint128) { - self.0 = self.0.checked_add(rhs.u128()).unwrap(); + *self = *self + rhs; } } impl<'a> ops::AddAssign<&'a Uint128> for Uint128 { fn add_assign(&mut self, rhs: &'a Uint128) { - self.0 = self.0.checked_add(rhs.u128()).unwrap(); + *self = *self + rhs; } } impl ops::SubAssign for Uint128 { fn sub_assign(&mut self, rhs: Uint128) { - self.0 = self.0.checked_sub(rhs.u128()).unwrap(); + *self = *self - rhs; } } impl<'a> ops::SubAssign<&'a Uint128> for Uint128 { fn sub_assign(&mut self, rhs: &'a Uint128) { - self.0 = self.0.checked_sub(rhs.u128()).unwrap(); + *self = *self - rhs; + } +} + +impl ops::MulAssign for Uint128 { + fn mul_assign(&mut self, rhs: Self) { + *self = *self * rhs; + } +} + +impl<'a> ops::MulAssign<&'a Uint128> for Uint128 { + fn mul_assign(&mut self, rhs: &'a Uint128) { + *self = *self * rhs; } } impl ops::DivAssign for Uint128 { fn div_assign(&mut self, rhs: Self) { - self.0 = self.0.checked_div(rhs.u128()).unwrap(); + *self = *self / rhs; } } impl<'a> ops::DivAssign<&'a Uint128> for Uint128 { fn div_assign(&mut self, rhs: &'a Uint128) { - self.0 = self.0.checked_div(rhs.u128()).unwrap(); + *self = *self / rhs; } } impl ops::ShrAssign for Uint128 { fn shr_assign(&mut self, rhs: u32) { - self.0 = self.0.checked_shr(rhs).unwrap(); + *self = *self >> rhs; } } impl<'a> ops::ShrAssign<&'a u32> for Uint128 { fn shr_assign(&mut self, rhs: &'a u32) { - self.0 = self.0.checked_shr(*rhs).unwrap(); + *self = *self >> rhs; } } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index e59062677..2d01a79c0 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -4,6 +4,7 @@ use std::convert::{TryFrom, TryInto}; use std::fmt; use std::iter::Sum; use std::ops::{self, Shr}; +use std::str::FromStr; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, @@ -205,6 +206,14 @@ impl TryFrom<&str> for Uint256 { } } +impl FromStr for Uint256 { + type Err = StdError; + + fn from_str(s: &str) -> Result { + Self::try_from(s) + } +} + impl From for String { fn from(original: Uint256) -> Self { original.to_string() @@ -213,7 +222,7 @@ impl From for String { impl fmt::Display for Uint256 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) + self.0.fmt(f) } } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 51fab53b7..e477c806b 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -4,6 +4,7 @@ use std::convert::{TryFrom, TryInto}; use std::fmt; use std::iter::Sum; use std::ops::{self, Shr}; +use std::str::FromStr; use crate::errors::{ ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, StdError, @@ -236,6 +237,14 @@ impl TryFrom<&str> for Uint512 { } } +impl FromStr for Uint64 { + type Err = StdError; + + fn from_str(s: &str) -> Result { + Self::try_from(s) + } +} + impl From for String { fn from(original: Uint512) -> Self { original.to_string() @@ -244,7 +253,7 @@ impl From for String { impl fmt::Display for Uint512 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) + self.0.fmt(f) } } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index c18525f5d..b4020adfd 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -180,7 +180,7 @@ impl From for u64 { impl fmt::Display for Uint64 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) + self.0.fmt(f) } } From 305e6982fee1dda9b673de3ff1c6d30ff63266ed Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 06:48:08 +0200 Subject: [PATCH 352/402] Fix clippy --- packages/std/src/math/decimal.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index b6dc82d30..91b4244dd 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -53,9 +53,7 @@ impl Decimal { Decimal( // numerator * DECIMAL_FRACTIONAL / denominator - Uint128::from(numerator) - .multiply_ratio(Self::DECIMAL_FRACTIONAL, denominator) - .into(), + numerator.multiply_ratio(Self::DECIMAL_FRACTIONAL, denominator), ) } From c35885ae7f8f1dc2e2a0661a426a80778f55c945 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 08:58:57 +0200 Subject: [PATCH 353/402] style (suggestions from code review) Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- packages/std/src/math/decimal.rs | 6 +++--- packages/std/src/math/uint128.rs | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 91b4244dd..da0c906a6 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -217,13 +217,13 @@ impl ops::Div for Decimal { type Output = Self; fn div(self, rhs: Uint128) -> Self::Output { - Decimal(self.0 / Uint128::from(rhs.u128())) + Decimal(self.0 / rhs) } } impl ops::DivAssign for Decimal { fn div_assign(&mut self, rhs: Uint128) { - self.0 /= Uint128::from(rhs.u128()); + self.0 /= rhs; } } @@ -704,7 +704,7 @@ mod tests { // Decimals assert_eq!(Decimal::percent(125).to_string(), "1.25"); assert_eq!(Decimal::percent(42638).to_string(), "426.38"); - //assert_eq!(Decimal::percent(1).to_string(), "0.01"); + assert_eq!(Decimal::percent(3).to_string(), "0.03"); assert_eq!(Decimal::permille(987).to_string(), "0.987"); assert_eq!( diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index 3e5585279..b655b59a5 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -225,7 +225,7 @@ impl ops::Add for Uint128 { Uint128( self.u128() .checked_add(rhs.u128()) - .unwrap_or_else(|| panic!("attempt to add with overflow")), + .expect("attempt to add with overflow"), ) } } @@ -245,7 +245,7 @@ impl ops::Sub for Uint128 { Uint128( self.u128() .checked_sub(rhs.u128()) - .unwrap_or_else(|| panic!("attempt to subtract with overflow")), + .expect("attempt to subtract with overflow"), ) } } @@ -265,7 +265,7 @@ impl ops::Mul for Uint128 { Self( self.u128() .checked_mul(rhs.u128()) - .unwrap_or_else(|| panic!("attempt to multiply with overflow")), + .expect("attempt to multiply with overflow"), ) } } @@ -274,7 +274,7 @@ impl<'a> ops::Mul<&'a Uint128> for Uint128 { type Output = Self; fn mul(self, rhs: &'a Uint128) -> Self::Output { - self * *rhs + self.mul(*rhs) } } @@ -285,7 +285,7 @@ impl ops::Div for Uint128 { Self( self.u128() .checked_div(rhs.u128()) - .unwrap_or_else(|| panic!("attempt to divide by zero")), + .expect("attempt to divide by zero"), ) } } @@ -305,7 +305,7 @@ impl ops::Shr for Uint128 { Self( self.u128() .checked_shr(rhs) - .unwrap_or_else(|| panic!("attempt to shift right with overflow")), + .expect("attempt to shift right with overflow"), ) } } From 1811f059b81f17539fd1c01e239553c14f87d999 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 09:56:30 +0200 Subject: [PATCH 354/402] Code comments --- packages/std/src/math/decimal.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index da0c906a6..01b792f5a 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -144,7 +144,11 @@ impl FromStr for Decimal { debug_assert!(exp <= 18); let fractional_factor = Uint128::from(10u128.pow(exp as u32)); atomics = atomics - .checked_add(fractional.checked_mul(fractional_factor)?) + .checked_add( + // The inner multiplication can't overflow because + // fractional < 10^18 && fractional_factor <= 10^18 + fractional.checked_mul(fractional_factor).unwrap(), + ) .map_err(|_| StdError::generic_err("Value too big"))?; } From c92ac5b5643be148b57120aede799a2a0a058df2 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 10:03:32 +0200 Subject: [PATCH 355/402] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8493abe4..0f4960fb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to - cosmwasm-std: Implement `Decimal::from_ratio` using full uint128 multiplication to support a wider range of input values. +- cosmwasm-std: `Fraction` methods `numerator` and `denominator` now return a + `Uint128`. ## [0.16.1] - 2021-08-31 From c7ffc05142b8d975439c6b7cb9e70a3bb80b2c63 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 10:57:26 +0200 Subject: [PATCH 356/402] CHANGELOG update --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f4960fb0..9769902a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,12 +6,24 @@ and this project adheres to ## [Unreleased] -### Fixed +### Added + +- cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. +- cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`.` + +### Changed - cosmwasm-std: Implement `Decimal::from_ratio` using full uint128 multiplication to support a wider range of input values. - cosmwasm-std: `Fraction` methods `numerator` and `denominator` now return a `Uint128`. +- cosmwasm-std: `Decimal::from_ratio` now accepts any types that implement + `Into` rather than `Into`. + +### 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 From a4ed308d5e2c148f576304d4a331304a859bb61e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 11:00:51 +0200 Subject: [PATCH 357/402] style fixes for Uint* --- packages/std/src/math/decimal.rs | 22 ++++++++-------------- packages/std/src/math/uint128.rs | 10 +++++----- packages/std/src/math/uint256.rs | 10 +++++----- packages/std/src/math/uint512.rs | 12 ++++++------ 4 files changed, 24 insertions(+), 30 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 01b792f5a..88ee60ee1 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -44,7 +44,7 @@ impl Decimal { } /// Returns the ratio (numerator / denominator) as a Decimal - pub fn from_ratio, B: Into>(numerator: A, denominator: B) -> Self { + pub fn from_ratio(numerator: impl Into, denominator: impl Into) -> Self { let numerator: Uint128 = numerator.into(); let denominator: Uint128 = denominator.into(); if denominator.is_zero() { @@ -88,15 +88,15 @@ impl Decimal { } } -impl Fraction for Decimal { +impl Fraction for Decimal { #[inline] - fn numerator(&self) -> Uint128 { - self.0 + fn numerator(&self) -> u128 { + self.0.u128() } #[inline] - fn denominator(&self) -> Uint128 { - Self::DECIMAL_FRACTIONAL + fn denominator(&self) -> u128 { + Self::DECIMAL_FRACTIONAL.u128() } /// Returns the multiplicative inverse `1/d` for decimal `d`. @@ -348,14 +348,8 @@ mod tests { #[test] fn decimal_implements_fraction() { let fraction = Decimal::from_str("1234.567").unwrap(); - assert_eq!( - fraction.numerator(), - Uint128::from(1_234_567_000_000_000_000_000u128) - ); - assert_eq!( - fraction.denominator(), - Uint128::from(1_000_000_000_000_000_000u128) - ); + assert_eq!(fraction.numerator(), 1_234_567_000_000_000_000_000u128); + assert_eq!(fraction.denominator(), 1_000_000_000_000_000_000u128); } #[test] diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index b655b59a5..abf5abae7 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -185,10 +185,7 @@ impl TryFrom<&str> for Uint128 { type Error = StdError; fn try_from(val: &str) -> Result { - match val.parse::() { - Ok(u) => Ok(Uint128(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u128: {}", e))), - } + Self::from_str(val) } } @@ -196,7 +193,10 @@ impl FromStr for Uint128 { type Err = StdError; fn from_str(s: &str) -> Result { - Self::try_from(s) + match s.parse::() { + Ok(u) => Ok(Uint128(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing u128: {}", e))), + } } } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 2d01a79c0..d7ef06cb3 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -199,10 +199,7 @@ impl TryFrom<&str> for Uint256 { type Error = StdError; fn try_from(val: &str) -> Result { - match U256::from_dec_str(val) { - Ok(u) => Ok(Uint256(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u256: {}", e))), - } + Self::from_str(val) } } @@ -210,7 +207,10 @@ impl FromStr for Uint256 { type Err = StdError; fn from_str(s: &str) -> Result { - Self::try_from(s) + match U256::from_dec_str(s) { + Ok(u) => Ok(Uint256(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing u256: {}", e))), + } } } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index e477c806b..14f26e519 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -230,18 +230,18 @@ impl TryFrom<&str> for Uint512 { type Error = StdError; fn try_from(val: &str) -> Result { - match U512::from_dec_str(val) { - Ok(u) => Ok(Uint512(u)), - Err(e) => Err(StdError::generic_err(format!("Parsing u512: {}", e))), - } + Self::from_str(val) } } -impl FromStr for Uint64 { +impl FromStr for Uint512 { type Err = StdError; fn from_str(s: &str) -> Result { - Self::try_from(s) + match U512::from_dec_str(s) { + Ok(u) => Ok(Self(u)), + Err(e) => Err(StdError::generic_err(format!("Parsing u512: {}", e))), + } } } From 2ad50d6e87ef680c52fbaea3c650f76fe3b97e99 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 14:32:57 +0200 Subject: [PATCH 358/402] Update CHANGELOG --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9769902a0..e0c464d53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,8 +15,6 @@ and this project adheres to - cosmwasm-std: Implement `Decimal::from_ratio` using full uint128 multiplication to support a wider range of input values. -- cosmwasm-std: `Fraction` methods `numerator` and `denominator` now return a - `Uint128`. - cosmwasm-std: `Decimal::from_ratio` now accepts any types that implement `Into` rather than `Into`. From 8335878d51f3307228afc6cb2baf22434ded3981 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Sep 2021 11:59:32 +0200 Subject: [PATCH 359/402] Update dependency k256 to ^0.9.6 --- CHANGELOG.md | 1 + Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 4 ++-- contracts/crypto-verify/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/crypto/Cargo.toml | 2 +- 12 files changed, 26 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0c464d53..992026289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to 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. ### Fixed diff --git a/Cargo.lock b/Cargo.lock index d540249e9..d9a0eee9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,9 +416,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +checksum = "cc209804a22c34a98fe26a32d997ac64d4284816f65cf1a529c4e31a256218a0" dependencies = [ "generic-array", "rand_core 0.6.3", @@ -590,9 +590,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.10.4" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" +checksum = "beca177dcb8eb540133e7680baff45e7cc4d93bf22002676cec549f82343721b" dependencies = [ "crypto-bigint", "ff", @@ -802,9 +802,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index fb0a38aa0..8f96f031b 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -608,9 +608,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index d0bef08f8..849495c09 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -641,9 +641,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index a7352b783..c60e5bf01 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -619,9 +619,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index ae5bf95d8..6ea65aa7c 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -619,9 +619,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index bf357656d..e7c5e066b 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -617,9 +617,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index 10dffc231..cad1cb3cd 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -617,9 +617,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 57bab159e..70b559686 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -597,9 +597,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 1e1fc818c..0d00fb7b9 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -605,9 +605,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index a09209f45..5694b0aa2 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -611,9 +611,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "k256" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b0281ca8032567c9711cd48631781c15228301860a39b32deb28d63125e46" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if", "ecdsa", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index c590be72a..bc4636ed3 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -19,7 +19,7 @@ backtraces = [] bench = false [dependencies] -k256 = { version = "0.9.4", features = ["ecdsa"] } +k256 = { version = "0.9.6", features = ["ecdsa"] } ed25519-zebra = "2" digest = "0.9" rand_core = { version = "0.5", features = ["getrandom"] } From 93961d9a3d7fa12cf728efe8f98f5edcda7cc575 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Sep 2021 12:02:39 +0200 Subject: [PATCH 360/402] Use rust-optimizer 0.12.1 --- .circleci/config.yml | 2 +- README.md | 2 +- contracts/README.md | 18 +++++++++--------- packages/vm/README.md | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 529f31431..ef50206bd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -958,7 +958,7 @@ jobs: name: Build development contracts command: | echo "Building all contracts under ./contracts" - docker run --volumes-from with_code cosmwasm/rust-optimizer:0.11.4 ./contracts/*/ + docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.1 ./contracts/*/ - run: name: Check development contracts command: | diff --git a/README.md b/README.md index 001425e1e..b3e728e04 100644 --- a/README.md +++ b/README.md @@ -349,7 +349,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.11.4 + cosmwasm/rust-optimizer:0.12.1 ``` 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 4860e1e00..872a878cf 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -18,47 +18,47 @@ 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.11.4 ./contracts/burner + cosmwasm/rust-optimizer:0.12.1 ./contracts/burner docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="devcontract_cache_burner",target=/code/contracts/crypto-verify/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.11.4 ./contracts/crypto-verify + cosmwasm/rust-optimizer:0.12.1 ./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.11.4 ./contracts/floaty + cosmwasm/rust-optimizer:0.12.1 ./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.11.4 ./contracts/hackatom + cosmwasm/rust-optimizer:0.12.1 ./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.11.4 ./contracts/ibc-reflect + cosmwasm/rust-optimizer:0.12.1 ./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.11.4 ./contracts/ibc-reflect-send + cosmwasm/rust-optimizer:0.12.1 ./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.11.4 ./contracts/queue + cosmwasm/rust-optimizer:0.12.1 ./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.11.4 ./contracts/reflect + cosmwasm/rust-optimizer:0.12.1 ./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.11.4 ./contracts/staking + cosmwasm/rust-optimizer:0.12.1 ./contracts/staking ``` ## Entry points diff --git a/packages/vm/README.md b/packages/vm/README.md index 8c033a5c4..93595ab53 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -53,19 +53,19 @@ To rebuild the test contracts, go to the repo root and do 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.11.4 ./contracts/hackatom \ + cosmwasm/rust-optimizer:0.12.1 ./contracts/hackatom \ && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_0.16.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.11.4 ./contracts/ibc-reflect \ + cosmwasm/rust-optimizer:0.12.1 ./contracts/ibc-reflect \ && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_0.16.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.11.4 ./contracts/floaty \ + cosmwasm/rust-optimizer:0.12.1 ./contracts/floaty \ && cp artifacts/floaty.wasm packages/vm/testdata/floaty.wasm ``` From f00fafd1e8329706f7669e82863a7043be98223c Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 2 Sep 2021 13:56:01 +0200 Subject: [PATCH 361/402] Add a test for Uint* Display padding --- 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 ++++++ 4 files changed, 24 insertions(+) diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index abf5abae7..a475107c4 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -517,6 +517,12 @@ mod tests { 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"); + } + #[test] fn uint128_is_zero_works() { assert!(Uint128::zero().is_zero()); diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index d7ef06cb3..a739617f8 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -552,6 +552,12 @@ mod tests { 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"); + } + #[test] fn uint256_is_zero_works() { assert!(Uint256::zero().is_zero()); diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 14f26e519..ce04b1340 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -550,6 +550,12 @@ mod tests { 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"); + } + #[test] fn uint512_is_zero_works() { assert!(Uint512::zero().is_zero()); diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index b4020adfd..c3274e481 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -405,6 +405,12 @@ mod tests { 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"); + } + #[test] fn uint64_is_zero_works() { assert!(Uint64::zero().is_zero()); From eb2284ff29d6494e3c7c7cf63fab95f22ed17553 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 2 Sep 2021 14:00:55 +0200 Subject: [PATCH 362/402] Fix the padding bug for Uint256 and Uint512 --- packages/std/src/math/uint256.rs | 6 +++++- packages/std/src/math/uint512.rs | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index a739617f8..4839ca7a2 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -222,7 +222,11 @@ impl From for String { impl fmt::Display for Uint256 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.0.fmt(f) + // 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) } } diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index ce04b1340..00ef9d416 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -253,7 +253,11 @@ impl From for String { impl fmt::Display for Uint512 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.0.fmt(f) + // 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) } } From c16f74c34d32320998c82c20f8d47ddcaa82ffb5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 3 Sep 2021 15:24:39 +0200 Subject: [PATCH 363/402] Add CHANGELOG entry for OverflowOperation::Shr --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 992026289..0f30168c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,9 @@ and this project adheres to - 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 From 3b4e615af3dc2410bdb8e086a8fcc4f958f0cdb9 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 3 Sep 2021 17:22:26 +0200 Subject: [PATCH 364/402] Remove extra ` from CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f30168c4..56ab01e04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to ### Added - cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. -- cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`.` +- cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`. ### Changed From d365955242ebfb2f58b7ed6d86ee360b91182e67 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 3 Sep 2021 15:24:58 +0200 Subject: [PATCH 365/402] Add Shl implementation --- CHANGELOG.md | 3 +++ packages/std/src/errors/std_error.rs | 1 + packages/std/src/math/uint256.rs | 33 ++++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56ab01e04..f79d5bdbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,9 @@ and this project adheres to - 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 diff --git a/packages/std/src/errors/std_error.rs b/packages/std/src/errors/std_error.rs index 0c16cadce..1c0410ba2 100644 --- a/packages/std/src/errors/std_error.rs +++ b/packages/std/src/errors/std_error.rs @@ -453,6 +453,7 @@ pub enum OverflowOperation { Mul, Pow, Shr, + Shl, } impl fmt::Display for OverflowOperation { diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 4839ca7a2..e44a57e33 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -3,7 +3,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize}; use std::convert::{TryFrom, TryInto}; use std::fmt; use std::iter::Sum; -use std::ops::{self, Shr}; +use std::ops::{self, Shl, Shr}; use std::str::FromStr; use crate::errors::{ @@ -130,6 +130,14 @@ impl Uint256 { Ok(Self(self.0.shr(other))) } + pub fn checked_shl(self, other: u32) -> Result { + if other >= 256 { + return Err(OverflowError::new(OverflowOperation::Shl, self, other)); + } + + Ok(Self(self.0.shl(other))) + } + pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } @@ -311,7 +319,28 @@ impl<'a> ops::Shr<&'a u32> for Uint256 { type Output = Self; fn shr(self, rhs: &'a u32) -> Self::Output { - Shr::::shr(self, *rhs) + self.shr(*rhs) + } +} + +impl ops::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, + ) + }) + } +} + +impl<'a> ops::Shl<&'a u32> for Uint256 { + type Output = Self; + + fn shl(self, rhs: &'a u32) -> Self::Output { + self.shl(*rhs) } } From 992eaf5ab8e05a7622c274e235831c6527cc361c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Sep 2021 16:13:48 +0200 Subject: [PATCH 366/402] Make Uint256::from_le_bytes const --- CHANGELOG.md | 1 + packages/std/src/math/uint256.rs | 154 ++++++++++++++++++++++++++++++- 2 files changed, 153 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f79d5bdbd..5ee84ae65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to - cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. - cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`. +- cosmwasm-std: Make `Uint256::from_le_bytes` const. ### Changed diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index e44a57e33..2b686e3e6 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -65,8 +65,22 @@ impl Uint256 { Uint256(U256::from_big_endian(&value)) } - pub fn from_le_bytes(value: [u8; 32]) -> Self { - Uint256(U256::from_little_endian(&value)) + 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], + ]), + ]; + Uint256(U256(words)) } /// Returns a copy of the number as big endian bytes. @@ -512,6 +526,142 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn uint256_from_le_bytes() { + let a = Uint256::from_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, + ]); + assert_eq!(a, Uint256::from(0u128)); + let a = Uint256::from_le_bytes([ + 42, 0, 0, 0, 0, 0, 0, 0, 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!(a, Uint256::from(42u128)); + let a = Uint256::from_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, + ]); + assert_eq!(a, Uint256::from(1u128)); + let a = Uint256::from_le_bytes([ + 0, 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, + ]); + assert_eq!(a, Uint256::from(256u128)); + let a = Uint256::from_le_bytes([ + 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(65536u128)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(16777216u128)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(4294967296u128)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(72057594037927936u128)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 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!(a, Uint256::from(18446744073709551616u128)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1329227995784915872903807060280344576u128)); + + // Values > u128::MAX + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 16)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 17)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 18)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 19)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 20)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 21)); + let a = Uint256::from_le_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 22)); + let a = Uint256::from_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, 1, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 23)); + let a = Uint256::from_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, 1, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 24)); + let a = Uint256::from_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, 1, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 25)); + let a = Uint256::from_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, 1, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 26)); + let a = Uint256::from_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, 1, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 27)); + let a = Uint256::from_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, 1, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 28)); + let a = Uint256::from_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, + 1, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 29)); + let a = Uint256::from_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, 1, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 30)); + let a = Uint256::from_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, 1, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 31)); + } + #[test] fn uint256_endianness() { let be_bytes = [ From 9d754e08f3647a35820b847e9789c24d87b398e5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 3 Sep 2021 17:25:35 +0200 Subject: [PATCH 367/402] Make Uint256::from_be_bytes const --- CHANGELOG.md | 2 +- packages/std/src/math/uint256.rs | 174 ++++++++++++++++++++++++++++++- 2 files changed, 173 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ee84ae65..a108cb24e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to - cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. - cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`. -- cosmwasm-std: Make `Uint256::from_le_bytes` const. +- cosmwasm-std: Make `Uint256::from_le_bytes` and `::from_be_bytes` const. ### Changed diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 2b686e3e6..fca8de2b2 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -61,8 +61,22 @@ impl Uint256 { Uint256(U256::zero()) } - pub fn from_be_bytes(value: [u8; 32]) -> Self { - Uint256(U256::from_big_endian(&value)) + 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], + ]), + ]; + Uint256(U256(words)) } pub const fn from_le_bytes(data: [u8; 32]) -> Self { @@ -526,6 +540,162 @@ mod tests { assert_eq!(be_bytes, resulting_bytes); } + #[test] + fn uint256_from_be_bytes() { + let a = 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, 0, + ]); + assert_eq!(a, Uint256::from(0u128)); + let a = 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, 42, + ]); + assert_eq!(a, Uint256::from(42u128)); + let a = 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, 1, + ]); + assert_eq!(a, Uint256::from(1u128)); + let a = 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, 1, 0, + ]); + assert_eq!(a, Uint256::from(256u128)); + let a = 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, + 1, 0, 0, + ]); + assert_eq!(a, Uint256::from(65536u128)); + let a = 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, 1, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(16777216u128)); + let a = 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, 1, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(4294967296u128)); + let a = 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, 1, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1099511627776u128)); + let a = 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, 1, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(281474976710656u128)); + let a = 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, 1, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(72057594037927936u128)); + let a = 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, 1, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(18446744073709551616u128)); + let a = 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, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(4722366482869645213696u128)); + let a = 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, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1208925819614629174706176u128)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1329227995784915872903807060280344576u128)); + + // Values > u128::MAX + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 16)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 17)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 18)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 19)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 20)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 21)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 22)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 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!(a, Uint256::from(1u128) << (8 * 23)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 24)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 25)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 26)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 27)); + let a = Uint256::from_be_bytes([ + 0, 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 28)); + let a = Uint256::from_be_bytes([ + 0, 0, 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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 29)); + let a = Uint256::from_be_bytes([ + 0, 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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 30)); + let a = Uint256::from_be_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, + ]); + assert_eq!(a, Uint256::from(1u128) << (8 * 31)); + } + #[test] fn uint256_from_le_bytes() { let a = Uint256::from_le_bytes([ From 6a9790955ba9431297cd0e0aac3642aea2771b14 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 3 Sep 2021 17:26:26 +0200 Subject: [PATCH 368/402] Make Uint256::new const --- CHANGELOG.md | 3 ++- packages/std/src/math/uint256.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a108cb24e..c74f3b03a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ and this project adheres to - cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. - cosmwasm-std: Implement `FromStr` for `Uint128`, `Uint256`, and `Uint512`. -- cosmwasm-std: Make `Uint256::from_le_bytes` and `::from_be_bytes` const. +- cosmwasm-std: Make `Uint256::from_le_bytes`, `::from_be_bytes` and `::new` + const. ### Changed diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index fca8de2b2..364f4ea9f 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -52,7 +52,7 @@ impl Uint256 { /// Creates a Uint256(value) from a big endian representation. It's just an alias for /// `from_big_endian`. - pub fn new(value: [u8; 32]) -> Self { + pub const fn new(value: [u8; 32]) -> Self { Self::from_be_bytes(value) } From e76043e8dd762b5f16d4dda92873f3e6fbb28659 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Sat, 4 Sep 2021 09:12:24 +0200 Subject: [PATCH 369/402] Improve Uint256::new docs --- packages/std/src/math/uint256.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 364f4ea9f..d904c9cdf 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -51,7 +51,9 @@ impl Uint256 { pub const MAX: Uint256 = Uint256(U256::MAX); /// Creates a Uint256(value) from a big endian representation. It's just an alias for - /// `from_big_endian`. + /// [`Uint256::from_be_bytes`]. + /// + /// This method is less flexible than `from` but can be called in a const context. pub const fn new(value: [u8; 32]) -> Self { Self::from_be_bytes(value) } From d032c3d720c156129d32a356f1269e17a57d3951 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 11:18:44 +0200 Subject: [PATCH 370/402] Make FunctionDeterministic private --- packages/vm/src/wasm_backend/deterministic.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index deac0a974..34109e07d 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -23,7 +23,7 @@ impl ModuleMiddleware for Deterministic { } #[derive(Debug)] -pub struct FunctionDeterministic {} +struct FunctionDeterministic {} impl FunctionMiddleware for FunctionDeterministic { fn feed<'a>( From 2bd42d44707ea0a88c72e89b94b3ca539931e4db Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 11:19:00 +0200 Subject: [PATCH 371/402] Implement FunctionDeterministic::default() --- packages/vm/src/wasm_backend/deterministic.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index 34109e07d..296ed435b 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -18,13 +18,20 @@ impl Deterministic { impl ModuleMiddleware for Deterministic { /// Generates a `FunctionMiddleware` for a given function. fn generate_function_middleware(&self, _: LocalFunctionIndex) -> Box { - Box::new(FunctionDeterministic {}) + Box::new(FunctionDeterministic::default()) } } #[derive(Debug)] +#[non_exhaustive] struct FunctionDeterministic {} +impl Default for FunctionDeterministic { + fn default() -> Self { + Self {} + } +} + impl FunctionMiddleware for FunctionDeterministic { fn feed<'a>( &mut self, From 22f6af7a84c9bd537f1541fa37b3baf88fcf3c63 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 11:23:05 +0200 Subject: [PATCH 372/402] Replace Deterministic::new with ::default --- packages/vm/src/wasm_backend/deterministic.rs | 11 ++++++----- packages/vm/src/wasm_backend/store.rs | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index 296ed435b..836f12ab9 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -7,10 +7,11 @@ use wasmer::{ /// A middleware that ensures only deterministic operations are used (i.e. no floats) #[derive(Debug, MemoryUsage)] +#[non_exhaustive] pub struct Deterministic {} -impl Deterministic { - pub fn new() -> Self { +impl Default for Deterministic { + fn default() -> Self { Self {} } } @@ -612,7 +613,7 @@ mod tests { ) .unwrap(); - let deterministic = Arc::new(Deterministic::new()); + let deterministic = Arc::new(Deterministic::default()); let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); let store = Store::new(&Universal::new(compiler_config).engine()); @@ -633,7 +634,7 @@ mod tests { ) .unwrap(); - let deterministic = Arc::new(Deterministic::new()); + let deterministic = Arc::new(Deterministic::default()); let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); let store = Store::new(&Universal::new(compiler_config).engine()); @@ -660,7 +661,7 @@ mod tests { ) .unwrap(); - let deterministic = Arc::new(Deterministic::new()); + let deterministic = Arc::new(Deterministic::default()); let mut compiler_config = Cranelift::default(); compiler_config.push_middleware(deterministic); let store = Store::new(&Universal::new(compiler_config).engine()); diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 27f91c5ce..012a62358 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -32,7 +32,7 @@ fn cost(_operator: &Operator) -> u64 { /// If memory_limit is None, no limit is applied. pub fn make_compile_time_store(memory_limit: Option) -> Store { let gas_limit = 0; - let deterministic = Arc::new(Deterministic::new()); + let deterministic = Arc::new(Deterministic::default()); let metering = Arc::new(Metering::new(gas_limit, cost)); #[cfg(feature = "cranelift")] From eed0e9927060fa426292d09145b6137fd97cffb1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 11:45:17 +0200 Subject: [PATCH 373/402] Add configurations to FunctionDeterministic --- packages/vm/src/wasm_backend/deterministic.rs | 112 +++++++++++++----- 1 file changed, 83 insertions(+), 29 deletions(-) diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index 836f12ab9..7662e7de8 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -25,11 +25,47 @@ impl ModuleMiddleware for Deterministic { #[derive(Debug)] #[non_exhaustive] -struct FunctionDeterministic {} +struct FunctionDeterministic { + /// True iff float operations are allowed. + /// + /// Note: there are float operations in the SIMD block as well and we do not yet handle + /// any combination of `allow_float` and `allow_feature_simd` properly. + allow_float: bool, + // + // Standardized features + // + /// True iff operations of the "Bulk memory operations" feature are allowed. + /// See and . + allow_feature_bulk_memory_operations: bool, + /// True iff operations of the "Reference types" feature are allowed. + /// See and . + allow_feature_reference_types: bool, + /// True iff operations of the "Fixed-width SIMD" feature are allowed. + /// See and . + allow_feature_simd: bool, + // + // In-progress proposals + // + /// True iff operations of the "Exception handling" feature are allowed. + /// Note, this feature is not yet standardized! + /// See and . + allow_feature_exception_handling: bool, + /// True iff operations of the "Threads and atomics" feature are allowed. + /// Note, this feature is not yet standardized! + /// See and . + allow_feature_threads: bool, +} impl Default for FunctionDeterministic { fn default() -> Self { - Self {} + Self { + allow_float: false, + allow_feature_bulk_memory_operations: false, + allow_feature_reference_types: false, + allow_feature_simd: false, + allow_feature_exception_handling: false, + allow_feature_threads: false, + } } } @@ -162,11 +198,13 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::TableSet { .. } | Operator::TableGrow { .. } | Operator::TableSize { .. } => { - let msg = format!( - "Reference type operation detected: {:?}. Reference types are not supported.", - operator - ); - Err(MiddlewareError::new("Deterministic", msg)) + if self.allow_feature_reference_types { + state.push_operator(operator); + Ok(()) + } else { + let msg = format!("Reference type operation detected: {:?}. Reference types are not supported.", operator); + Err(MiddlewareError::new("Deterministic", msg)) + } } Operator::MemoryAtomicNotify { .. } | Operator::MemoryAtomicWait32 { .. } @@ -235,11 +273,13 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::I64AtomicRmw8CmpxchgU { .. } | Operator::I64AtomicRmw16CmpxchgU { .. } | Operator::I64AtomicRmw32CmpxchgU { .. } => { - let msg = format!( - "Threads operator detected: {:?}. The Wasm Threads extension is not supported.", - operator - ); - Err(MiddlewareError::new("Deterministic", msg)) + if self.allow_feature_threads { + state.push_operator(operator); + Ok(()) + } else { + let msg = format!("Threads operator detected: {:?}. The Wasm Threads extension is not supported.", operator); + Err(MiddlewareError::new("Deterministic", msg)) + } } Operator::V128Load { .. } | Operator::V128Store { .. } @@ -425,11 +465,16 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::F64x2ConvertLowI32x4U | Operator::F32x4DemoteF64x2Zero | Operator::F64x2PromoteLowF32x4 => { - let msg = format!( - "SIMD operator detected: {:?}. The Wasm SIMD extension is not supported.", - operator - ); - Err(MiddlewareError::new("Deterministic", msg)) + if self.allow_feature_simd { + state.push_operator(operator); + Ok(()) + } else { + let msg = format!( + "SIMD operator detected: {:?}. The Wasm SIMD extension is not supported.", + operator + ); + Err(MiddlewareError::new("Deterministic", msg)) + } } Operator::F32Load { .. } | Operator::F64Load { .. } @@ -559,8 +604,13 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::I32x4TruncSatF32x4U | Operator::F32x4ConvertI32x4S | Operator::F32x4ConvertI32x4U => { - let msg = format!("Non-deterministic operator detected: {:?}", operator); - Err(MiddlewareError::new("Deterministic", msg)) + if self.allow_float { + state.push_operator(operator); + Ok(()) + } else { + let msg = format!("Non-deterministic operator detected: {:?}", operator); + Err(MiddlewareError::new("Deterministic", msg)) + } } Operator::MemoryInit { .. } | Operator::DataDrop { .. } @@ -570,11 +620,13 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::ElemDrop { .. } | Operator::TableCopy { .. } | Operator::TableFill { .. } => { - let msg = format!( - "Bulk memory operation detected: {:?}. Bulk memory operations are not supported.", - operator - ); - Err(MiddlewareError::new("Deterministic", msg)) + if self.allow_feature_bulk_memory_operations { + state.push_operator(operator); + Ok(()) + } else { + let msg = format!("Bulk memory operation detected: {:?}. Bulk memory operations are not supported.", operator); + Err(MiddlewareError::new("Deterministic", msg)) + } } Operator::Try { .. } | Operator::Catch { .. } @@ -583,11 +635,13 @@ impl FunctionMiddleware for FunctionDeterministic { | Operator::Unwind { .. } | Operator::Delegate { .. } | Operator::CatchAll => { - let msg = format!( - "Exception handling operation detected: {:?}. Exception handling is not supported.", - operator - ); - Err(MiddlewareError::new("Deterministic", msg)) + if self.allow_feature_exception_handling { + state.push_operator(operator); + Ok(()) + } else { + let msg = format!("Exception handling operation detected: {:?}. Exception handling is not supported.", operator); + Err(MiddlewareError::new("Deterministic", msg)) + } } } } From 6cd960aff27b1c739e54d3c596990ca0292dfe22 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 11:48:15 +0200 Subject: [PATCH 374/402] Pull out MIDDLEWARE_NAME --- packages/vm/src/wasm_backend/deterministic.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index 7662e7de8..f67ede05d 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -69,6 +69,9 @@ impl Default for FunctionDeterministic { } } +/// The name used in errors +const MIDDLEWARE_NAME: &str = "Deterministic"; + impl FunctionMiddleware for FunctionDeterministic { fn feed<'a>( &mut self, @@ -203,7 +206,7 @@ impl FunctionMiddleware for FunctionDeterministic { Ok(()) } else { let msg = format!("Reference type operation detected: {:?}. Reference types are not supported.", operator); - Err(MiddlewareError::new("Deterministic", msg)) + Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } Operator::MemoryAtomicNotify { .. } @@ -278,7 +281,7 @@ impl FunctionMiddleware for FunctionDeterministic { Ok(()) } else { let msg = format!("Threads operator detected: {:?}. The Wasm Threads extension is not supported.", operator); - Err(MiddlewareError::new("Deterministic", msg)) + Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } Operator::V128Load { .. } @@ -473,7 +476,7 @@ impl FunctionMiddleware for FunctionDeterministic { "SIMD operator detected: {:?}. The Wasm SIMD extension is not supported.", operator ); - Err(MiddlewareError::new("Deterministic", msg)) + Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } Operator::F32Load { .. } @@ -609,7 +612,7 @@ impl FunctionMiddleware for FunctionDeterministic { Ok(()) } else { let msg = format!("Non-deterministic operator detected: {:?}", operator); - Err(MiddlewareError::new("Deterministic", msg)) + Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } Operator::MemoryInit { .. } @@ -625,7 +628,7 @@ impl FunctionMiddleware for FunctionDeterministic { Ok(()) } else { let msg = format!("Bulk memory operation detected: {:?}. Bulk memory operations are not supported.", operator); - Err(MiddlewareError::new("Deterministic", msg)) + Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } Operator::Try { .. } @@ -640,7 +643,7 @@ impl FunctionMiddleware for FunctionDeterministic { Ok(()) } else { let msg = format!("Exception handling operation detected: {:?}. Exception handling is not supported.", operator); - Err(MiddlewareError::new("Deterministic", msg)) + Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } } From d3ac12534e4c64926e1f70cf6767fa0f62bcd991 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 11:49:42 +0200 Subject: [PATCH 375/402] Make error message specific to floats --- packages/vm/src/wasm_backend/compile.rs | 4 +--- packages/vm/src/wasm_backend/deterministic.rs | 7 +++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/vm/src/wasm_backend/compile.rs b/packages/vm/src/wasm_backend/compile.rs index 194a7b442..1b3ca63bb 100644 --- a/packages/vm/src/wasm_backend/compile.rs +++ b/packages/vm/src/wasm_backend/compile.rs @@ -24,8 +24,6 @@ mod tests { #[test] fn contract_with_floats_fails_check() { let err = compile(CONTRACT, None).unwrap_err(); - assert!(err - .to_string() - .contains("Non-deterministic operator detected")); + assert!(err.to_string().contains("Float operator detected:")); } } diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/deterministic.rs index f67ede05d..f3bd46b68 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/deterministic.rs @@ -611,7 +611,10 @@ impl FunctionMiddleware for FunctionDeterministic { state.push_operator(operator); Ok(()) } else { - let msg = format!("Non-deterministic operator detected: {:?}", operator); + let msg = format!( + "Float operator detected: {:?}. The use of floats is not supported.", + operator + ); Err(MiddlewareError::new(MIDDLEWARE_NAME, msg)) } } @@ -699,7 +702,7 @@ mod tests { assert!(result .unwrap_err() .to_string() - .contains("Non-deterministic")); + .contains("Float operator detected:")); } #[test] From 60673244e6a712515d34f8590f34ec34d9cea13b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 12:07:12 +0200 Subject: [PATCH 376/402] Rename Deterministic -> Gatekeeper --- .../{deterministic.rs => gatekeeper.rs} | 22 +++++++++---------- packages/vm/src/wasm_backend/mod.rs | 2 +- packages/vm/src/wasm_backend/store.rs | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) rename packages/vm/src/wasm_backend/{deterministic.rs => gatekeeper.rs} (98%) diff --git a/packages/vm/src/wasm_backend/deterministic.rs b/packages/vm/src/wasm_backend/gatekeeper.rs similarity index 98% rename from packages/vm/src/wasm_backend/deterministic.rs rename to packages/vm/src/wasm_backend/gatekeeper.rs index f3bd46b68..c365189a7 100644 --- a/packages/vm/src/wasm_backend/deterministic.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -8,24 +8,24 @@ use wasmer::{ /// A middleware that ensures only deterministic operations are used (i.e. no floats) #[derive(Debug, MemoryUsage)] #[non_exhaustive] -pub struct Deterministic {} +pub struct Gatekeeper {} -impl Default for Deterministic { +impl Default for Gatekeeper { fn default() -> Self { Self {} } } -impl ModuleMiddleware for Deterministic { +impl ModuleMiddleware for Gatekeeper { /// Generates a `FunctionMiddleware` for a given function. fn generate_function_middleware(&self, _: LocalFunctionIndex) -> Box { - Box::new(FunctionDeterministic::default()) + Box::new(FunctionGatekeeper::default()) } } #[derive(Debug)] #[non_exhaustive] -struct FunctionDeterministic { +struct FunctionGatekeeper { /// True iff float operations are allowed. /// /// Note: there are float operations in the SIMD block as well and we do not yet handle @@ -56,7 +56,7 @@ struct FunctionDeterministic { allow_feature_threads: bool, } -impl Default for FunctionDeterministic { +impl Default for FunctionGatekeeper { fn default() -> Self { Self { allow_float: false, @@ -70,9 +70,9 @@ impl Default for FunctionDeterministic { } /// The name used in errors -const MIDDLEWARE_NAME: &str = "Deterministic"; +const MIDDLEWARE_NAME: &str = "Gatekeeper"; -impl FunctionMiddleware for FunctionDeterministic { +impl FunctionMiddleware for FunctionGatekeeper { fn feed<'a>( &mut self, operator: Operator<'a>, @@ -673,7 +673,7 @@ mod tests { ) .unwrap(); - let deterministic = Arc::new(Deterministic::default()); + 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()); @@ -694,7 +694,7 @@ mod tests { ) .unwrap(); - let deterministic = Arc::new(Deterministic::default()); + 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()); @@ -721,7 +721,7 @@ mod tests { ) .unwrap(); - let deterministic = Arc::new(Deterministic::default()); + 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()); diff --git a/packages/vm/src/wasm_backend/mod.rs b/packages/vm/src/wasm_backend/mod.rs index 4d474b629..3e503c1da 100644 --- a/packages/vm/src/wasm_backend/mod.rs +++ b/packages/vm/src/wasm_backend/mod.rs @@ -1,5 +1,5 @@ mod compile; -mod deterministic; +mod gatekeeper; mod limiting_tunables; mod store; diff --git a/packages/vm/src/wasm_backend/store.rs b/packages/vm/src/wasm_backend/store.rs index 012a62358..97a914360 100644 --- a/packages/vm/src/wasm_backend/store.rs +++ b/packages/vm/src/wasm_backend/store.rs @@ -12,7 +12,7 @@ use wasmer_middlewares::Metering; use crate::size::Size; -use super::deterministic::Deterministic; +use super::gatekeeper::Gatekeeper; use super::limiting_tunables::LimitingTunables; /// WebAssembly linear memory objects have sizes measured in pages. Each page @@ -32,7 +32,7 @@ fn cost(_operator: &Operator) -> u64 { /// If memory_limit is None, no limit is applied. pub fn make_compile_time_store(memory_limit: Option) -> Store { let gas_limit = 0; - let deterministic = Arc::new(Deterministic::default()); + let deterministic = Arc::new(Gatekeeper::default()); let metering = Arc::new(Metering::new(gas_limit, cost)); #[cfg(feature = "cranelift")] From 38835eaed052d36223180c915be6f8e4addcad9d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 12:08:20 +0200 Subject: [PATCH 377/402] Add note on Gatekeeper --- packages/vm/src/wasm_backend/gatekeeper.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index c365189a7..7dd70ffca 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -5,7 +5,8 @@ use wasmer::{ ModuleMiddleware, }; -/// A middleware that ensures only deterministic operations are used (i.e. no floats) +/// 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)] #[non_exhaustive] pub struct Gatekeeper {} From 26e4fcd71e8283d7a856ef807f8a127fdb6b4b91 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 13:52:58 +0200 Subject: [PATCH 378/402] Pull out GatekeeperConfig --- packages/vm/src/wasm_backend/gatekeeper.rs | 79 +++++++++++++--------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index 7dd70ffca..9b618e3ac 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -5,28 +5,8 @@ use wasmer::{ ModuleMiddleware, }; -/// 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)] -#[non_exhaustive] -pub struct Gatekeeper {} - -impl Default for Gatekeeper { - fn default() -> Self { - Self {} - } -} - -impl ModuleMiddleware for Gatekeeper { - /// Generates a `FunctionMiddleware` for a given function. - fn generate_function_middleware(&self, _: LocalFunctionIndex) -> Box { - Box::new(FunctionGatekeeper::default()) - } -} - -#[derive(Debug)] -#[non_exhaustive] -struct FunctionGatekeeper { +#[derive(Debug, MemoryUsage, Clone, Copy)] +struct GatekeeperConfig { /// True iff float operations are allowed. /// /// Note: there are float operations in the SIMD block as well and we do not yet handle @@ -57,16 +37,53 @@ struct FunctionGatekeeper { allow_feature_threads: bool, } -impl Default for FunctionGatekeeper { +/// 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)] +#[non_exhaustive] +pub struct Gatekeeper { + config: GatekeeperConfig, +} + +impl Gatekeeper { + /// Creates a new Gatekeeper with a custom config. + /// + /// A costum configuration is potentially dangerous (non-final Wasm proposals, floats in SIMD operation). + /// For this reason, only [`Gatekeeper::default()`] is public. + fn new(config: GatekeeperConfig) -> Self { + Self { config } + } +} + +impl Default for Gatekeeper { fn default() -> Self { - Self { + Self::new(GatekeeperConfig { allow_float: false, allow_feature_bulk_memory_operations: false, allow_feature_reference_types: false, allow_feature_simd: false, allow_feature_exception_handling: false, allow_feature_threads: false, - } + }) + } +} + +impl ModuleMiddleware for Gatekeeper { + /// Generates a `FunctionMiddleware` for a given function. + fn generate_function_middleware(&self, _: LocalFunctionIndex) -> Box { + Box::new(FunctionGatekeeper::new(self.config)) + } +} + +#[derive(Debug)] +#[non_exhaustive] +struct FunctionGatekeeper { + config: GatekeeperConfig, +} + +impl FunctionGatekeeper { + fn new(config: GatekeeperConfig) -> Self { + Self { config } } } @@ -202,7 +219,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::TableSet { .. } | Operator::TableGrow { .. } | Operator::TableSize { .. } => { - if self.allow_feature_reference_types { + if self.config.allow_feature_reference_types { state.push_operator(operator); Ok(()) } else { @@ -277,7 +294,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I64AtomicRmw8CmpxchgU { .. } | Operator::I64AtomicRmw16CmpxchgU { .. } | Operator::I64AtomicRmw32CmpxchgU { .. } => { - if self.allow_feature_threads { + if self.config.allow_feature_threads { state.push_operator(operator); Ok(()) } else { @@ -469,7 +486,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::F64x2ConvertLowI32x4U | Operator::F32x4DemoteF64x2Zero | Operator::F64x2PromoteLowF32x4 => { - if self.allow_feature_simd { + if self.config.allow_feature_simd { state.push_operator(operator); Ok(()) } else { @@ -608,7 +625,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I32x4TruncSatF32x4U | Operator::F32x4ConvertI32x4S | Operator::F32x4ConvertI32x4U => { - if self.allow_float { + if self.config.allow_float { state.push_operator(operator); Ok(()) } else { @@ -627,7 +644,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::ElemDrop { .. } | Operator::TableCopy { .. } | Operator::TableFill { .. } => { - if self.allow_feature_bulk_memory_operations { + if self.config.allow_feature_bulk_memory_operations { state.push_operator(operator); Ok(()) } else { @@ -642,7 +659,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::Unwind { .. } | Operator::Delegate { .. } | Operator::CatchAll => { - if self.allow_feature_exception_handling { + if self.config.allow_feature_exception_handling { state.push_operator(operator); Ok(()) } else { From f00f4e363bd3f28383062ab16d3e4a98059c2b05 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 6 Sep 2021 14:09:27 +0200 Subject: [PATCH 379/402] Rename allow_float -> allow_floats --- packages/vm/src/wasm_backend/gatekeeper.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vm/src/wasm_backend/gatekeeper.rs b/packages/vm/src/wasm_backend/gatekeeper.rs index 9b618e3ac..7d5f625a0 100644 --- a/packages/vm/src/wasm_backend/gatekeeper.rs +++ b/packages/vm/src/wasm_backend/gatekeeper.rs @@ -10,8 +10,8 @@ struct GatekeeperConfig { /// True iff float operations are allowed. /// /// Note: there are float operations in the SIMD block as well and we do not yet handle - /// any combination of `allow_float` and `allow_feature_simd` properly. - allow_float: bool, + /// any combination of `allow_floats` and `allow_feature_simd` properly. + allow_floats: bool, // // Standardized features // @@ -58,7 +58,7 @@ impl Gatekeeper { impl Default for Gatekeeper { fn default() -> Self { Self::new(GatekeeperConfig { - allow_float: false, + allow_floats: false, allow_feature_bulk_memory_operations: false, allow_feature_reference_types: false, allow_feature_simd: false, @@ -625,7 +625,7 @@ impl FunctionMiddleware for FunctionGatekeeper { | Operator::I32x4TruncSatF32x4U | Operator::F32x4ConvertI32x4S | Operator::F32x4ConvertI32x4U => { - if self.config.allow_float { + if self.config.allow_floats { state.push_operator(operator); Ok(()) } else { From 7cd3efc7a66b94e38bde13042c4edf867aad7add Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 16:43:43 +0200 Subject: [PATCH 380/402] Implement Decimal256 --- packages/std/src/lib.rs | 2 +- packages/std/src/math/decimal256.rs | 902 ++++++++++++++++++++++++++++ packages/std/src/math/mod.rs | 2 + packages/std/src/math/uint256.rs | 64 +- 4 files changed, 945 insertions(+), 25 deletions(-) create mode 100644 packages/std/src/math/decimal256.rs diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index b62edf3fe..cdd8601f2 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -41,7 +41,7 @@ pub use crate::ibc::{ #[cfg(feature = "iterator")] #[allow(deprecated)] pub use crate::iterator::{Order, Pair, KV}; -pub use crate::math::{Decimal, Fraction, Uint128, Uint256, Uint512, Uint64}; +pub use crate::math::{Decimal, Decimal256, Fraction, Uint128, Uint256, Uint512, Uint64}; pub use crate::query::{ AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery, }; diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs new file mode 100644 index 000000000..83c7aaff8 --- /dev/null +++ b/packages/std/src/math/decimal256.rs @@ -0,0 +1,902 @@ +use schemars::JsonSchema; +use serde::{de, ser, Deserialize, Deserializer, Serialize}; +use std::fmt::{self, Write}; +use std::ops; +use std::str::FromStr; + +use crate::errors::StdError; + +use super::Fraction; +use super::Isqrt; +use super::Uint256; + +/// A fixed-point decimal value with 18 fractional digits, i.e. Decimal256(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)] +pub struct Decimal256(#[schemars(with = "String")] Uint256); + +impl Decimal256 { + fn decimal_fractional() -> Uint256 { + // 1*10**36 + Uint256::from(1_000_000_000_000_000_000_000_000_000_000_000_000u128) + } + + fn decimal_fractional_squared() -> Uint256 { + // 1*10**72 + Uint256::new([ + 0, 0, 144, 228, 15, 190, 234, 29, 58, 74, 188, 137, 85, 233, 70, 254, 49, 205, 207, + 102, 246, 52, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]) + } + + pub const MAX: Self = Self(Uint256::MAX); + + /// Create a 1.0 Decimal256 + pub fn one() -> Self { + Self(Self::decimal_fractional()) + } + + /// Create a 0.0 Decimal256 + pub const fn zero() -> Self { + Self(Uint256::zero()) + } + + /// Convert x% into Decimal256 + pub fn percent(x: u64) -> Self { + Self(((x as u128) * 10_000_000_000_000_000).into()) + } + + /// Convert permille (x/1000) into Decimal256 + pub fn permille(x: u64) -> Self { + Self(((x as u128) * 1_000_000_000_000_000).into()) + } + + /// Returns the ratio (numerator / denominator) as a Decimal256 + pub fn from_ratio(numerator: impl Into, denominator: impl Into) -> Self { + let numerator: Uint256 = numerator.into(); + let denominator: Uint256 = denominator.into(); + if denominator.is_zero() { + panic!("Denominator must not be zero"); + } + + Self( + // numerator * DECIMAL_FRACTIONAL / denominator + numerator.multiply_ratio(Self::decimal_fractional(), denominator), + ) + } + + pub fn is_zero(&self) -> bool { + self.0.is_zero() + } + + /// Returns the approximate square root as a Decimal256. + /// + /// This should not overflow or panic. + pub fn sqrt(&self) -> Self { + // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ + // We start with the highest precision possible and lower it until + // there's no overflow. + (0..=9) + .rev() + .find_map(|i| self.sqrt_with_precision(i)) + // The last step (i = 0) is guaranteed to succeed because `isqrt(u128::MAX) * 10^9` does not overflow + .unwrap() + } + + /// Lower precision means more aggressive rounding, but less risk of overflow. + /// Precision *must* be a number between 0 and 9 (inclusive). + /// + /// Returns `None` if the internal multiplication overflows. + fn sqrt_with_precision(&self, precision: u32) -> Option { + let inner_mul = 100u128.pow(precision); + self.0.checked_mul(inner_mul.into()).ok().map(|inner| { + let outer_mul = 10u128.pow(9 - precision); + Self(inner.isqrt().checked_mul(Uint256::from(outer_mul)).unwrap()) + }) + } +} + +impl Fraction for Decimal256 { + #[inline] + fn numerator(&self) -> Uint256 { + self.0 + } + + #[inline] + fn denominator(&self) -> Uint256 { + 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(Self(Self::decimal_fractional_squared() / self.0)) + } + } +} + +impl FromStr for Decimal256 { + type Err = StdError; + + /// Converts the decimal string to a Decimal256 + /// Possible inputs: "1.23", "1", "000012", "1.123000000" + /// Disallowed: "", ".23" + /// + /// This never performs any kind of rounding. + /// More than 18 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 = (18usize.checked_sub(fractional_part.len())).ok_or_else(|| { + StdError::generic_err("Cannot parse more than 18 fractional digits") + })?; + debug_assert!(exp <= 18); + let fractional_factor = Uint256::from(10u128.pow(exp as u32)); + atomics = atomics + .checked_add( + // The inner multiplication can't overflow because + // fractional < 10^18 && fractional_factor <= 10^18 + 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(Self(atomics)) + } +} + +impl fmt::Display for Decimal256 { + 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!("{:018}", fractional); + f.write_str(&whole.to_string())?; + f.write_char('.')?; + f.write_str(fractional_string.trim_end_matches('0'))?; + Ok(()) + } + } +} + +impl ops::Add for Decimal256 { + type Output = Self; + + fn add(self, other: Self) -> Self { + Self(self.0 + other.0) + } +} + +impl ops::Sub for Decimal256 { + type Output = Self; + + fn sub(self, other: Self) -> Self { + Self(self.0 - other.0) + } +} + +/// 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 ops::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 ops::Mul for Decimal256 { + type Output = Uint256; + + fn mul(self, rhs: Uint256) -> Self::Output { + rhs * self + } +} + +impl ops::Div for Decimal256 { + type Output = Self; + + fn div(self, rhs: Uint256) -> Self::Output { + Self(self.0 / rhs) + } +} + +impl ops::DivAssign for Decimal256 { + fn div_assign(&mut self, rhs: Uint256) { + self.0 /= rhs; + } +} + +/// Serializes as a decimal string +impl Serialize for Decimal256 { + 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 Decimal256 { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Decimal256Visitor) + } +} + +struct Decimal256Visitor; + +impl<'de> de::Visitor<'de> for Decimal256Visitor { + type Value = Decimal256; + + 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 Self::Value::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::errors::StdError; + use crate::{from_slice, to_vec}; + + #[test] + fn decimal_one() { + let value = Decimal256::one(); + assert_eq!(value.0, Decimal256::decimal_fractional()); + } + + #[test] + fn decimal_zero() { + let value = Decimal256::zero(); + assert!(value.0.is_zero()); + } + + #[test] + fn decimal_percent() { + let value = Decimal256::percent(50); + assert_eq!( + value.0, + Decimal256::decimal_fractional() / Uint256::from(2u8) + ); + } + + #[test] + fn decimal_permille() { + let value = Decimal256::permille(125); + assert_eq!( + value.0, + Decimal256::decimal_fractional() / Uint256::from(8u8) + ); + } + + #[test] + fn decimal_from_ratio_works() { + // 1.0 + assert_eq!(Decimal256::from_ratio(1u128, 1u128), Decimal256::one()); + assert_eq!(Decimal256::from_ratio(53u128, 53u128), Decimal256::one()); + assert_eq!(Decimal256::from_ratio(125u128, 125u128), Decimal256::one()); + + // 1.5 + assert_eq!( + Decimal256::from_ratio(3u128, 2u128), + Decimal256::percent(150) + ); + assert_eq!( + Decimal256::from_ratio(150u128, 100u128), + Decimal256::percent(150) + ); + assert_eq!( + Decimal256::from_ratio(333u128, 222u128), + Decimal256::percent(150) + ); + + // 0.125 + assert_eq!( + Decimal256::from_ratio(1u64, 8u64), + Decimal256::permille(125) + ); + assert_eq!( + Decimal256::from_ratio(125u64, 1000u64), + Decimal256::permille(125) + ); + + // 1/3 (result floored) + assert_eq!( + Decimal256::from_ratio(1u64, 3u64), + Decimal256(Uint256::from(333_333_333_333_333_333u128)) + ); + + // 2/3 (result floored) + assert_eq!( + Decimal256::from_ratio(2u64, 3u64), + Decimal256(Uint256::from(666_666_666_666_666_666u128)) + ); + + // large inputs + assert_eq!(Decimal256::from_ratio(0u128, u128::MAX), Decimal256::zero()); + assert_eq!( + Decimal256::from_ratio(u128::MAX, u128::MAX), + Decimal256::one() + ); + // 340282366920938463463 is the largest integer <= Decimal256::MAX + assert_eq!( + Decimal256::from_ratio(340282366920938463463u128, 1u128), + Decimal256::from_str("340282366920938463463").unwrap() + ); + } + + #[test] + #[should_panic(expected = "Denominator must not be zero")] + fn decimal_from_ratio_panics_for_zero_denominator() { + Decimal256::from_ratio(1u128, 0u128); + } + + #[test] + fn decimal_implements_fraction() { + let fraction = Decimal256::from_str("1234.567").unwrap(); + assert_eq!( + fraction.numerator(), + Uint256::from(1_234_567_000_000_000_000_000u128) + ); + assert_eq!( + fraction.denominator(), + Uint256::from(1_000_000_000_000_000_000u128) + ); + } + + #[test] + fn decimal_from_str_works() { + // Integers + assert_eq!(Decimal256::from_str("0").unwrap(), Decimal256::percent(0)); + assert_eq!(Decimal256::from_str("1").unwrap(), Decimal256::percent(100)); + assert_eq!(Decimal256::from_str("5").unwrap(), Decimal256::percent(500)); + assert_eq!( + Decimal256::from_str("42").unwrap(), + Decimal256::percent(4200) + ); + assert_eq!(Decimal256::from_str("000").unwrap(), Decimal256::percent(0)); + assert_eq!( + Decimal256::from_str("001").unwrap(), + Decimal256::percent(100) + ); + assert_eq!( + Decimal256::from_str("005").unwrap(), + Decimal256::percent(500) + ); + assert_eq!( + Decimal256::from_str("0042").unwrap(), + Decimal256::percent(4200) + ); + + // Decimals + assert_eq!( + Decimal256::from_str("1.0").unwrap(), + Decimal256::percent(100) + ); + assert_eq!( + Decimal256::from_str("1.5").unwrap(), + Decimal256::percent(150) + ); + assert_eq!( + Decimal256::from_str("0.5").unwrap(), + Decimal256::percent(50) + ); + assert_eq!( + Decimal256::from_str("0.123").unwrap(), + Decimal256::permille(123) + ); + + assert_eq!( + Decimal256::from_str("40.00").unwrap(), + Decimal256::percent(4000) + ); + assert_eq!( + Decimal256::from_str("04.00").unwrap(), + Decimal256::percent(400) + ); + assert_eq!( + Decimal256::from_str("00.40").unwrap(), + Decimal256::percent(40) + ); + assert_eq!( + Decimal256::from_str("00.04").unwrap(), + Decimal256::percent(4) + ); + + // Can handle 18 fractional digits + assert_eq!( + Decimal256::from_str("7.123456789012345678").unwrap(), + Decimal256(Uint256::from(7123456789012345678u128)) + ); + assert_eq!( + Decimal256::from_str("7.999999999999999999").unwrap(), + Decimal256(Uint256::from(7999999999999999999u128)) + ); + + // Works for documented max value + assert_eq!( + Decimal256::from_str("340282366920938463463.374607431768211455").unwrap(), + Decimal256::MAX + ); + } + + #[test] + fn decimal_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), + } + + match Decimal256::from_str(" ").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing whole"), + 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), + } + } + + #[test] + fn decimal_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), + } + + match Decimal256::from_str("1. ").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Error parsing fractional"), + 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), + } + + match Decimal256::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 Decimal256::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 Decimal256::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 Decimal256::from_str("1.2.3").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Unexpected number of dots"), + 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), + } + } + + #[test] + fn decimal_from_str_errors_for_more_than_max_value() { + // Integer + match Decimal256::from_str("340282366920938463464").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {:?}", e), + } + + // Decimal + match Decimal256::from_str("340282366920938463464.0").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {:?}", e), + } + match Decimal256::from_str("340282366920938463463.374607431768211456").unwrap_err() { + StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), + e => panic!("Unexpected error: {:?}", e), + } + } + + #[test] + fn decimal_is_zero_works() { + assert!(Decimal256::zero().is_zero()); + assert!(Decimal256::percent(0).is_zero()); + assert!(Decimal256::permille(0).is_zero()); + + assert!(!Decimal256::one().is_zero()); + assert!(!Decimal256::percent(123).is_zero()); + assert!(!Decimal256::permille(1234).is_zero()); + } + + #[test] + fn decimal_inv_works() { + // d = 0 + assert_eq!(Decimal256::zero().inv(), None); + + // d == 1 + assert_eq!(Decimal256::one().inv(), Some(Decimal256::one())); + + // d > 1 exact + assert_eq!( + Decimal256::from_str("2").unwrap().inv(), + Some(Decimal256::from_str("0.5").unwrap()) + ); + assert_eq!( + Decimal256::from_str("20").unwrap().inv(), + Some(Decimal256::from_str("0.05").unwrap()) + ); + assert_eq!( + Decimal256::from_str("200").unwrap().inv(), + Some(Decimal256::from_str("0.005").unwrap()) + ); + assert_eq!( + Decimal256::from_str("2000").unwrap().inv(), + Some(Decimal256::from_str("0.0005").unwrap()) + ); + + // d > 1 rounded + assert_eq!( + Decimal256::from_str("3").unwrap().inv(), + Some(Decimal256::from_str("0.333333333333333333").unwrap()) + ); + assert_eq!( + Decimal256::from_str("6").unwrap().inv(), + Some(Decimal256::from_str("0.166666666666666666").unwrap()) + ); + + // d < 1 exact + assert_eq!( + Decimal256::from_str("0.5").unwrap().inv(), + Some(Decimal256::from_str("2").unwrap()) + ); + assert_eq!( + Decimal256::from_str("0.05").unwrap().inv(), + Some(Decimal256::from_str("20").unwrap()) + ); + assert_eq!( + Decimal256::from_str("0.005").unwrap().inv(), + Some(Decimal256::from_str("200").unwrap()) + ); + assert_eq!( + Decimal256::from_str("0.0005").unwrap().inv(), + Some(Decimal256::from_str("2000").unwrap()) + ); + } + + #[test] + fn decimal_add() { + let value = Decimal256::one() + Decimal256::percent(50); // 1.5 + assert_eq!( + value.0, + Decimal256::decimal_fractional() * Uint256::from(3u8) / Uint256::from(2u8) + ); + } + + #[test] + #[should_panic(expected = "attempt to add with overflow")] + fn decimal_add_overflow_panics() { + let _value = Decimal256::MAX + Decimal256::percent(50); + } + + #[test] + fn decimal_sub() { + let value = Decimal256::one() - Decimal256::percent(50); // 0.5 + assert_eq!( + value.0, + Decimal256::decimal_fractional() / Uint256::from(2u8) + ); + } + + #[test] + #[should_panic(expected = "attempt to subtract with overflow")] + fn decimal_sub_overflow_panics() { + let _value = Decimal256::zero() - Decimal256::percent(50); + } + + #[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 decimal_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] + fn decimal_uint128_division() { + // a/b + let left = Decimal256::percent(150); // 1.5 + let right = Uint256::from(3u128); + assert_eq!(left / right, Decimal256::percent(50)); + + // 0/a + let left = Decimal256::zero(); + let right = Uint256::from(300u128); + assert_eq!(left / right, Decimal256::zero()); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn decimal_uint128_divide_by_zero() { + let left = Decimal256::percent(150); // 1.5 + let right = Uint256::from(0u128); + let _result = left / right; + } + + #[test] + fn decimal_uint128_div_assign() { + // a/b + let mut dec = Decimal256::percent(150); // 1.5 + dec /= Uint256::from(3u128); + assert_eq!(dec, Decimal256::percent(50)); + + // 0/a + let mut dec = Decimal256::zero(); + dec /= Uint256::from(300u128); + assert_eq!(dec, Decimal256::zero()); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn decimal_uint128_div_assign_by_zero() { + // a/0 + let mut dec = Decimal256::percent(50); + dec /= Uint256::from(0u128); + } + + #[test] + fn decimal_uint128_sqrt() { + assert_eq!(Decimal256::percent(900).sqrt(), Decimal256::percent(300)); + + assert!(Decimal256::percent(316) < Decimal256::percent(1000).sqrt()); + assert!(Decimal256::percent(1000).sqrt() < Decimal256::percent(317)); + } + + /// sqrt(2) is an irrational number, i.e. all 18 decimal places should be used. + #[test] + fn decimal_uint128_sqrt_is_precise() { + assert_eq!( + Decimal256::from_str("2").unwrap().sqrt(), + Decimal256::from_str("1.414213562373095048").unwrap() // https://www.wolframalpha.com/input/?i=sqrt%282%29 + ); + } + + #[test] + fn decimal_uint128_sqrt_does_not_overflow() { + assert_eq!( + Decimal256::from_str("400").unwrap().sqrt(), + Decimal256::from_str("20").unwrap() + ); + } + + #[test] + fn decimal_uint128_sqrt_intermediate_precision_used() { + assert_eq!( + Decimal256::from_str("400001").unwrap().sqrt(), + // The last two digits (27) are truncated below due to the algorithm + // we use. Larger numbers will cause less precision. + // https://www.wolframalpha.com/input/?i=sqrt%28400001%29 + Decimal256::from_str("632.456322602596803200").unwrap() + ); + } + + #[test] + fn decimal_to_string() { + // Integers + assert_eq!(Decimal256::zero().to_string(), "0"); + assert_eq!(Decimal256::one().to_string(), "1"); + assert_eq!(Decimal256::percent(500).to_string(), "5"); + + // Decimals + assert_eq!(Decimal256::percent(125).to_string(), "1.25"); + assert_eq!(Decimal256::percent(42638).to_string(), "426.38"); + assert_eq!(Decimal256::percent(3).to_string(), "0.03"); + assert_eq!(Decimal256::permille(987).to_string(), "0.987"); + + assert_eq!( + Decimal256(Uint256::from(1u128)).to_string(), + "0.000000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from(10u128)).to_string(), + "0.00000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from(100u128)).to_string(), + "0.0000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from(1000u128)).to_string(), + "0.000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from(10000u128)).to_string(), + "0.00000000000001" + ); + assert_eq!( + Decimal256(Uint256::from(100000u128)).to_string(), + "0.0000000000001" + ); + assert_eq!( + Decimal256(Uint256::from(1000000u128)).to_string(), + "0.000000000001" + ); + assert_eq!( + Decimal256(Uint256::from(10000000u128)).to_string(), + "0.00000000001" + ); + assert_eq!( + Decimal256(Uint256::from(100000000u128)).to_string(), + "0.0000000001" + ); + assert_eq!( + Decimal256(Uint256::from(1000000000u128)).to_string(), + "0.000000001" + ); + assert_eq!( + Decimal256(Uint256::from(10000000000u128)).to_string(), + "0.00000001" + ); + assert_eq!( + Decimal256(Uint256::from(100000000000u128)).to_string(), + "0.0000001" + ); + assert_eq!( + Decimal256(Uint256::from(10000000000000u128)).to_string(), + "0.00001" + ); + assert_eq!( + Decimal256(Uint256::from(100000000000000u128)).to_string(), + "0.0001" + ); + assert_eq!( + Decimal256(Uint256::from(1000000000000000u128)).to_string(), + "0.001" + ); + assert_eq!( + Decimal256(Uint256::from(10000000000000000u128)).to_string(), + "0.01" + ); + assert_eq!( + Decimal256(Uint256::from(100000000000000000u128)).to_string(), + "0.1" + ); + } + + #[test] + fn decimal_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""#); + } + + #[test] + fn decimal_deserialize() { + assert_eq!( + from_slice::(br#""0""#).unwrap(), + Decimal256::zero() + ); + assert_eq!( + from_slice::(br#""1""#).unwrap(), + Decimal256::one() + ); + assert_eq!( + from_slice::(br#""000""#).unwrap(), + Decimal256::zero() + ); + assert_eq!( + from_slice::(br#""001""#).unwrap(), + Decimal256::one() + ); + + assert_eq!( + from_slice::(br#""0.08""#).unwrap(), + Decimal256::percent(8) + ); + assert_eq!( + from_slice::(br#""0.87""#).unwrap(), + Decimal256::percent(87) + ); + assert_eq!( + from_slice::(br#""8.76""#).unwrap(), + Decimal256::percent(876) + ); + assert_eq!( + from_slice::(br#""87.65""#).unwrap(), + Decimal256::percent(8765) + ); + } +} diff --git a/packages/std/src/math/mod.rs b/packages/std/src/math/mod.rs index 4f6221fdc..cc3c91bde 100644 --- a/packages/std/src/math/mod.rs +++ b/packages/std/src/math/mod.rs @@ -1,4 +1,5 @@ mod decimal; +mod decimal256; mod fraction; mod isqrt; mod uint128; @@ -7,6 +8,7 @@ mod uint512; mod uint64; pub use decimal::Decimal; +pub use decimal256::Decimal256; pub use fraction::Fraction; pub use isqrt::Isqrt; pub use uint128::Uint128; diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index d904c9cdf..affe7f7ba 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -272,7 +272,11 @@ impl ops::Add for Uint256 { type Output = Self; fn add(self, rhs: Self) -> Self { - Uint256(self.0.checked_add(rhs.0).unwrap()) + Self( + self.0 + .checked_add(rhs.0) + .expect("attempt to add with overflow"), + ) } } @@ -280,7 +284,7 @@ impl<'a> ops::Add<&'a Uint256> for Uint256 { type Output = Self; fn add(self, rhs: &'a Uint256) -> Self { - Uint256(self.0.checked_add(rhs.0).unwrap()) + self + *rhs } } @@ -288,7 +292,11 @@ impl ops::Sub for Uint256 { type Output = Self; fn sub(self, rhs: Self) -> Self { - Uint256(self.0.checked_sub(rhs.0).unwrap()) + Self( + self.0 + .checked_sub(rhs.0) + .expect("attempt to subtract with overflow"), + ) } } @@ -296,7 +304,7 @@ impl<'a> ops::Sub<&'a Uint256> for Uint256 { type Output = Self; fn sub(self, rhs: &'a Uint256) -> Self { - Uint256(self.0.checked_sub(rhs.0).unwrap()) + self - *rhs } } @@ -304,7 +312,11 @@ impl ops::Div for Uint256 { type Output = Self; fn div(self, rhs: Self) -> Self::Output { - Self(self.0.checked_div(rhs.0).unwrap()) + Self( + self.0 + .checked_div(rhs.0) + .expect("attempt to divide by zero"), + ) } } @@ -312,7 +324,7 @@ impl<'a> ops::Div<&'a Uint256> for Uint256 { type Output = Self; fn div(self, rhs: &'a Uint256) -> Self::Output { - Self(self.0.checked_div(rhs.0).unwrap()) + self / *rhs } } @@ -320,7 +332,11 @@ impl ops::Mul for Uint256 { type Output = Self; fn mul(self, rhs: Self) -> Self::Output { - Self(self.0.checked_mul(rhs.0).unwrap()) + Self( + self.0 + .checked_mul(rhs.0) + .expect("attempt to multiply with overflow"), + ) } } @@ -328,7 +344,7 @@ impl<'a> ops::Mul<&'a Uint256> for Uint256 { type Output = Self; fn mul(self, rhs: &'a Uint256) -> Self::Output { - Self(self.0.checked_mul(rhs.0).unwrap()) + self.mul(*rhs) } } @@ -376,49 +392,49 @@ impl<'a> ops::Shl<&'a u32> for Uint256 { impl ops::AddAssign for Uint256 { fn add_assign(&mut self, rhs: Uint256) { - self.0 = self.0.checked_add(rhs.0).unwrap(); + *self = *self + rhs; } } impl<'a> ops::AddAssign<&'a Uint256> for Uint256 { fn add_assign(&mut self, rhs: &'a Uint256) { - self.0 = self.0.checked_add(rhs.0).unwrap(); + *self = *self + rhs; } } impl ops::SubAssign for Uint256 { fn sub_assign(&mut self, rhs: Uint256) { - self.0 = self.0.checked_sub(rhs.0).unwrap(); + *self = *self - rhs; } } impl<'a> ops::SubAssign<&'a Uint256> for Uint256 { fn sub_assign(&mut self, rhs: &'a Uint256) { - self.0 = self.0.checked_sub(rhs.0).unwrap(); + *self = *self - rhs; } } -impl ops::DivAssign for Uint256 { - fn div_assign(&mut self, rhs: Self) { - self.0 = self.0.checked_div(rhs.0).unwrap(); +impl ops::MulAssign for Uint256 { + fn mul_assign(&mut self, rhs: Self) { + *self = *self * rhs; } } -impl<'a> ops::DivAssign<&'a Uint256> for Uint256 { - fn div_assign(&mut self, rhs: &'a Uint256) { - self.0 = self.0.checked_div(rhs.0).unwrap(); +impl<'a> ops::MulAssign<&'a Uint256> for Uint256 { + fn mul_assign(&mut self, rhs: &'a Uint256) { + *self = *self * rhs; } } -impl ops::MulAssign for Uint256 { - fn mul_assign(&mut self, rhs: Self) { - self.0 = self.0.checked_mul(rhs.0).unwrap(); +impl ops::DivAssign for Uint256 { + fn div_assign(&mut self, rhs: Self) { + *self = *self / rhs; } } -impl<'a> ops::MulAssign<&'a Uint256> for Uint256 { - fn mul_assign(&mut self, rhs: &'a Uint256) { - self.0 = self.0.checked_mul(rhs.0).unwrap(); +impl<'a> ops::DivAssign<&'a Uint256> for Uint256 { + fn div_assign(&mut self, rhs: &'a Uint256) { + *self = *self / rhs; } } From 5415967a1e26d546bba0371c8c6afbea310238ca Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 20:24:06 +0200 Subject: [PATCH 381/402] Fix some Decimal256 bugs --- packages/std/src/math/decimal256.rs | 91 +++++++++++++++++------------ packages/std/src/math/uint256.rs | 16 +++++ 2 files changed, 70 insertions(+), 37 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 83c7aaff8..7aaf3f3b0 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -10,9 +10,11 @@ use super::Fraction; use super::Isqrt; use super::Uint256; -/// A fixed-point decimal value with 18 fractional digits, i.e. Decimal256(1_000_000_000_000_000_000) == 1.0 +/// A fixed-point decimal value with 36 fractional digits, i.e. Decimal256(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 +/// 115792089237316195423570985008687907853269.984665640564039457584007913129639935 +/// (which is (2^256 - 1) / 10^36) #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Decimal256(#[schemars(with = "String")] Uint256); @@ -44,12 +46,18 @@ impl Decimal256 { /// Convert x% into Decimal256 pub fn percent(x: u64) -> Self { - Self(((x as u128) * 10_000_000_000_000_000).into()) + Self( + (Uint256::from(x) * Uint256::from(10_000_000_000_000_000_000_000_000_000_000_000u128)) + .into(), + ) } /// Convert permille (x/1000) into Decimal256 pub fn permille(x: u64) -> Self { - Self(((x as u128) * 1_000_000_000_000_000).into()) + Self( + (Uint256::from(x) * Uint256::from(1_000_000_000_000_000_000_000_000_000_000_000u128)) + .into(), + ) } /// Returns the ratio (numerator / denominator) as a Decimal256 @@ -77,21 +85,21 @@ impl Decimal256 { // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until // there's no overflow. - (0..=9) + (0..=18) .rev() .find_map(|i| self.sqrt_with_precision(i)) - // The last step (i = 0) is guaranteed to succeed because `isqrt(u128::MAX) * 10^9` does not overflow + // The last step (i = 0) is guaranteed to succeed because `isqrt(u256::MAX) * 10^18` does not overflow .unwrap() } /// Lower precision means more aggressive rounding, but less risk of overflow. - /// Precision *must* be a number between 0 and 9 (inclusive). + /// Precision *must* be a number between 0 and 36 (inclusive). /// /// Returns `None` if the internal multiplication overflows. fn sqrt_with_precision(&self, precision: u32) -> Option { - let inner_mul = 100u128.pow(precision); + let inner_mul = Uint256::from(100u128).pow(precision); self.0.checked_mul(inner_mul.into()).ok().map(|inner| { - let outer_mul = 10u128.pow(9 - precision); + let outer_mul = Uint256::from(10u128).pow(18 - precision); Self(inner.isqrt().checked_mul(Uint256::from(outer_mul)).unwrap()) }) } @@ -147,11 +155,11 @@ impl FromStr for Decimal256 { let fractional = fractional_part .parse::() .map_err(|_| StdError::generic_err("Error parsing fractional"))?; - let exp = (18usize.checked_sub(fractional_part.len())).ok_or_else(|| { - StdError::generic_err("Cannot parse more than 18 fractional digits") + let exp = (36usize.checked_sub(fractional_part.len())).ok_or_else(|| { + StdError::generic_err("Cannot parse more than 36 fractional digits") })?; - debug_assert!(exp <= 18); - let fractional_factor = Uint256::from(10u128.pow(exp as u32)); + debug_assert!(exp <= 36); + let fractional_factor = Uint256::from(10u128).pow(exp as u32); atomics = atomics .checked_add( // The inner multiplication can't overflow because @@ -177,7 +185,7 @@ impl fmt::Display for Decimal256 { if fractional.is_zero() { write!(f, "{}", whole) } else { - let fractional_string = format!("{:018}", fractional); + let fractional_string = format!("{:036}", fractional); f.write_str(&whole.to_string())?; f.write_char('.')?; f.write_str(fractional_string.trim_end_matches('0'))?; @@ -450,19 +458,22 @@ mod tests { Decimal256::percent(4) ); - // Can handle 18 fractional digits + // Can handle 36 fractional digits assert_eq!( - Decimal256::from_str("7.123456789012345678").unwrap(), - Decimal256(Uint256::from(7123456789012345678u128)) + Decimal256::from_str("7.123456789012345678123456789012345678").unwrap(), + Decimal256(Uint256::from(7123456789012345678123456789012345678u128)) ); assert_eq!( - Decimal256::from_str("7.999999999999999999").unwrap(), - Decimal256(Uint256::from(7999999999999999999u128)) + Decimal256::from_str("7.999999999999999999999999999999999999").unwrap(), + Decimal256(Uint256::from(7999999999999999999999999999999999999u128)) ); // Works for documented max value assert_eq!( - Decimal256::from_str("340282366920938463463.374607431768211455").unwrap(), + Decimal256::from_str( + "115792089237316195423570985008687907853269.984665640564039457584007913129639935" + ) + .unwrap(), Decimal256::MAX ); } @@ -509,18 +520,18 @@ mod tests { } #[test] - fn decimal_from_str_errors_for_more_than_18_fractional_digits() { - match Decimal256::from_str("7.1234567890123456789").unwrap_err() { + fn decimal_from_str_errors_for_more_than_36_fractional_digits() { + match Decimal256::from_str("7.1234567890123456789012345678901234567").unwrap_err() { StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 18 fractional digits") + assert_eq!(msg, "Cannot parse more than 36 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 Decimal256::from_str("7.1230000000000000000").unwrap_err() { + match Decimal256::from_str("7.1230000000000000000000000000000000000").unwrap_err() { StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 18 fractional digits") + assert_eq!(msg, "Cannot parse more than 36 fractional digits") } e => panic!("Unexpected error: {:?}", e), } @@ -542,17 +553,21 @@ mod tests { #[test] fn decimal_from_str_errors_for_more_than_max_value() { // Integer - match Decimal256::from_str("340282366920938463464").unwrap_err() { + match Decimal256::from_str("115792089237316195423570985008687907853270").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {:?}", e), } // Decimal - match Decimal256::from_str("340282366920938463464.0").unwrap_err() { + match Decimal256::from_str("115792089237316195423570985008687907853270.0").unwrap_err() { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {:?}", e), } - match Decimal256::from_str("340282366920938463463.374607431768211456").unwrap_err() { + match Decimal256::from_str( + "115792089237316195423570985008687907853269.984665640564039457584007913129639936", + ) + .unwrap_err() + { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {:?}", e), } @@ -598,11 +613,11 @@ mod tests { // d > 1 rounded assert_eq!( Decimal256::from_str("3").unwrap().inv(), - Some(Decimal256::from_str("0.333333333333333333").unwrap()) + Some(Decimal256::from_str("0.333333333333333333333333333333333333").unwrap()) ); assert_eq!( Decimal256::from_str("6").unwrap().inv(), - Some(Decimal256::from_str("0.166666666666666666").unwrap()) + Some(Decimal256::from_str("0.166666666666666666666666666666666666").unwrap()) ); // d < 1 exact @@ -747,26 +762,28 @@ mod tests { fn decimal_uint128_sqrt_is_precise() { assert_eq!( Decimal256::from_str("2").unwrap().sqrt(), - Decimal256::from_str("1.414213562373095048").unwrap() // https://www.wolframalpha.com/input/?i=sqrt%282%29 + Decimal256::from_str("1.414213562373095048801688724209698078").unwrap() // https://www.wolframalpha.com/input/?i=sqrt%282%29 ); } #[test] fn decimal_uint128_sqrt_does_not_overflow() { assert_eq!( - Decimal256::from_str("400").unwrap().sqrt(), - Decimal256::from_str("20").unwrap() + Decimal256::from_str("40000000000000000000000000000000000000000") + .unwrap() + .sqrt(), + Decimal256::from_str("200000000000000000000").unwrap() ); } #[test] fn decimal_uint128_sqrt_intermediate_precision_used() { assert_eq!( - Decimal256::from_str("400001").unwrap().sqrt(), - // The last two digits (27) are truncated below due to the algorithm + Decimal256::from_str("400000000001").unwrap().sqrt(), + // The last four digits (8380) are truncated below due to the algorithm // we use. Larger numbers will cause less precision. - // https://www.wolframalpha.com/input/?i=sqrt%28400001%29 - Decimal256::from_str("632.456322602596803200").unwrap() + // https://www.wolframalpha.com/input/?i=sqrt%28400000000001%29 + Decimal256::from_str("632455.532034466435814820309613659029430000").unwrap() ); } diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index affe7f7ba..6e0cd7996 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -152,6 +152,18 @@ impl Uint256 { .ok_or_else(|| DivideByZeroError::new(self)) } + pub fn checked_pow(self, exp: u32) -> Result { + self.0 + .checked_pow(exp.into()) + .map(Self) + .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) + } + + pub fn pow(self, exp: u32) -> Self { + self.checked_pow(exp) + .expect("attempt to raise to a power with overflow") + } + pub fn checked_shr(self, other: u32) -> Result { if other >= 256 { return Err(OverflowError::new(OverflowOperation::Shr, self, other)); @@ -245,6 +257,10 @@ impl FromStr for Uint256 { type Err = StdError; fn from_str(s: &str) -> Result { + if s.is_empty() { + return Err(StdError::generic_err("Parsing u256: received empty string")); + } + match U256::from_dec_str(s) { Ok(u) => Ok(Uint256(u)), Err(e) => Err(StdError::generic_err(format!("Parsing u256: {}", e))), From fe5157faa6d6c5c10d382395dddeb615de938312 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 20:57:38 +0200 Subject: [PATCH 382/402] Fix Decimal256 tests --- packages/std/src/math/decimal256.rs | 111 +++++++++++++++++++++++----- 1 file changed, 91 insertions(+), 20 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 7aaf3f3b0..78201b577 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -358,13 +358,13 @@ mod tests { // 1/3 (result floored) assert_eq!( Decimal256::from_ratio(1u64, 3u64), - Decimal256(Uint256::from(333_333_333_333_333_333u128)) + Decimal256(Uint256::from_str("333333333333333333333333333333333333").unwrap()) ); // 2/3 (result floored) assert_eq!( Decimal256::from_ratio(2u64, 3u64), - Decimal256(Uint256::from(666_666_666_666_666_666u128)) + Decimal256(Uint256::from_str("666666666666666666666666666666666666").unwrap()) ); // large inputs @@ -391,11 +391,11 @@ mod tests { let fraction = Decimal256::from_str("1234.567").unwrap(); assert_eq!( fraction.numerator(), - Uint256::from(1_234_567_000_000_000_000_000u128) + Uint256::from_str("1234567000000000000000000000000000000000").unwrap() ); assert_eq!( fraction.denominator(), - Uint256::from(1_000_000_000_000_000_000u128) + Uint256::from_str("1000000000000000000000000000000000000").unwrap() ); } @@ -802,70 +802,141 @@ mod tests { assert_eq!( Decimal256(Uint256::from(1u128)).to_string(), - "0.000000000000000001" + "0.000000000000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(10u128)).to_string(), - "0.00000000000000001" + "0.00000000000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(100u128)).to_string(), - "0.0000000000000001" + "0.0000000000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(1000u128)).to_string(), - "0.000000000000001" + "0.000000000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(10000u128)).to_string(), - "0.00000000000001" + "0.00000000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(100000u128)).to_string(), - "0.0000000000001" + "0.0000000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(1000000u128)).to_string(), - "0.000000000001" + "0.000000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(10000000u128)).to_string(), - "0.00000000001" + "0.00000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(100000000u128)).to_string(), - "0.0000000001" + "0.0000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(1000000000u128)).to_string(), - "0.000000001" + "0.000000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(10000000000u128)).to_string(), - "0.00000001" + "0.00000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(100000000000u128)).to_string(), - "0.0000001" + "0.0000000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(10000000000000u128)).to_string(), - "0.00001" + "0.00000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(100000000000000u128)).to_string(), - "0.0001" + "0.0000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(1000000000000000u128)).to_string(), - "0.001" + "0.000000000000000000001" ); assert_eq!( Decimal256(Uint256::from(10000000000000000u128)).to_string(), - "0.01" + "0.00000000000000000001" ); assert_eq!( Decimal256(Uint256::from(100000000000000000u128)).to_string(), + "0.0000000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("1000000000000000000").unwrap()).to_string(), + "0.000000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("10000000000000000000").unwrap()).to_string(), + "0.00000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("100000000000000000000").unwrap()).to_string(), + "0.0000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("1000000000000000000000").unwrap()).to_string(), + "0.000000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("10000000000000000000000").unwrap()).to_string(), + "0.00000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("100000000000000000000000").unwrap()).to_string(), + "0.0000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("1000000000000000000000000").unwrap()).to_string(), + "0.000000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("10000000000000000000000000").unwrap()).to_string(), + "0.00000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("100000000000000000000000000").unwrap()).to_string(), + "0.0000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("1000000000000000000000000000").unwrap()).to_string(), + "0.000000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("10000000000000000000000000000").unwrap()).to_string(), + "0.00000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("100000000000000000000000000000").unwrap()).to_string(), + "0.0000001" + ); + assert_eq!( + Decimal256(Uint256::from_str("10000000000000000000000000000000").unwrap()).to_string(), + "0.00001" + ); + assert_eq!( + Decimal256(Uint256::from_str("100000000000000000000000000000000").unwrap()).to_string(), + "0.0001" + ); + assert_eq!( + Decimal256(Uint256::from_str("1000000000000000000000000000000000").unwrap()) + .to_string(), + "0.001" + ); + assert_eq!( + Decimal256(Uint256::from_str("10000000000000000000000000000000000").unwrap()) + .to_string(), + "0.01" + ); + assert_eq!( + Decimal256(Uint256::from_str("100000000000000000000000000000000000").unwrap()) + .to_string(), "0.1" ); } From c89c79c286db8cad473c4d53fe91bdab7b2bb65e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 21:01:07 +0200 Subject: [PATCH 383/402] Update Decimal256 comments --- packages/std/src/math/decimal256.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 78201b577..d1eeba71c 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -88,7 +88,7 @@ impl Decimal256 { (0..=18) .rev() .find_map(|i| self.sqrt_with_precision(i)) - // The last step (i = 0) is guaranteed to succeed because `isqrt(u256::MAX) * 10^18` does not overflow + // The last step (i = 0) is guaranteed to succeed because `isqrt(Uint256::MAX) * 10^18` does not overflow .unwrap() } @@ -139,7 +139,7 @@ impl FromStr for Decimal256 { /// Disallowed: "", ".23" /// /// This never performs any kind of rounding. - /// More than 18 fractional digits, even zeros, result in an error. + /// More than 36 fractional digits, even zeros, result in an error. fn from_str(input: &str) -> Result { let mut parts_iter = input.split('.'); @@ -163,7 +163,7 @@ impl FromStr for Decimal256 { atomics = atomics .checked_add( // The inner multiplication can't overflow because - // fractional < 10^18 && fractional_factor <= 10^18 + // fractional < 10^36 && fractional_factor <= 10^36 fractional.checked_mul(fractional_factor).unwrap(), ) .map_err(|_| StdError::generic_err("Value too big"))?; @@ -757,7 +757,7 @@ mod tests { assert!(Decimal256::percent(1000).sqrt() < Decimal256::percent(317)); } - /// sqrt(2) is an irrational number, i.e. all 18 decimal places should be used. + /// sqrt(2) is an irrational number, i.e. all 36 decimal places should be used. #[test] fn decimal_uint128_sqrt_is_precise() { assert_eq!( From e00b96267d01bd64060d779c39b235458b20a3ab Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 21:07:02 +0200 Subject: [PATCH 384/402] clippy --- packages/std/src/math/decimal256.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index d1eeba71c..ea14a3484 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -46,18 +46,12 @@ impl Decimal256 { /// Convert x% into Decimal256 pub fn percent(x: u64) -> Self { - Self( - (Uint256::from(x) * Uint256::from(10_000_000_000_000_000_000_000_000_000_000_000u128)) - .into(), - ) + Self(Uint256::from(x) * Uint256::from(10_000_000_000_000_000_000_000_000_000_000_000u128)) } /// Convert permille (x/1000) into Decimal256 pub fn permille(x: u64) -> Self { - Self( - (Uint256::from(x) * Uint256::from(1_000_000_000_000_000_000_000_000_000_000_000u128)) - .into(), - ) + Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000_000_000_000_000_000_000u128)) } /// Returns the ratio (numerator / denominator) as a Decimal256 @@ -98,9 +92,9 @@ impl Decimal256 { /// Returns `None` if the internal multiplication overflows. fn sqrt_with_precision(&self, precision: u32) -> Option { let inner_mul = Uint256::from(100u128).pow(precision); - self.0.checked_mul(inner_mul.into()).ok().map(|inner| { + self.0.checked_mul(inner_mul).ok().map(|inner| { let outer_mul = Uint256::from(10u128).pow(18 - precision); - Self(inner.isqrt().checked_mul(Uint256::from(outer_mul)).unwrap()) + Self(inner.isqrt().checked_mul(outer_mul).unwrap()) }) } } From 3a4c7f6c79b703323093b86512f343101d46980b Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Wed, 1 Sep 2021 21:08:08 +0200 Subject: [PATCH 385/402] CHANGELOG update --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c74f3b03a..30873d5c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ and this project adheres to `Uint64`, `Uint128`, `Uint256`, and `Uint512`. - cosmwasm-std: Exposed `Uint{64, 128, 256}::full_mul` for full multiplication that cannot overflow. +- cosmwasm-std: Added the `Decimal256` type with 36 decimal places. ### Changed From c155d332704ef7cb9db21e2e9db4165ffd202d2e Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 2 Sep 2021 14:11:01 +0200 Subject: [PATCH 386/402] Add a comment about Decimal*::sqrt algorithm --- packages/std/src/math/decimal256.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index ea14a3484..675232f40 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -79,6 +79,10 @@ impl Decimal256 { // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until // there's no overflow. + // + // TODO: This could be made more efficient once log10 is in: + // https://github.com/rust-lang/rust/issues/70887 + // The max precision is something like `18 - log10(self.0) / 2`. (0..=18) .rev() .find_map(|i| self.sqrt_with_precision(i)) From 6c4d53b48f2ce2be3641ff4a4f0d36c1a3766ac9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Thu, 2 Sep 2021 14:37:27 +0200 Subject: [PATCH 387/402] Define DECIMAL_PLACES as a const in Decimal* --- packages/std/src/math/decimal.rs | 36 +++++++++++++++++++---------- packages/std/src/math/decimal256.rs | 31 ++++++++++++++++--------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 88ee60ee1..822f04bcd 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -20,6 +20,7 @@ impl Decimal { const DECIMAL_FRACTIONAL: Uint128 = Uint128::new(1_000_000_000_000_000_000u128); // 1*10**18 const DECIMAL_FRACTIONAL_SQUARED: Uint128 = Uint128::new(1_000_000_000_000_000_000_000_000_000_000_000_000u128); // (1*10**18)**2 = 1*10**36 + const DECIMAL_PLACES: usize = 18; // This needs to be an even number. pub const MAX: Self = Self(Uint128::MAX); @@ -68,7 +69,11 @@ impl Decimal { // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until // there's no overflow. - (0..=9) + // + // TODO: This could be made more efficient once log10 is in: + // https://github.com/rust-lang/rust/issues/70887 + // The max precision is something like `9 - log10(self.0) / 2`. + (0..=Self::DECIMAL_PLACES / 2) .rev() .find_map(|i| self.sqrt_with_precision(i)) // The last step (i = 0) is guaranteed to succeed because `isqrt(u128::MAX) * 10^9` does not overflow @@ -79,10 +84,12 @@ impl Decimal { /// Precision *must* be a number between 0 and 9 (inclusive). /// /// Returns `None` if the internal multiplication overflows. - fn sqrt_with_precision(&self, precision: u32) -> Option { + fn sqrt_with_precision(&self, precision: usize) -> Option { + let precision = precision as u32; + let inner_mul = 100u128.pow(precision); self.0.checked_mul(inner_mul.into()).ok().map(|inner| { - let outer_mul = 10u128.pow(9 - precision); + let outer_mul = 10u128.pow(Self::DECIMAL_PLACES as u32 / 2 - precision); Decimal(inner.isqrt().checked_mul(Uint128::from(outer_mul)).unwrap()) }) } @@ -122,7 +129,7 @@ impl FromStr for Decimal { /// Disallowed: "", ".23" /// /// This never performs any kind of rounding. - /// More than 18 fractional digits, even zeros, result in an error. + /// More than DECIMAL_PLACES fractional digits, even zeros, result in an error. fn from_str(input: &str) -> Result { let mut parts_iter = input.split('.'); @@ -138,15 +145,19 @@ impl FromStr for Decimal { let fractional = fractional_part .parse::() .map_err(|_| StdError::generic_err("Error parsing fractional"))?; - let exp = (18usize.checked_sub(fractional_part.len())).ok_or_else(|| { - StdError::generic_err("Cannot parse more than 18 fractional digits") - })?; - debug_assert!(exp <= 18); + let exp = + (Self::DECIMAL_PLACES.checked_sub(fractional_part.len())).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 = Uint128::from(10u128.pow(exp as u32)); atomics = atomics .checked_add( // The inner multiplication can't overflow because - // fractional < 10^18 && fractional_factor <= 10^18 + // fractional < 10^DECIMAL_PLACES && fractional_factor <= 10^DECIMAL_PLACES fractional.checked_mul(fractional_factor).unwrap(), ) .map_err(|_| StdError::generic_err("Value too big"))?; @@ -168,7 +179,8 @@ impl fmt::Display for Decimal { if fractional.is_zero() { write!(f, "{}", whole) } else { - let fractional_string = format!("{:018}", fractional); + let fractional_string = + format!("{:0>padding$}", fractional, padding = Self::DECIMAL_PLACES); f.write_str(&whole.to_string())?; f.write_char('.')?; f.write_str(fractional_string.trim_end_matches('0'))?; @@ -375,7 +387,7 @@ mod tests { assert_eq!(Decimal::from_str("00.40").unwrap(), Decimal::percent(40)); assert_eq!(Decimal::from_str("00.04").unwrap(), Decimal::percent(4)); - // Can handle 18 fractional digits + // Can handle DECIMAL_PLACES fractional digits assert_eq!( Decimal::from_str("7.123456789012345678").unwrap(), Decimal(Uint128::from(7123456789012345678u128)) @@ -437,7 +449,7 @@ mod tests { fn decimal_from_str_errors_for_more_than_18_fractional_digits() { match Decimal::from_str("7.1234567890123456789").unwrap_err() { StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 18 fractional digits") + assert_eq!(msg, "Cannot parse more than 18 fractional digits",) } e => panic!("Unexpected error: {:?}", e), } diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 675232f40..00ee83be7 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -19,6 +19,8 @@ use super::Uint256; pub struct Decimal256(#[schemars(with = "String")] Uint256); impl Decimal256 { + const DECIMAL_PLACES: usize = 36; + fn decimal_fractional() -> Uint256 { // 1*10**36 Uint256::from(1_000_000_000_000_000_000_000_000_000_000_000_000u128) @@ -83,7 +85,7 @@ impl Decimal256 { // TODO: This could be made more efficient once log10 is in: // https://github.com/rust-lang/rust/issues/70887 // The max precision is something like `18 - log10(self.0) / 2`. - (0..=18) + (0..=Self::DECIMAL_PLACES / 2) .rev() .find_map(|i| self.sqrt_with_precision(i)) // The last step (i = 0) is guaranteed to succeed because `isqrt(Uint256::MAX) * 10^18` does not overflow @@ -91,13 +93,15 @@ impl Decimal256 { } /// Lower precision means more aggressive rounding, but less risk of overflow. - /// Precision *must* be a number between 0 and 36 (inclusive). + /// Precision *must* be a number between 0 and 18 (inclusive). /// /// Returns `None` if the internal multiplication overflows. - fn sqrt_with_precision(&self, precision: u32) -> Option { + fn sqrt_with_precision(&self, precision: usize) -> Option { + let precision = precision as u32; + let inner_mul = Uint256::from(100u128).pow(precision); self.0.checked_mul(inner_mul).ok().map(|inner| { - let outer_mul = Uint256::from(10u128).pow(18 - precision); + let outer_mul = Uint256::from(10u128).pow(Self::DECIMAL_PLACES as u32 / 2 - precision); Self(inner.isqrt().checked_mul(outer_mul).unwrap()) }) } @@ -137,7 +141,7 @@ impl FromStr for Decimal256 { /// Disallowed: "", ".23" /// /// This never performs any kind of rounding. - /// More than 36 fractional digits, even zeros, result in an error. + /// More than DECIMAL_PLACES fractional digits, even zeros, result in an error. fn from_str(input: &str) -> Result { let mut parts_iter = input.split('.'); @@ -153,15 +157,19 @@ impl FromStr for Decimal256 { let fractional = fractional_part .parse::() .map_err(|_| StdError::generic_err("Error parsing fractional"))?; - let exp = (36usize.checked_sub(fractional_part.len())).ok_or_else(|| { - StdError::generic_err("Cannot parse more than 36 fractional digits") - })?; - debug_assert!(exp <= 36); + let exp = + (Self::DECIMAL_PLACES.checked_sub(fractional_part.len())).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 = Uint256::from(10u128).pow(exp as u32); atomics = atomics .checked_add( // The inner multiplication can't overflow because - // fractional < 10^36 && fractional_factor <= 10^36 + // fractional < 10^DECIMAL_PLACES && fractional_factor <= 10^DECIMAL_PLACES fractional.checked_mul(fractional_factor).unwrap(), ) .map_err(|_| StdError::generic_err("Value too big"))?; @@ -183,7 +191,8 @@ impl fmt::Display for Decimal256 { if fractional.is_zero() { write!(f, "{}", whole) } else { - let fractional_string = format!("{:036}", fractional); + let fractional_string = + format!("{:0>padding$}", fractional, padding = Self::DECIMAL_PLACES); f.write_str(&whole.to_string())?; f.write_char('.')?; f.write_str(fractional_string.trim_end_matches('0'))?; From 23be43e5503fe0a7b0adc9bd7940168963068dc9 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 6 Sep 2021 17:45:12 +0200 Subject: [PATCH 388/402] Decimal256: 18 decimal places + const fns --- packages/std/src/math/decimal256.rs | 198 ++++++++++------------------ 1 file changed, 69 insertions(+), 129 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 00ee83be7..7b54fbfa9 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -10,34 +10,39 @@ use super::Fraction; use super::Isqrt; use super::Uint256; -/// A fixed-point decimal value with 36 fractional digits, i.e. Decimal256(1_000_000_000_000_000_000) == 1.0 +/// A fixed-point decimal value with 18 fractional digits, i.e. Decimal256(1_000_000_000_000_000_000) == 1.0 /// /// The greatest possible value that can be represented is -/// 115792089237316195423570985008687907853269.984665640564039457584007913129639935 -/// (which is (2^256 - 1) / 10^36) +/// 115792089237316195423570985008687907853269984665640564039457.584007913129639935 +/// (which is (2^256 - 1) / 10^18) #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, JsonSchema)] pub struct Decimal256(#[schemars(with = "String")] Uint256); impl Decimal256 { - const DECIMAL_PLACES: usize = 36; + const DECIMAL_PLACES: usize = 18; + 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, + ]); + 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, + ]); - fn decimal_fractional() -> Uint256 { - // 1*10**36 - Uint256::from(1_000_000_000_000_000_000_000_000_000_000_000_000u128) + const fn decimal_fractional() -> Uint256 { + Self::DECIMAL_FRACTIONAL } - fn decimal_fractional_squared() -> Uint256 { - // 1*10**72 - Uint256::new([ - 0, 0, 144, 228, 15, 190, 234, 29, 58, 74, 188, 137, 85, 233, 70, 254, 49, 205, 207, - 102, 246, 52, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]) + const fn decimal_fractional_squared() -> Uint256 { + Self::DECIMAL_FRACTIONAL_SQUARED } pub const MAX: Self = Self(Uint256::MAX); /// Create a 1.0 Decimal256 - pub fn one() -> Self { + pub const fn one() -> Self { Self(Self::decimal_fractional()) } @@ -48,12 +53,12 @@ impl Decimal256 { /// Convert x% into Decimal256 pub fn percent(x: u64) -> Self { - Self(Uint256::from(x) * Uint256::from(10_000_000_000_000_000_000_000_000_000_000_000u128)) + Self(Uint256::from(x) * Uint256::from(10_000_000_000_000_000u128)) } /// Convert permille (x/1000) into Decimal256 pub fn permille(x: u64) -> Self { - Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000_000_000_000_000_000_000u128)) + Self(Uint256::from(x) * Uint256::from(1_000_000_000_000_000u128)) } /// Returns the ratio (numerator / denominator) as a Decimal256 @@ -365,13 +370,13 @@ mod tests { // 1/3 (result floored) assert_eq!( Decimal256::from_ratio(1u64, 3u64), - Decimal256(Uint256::from_str("333333333333333333333333333333333333").unwrap()) + Decimal256(Uint256::from_str("333333333333333333").unwrap()) ); // 2/3 (result floored) assert_eq!( Decimal256::from_ratio(2u64, 3u64), - Decimal256(Uint256::from_str("666666666666666666666666666666666666").unwrap()) + Decimal256(Uint256::from_str("666666666666666666").unwrap()) ); // large inputs @@ -398,11 +403,11 @@ mod tests { let fraction = Decimal256::from_str("1234.567").unwrap(); assert_eq!( fraction.numerator(), - Uint256::from_str("1234567000000000000000000000000000000000").unwrap() + Uint256::from_str("1234567000000000000000").unwrap() ); assert_eq!( fraction.denominator(), - Uint256::from_str("1000000000000000000000000000000000000").unwrap() + Uint256::from_str("1000000000000000000").unwrap() ); } @@ -465,20 +470,20 @@ mod tests { Decimal256::percent(4) ); - // Can handle 36 fractional digits + // Can handle 18 fractional digits assert_eq!( - Decimal256::from_str("7.123456789012345678123456789012345678").unwrap(), - Decimal256(Uint256::from(7123456789012345678123456789012345678u128)) + Decimal256::from_str("7.123456789012345678").unwrap(), + Decimal256(Uint256::from(7123456789012345678u128)) ); assert_eq!( - Decimal256::from_str("7.999999999999999999999999999999999999").unwrap(), - Decimal256(Uint256::from(7999999999999999999999999999999999999u128)) + Decimal256::from_str("7.999999999999999999").unwrap(), + Decimal256(Uint256::from(7999999999999999999u128)) ); // Works for documented max value assert_eq!( Decimal256::from_str( - "115792089237316195423570985008687907853269.984665640564039457584007913129639935" + "115792089237316195423570985008687907853269984665640564039457.584007913129639935" ) .unwrap(), Decimal256::MAX @@ -528,17 +533,17 @@ mod tests { #[test] fn decimal_from_str_errors_for_more_than_36_fractional_digits() { - match Decimal256::from_str("7.1234567890123456789012345678901234567").unwrap_err() { + match Decimal256::from_str("7.1234567890123456789").unwrap_err() { StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 36 fractional digits") + 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 Decimal256::from_str("7.1230000000000000000000000000000000000").unwrap_err() { + match Decimal256::from_str("7.1230000000000000000").unwrap_err() { StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "Cannot parse more than 36 fractional digits") + assert_eq!(msg, "Cannot parse more than 18 fractional digits") } e => panic!("Unexpected error: {:?}", e), } @@ -560,18 +565,22 @@ mod tests { #[test] fn decimal_from_str_errors_for_more_than_max_value() { // Integer - match Decimal256::from_str("115792089237316195423570985008687907853270").unwrap_err() { + match Decimal256::from_str("115792089237316195423570985008687907853269984665640564039458") + .unwrap_err() + { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {:?}", e), } // Decimal - match Decimal256::from_str("115792089237316195423570985008687907853270.0").unwrap_err() { + match Decimal256::from_str("115792089237316195423570985008687907853269984665640564039458.0") + .unwrap_err() + { StdError::GenericErr { msg, .. } => assert_eq!(msg, "Value too big"), e => panic!("Unexpected error: {:?}", e), } match Decimal256::from_str( - "115792089237316195423570985008687907853269.984665640564039457584007913129639936", + "115792089237316195423570985008687907853269984665640564039457.584007913129639936", ) .unwrap_err() { @@ -620,11 +629,11 @@ mod tests { // d > 1 rounded assert_eq!( Decimal256::from_str("3").unwrap().inv(), - Some(Decimal256::from_str("0.333333333333333333333333333333333333").unwrap()) + Some(Decimal256::from_str("0.333333333333333333").unwrap()) ); assert_eq!( Decimal256::from_str("6").unwrap().inv(), - Some(Decimal256::from_str("0.166666666666666666666666666666666666").unwrap()) + Some(Decimal256::from_str("0.166666666666666666").unwrap()) ); // d < 1 exact @@ -769,28 +778,30 @@ mod tests { fn decimal_uint128_sqrt_is_precise() { assert_eq!( Decimal256::from_str("2").unwrap().sqrt(), - Decimal256::from_str("1.414213562373095048801688724209698078").unwrap() // https://www.wolframalpha.com/input/?i=sqrt%282%29 + Decimal256::from_str("1.414213562373095048").unwrap() // https://www.wolframalpha.com/input/?i=sqrt%282%29 ); } #[test] fn decimal_uint128_sqrt_does_not_overflow() { assert_eq!( - Decimal256::from_str("40000000000000000000000000000000000000000") + Decimal256::from_str("40000000000000000000000000000000000000000000000000000000000") .unwrap() .sqrt(), - Decimal256::from_str("200000000000000000000").unwrap() + Decimal256::from_str("200000000000000000000000000000").unwrap() ); } #[test] fn decimal_uint128_sqrt_intermediate_precision_used() { assert_eq!( - Decimal256::from_str("400000000001").unwrap().sqrt(), - // The last four digits (8380) are truncated below due to the algorithm + Decimal256::from_str("40000000000000000000000000000000000000000000000001") + .unwrap() + .sqrt(), + // The last few digits (39110) are truncated below due to the algorithm // we use. Larger numbers will cause less precision. - // https://www.wolframalpha.com/input/?i=sqrt%28400000000001%29 - Decimal256::from_str("632455.532034466435814820309613659029430000").unwrap() + // https://www.wolframalpha.com/input/?i=sqrt%2840000000000000000000000000000000000000000000000001%29 + Decimal256::from_str("6324555320336758663997787.088865437067400000").unwrap() ); } @@ -809,141 +820,70 @@ mod tests { assert_eq!( Decimal256(Uint256::from(1u128)).to_string(), - "0.000000000000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(10u128)).to_string(), - "0.00000000000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(100u128)).to_string(), - "0.0000000000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(1000u128)).to_string(), - "0.000000000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(10000u128)).to_string(), - "0.00000000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(100000u128)).to_string(), - "0.0000000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(1000000u128)).to_string(), - "0.000000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(10000000u128)).to_string(), - "0.00000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(100000000u128)).to_string(), - "0.0000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(1000000000u128)).to_string(), - "0.000000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(10000000000u128)).to_string(), - "0.00000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(100000000000u128)).to_string(), - "0.0000000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(10000000000000u128)).to_string(), - "0.00000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(100000000000000u128)).to_string(), - "0.0000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(1000000000000000u128)).to_string(), - "0.000000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(10000000000000000u128)).to_string(), - "0.00000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from(100000000000000000u128)).to_string(), - "0.0000000000000000001" - ); - assert_eq!( - Decimal256(Uint256::from_str("1000000000000000000").unwrap()).to_string(), "0.000000000000000001" ); assert_eq!( - Decimal256(Uint256::from_str("10000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(10u128)).to_string(), "0.00000000000000001" ); assert_eq!( - Decimal256(Uint256::from_str("100000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(100u128)).to_string(), "0.0000000000000001" ); assert_eq!( - Decimal256(Uint256::from_str("1000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(1000u128)).to_string(), "0.000000000000001" ); assert_eq!( - Decimal256(Uint256::from_str("10000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(10000u128)).to_string(), "0.00000000000001" ); assert_eq!( - Decimal256(Uint256::from_str("100000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(100000u128)).to_string(), "0.0000000000001" ); assert_eq!( - Decimal256(Uint256::from_str("1000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(1000000u128)).to_string(), "0.000000000001" ); assert_eq!( - Decimal256(Uint256::from_str("10000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(10000000u128)).to_string(), "0.00000000001" ); assert_eq!( - Decimal256(Uint256::from_str("100000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(100000000u128)).to_string(), "0.0000000001" ); assert_eq!( - Decimal256(Uint256::from_str("1000000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(1000000000u128)).to_string(), "0.000000001" ); assert_eq!( - Decimal256(Uint256::from_str("10000000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(10000000000u128)).to_string(), "0.00000001" ); assert_eq!( - Decimal256(Uint256::from_str("100000000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(100000000000u128)).to_string(), "0.0000001" ); assert_eq!( - Decimal256(Uint256::from_str("10000000000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(10000000000000u128)).to_string(), "0.00001" ); assert_eq!( - Decimal256(Uint256::from_str("100000000000000000000000000000000").unwrap()).to_string(), + Decimal256(Uint256::from(100000000000000u128)).to_string(), "0.0001" ); assert_eq!( - Decimal256(Uint256::from_str("1000000000000000000000000000000000").unwrap()) - .to_string(), + Decimal256(Uint256::from(1000000000000000u128)).to_string(), "0.001" ); assert_eq!( - Decimal256(Uint256::from_str("10000000000000000000000000000000000").unwrap()) - .to_string(), + Decimal256(Uint256::from(10000000000000000u128)).to_string(), "0.01" ); assert_eq!( - Decimal256(Uint256::from_str("100000000000000000000000000000000000").unwrap()) - .to_string(), + Decimal256(Uint256::from(100000000000000000u128)).to_string(), "0.1" ); } From e49359312dc0f57ab1c31eecfa8edb7f5fd40933 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 6 Sep 2021 17:47:44 +0200 Subject: [PATCH 389/402] Decimal256: DECIMAL_FRACTIONAL* are now constants --- packages/std/src/math/decimal256.rs | 43 +++++++++-------------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 7b54fbfa9..06985f089 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -31,19 +31,11 @@ impl Decimal256 { 75, 159, 16, 0, 0, 0, 0, ]); - const fn decimal_fractional() -> Uint256 { - Self::DECIMAL_FRACTIONAL - } - - const fn decimal_fractional_squared() -> Uint256 { - Self::DECIMAL_FRACTIONAL_SQUARED - } - pub const MAX: Self = Self(Uint256::MAX); /// Create a 1.0 Decimal256 pub const fn one() -> Self { - Self(Self::decimal_fractional()) + Self(Self::DECIMAL_FRACTIONAL) } /// Create a 0.0 Decimal256 @@ -71,7 +63,7 @@ impl Decimal256 { Self( // numerator * DECIMAL_FRACTIONAL / denominator - numerator.multiply_ratio(Self::decimal_fractional(), denominator), + numerator.multiply_ratio(Self::DECIMAL_FRACTIONAL, denominator), ) } @@ -120,7 +112,7 @@ impl Fraction for Decimal256 { #[inline] fn denominator(&self) -> Uint256 { - Self::decimal_fractional() + Self::DECIMAL_FRACTIONAL } /// Returns the multiplicative inverse `1/d` for decimal `d`. @@ -133,7 +125,7 @@ impl Fraction for Decimal256 { // 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(Self(Self::decimal_fractional_squared() / self.0)) + Some(Self(Self::DECIMAL_FRACTIONAL_SQUARED / self.0)) } } } @@ -155,7 +147,7 @@ impl FromStr for Decimal256 { .parse::() .map_err(|_| StdError::generic_err("Error parsing whole"))?; let mut atomics = whole - .checked_mul(Self::decimal_fractional()) + .checked_mul(Self::DECIMAL_FRACTIONAL) .map_err(|_| StdError::generic_err("Value too big"))?; if let Some(fractional_part) = parts_iter.next() { @@ -190,8 +182,8 @@ impl FromStr for Decimal256 { impl fmt::Display for Decimal256 { 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(); + let whole = (self.0) / Self::DECIMAL_FRACTIONAL; + let fractional = (self.0).checked_rem(Self::DECIMAL_FRACTIONAL).unwrap(); if fractional.is_zero() { write!(f, "{}", whole) @@ -234,7 +226,7 @@ impl ops::Mul for Uint256 { if self.is_zero() || rhs.is_zero() { return Uint256::zero(); } - self.multiply_ratio(rhs.0, Decimal256::decimal_fractional()) + self.multiply_ratio(rhs.0, Decimal256::DECIMAL_FRACTIONAL) } } @@ -309,7 +301,7 @@ mod tests { #[test] fn decimal_one() { let value = Decimal256::one(); - assert_eq!(value.0, Decimal256::decimal_fractional()); + assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL); } #[test] @@ -321,19 +313,13 @@ mod tests { #[test] fn decimal_percent() { let value = Decimal256::percent(50); - assert_eq!( - value.0, - Decimal256::decimal_fractional() / Uint256::from(2u8) - ); + assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(2u8)); } #[test] fn decimal_permille() { let value = Decimal256::permille(125); - assert_eq!( - value.0, - Decimal256::decimal_fractional() / Uint256::from(8u8) - ); + assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(8u8)); } #[test] @@ -660,7 +646,7 @@ mod tests { let value = Decimal256::one() + Decimal256::percent(50); // 1.5 assert_eq!( value.0, - Decimal256::decimal_fractional() * Uint256::from(3u8) / Uint256::from(2u8) + Decimal256::DECIMAL_FRACTIONAL * Uint256::from(3u8) / Uint256::from(2u8) ); } @@ -673,10 +659,7 @@ mod tests { #[test] fn decimal_sub() { let value = Decimal256::one() - Decimal256::percent(50); // 0.5 - assert_eq!( - value.0, - Decimal256::decimal_fractional() / Uint256::from(2u8) - ); + assert_eq!(value.0, Decimal256::DECIMAL_FRACTIONAL / Uint256::from(2u8)); } #[test] From 89dc7818e7def8446474c48e1f151e7eebb11a51 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Mon, 6 Sep 2021 17:53:06 +0200 Subject: [PATCH 390/402] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30873d5c4..896557062 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to `Into` rather than `Into`. - cosmwasm-crypto: Update dependency `k256` to ^0.9.6. - cosmwasm-std: Add enum cases `Shl` to `OverflowOperation` (breaking; [#1071]). +- cosmwasm-std: `Decimal256` now has 18 decimal places. [#1071]: https://github.com/CosmWasm/cosmwasm/pull/1071 From 65dbffb0842b6bd4da741de1b1c3442be8e72093 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 7 Sep 2021 12:13:15 +0200 Subject: [PATCH 391/402] Apply suggestions from code review Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- CHANGELOG.md | 2 +- packages/std/src/math/decimal256.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 896557062..6c1ee7a45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ and this project adheres to `Uint64`, `Uint128`, `Uint256`, and `Uint512`. - cosmwasm-std: Exposed `Uint{64, 128, 256}::full_mul` for full multiplication that cannot overflow. -- cosmwasm-std: Added the `Decimal256` type with 36 decimal places. +- cosmwasm-std: Added the `Decimal256` type with 18 decimal places. ### Changed diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index 06985f089..cf3cfa2d4 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -85,12 +85,12 @@ impl Decimal256 { (0..=Self::DECIMAL_PLACES / 2) .rev() .find_map(|i| self.sqrt_with_precision(i)) - // The last step (i = 0) is guaranteed to succeed because `isqrt(Uint256::MAX) * 10^18` does not overflow + // The last step (i = 0) is guaranteed to succeed because `isqrt(Uint256::MAX) * 10^9` does not overflow .unwrap() } /// Lower precision means more aggressive rounding, but less risk of overflow. - /// Precision *must* be a number between 0 and 18 (inclusive). + /// Precision *must* be a number between 0 and 9 (inclusive). /// /// Returns `None` if the internal multiplication overflows. fn sqrt_with_precision(&self, precision: usize) -> Option { From 2aa7a619690385004700cda7ca58a482d69aeb71 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 7 Sep 2021 12:16:40 +0200 Subject: [PATCH 392/402] Fix CHANGELOG --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c1ee7a45..493400f8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to - 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 @@ -21,7 +22,6 @@ and this project adheres to `Into` rather than `Into`. - cosmwasm-crypto: Update dependency `k256` to ^0.9.6. - cosmwasm-std: Add enum cases `Shl` to `OverflowOperation` (breaking; [#1071]). -- cosmwasm-std: `Decimal256` now has 18 decimal places. [#1071]: https://github.com/CosmWasm/cosmwasm/pull/1071 @@ -41,7 +41,6 @@ and this project adheres to `Uint64`, `Uint128`, `Uint256`, and `Uint512`. - cosmwasm-std: Exposed `Uint{64, 128, 256}::full_mul` for full multiplication that cannot overflow. -- cosmwasm-std: Added the `Decimal256` type with 18 decimal places. ### Changed From 623118a4003d2cb1be4c69be2ee3cc06204932d0 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 7 Sep 2021 12:53:40 +0200 Subject: [PATCH 393/402] Set version: 0.16.2 --- Cargo.lock | 12 ++++++------ contracts/burner/Cargo.lock | 10 +++++----- contracts/crypto-verify/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 | 10 +++++----- contracts/reflect/Cargo.lock | 12 ++++++------ contracts/staking/Cargo.lock | 12 ++++++------ packages/crypto/Cargo.toml | 2 +- packages/derive/Cargo.toml | 2 +- packages/schema/Cargo.toml | 2 +- packages/std/Cargo.toml | 6 +++--- packages/storage/Cargo.toml | 4 ++-- packages/vm/Cargo.toml | 6 +++--- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9a0eee9d..68d32da2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,7 +166,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "criterion", @@ -186,7 +186,7 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "syn", @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "chrono", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -228,7 +228,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clap", "clru", diff --git a/contracts/burner/Cargo.lock b/contracts/burner/Cargo.lock index 8f96f031b..15689aa56 100644 --- a/contracts/burner/Cargo.lock +++ b/contracts/burner/Cargo.lock @@ -102,7 +102,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -113,14 +113,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -142,7 +142,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/crypto-verify/Cargo.lock b/contracts/crypto-verify/Cargo.lock index 849495c09..febce5647 100644 --- a/contracts/crypto-verify/Cargo.lock +++ b/contracts/crypto-verify/Cargo.lock @@ -104,7 +104,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -115,14 +115,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -130,7 +130,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -144,7 +144,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -152,7 +152,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/floaty/Cargo.lock b/contracts/floaty/Cargo.lock index c60e5bf01..d51767fbc 100644 --- a/contracts/floaty/Cargo.lock +++ b/contracts/floaty/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/hackatom/Cargo.lock b/contracts/hackatom/Cargo.lock index 6ea65aa7c..ddff86185 100644 --- a/contracts/hackatom/Cargo.lock +++ b/contracts/hackatom/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect-send/Cargo.lock b/contracts/ibc-reflect-send/Cargo.lock index e7c5e066b..5ad903b09 100644 --- a/contracts/ibc-reflect-send/Cargo.lock +++ b/contracts/ibc-reflect-send/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/ibc-reflect/Cargo.lock b/contracts/ibc-reflect/Cargo.lock index cad1cb3cd..785e882ac 100644 --- a/contracts/ibc-reflect/Cargo.lock +++ b/contracts/ibc-reflect/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/queue/Cargo.lock b/contracts/queue/Cargo.lock index 70b559686..df159a266 100644 --- a/contracts/queue/Cargo.lock +++ b/contracts/queue/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/reflect/Cargo.lock b/contracts/reflect/Cargo.lock index 0d00fb7b9..c32cfacee 100644 --- a/contracts/reflect/Cargo.lock +++ b/contracts/reflect/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/contracts/staking/Cargo.lock b/contracts/staking/Cargo.lock index 5694b0aa2..fd44fdd7b 100644 --- a/contracts/staking/Cargo.lock +++ b/contracts/staking/Cargo.lock @@ -91,7 +91,7 @@ checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" [[package]] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" dependencies = [ "digest", "ed25519-zebra", @@ -102,14 +102,14 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" dependencies = [ "syn", ] [[package]] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" dependencies = [ "schemars", "serde_json", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" dependencies = [ "base64", "cosmwasm-crypto", @@ -131,7 +131,7 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cosmwasm-std", "serde", @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" dependencies = [ "clru", "cosmwasm-crypto", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index bc4636ed3..2dac77c2d 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-crypto" -version = "0.16.1" +version = "0.16.2" authors = ["Mauro Lacy "] edition = "2018" description = "Crypto bindings for cosmwasm contracts" diff --git a/packages/derive/Cargo.toml b/packages/derive/Cargo.toml index 8a35ad87b..a8d8b6d07 100644 --- a/packages/derive/Cargo.toml +++ b/packages/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-derive" -version = "0.16.1" +version = "0.16.2" authors = ["Simon Warta "] edition = "2018" 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/Cargo.toml b/packages/schema/Cargo.toml index a34f3aa1c..a3e4def64 100644 --- a/packages/schema/Cargo.toml +++ b/packages/schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-schema" -version = "0.16.1" +version = "0.16.2" authors = ["Simon Warta ", "Ethan Frey "] edition = "2018" description = "A dev-dependency for CosmWasm contracts to generate JSON Schema files." diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 6971f7725..d1de71101 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-std" -version = "0.16.1" +version = "0.16.2" authors = ["Ethan Frey "] edition = "2018" description = "Standard library for Wasm based smart contracts on Cosmos blockchains" @@ -32,7 +32,7 @@ stargate = [] [dependencies] base64 = "0.13.0" -cosmwasm-derive = { path = "../derive", version = "0.16.1" } +cosmwasm-derive = { path = "../derive", version = "0.16.2" } uint = "0.9.0" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" @@ -40,7 +40,7 @@ serde = { version = "1.0.103", default-features = false, features = ["derive", " thiserror = "1.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -cosmwasm-crypto = { path = "../crypto", version = "0.16.1" } +cosmwasm-crypto = { path = "../crypto", version = "0.16.2" } [dev-dependencies] cosmwasm-schema = { path = "../schema" } diff --git a/packages/storage/Cargo.toml b/packages/storage/Cargo.toml index f02c824cb..24cd9ce7e 100644 --- a/packages/storage/Cargo.toml +++ b/packages/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-storage" -version = "0.16.1" +version = "0.16.2" authors = ["Ethan Frey "] edition = "2018" 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 = "0.16.1", default-features = false } +cosmwasm-std = { path = "../std", version = "0.16.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 f79ff8e9f..cd6c16093 100644 --- a/packages/vm/Cargo.toml +++ b/packages/vm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmwasm-vm" -version = "0.16.1" +version = "0.16.2" authors = ["Ethan Frey "] edition = "2018" description = "VM bindings to run cosmwams contracts" @@ -36,8 +36,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 = "0.16.1", default-features = false } -cosmwasm-crypto = { path = "../crypto", version = "0.16.1" } +cosmwasm-std = { path = "../std", version = "0.16.2", default-features = false } +cosmwasm-crypto = { path = "../crypto", version = "0.16.2" } hex = "0.4" parity-wasm = "0.42" schemars = "0.8.1" From 93ea53e56b152f552df73db7104dfeef3f1fe904 Mon Sep 17 00:00:00 2001 From: Tomasz Kurcz Date: Tue, 7 Sep 2021 13:02:11 +0200 Subject: [PATCH 394/402] CHANGELOG - new release --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 493400f8f..8c2a75507 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to ## [Unreleased] +## [0.16.2] - 2021-09-07 + ### Added - cosmwasm-std: Implement `Mul` and `MulAssign` for `Uint128`. From edcc9396848b1b7fba6835b08d96a1b0a801ac8a Mon Sep 17 00:00:00 2001 From: loloicci Date: Tue, 14 Dec 2021 22:19:27 +0900 Subject: [PATCH 395/402] fix: update voting-with-uuid --- contracts/voting-with-uuid/Cargo.toml | 4 +- contracts/voting-with-uuid/src/contract.rs | 75 ++++++++-------------- contracts/voting-with-uuid/src/tests.rs | 14 ++-- 3 files changed, 34 insertions(+), 59 deletions(-) diff --git a/contracts/voting-with-uuid/Cargo.toml b/contracts/voting-with-uuid/Cargo.toml index b8740ec8a..8098339cc 100644 --- a/contracts/voting-with-uuid/Cargo.toml +++ b/contracts/voting-with-uuid/Cargo.toml @@ -32,7 +32,7 @@ backtraces = ["cosmwasm-std/backtraces", "cosmwasm-vm/backtraces"] [dependencies] -cosmwasm-std = { path = "../../packages/std" } +cosmwasm-std = { path = "../../packages/std", features = ["iterator"] } cosmwasm-storage = { path = "../../packages/storage"} schemars = "0.8.1" serde = { version = "1.0.125", default-features = false, features = ["derive"] } @@ -41,4 +41,4 @@ thiserror = { version = "1.0.23" } [dev-dependencies] cosmwasm-schema = { path = "../../packages/schema" } -cosmwasm-vm = { path = "../../packages/vm", default-features = false } +cosmwasm-vm = { path = "../../packages/vm", default-features = false, features = ["iterator"] } diff --git a/contracts/voting-with-uuid/src/contract.rs b/contracts/voting-with-uuid/src/contract.rs index d7a0c0661..1f14485a3 100644 --- a/contracts/voting-with-uuid/src/contract.rs +++ b/contracts/voting-with-uuid/src/contract.rs @@ -208,19 +208,14 @@ pub fn create_poll( }; poll(deps.storage).save(poll_id.as_slice(), &new_poll)?; - let r = Response { - submessages: vec![], - messages: vec![], - attributes: vec![ - attr("action", "create_poll"), - attr("creator", new_poll.creator), - attr("poll_id", poll_id.to_string()), - attr("quorum_percentage", quorum_percentage.unwrap_or(0)), - attr("end_height", new_poll.end_height), - attr("start_height", start_height.unwrap_or(0)), - ], - data: Some(to_binary(&CreatePollResponse { poll_id })?), - }; + let r = Response::new() + .add_attribute("action", "create_poll") + .add_attribute("creator", new_poll.creator) + .add_attribute("poll_id", poll_id.to_string()) + .add_attribute("quorum_percentage", quorum_percentage.unwrap_or(0).to_string()) + .add_attribute("end_height", new_poll.end_height.to_string().to_string()) + .add_attribute("start_height", start_height.unwrap_or(0).to_string()) + .set_data(to_binary(&CreatePollResponse { poll_id })?); Ok(r) } @@ -316,16 +311,10 @@ pub fn end_poll( attr("action", "end_poll"), attr("poll_id", poll_id.to_string()), attr("rejected_reason", rejected_reason), - attr("passed", &passed), + attr("passed", &passed.to_string()), ]; - let r = Response { - submessages: vec![], - messages: vec![], - attributes, - data: None, - }; - Ok(r) + Ok(Response::new().add_attributes(attributes)) } // unlock voter's tokens in a given poll @@ -401,41 +390,30 @@ pub fn cast_vote( let attributes = vec![ attr("action", "vote_casted"), attr("poll_id", poll_id.to_string()), - attr("weight", &weight), + attr("weight", &weight.to_string()), attr("voter", &info.sender), ]; - let r = Response { - submessages: vec![], - messages: vec![], - attributes, - data: None, - }; - Ok(r) + Ok(Response::new().add_attributes(attributes)) } fn send_tokens(to_address: &Addr, amount: Vec, action: &str) -> Response { let attributes = vec![attr("action", action), attr("to", to_address.clone())]; - Response { - submessages: vec![], - messages: vec![CosmosMsg::Bank(BankMsg::Send { - to_address: to_address.to_string(), - amount, - })], - attributes, - data: None, - } + Response::new() + .add_message( + CosmosMsg::Bank(BankMsg::Send { + to_address: to_address.to_string(), + amount, + })) + .add_attributes(attributes) } pub fn make_uuid(deps: DepsMut, env: Env, _info: MessageInfo) -> Result { let uuid = new_uuid(&env, deps.storage, deps.api)?; - let r = Response { - submessages: vec![], - messages: vec![], - attributes: vec![attr("action", "make_uuid"), attr("uuid", uuid.to_string())], - data: None, - }; + let r = Response::new() + .add_attribute("action", "make_uuid") + .add_attribute("uuid", uuid.to_string()); Ok(r) } @@ -446,12 +424,9 @@ pub fn make_seq_id( ) -> Result { let seq_id: u64 = 0; - let r = Response { - submessages: vec![], - messages: vec![], - attributes: vec![attr("action", "make_seq_id"), attr("uuid", seq_id)], - data: None, - }; + let r = Response::new() + .add_attribute("action", "make_seq_id") + .add_attribute("uuid", seq_id.to_string()); Ok(r) } diff --git a/contracts/voting-with-uuid/src/tests.rs b/contracts/voting-with-uuid/src/tests.rs index 534b1fbc7..3de389e9a 100644 --- a/contracts/voting-with-uuid/src/tests.rs +++ b/contracts/voting-with-uuid/src/tests.rs @@ -692,8 +692,8 @@ mod tests { let msg = execute_res.messages.get(0).expect("no message"); assert_eq!( - msg, - &CosmosMsg::Bank(BankMsg::Send { + msg.msg, + CosmosMsg::Bank(BankMsg::Send { to_address: TEST_VOTER.to_string(), amount: coins(11, VOTING_TOKEN), }) @@ -750,7 +750,7 @@ mod tests { match res { Ok(_) => panic!("Must return error"), Err(ContractError::ExcessiveWithdraw { max_amount }) => { - assert_eq!(max_amount, Uint128(10)) + assert_eq!(max_amount, Uint128::from(10u32)) } Err(e) => panic!("Unexpected error: {:?}", e), } @@ -904,9 +904,9 @@ mod tests { attr("action", "create_poll"), attr("creator", creator), attr("poll_id", poll_id.to_string()), - attr("quorum_percentage", quorum), - attr("end_height", end_height), - attr("start_height", start_height), + attr("quorum_percentage", quorum.to_string()), + attr("end_height", end_height.to_string()), + attr("start_height", start_height.to_string()), ] ); @@ -942,7 +942,7 @@ mod tests { vec![ attr("action", "vote_casted"), attr("poll_id", poll_id.to_string()), - attr("weight", weight), + attr("weight", weight.to_string()), attr("voter", voter), ] ); From 338cf5cddcd8b3566aa597743c3e044b652a4e24 Mon Sep 17 00:00:00 2001 From: loloicci Date: Mon, 20 Dec 2021 15:09:13 +0900 Subject: [PATCH 396/402] fix: update rust version for git workflow --- .github/workflows/benchmarking.yml | 4 +- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 7 ++-- .github/workflows/tests.yml | 60 +++++++++++++++--------------- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/.github/workflows/benchmarking.yml b/.github/workflows/benchmarking.yml index 19a517c4f..7231dfce4 100644 --- a/.github/workflows/benchmarking.yml +++ b/.github/workflows/benchmarking.yml @@ -28,7 +28,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.50.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -36,7 +36,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-benchmarking-rust:1.50.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-benchmarking-rust:1.57.0-{{ checksum "Cargo.lock" }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Run vm benchmarks (Singlepass) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43cf6ca90..17b3e664b 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.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 454d36b5a..251560a2d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: types: [closed] env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: release: runs-on: ubuntu-latest @@ -20,10 +20,10 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal - override: true + override: true - name: Get version id: get_version run: | @@ -37,7 +37,6 @@ jobs: with: version: ${{ steps.get_version.outputs.version }} git_tag_prefix: v - - name: Create new tag run: | if [ -z "${{ steps.get_version.outputs.version }}" ]; then diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 79cfd6c58..5080fdc80 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,7 +19,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -27,7 +27,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-package_crypto-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-package_crypto-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Build @@ -48,7 +48,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -56,7 +56,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-package_schema-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-package_schema-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Build @@ -77,7 +77,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -85,7 +85,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-package_std-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-package_std-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -130,7 +130,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -138,7 +138,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-package_storage-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-package_storage-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Build library for native target @@ -162,7 +162,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -170,7 +170,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-package_vm-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-package_vm-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Build @@ -197,7 +197,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -205,7 +205,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-contract_burner-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-contract_burner-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -243,7 +243,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -251,7 +251,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-contract_crypto_verify-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-contract_crypto_verify-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -289,7 +289,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -297,7 +297,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-hackatom_verify-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-hackatom_verify-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -335,7 +335,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -343,7 +343,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-contract_ibc_reflect-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-contract_ibc_reflect-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -381,7 +381,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -389,7 +389,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-contract_ibc_reflect_send-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-contract_ibc_reflect_send-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -427,7 +427,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -435,7 +435,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-contract_queue-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-contract_queue-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -473,7 +473,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -481,7 +481,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-contract_reflect-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-contract_reflect-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -519,7 +519,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -527,7 +527,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-contract_staking-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-contract_staking-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add wasm32 target @@ -565,7 +565,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -573,7 +573,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-fmt-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-fmt-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add rustfmt component @@ -611,7 +611,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.57.0 target: wasm32-unknown-unknown profile: minimal override: true @@ -619,7 +619,7 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo - key: cargocache-v2-clippy-rust:1.51.0-${{ hashFiles('Cargo.lock') }} + key: cargocache-v2-clippy-rust:1.57.0-${{ hashFiles('Cargo.lock') }} - name: Version information run: rustc --version; cargo --version; rustup --version; rustup target list --installed - name: Add clippy component From 592b8cc3c554e1a52ca785b26f91fbf0faed9213 Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 22 Dec 2021 11:38:06 +0900 Subject: [PATCH 397/402] chore: update reflect contract schema --- contracts/reflect/schema/execute_msg.json | 2 +- contracts/reflect/schema/response_for__custom_msg.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/reflect/schema/execute_msg.json b/contracts/reflect/schema/execute_msg.json index c7c15eda5..f3312f64f 100644 --- a/contracts/reflect/schema/execute_msg.json +++ b/contracts/reflect/schema/execute_msg.json @@ -338,7 +338,7 @@ ] }, "GovMsg": { - "anyOf": [ + "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", diff --git a/contracts/reflect/schema/response_for__custom_msg.json b/contracts/reflect/schema/response_for__custom_msg.json index 827a0c2fe..89586a709 100644 --- a/contracts/reflect/schema/response_for__custom_msg.json +++ b/contracts/reflect/schema/response_for__custom_msg.json @@ -348,7 +348,7 @@ } }, "GovMsg": { - "anyOf": [ + "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", From f97b8d0431806f3d9a45558cc423c2efc5dc26d4 Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 22 Dec 2021 11:38:18 +0900 Subject: [PATCH 398/402] chore: formating --- packages/crypto/src/sha1.rs | 2 +- packages/std/src/lib.rs | 4 ++-- packages/vm/src/imports.rs | 4 +--- packages/vm/src/instance.rs | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/crypto/src/sha1.rs b/packages/crypto/src/sha1.rs index df5c339c6..6dc6f2d69 100644 --- a/packages/crypto/src/sha1.rs +++ b/packages/crypto/src/sha1.rs @@ -1,6 +1,6 @@ use sha1::{Digest, Sha1}; -use crate::errors::{CryptoResult}; +use crate::errors::CryptoResult; pub fn sha1_calculate(hash_inputs: &[&[u8]]) -> CryptoResult<[u8; 20]> { let mut hasher = Sha1::new(); diff --git a/packages/std/src/lib.rs b/packages/std/src/lib.rs index 7c3b0caa6..15e14ea82 100644 --- a/packages/std/src/lib.rs +++ b/packages/std/src/lib.rs @@ -30,8 +30,8 @@ pub use crate::binary::Binary; pub use crate::coins::{coin, coins, has_coins, Coin}; pub use crate::deps::{Deps, DepsMut, OwnedDeps}; pub use crate::errors::{ - DivideByZeroError, ConversionOverflowError, OverflowError, OverflowOperation, RecoverPubkeyError, StdError, - StdResult, SystemError, VerificationError, + ConversionOverflowError, DivideByZeroError, OverflowError, OverflowOperation, + RecoverPubkeyError, StdError, StdResult, SystemError, VerificationError, }; #[cfg(feature = "stargate")] pub use crate::ibc::{ diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 88b06288b..7f2cd5854 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -8,8 +8,7 @@ use cosmwasm_crypto::{ sha1_calculate, CryptoError, }; use cosmwasm_crypto::{ - ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, - MESSAGE_HASH_MAX_LEN, + ECDSA_PUBKEY_MAX_LEN, ECDSA_SIGNATURE_LEN, EDDSA_PUBKEY_LEN, MESSAGE_HASH_MAX_LEN, }; #[cfg(feature = "iterator")] @@ -64,7 +63,6 @@ pub const MAX_COUNT_SHA1_INPUT: usize = 4; /// If you modify this value, you need to adjust the gas factor. pub const MAX_LENGTH_SHA1_MESSAGE: usize = 80; - /// Max length for a debug message const MAX_LENGTH_DEBUG: usize = 2 * MI; diff --git a/packages/vm/src/instance.rs b/packages/vm/src/instance.rs index c5dd38a1c..1a676b612 100644 --- a/packages/vm/src/instance.rs +++ b/packages/vm/src/instance.rs @@ -10,8 +10,8 @@ use crate::errors::{CommunicationError, VmError, VmResult}; use crate::features::required_features_from_module; use crate::imports::{ 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_sha1_calculate, - do_secp256k1_recover_pubkey, do_secp256k1_verify, + do_db_write, do_debug, do_ed25519_batch_verify, do_ed25519_verify, do_query_chain, + do_secp256k1_recover_pubkey, do_secp256k1_verify, do_sha1_calculate, }; #[cfg(feature = "iterator")] use crate::imports::{do_db_next, do_db_scan}; From c503ec7f998d00e51d65c1854ea9e81a4597f6b7 Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 22 Dec 2021 12:07:04 +0900 Subject: [PATCH 399/402] chore: cargo clippy --- packages/crypto/src/identity_digest.rs | 10 +-------- packages/std/src/math/decimal.rs | 1 + packages/std/src/math/decimal256.rs | 1 + packages/std/src/math/uint128.rs | 9 ++++++++ packages/std/src/math/uint256.rs | 5 +++++ packages/std/src/math/uint512.rs | 3 +++ packages/std/src/math/uint64.rs | 9 ++++++++ packages/std/src/mock.rs | 1 + packages/std/src/results/events.rs | 3 +++ packages/std/src/results/response.rs | 9 ++++++++ packages/std/src/results/submessages.rs | 1 + packages/std/src/timestamp.rs | 6 +++++ packages/vm/src/imports.rs | 30 ++++++++++++------------- packages/vm/src/testing/contract.rs | 16 ++++++------- packages/vm/src/testing/mock.rs | 4 ++-- packages/vm/src/testing/querier.rs | 1 + 16 files changed, 75 insertions(+), 34 deletions(-) diff --git a/packages/crypto/src/identity_digest.rs b/packages/crypto/src/identity_digest.rs index 5371360a4..5503c45ef 100644 --- a/packages/crypto/src/identity_digest.rs +++ b/packages/crypto/src/identity_digest.rs @@ -8,19 +8,11 @@ use digest::generic_array::GenericArray; use digest::{FixedOutputDirty, Output, Reset, Update}; /// The 256-bits identity container -#[derive(Clone)] +#[derive(Clone, Default)] pub struct Identity256 { array: GenericArray, } -impl Default for Identity256 { - fn default() -> Self { - Identity256 { - array: GenericArray::default(), - } - } -} - impl Update for Identity256 { fn update(&mut self, hash: impl AsRef<[u8]>) { assert_eq!(hash.as_ref().len(), 32); diff --git a/packages/std/src/math/decimal.rs b/packages/std/src/math/decimal.rs index 822f04bcd..d95a54679 100644 --- a/packages/std/src/math/decimal.rs +++ b/packages/std/src/math/decimal.rs @@ -65,6 +65,7 @@ impl Decimal { /// Returns the approximate square root as a Decimal. /// /// This should not overflow or panic. + #[must_use] pub fn sqrt(&self) -> Self { // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until diff --git a/packages/std/src/math/decimal256.rs b/packages/std/src/math/decimal256.rs index cf3cfa2d4..9e9b662f8 100644 --- a/packages/std/src/math/decimal256.rs +++ b/packages/std/src/math/decimal256.rs @@ -74,6 +74,7 @@ impl Decimal256 { /// Returns the approximate square root as a Decimal256. /// /// This should not overflow or panic. + #[must_use] pub fn sqrt(&self) -> Self { // Algorithm described in https://hackmd.io/@webmaster128/SJThlukj_ // We start with the highest precision possible and lower it until diff --git a/packages/std/src/math/uint128.rs b/packages/std/src/math/uint128.rs index a475107c4..ae1eaea1a 100644 --- a/packages/std/src/math/uint128.rs +++ b/packages/std/src/math/uint128.rs @@ -97,34 +97,42 @@ impl Uint128 { .ok_or_else(|| DivideByZeroError::new(self)) } + #[must_use] pub fn wrapping_add(self, other: Self) -> Self { Self(self.0.wrapping_add(other.0)) } + #[must_use] pub fn wrapping_sub(self, other: Self) -> Self { Self(self.0.wrapping_sub(other.0)) } + #[must_use] pub fn wrapping_mul(self, other: Self) -> Self { Self(self.0.wrapping_mul(other.0)) } + #[must_use] pub fn wrapping_pow(self, other: u32) -> Self { Self(self.0.wrapping_pow(other)) } + #[must_use] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } + #[must_use] pub fn saturating_pow(self, other: u32) -> Self { Self(self.0.saturating_pow(other)) } @@ -380,6 +388,7 @@ impl<'a> ops::ShrAssign<&'a u32> for Uint128 { impl Uint128 { /// Returns `self * numerator / denominator` + #[must_use] pub fn multiply_ratio, B: Into>( &self, numerator: A, diff --git a/packages/std/src/math/uint256.rs b/packages/std/src/math/uint256.rs index 6e0cd7996..3888f2dbe 100644 --- a/packages/std/src/math/uint256.rs +++ b/packages/std/src/math/uint256.rs @@ -159,6 +159,7 @@ impl Uint256 { .ok_or_else(|| OverflowError::new(OverflowOperation::Pow, self, exp)) } + #[must_use] pub fn pow(self, exp: u32) -> Self { self.checked_pow(exp) .expect("attempt to raise to a power with overflow") @@ -180,14 +181,17 @@ impl Uint256 { Ok(Self(self.0.shl(other))) } + #[must_use] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } @@ -468,6 +472,7 @@ impl<'a> ops::ShrAssign<&'a u32> for Uint256 { impl Uint256 { /// Returns `self * numerator / denominator` + #[must_use] pub fn multiply_ratio, B: Into>( &self, numerator: A, diff --git a/packages/std/src/math/uint512.rs b/packages/std/src/math/uint512.rs index 00ef9d416..33a10ff57 100644 --- a/packages/std/src/math/uint512.rs +++ b/packages/std/src/math/uint512.rs @@ -134,14 +134,17 @@ impl Uint512 { Ok(Self(self.0.shr(other))) } + #[must_use] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } diff --git a/packages/std/src/math/uint64.rs b/packages/std/src/math/uint64.rs index c3274e481..bccd60925 100644 --- a/packages/std/src/math/uint64.rs +++ b/packages/std/src/math/uint64.rs @@ -93,34 +93,42 @@ impl Uint64 { .ok_or_else(|| DivideByZeroError::new(self)) } + #[must_use] pub fn wrapping_add(self, other: Self) -> Self { Self(self.0.wrapping_add(other.0)) } + #[must_use] pub fn wrapping_sub(self, other: Self) -> Self { Self(self.0.wrapping_sub(other.0)) } + #[must_use] pub fn wrapping_mul(self, other: Self) -> Self { Self(self.0.wrapping_mul(other.0)) } + #[must_use] pub fn wrapping_pow(self, other: u32) -> Self { Self(self.0.wrapping_pow(other)) } + #[must_use] pub fn saturating_add(self, other: Self) -> Self { Self(self.0.saturating_add(other.0)) } + #[must_use] pub fn saturating_sub(self, other: Self) -> Self { Self(self.0.saturating_sub(other.0)) } + #[must_use] pub fn saturating_mul(self, other: Self) -> Self { Self(self.0.saturating_mul(other.0)) } + #[must_use] pub fn saturating_pow(self, other: u32) -> Self { Self(self.0.saturating_pow(other)) } @@ -270,6 +278,7 @@ impl<'a> ops::ShrAssign<&'a u32> for Uint64 { impl Uint64 { /// Returns `self * numerator / denominator` + #[must_use] pub fn multiply_ratio, B: Into>( &self, numerator: A, diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 9b3225665..0190e7ee5 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -435,6 +435,7 @@ impl MockQuerier { self.staking = StakingQuerier::new(denom, validators, delegations); } + #[must_use] pub fn with_custom_handler(mut self, handler: CH) -> Self where CH: Fn(&C) -> MockQuerierCustomHandlerResult, diff --git a/packages/std/src/results/events.rs b/packages/std/src/results/events.rs index 96f027644..b94004780 100644 --- a/packages/std/src/results/events.rs +++ b/packages/std/src/results/events.rs @@ -25,6 +25,7 @@ pub struct Event { impl Event { /// Create a new event with the given type and an empty list of attributes. + #[must_use] pub fn new(ty: impl Into) -> Self { Event { ty: ty.into(), @@ -33,6 +34,7 @@ impl Event { } /// Add an attribute to the event. + #[must_use] pub fn add_attribute(mut self, key: impl Into, value: impl Into) -> Self { self.attributes.push(Attribute { key: key.into(), @@ -45,6 +47,7 @@ impl Event { /// /// Anything that can be turned into an iterator and yields something /// that can be converted into an `Attribute` is accepted. + #[must_use] pub fn add_attributes>( mut self, attrs: impl IntoIterator, diff --git a/packages/std/src/results/response.rs b/packages/std/src/results/response.rs index 5f37d3635..b6f7453a7 100644 --- a/packages/std/src/results/response.rs +++ b/packages/std/src/results/response.rs @@ -112,6 +112,7 @@ where } /// Add an attribute included in the main `wasm` event. + #[must_use] pub fn add_attribute(mut self, key: impl Into, value: impl Into) -> Self { self.attributes.push(Attribute::new(key, value)); self @@ -119,6 +120,7 @@ where /// This creates a "fire and forget" message, by using `SubMsg::new()` to wrap it, /// and adds it to the list of messages to process. + #[must_use] pub fn add_message(mut self, msg: impl Into>) -> Self { self.messages.push(SubMsg::new(msg)); self @@ -126,6 +128,7 @@ where /// This takes an explicit SubMsg (creates via eg. `reply_on_error`) /// and adds it to the list of messages to process. + #[must_use] pub fn add_submessage(mut self, msg: SubMsg) -> Self { self.messages.push(msg); self @@ -136,6 +139,7 @@ where /// /// The `wasm-` prefix will be appended by the runtime to the provided type /// of event. + #[must_use] pub fn add_event(mut self, event: Event) -> Self { self.events.push(event); self @@ -159,6 +163,7 @@ where /// let res: Response = Response::new().add_attributes(attrs.clone()); /// assert_eq!(res.attributes, attrs); /// ``` + #[must_use] pub fn add_attributes>( mut self, attrs: impl IntoIterator, @@ -178,6 +183,7 @@ where /// Response::new().add_messages(msgs) /// } /// ``` + #[must_use] pub fn add_messages>>(self, msgs: impl IntoIterator) -> Self { self.add_submessages(msgs.into_iter().map(SubMsg::new)) } @@ -193,6 +199,7 @@ where /// Response::new().add_submessages(msgs) /// } /// ``` + #[must_use] pub fn add_submessages(mut self, msgs: impl IntoIterator>) -> Self { self.messages.extend(msgs.into_iter()); self @@ -203,12 +210,14 @@ where /// /// The `wasm-` prefix will be appended by the runtime to the provided types /// of events. + #[must_use] pub fn add_events(mut self, events: impl IntoIterator) -> Self { self.events.extend(events.into_iter()); self } /// Set the binary data included in the response. + #[must_use] pub fn set_data(mut self, data: impl Into) -> Self { self.data = Some(data.into()); self diff --git a/packages/std/src/results/submessages.rs b/packages/std/src/results/submessages.rs index e1ad9dcf4..8ee25d452 100644 --- a/packages/std/src/results/submessages.rs +++ b/packages/std/src/results/submessages.rs @@ -85,6 +85,7 @@ where /// assert_eq!(sub_msg.gas_limit, Some(60_000)); /// assert_eq!(sub_msg.reply_on, ReplyOn::Always); /// ``` + #[must_use] pub fn with_gas_limit(mut self, limit: u64) -> Self { self.gas_limit = Some(limit); self diff --git a/packages/std/src/timestamp.rs b/packages/std/src/timestamp.rs index fa96fb477..12d504aea 100644 --- a/packages/std/src/timestamp.rs +++ b/packages/std/src/timestamp.rs @@ -29,28 +29,34 @@ pub struct Timestamp(Uint64); impl Timestamp { /// Creates a timestamp from nanoseconds since epoch + #[must_use] pub const fn from_nanos(nanos_since_epoch: u64) -> Self { Timestamp(Uint64::new(nanos_since_epoch)) } /// Creates a timestamp from seconds since epoch + #[must_use] pub const fn from_seconds(seconds_since_epoch: u64) -> Self { Timestamp(Uint64::new(seconds_since_epoch * 1_000_000_000)) } + #[must_use] pub const fn plus_seconds(&self, addition: u64) -> Timestamp { self.plus_nanos(addition * 1_000_000_000) } + #[must_use] pub const fn plus_nanos(&self, addition: u64) -> Timestamp { let nanos = Uint64::new(self.0.u64() + addition); Timestamp(nanos) } + #[must_use] pub const fn minus_seconds(&self, subtrahend: u64) -> Timestamp { self.minus_nanos(subtrahend * 1_000_000_000) } + #[must_use] pub const fn minus_nanos(&self, subtrahend: u64) -> Timestamp { let nanos = Uint64::new(self.0.u64() - subtrahend); Timestamp(nanos) diff --git a/packages/vm/src/imports.rs b/packages/vm/src/imports.rs index 7f2cd5854..4e30e115d 100644 --- a/packages/vm/src/imports.rs +++ b/packages/vm/src/imports.rs @@ -540,21 +540,21 @@ mod tests { // 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 }), - "sha1_calculate" => Function::new_native(&store, |_a: u32| -> u64 { 0 }), - "debug" => Function::new_native(&store, |_a: u32| {}), + "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 }), + "sha1_calculate" => Function::new_native(store, |_a: u32| -> u64 { 0 }), + "debug" => Function::new_native(store, |_a: u32| {}), }, }; let instance = Box::from(WasmerInstance::new(&module, &import_obj).unwrap()); diff --git a/packages/vm/src/testing/contract.rs b/packages/vm/src/testing/contract.rs index f0c6bbad1..80eeb0dd8 100644 --- a/packages/vm/src/testing/contract.rs +++ b/packages/vm/src/testing/contract.rs @@ -125,7 +125,7 @@ mod test { // init let mut instance = contract.generate_instance().unwrap(); let msg = "{}".as_bytes(); - let _: Response = call_instantiate(&mut instance, &env, &info, &msg) + let _: Response = call_instantiate(&mut instance, &env, &info, msg) .unwrap() .into_result() .unwrap(); @@ -134,7 +134,7 @@ mod test { // query and confirm the queue is empty let mut instance = contract.generate_instance().unwrap(); let msg = "{\"count\": {}}".as_bytes(); - let res: QueryResponse = call_query(&mut instance, &env, &msg) + let res: QueryResponse = call_query(&mut instance, &env, msg) .unwrap() .into_result() .unwrap(); @@ -144,7 +144,7 @@ mod test { // handle and enqueue 42 let mut instance = contract.generate_instance().unwrap(); let msg = "{\"enqueue\": {\"value\": 42}}".as_bytes(); - let _: Response = call_execute(&mut instance, &env, &info, &msg) + let _: Response = call_execute(&mut instance, &env, &info, msg) .unwrap() .into_result() .unwrap(); @@ -153,7 +153,7 @@ mod test { // query and confirm the length of the queue is 1 let mut instance = contract.generate_instance().unwrap(); let msg = "{\"count\": {}}".as_bytes(); - let res: QueryResponse = call_query(&mut instance, &env, &msg) + let res: QueryResponse = call_query(&mut instance, &env, msg) .unwrap() .into_result() .unwrap(); @@ -163,7 +163,7 @@ mod test { // query and confirm the sum of the queue is 42 let mut instance = contract.generate_instance().unwrap(); let msg = "{\"sum\": {}}".as_bytes(); - let res: QueryResponse = call_query(&mut instance, &env, &msg) + let res: QueryResponse = call_query(&mut instance, &env, msg) .unwrap() .into_result() .unwrap(); @@ -174,7 +174,7 @@ mod test { contract.change_wasm(CONTRACT_WITH_MIGRATE).unwrap(); let mut instance = contract.generate_instance().unwrap(); let msg = "{}".as_bytes(); - let _: Response = call_migrate(&mut instance, &env, &msg) + let _: Response = call_migrate(&mut instance, &env, msg) .unwrap() .into_result() .unwrap(); @@ -183,7 +183,7 @@ mod test { // query and check the length of the queue is 3 let mut instance = contract.generate_instance().unwrap(); let msg = "{\"count\": {}}".as_bytes(); - let res: QueryResponse = call_query(&mut instance, &env, &msg) + let res: QueryResponse = call_query(&mut instance, &env, msg) .unwrap() .into_result() .unwrap(); @@ -193,7 +193,7 @@ mod test { // query and check the sum of the queue is 303 let mut instance = contract.generate_instance().unwrap(); let msg = "{\"sum\": {}}".as_bytes(); - let res: QueryResponse = call_query(&mut instance, &env, &msg) + let res: QueryResponse = call_query(&mut instance, &env, msg) .unwrap() .into_result() .unwrap(); diff --git a/packages/vm/src/testing/mock.rs b/packages/vm/src/testing/mock.rs index a59a93761..2371d0dee 100644 --- a/packages/vm/src/testing/mock.rs +++ b/packages/vm/src/testing/mock.rs @@ -267,7 +267,7 @@ mod test { let api = MockApi::default(); let original = "alice"; - let (canonical_res, gas_cost) = api.canonical_address(&original); + let (canonical_res, gas_cost) = api.canonical_address(original); assert_eq!(gas_cost.cost, DEFAULT_GAS_COST_CANONICALIZE); assert_eq!(gas_cost.externally_used, 0); let canonical = canonical_res.unwrap(); @@ -285,7 +285,7 @@ mod test { let api = MockApi::new_with_gas_cost(canonicalize_cost, humanize_cost); let original = "bob"; - let (canonical_res, gas_cost) = api.canonical_address(&original); + let (canonical_res, gas_cost) = api.canonical_address(original); assert_eq!(gas_cost.cost, canonicalize_cost); assert_eq!(gas_cost.externally_used, 0); let canonical = canonical_res.unwrap(); diff --git a/packages/vm/src/testing/querier.rs b/packages/vm/src/testing/querier.rs index 4e9b8bbcd..b852798f3 100644 --- a/packages/vm/src/testing/querier.rs +++ b/packages/vm/src/testing/querier.rs @@ -46,6 +46,7 @@ impl MockQuerier { self.querier.update_staking(denom, validators, delegations); } + #[must_use] pub fn with_custom_handler(mut self, handler: CH) -> Self where CH: Fn(&C) -> MockQuerierCustomHandlerResult, From 45de8b70f6107e64edbf868044c41a762eb62b97 Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 2 Feb 2022 03:23:57 +0900 Subject: [PATCH 400/402] fix: fix crypt bench --- packages/crypto/benches/main.rs | 16 +++++++++------- packages/vm/src/environment.rs | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index e8f7ecf6f..c9a704cdf 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -13,7 +13,7 @@ use sha2::Sha256; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, - sha1_calculate, INPUT_MAX_LEN, + sha1_calculate, }; use std::cmp::min; @@ -74,6 +74,8 @@ fn read_decode_cosmos_sigs() -> (Vec>, Vec>, Vec>) { } fn bench_crypto(c: &mut Criterion) { + // same as vm::imports::MAX_LENGTH_SHA1_MESSAGE (=80) + const MAX_LENGTH_SHA1_MESSAGE: usize = 80; let mut group = c.benchmark_group("Crypto"); group.bench_function("secp256k1_verify", |b| { @@ -108,14 +110,14 @@ fn bench_crypto(c: &mut Criterion) { }); group.bench_function("sha1_calculate_one", |b| { - let inputs: Vec<&[u8]> = vec![&[0; INPUT_MAX_LEN]]; + let inputs: Vec<&[u8]> = vec![&[0; MAX_LENGTH_SHA1_MESSAGE]]; b.iter(|| { let hash = sha1_calculate(&inputs).unwrap(); assert_eq!(hash.len(), 20); }); }); group.bench_function("sha1_calculate_two", |b| { - let inputs: Vec<&[u8]> = vec![&[0; INPUT_MAX_LEN], &[1; INPUT_MAX_LEN]]; + let inputs: Vec<&[u8]> = vec![&[0; MAX_LENGTH_SHA1_MESSAGE], &[1; MAX_LENGTH_SHA1_MESSAGE]]; b.iter(|| { let hash = sha1_calculate(&inputs).unwrap(); assert_eq!(hash.len(), 20); @@ -123,10 +125,10 @@ fn bench_crypto(c: &mut Criterion) { }); group.bench_function("sha1_calculate_four", |b| { let inputs: Vec<&[u8]> = vec![ - &[0; INPUT_MAX_LEN], - &[1; INPUT_MAX_LEN], - &[2; INPUT_MAX_LEN], - &[3; INPUT_MAX_LEN], + &[0; MAX_LENGTH_SHA1_MESSAGE], + &[1; MAX_LENGTH_SHA1_MESSAGE], + &[2; MAX_LENGTH_SHA1_MESSAGE], + &[3; MAX_LENGTH_SHA1_MESSAGE], ]; b.iter(|| { let hash = sha1_calculate(&inputs).unwrap(); diff --git a/packages/vm/src/environment.rs b/packages/vm/src/environment.rs index a4bb384af..afcdbd463 100644 --- a/packages/vm/src/environment.rs +++ b/packages/vm/src/environment.rs @@ -56,7 +56,7 @@ impl GasConfig { ); // 0.41 / 4. ~ 0.1 // sha1 cost factor - const SHA1_CALCULATE_FACTOR: (u64, u64) = (270, 15400); // 270 ns in crypto benchmarks when INPUT_MAX_LEN=80 + const SHA1_CALCULATE_FACTOR: (u64, u64) = (270, 15400); // 270 ns in crypto benchmarks when imports::MAX_LENGTH_SHA1_MESSAGE=80 fn calc_crypto_cost(factor: (u64, u64)) -> u64 { (GasConfig::BASE_CRYPTO_COST * factor.0) / factor.1 From 032a7aaa86fca23fd93e17273afa3f84c6f7d88c Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 2 Feb 2022 03:28:02 +0900 Subject: [PATCH 401/402] fix: update github workflow's rust optimizer --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 251560a2d..615b87e7a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,12 +56,12 @@ jobs: - name: Build development contracts run: | echo "Building all contracts under ./contracts" - docker run --volumes-from with_code cosmwasm/rust-optimizer:0.11.0 ./contracts/*/ + docker run --volumes-from with_code cosmwasm/rust-optimizer:0.12.1 ./contracts/*/ - name: Check development contracts working-directory: ./ run: | echo "Checking all contracts under ./artifacts" - docker run --volumes-from with_code rust:1.51.0 /bin/bash -e -c 'cd ./code/packages/vm; ./examples/check_contract.sh ../../artifacts/*.wasm' + docker run --volumes-from with_code rust:1.54.0 /bin/bash -e -c 'cd ./code/packages/vm; ./examples/check_contract.sh ../../artifacts/*.wasm' docker cp with_code:/code/artifacts . - name: Create Release From 811d14d8f36dc807c0f8cdf6c36d6ca1d09377b4 Mon Sep 17 00:00:00 2001 From: loloicci Date: Thu, 3 Feb 2022 17:52:21 +0900 Subject: [PATCH 402/402] feat: pin dependent uint version 0.9.1 uint version 0.9.2 or lator uses the feature of edition2021. This cannot be used from wasmvm now. --- packages/std/Cargo.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index a98b8b987..33941e17e 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -33,7 +33,10 @@ stargate = [] [dependencies] base64 = "0.13.0" cosmwasm-derive = { path = "../derive", version = "0.14.0-0.4.0" } -uint = "0.9.0" +# uint 0.9.2 uses edition2021 and this cannot be used from wasmvm now. +# See also https://github.com/CosmWasm/wasmvm/issues/277 +# and https://github.com/CosmWasm/cosmwasm/issues/1204 +uint = "=0.9.1" serde-json-wasm = { version = "0.3.1" } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] }

    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/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­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Π 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