Skip to content

Commit 51a500f

Browse files
committed
Improve MockApi canonicalize error handling
1 parent 71b9573 commit 51a500f

File tree

3 files changed

+31
-15
lines changed

3 files changed

+31
-15
lines changed

contracts/reflect/src/contract.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ mod tests {
353353
let err = execute(deps.as_mut(), mock_env(), info, msg).unwrap_err();
354354
match err {
355355
ReflectError::Std(StdError::GenericErr { msg, .. }) => {
356-
assert!(msg.contains("Invalid input"))
356+
assert!(msg.contains("Error decoding bech32"))
357357
}
358358
e => panic!("Unexpected error: {e:?}"),
359359
}

packages/std/src/testing/mock.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,20 @@ impl Api for MockApi {
126126
}
127127

128128
fn addr_canonicalize(&self, input: &str) -> StdResult<CanonicalAddr> {
129-
if let Ok((prefix, decoded, Variant::Bech32)) = decode(input) {
130-
if prefix == self.bech32_prefix {
131-
if let Ok(bytes) = Vec::<u8>::from_base32(&decoded) {
129+
match decode(input) {
130+
Ok((prefix, _, _)) if prefix != self.bech32_prefix => {
131+
Err(StdError::generic_err("Wrong bech32 prefix"))
132+
}
133+
Ok((_, _, Variant::Bech32m)) => Err(StdError::generic_err("Wrong bech32 variant")),
134+
Err(_) => Err(StdError::generic_err("Error decoding bech32")),
135+
Ok((_, decoded, Variant::Bech32)) => match Vec::<u8>::from_base32(&decoded) {
136+
Ok(bytes) => {
132137
validate_length(&bytes)?;
133-
return Ok(bytes.into());
138+
Ok(bytes.into())
134139
}
135-
}
140+
Err(_) => Err(StdError::generic_err("Invalid bech32 data")),
141+
},
136142
}
137-
Err(StdError::generic_err("Invalid input"))
138143
}
139144

140145
fn addr_humanize(&self, canonical: &CanonicalAddr) -> StdResult<Addr> {
@@ -1235,9 +1240,9 @@ mod tests {
12351240
fn addr_canonicalize_long_input() {
12361241
let api = MockApi::default();
12371242
let human =
1238-
"some-extremely-long-address-some-extremely-long-address-some-extremely-long-address-some-extremely-long-address";
1243+
"cosmwasm1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqehqqkz";
12391244
let err = api.addr_canonicalize(human).unwrap_err();
1240-
assert!(err.to_string().contains("Invalid input"));
1245+
assert!(err.to_string().contains("Invalid canonical address length"));
12411246
}
12421247

12431248
#[test]

packages/vm/src/testing/mock.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,26 @@ impl BackendApi for MockApi {
131131
MockApi::Bech32 { bech32_prefix } => *bech32_prefix,
132132
};
133133

134-
if let Ok((prefix, decoded, Variant::Bech32)) = decode(input) {
135-
if prefix == bech32_prefix {
136-
if let Ok(bytes) = Vec::<u8>::from_base32(&decoded) {
134+
match decode(input) {
135+
Ok((prefix, _, _)) if prefix != bech32_prefix => {
136+
(Err(BackendError::user_err("Wrong bech32 prefix")), gas_info)
137+
}
138+
Ok((_, _, Variant::Bech32m)) => (
139+
Err(BackendError::user_err("Wrong bech32 variant")),
140+
gas_info,
141+
),
142+
Err(_) => (
143+
Err(BackendError::user_err("Error decoding bech32")),
144+
gas_info,
145+
),
146+
Ok((_, decoded, Variant::Bech32)) => match Vec::<u8>::from_base32(&decoded) {
147+
Ok(bytes) => {
137148
try_br!((validate_length(&bytes), gas_info));
138-
return (Ok(bytes), gas_info);
149+
(Ok(bytes), gas_info)
139150
}
140-
}
151+
Err(_) => (Err(BackendError::user_err("Invalid bech32 data")), gas_info),
152+
},
141153
}
142-
(Err(BackendError::user_err("Invalid input")), gas_info)
143154
}
144155

145156
fn human_address(&self, canonical: &[u8]) -> BackendResult<String> {

0 commit comments

Comments
 (0)