From b3d68b0db6db6e9b633a1735f46e0432f9f4e227 Mon Sep 17 00:00:00 2001 From: Chirantan Ekbote Date: Fri, 9 Dec 2022 16:35:21 +0900 Subject: [PATCH] sdk/rust: Drop references to `de::Unexpected` The `de::Unexpected` enum from serde has a `Float(f64)` variant. Referencing this enum anywhere in the code will cause the compiler to emit its `fmt::Display` impl, which includes an `f64.load` instruction on wasm targets. Even if this instruction is never executed, its mere existence will cause cosmos chains to reject any cosmwasm contract that has it. Fix this by removing all references to `de::Unexpected`. --- sdk/rust/core/src/core.rs | 14 +++++++------- sdk/rust/core/src/nft.rs | 14 +++++++------- sdk/rust/core/src/token.rs | 14 +++++++------- sdk/rust/serde_wormhole/src/de.rs | 13 ++++++------- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/sdk/rust/core/src/core.rs b/sdk/rust/core/src/core.rs index bc22c62ee..1bfee2448 100644 --- a/sdk/rust/core/src/core.rs +++ b/sdk/rust/core/src/core.rs @@ -41,7 +41,7 @@ mod governance_packet_impl { use std::fmt; use serde::{ - de::{Error, MapAccess, SeqAccess, Unexpected, Visitor}, + de::{Error, MapAccess, SeqAccess, Visitor}, ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer, }; @@ -79,8 +79,9 @@ mod governance_packet_impl { if arr == MODULE { Ok(Module) } else { - let expected = format!("{MODULE:?}"); - Err(Error::invalid_value(Unexpected::Bytes(&arr), &&*expected)) + Err(Error::custom( + "invalid governance module, expected \"Core\"", + )) } } } @@ -215,10 +216,9 @@ mod governance_packet_impl { Action::TransferFee { amount, recipient } } v => { - return Err(Error::invalid_value( - Unexpected::Unsigned(v.into()), - &"one of 1, 2, 3, 4", - )) + return Err(Error::custom(format_args!( + "invaliid value {v}, expected one of 1, 2, 3, 4" + ))) } }; diff --git a/sdk/rust/core/src/nft.rs b/sdk/rust/core/src/nft.rs index 16fa585d9..d5ce1e35b 100644 --- a/sdk/rust/core/src/nft.rs +++ b/sdk/rust/core/src/nft.rs @@ -84,7 +84,7 @@ mod governance_packet_impl { use std::fmt; use serde::{ - de::{Error, MapAccess, SeqAccess, Unexpected, Visitor}, + de::{Error, MapAccess, SeqAccess, Visitor}, ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer, }; @@ -122,8 +122,9 @@ mod governance_packet_impl { if arr == MODULE { Ok(Module) } else { - let expected = format!("{MODULE:?}"); - Err(Error::invalid_value(Unexpected::Bytes(&arr), &&*expected)) + Err(Error::custom( + "invalid governance module, expected \"NFTBridge\"", + )) } } } @@ -223,10 +224,9 @@ mod governance_packet_impl { Action::ContractUpgrade { new_contract } } v => { - return Err(Error::invalid_value( - Unexpected::Unsigned(v.into()), - &"one of 1, 2", - )) + return Err(Error::custom(format_args!( + "invalid value {v}, expected one of 1, 2" + ))) } }; diff --git a/sdk/rust/core/src/token.rs b/sdk/rust/core/src/token.rs index a6e9eb0ba..dc27cb126 100644 --- a/sdk/rust/core/src/token.rs +++ b/sdk/rust/core/src/token.rs @@ -209,7 +209,7 @@ mod governance_packet_impl { use std::fmt; use serde::{ - de::{Error, MapAccess, SeqAccess, Unexpected, Visitor}, + de::{Error, MapAccess, SeqAccess, Visitor}, ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer, }; @@ -247,8 +247,9 @@ mod governance_packet_impl { if arr == MODULE { Ok(Module) } else { - let expected = format!("{MODULE:?}"); - Err(Error::invalid_value(Unexpected::Bytes(&arr), &&*expected)) + Err(Error::custom( + "invalid governance module, expected \"TokenBridge\"", + )) } } } @@ -348,10 +349,9 @@ mod governance_packet_impl { Action::ContractUpgrade { new_contract } } v => { - return Err(Error::invalid_value( - Unexpected::Unsigned(v.into()), - &"one of 1, 2", - )) + return Err(Error::custom(format_args!( + "invalid value: {v}, expected one of 1, 2" + ))) } }; diff --git a/sdk/rust/serde_wormhole/src/de.rs b/sdk/rust/serde_wormhole/src/de.rs index 6410713ce..2351e3999 100644 --- a/sdk/rust/serde_wormhole/src/de.rs +++ b/sdk/rust/serde_wormhole/src/de.rs @@ -2,7 +2,7 @@ use std::{convert::TryFrom, mem::size_of}; use serde::de::{ self, DeserializeSeed, EnumAccess, Error as DeError, IntoDeserializer, MapAccess, SeqAccess, - Unexpected, VariantAccess, Visitor, + VariantAccess, Visitor, }; use crate::error::Error; @@ -68,10 +68,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { match v { 0 => visitor.visit_bool(false), 1 => visitor.visit_bool(true), - v => Err(Error::invalid_value( - Unexpected::Unsigned(v.into()), - &"a 0 or 1", - )), + v => Err(Error::custom(format_args!( + "invalid value: {v}, expected a 0 or 1" + ))), } } @@ -165,7 +164,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { { let v = deserialize_be_number!(self, u32); char::try_from(v) - .map_err(|_| Error::invalid_value(Unexpected::Unsigned(v.into()), &"a `char`")) + .map_err(|e| Error::custom(format_args!("invalid value {v}: {e}"))) .and_then(|v| visitor.visit_char(v)) } @@ -183,7 +182,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { self.input = rem; std::str::from_utf8(data) - .map_err(|_| Error::invalid_value(Unexpected::Bytes(data), &"a UTF-8 string")) + .map_err(Error::custom) .and_then(|s| visitor.visit_borrowed_str(s)) }