Skip to content

Commit 0aab099

Browse files
authored
Merge pull request #1914 from CosmWasm/1873-new-impl-canonicalize-humanize
[2.0] New implementation of addr_canonicalize and addr_humanize functions
2 parents 6ffe942 + c184648 commit 0aab099

36 files changed

+746
-604
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ and this project adheres to
6464
- cosmwasm-vm: Removed `backtraces` feature, use the `RUST_BACKTRACE=1` env
6565
variable instead. All `VmError` variants now have a `backtrace` field.
6666
([#1967])
67+
- cosmwasm-std: Replace `MockApi` with bech32 implementation. ([#1914])
68+
- cosmwasm-vm: Replace `MockApi` with bech32 implementation. ([#1914])
6769

6870
[#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874
6971
[#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876
@@ -72,6 +74,7 @@ and this project adheres to
7274
[#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884
7375
[#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898
7476
[#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902
77+
[#1914]: https://github.com/CosmWasm/cosmwasm/pull/1914
7578
[#1926]: https://github.com/CosmWasm/cosmwasm/pull/1926
7679
[#1933]: https://github.com/CosmWasm/cosmwasm/pull/1933
7780
[#1939]: https://github.com/CosmWasm/cosmwasm/pull/1939

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

MIGRATING.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,39 @@ major releases of `cosmwasm`. Note that you can also view the
135135
+StdError::generic_err(msg)
136136
```
137137

138+
- Replace addresses in unit tests with valid bech32 addresses. This has to be
139+
done for all addresses that are validated or canonicalized during the test or
140+
within the contract. The easiest way to do this is by using
141+
`MockApi::addr_make`. It generates a bech32 address from any string:
142+
143+
```diff
144+
-let msg = InstantiateMsg {
145+
- verifier: "verifier".to_string(),
146+
- beneficiary: "beneficiary".to_string(),
147+
-};
148+
+let msg = InstantiateMsg {
149+
+ verifier: deps.api.addr_make("verifier").to_string(),
150+
+ beneficiary: deps.api.addr_make("beneficiary").to_string(),
151+
+};
152+
```
153+
154+
- Replace addresses in integration tests using `cosmwasm-vm` with valid bech32
155+
addresses. This has to be done for all addresses that are validated or
156+
canonicalized during the test or within the contract. The easiest way to do
157+
this is by using `MockApi::addr_make`. It generates a bech32 address from any
158+
string:
159+
160+
```diff
161+
-let msg = InstantiateMsg {
162+
- verifier: "verifier".to_string(),
163+
- beneficiary: "beneficiary".to_string(),
164+
-};
165+
+let msg = InstantiateMsg {
166+
+ verifier: instance.api().addr_make("verifier").to_string(),
167+
+ beneficiary: instance.api().addr_make("beneficiary").to_string(),
168+
+};
169+
```
170+
138171
## 1.4.x -> 1.5.0
139172

140173
- Update `cosmwasm-*` dependencies in Cargo.toml (skip the ones you don't use):

contracts/burner/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/crypto-verify/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/cyberpunk/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/empty/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/floaty/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/hackatom/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/hackatom/src/contract.rs

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -195,22 +195,8 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result<Response, HackError> {
195195
}
196196
}
197197

198-
let too_long =
199-
"bn9hhssomeltvhzgvuqkwjkpwxojfuigltwedayzxljucefikuieillowaticksoistqoynmgcnj219aewfwefwwegwg";
200-
match api.addr_canonicalize(too_long).unwrap_err() {
201-
StdError::GenericErr { .. } => {}
202-
err => {
203-
return Err(StdError::generic_err(format!(
204-
"Unexpected error in do_user_errors_in_api_calls: {err:?}"
205-
))
206-
.into())
207-
}
208-
}
209-
210-
// Humanize
211-
212-
let empty: CanonicalAddr = vec![].into();
213-
match api.addr_humanize(&empty).unwrap_err() {
198+
let invalid = "bn9hhssomeltvhzgvuqkwjkpwxoj";
199+
match api.addr_canonicalize(invalid).unwrap_err() {
214200
StdError::GenericErr { .. } => {}
215201
err => {
216202
return Err(StdError::generic_err(format!(
@@ -220,8 +206,8 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result<Response, HackError> {
220206
}
221207
}
222208

223-
let too_short: CanonicalAddr = vec![0xAA, 0xBB, 0xCC].into();
224-
match api.addr_humanize(&too_short).unwrap_err() {
209+
let too_long = "cosmwasm1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqehqqkz";
210+
match api.addr_canonicalize(too_long).unwrap_err() {
225211
StdError::GenericErr { .. } => {}
226212
err => {
227213
return Err(StdError::generic_err(format!(
@@ -231,8 +217,9 @@ fn do_user_errors_in_api_calls(api: &dyn Api) -> Result<Response, HackError> {
231217
}
232218
}
233219

234-
let wrong_length: CanonicalAddr = vec![0xA6; 17].into();
235-
match api.addr_humanize(&wrong_length).unwrap_err() {
220+
// Humanize
221+
let empty: CanonicalAddr = vec![].into();
222+
match api.addr_humanize(&empty).unwrap_err() {
236223
StdError::GenericErr { .. } => {}
237224
err => {
238225
return Err(StdError::generic_err(format!(
@@ -316,9 +303,9 @@ mod tests {
316303
fn proper_initialization() {
317304
let mut deps = mock_dependencies();
318305

319-
let verifier = String::from("verifies");
320-
let beneficiary = String::from("benefits");
321-
let creator = String::from("creator");
306+
let verifier: String = deps.api.addr_make("verifies").into();
307+
let beneficiary: String = deps.api.addr_make("benefits").into();
308+
let creator: String = deps.api.addr_make("creator").into();
322309
let expected_state = State {
323310
verifier: deps.api.addr_validate(&verifier).unwrap(),
324311
beneficiary: deps.api.addr_validate(&beneficiary).unwrap(),
@@ -344,9 +331,9 @@ mod tests {
344331
fn instantiate_and_query() {
345332
let mut deps = mock_dependencies();
346333

347-
let verifier = String::from("verifies");
348-
let beneficiary = String::from("benefits");
349-
let creator = String::from("creator");
334+
let verifier: String = deps.api.addr_make("verifies").into();
335+
let beneficiary: String = deps.api.addr_make("benefits").into();
336+
let creator: String = deps.api.addr_make("creator").into();
350337
let msg = InstantiateMsg {
351338
verifier: verifier.clone(),
352339
beneficiary,
@@ -364,11 +351,11 @@ mod tests {
364351
fn migrate_verifier() {
365352
let mut deps = mock_dependencies();
366353

367-
let verifier = String::from("verifies");
368-
let beneficiary = String::from("benefits");
369-
let creator = String::from("creator");
354+
let verifier: String = deps.api.addr_make("verifies").into();
355+
let beneficiary: String = deps.api.addr_make("benefits").into();
356+
let creator: String = deps.api.addr_make("creator").into();
370357
let msg = InstantiateMsg {
371-
verifier,
358+
verifier: verifier.clone(),
372359
beneficiary,
373360
};
374361
let info = mock_info(&creator, &[]);
@@ -377,10 +364,13 @@ mod tests {
377364

378365
// check it is 'verifies'
379366
let query_response = query(deps.as_ref(), mock_env(), QueryMsg::Verifier {}).unwrap();
380-
assert_eq!(query_response.as_slice(), b"{\"verifier\":\"verifies\"}");
367+
assert_eq!(
368+
query_response.as_slice(),
369+
format!(r#"{{"verifier":"{verifier}"}}"#).as_bytes()
370+
);
381371

382372
// change the verifier via migrate
383-
let new_verifier = String::from("someone else");
373+
let new_verifier: String = deps.api.addr_make("someone else").into();
384374
let msg = MigrateMsg {
385375
verifier: new_verifier.clone(),
386376
};
@@ -396,9 +386,9 @@ mod tests {
396386
fn sudo_can_steal_tokens() {
397387
let mut deps = mock_dependencies();
398388

399-
let verifier = String::from("verifies");
400-
let beneficiary = String::from("benefits");
401-
let creator = String::from("creator");
389+
let verifier: String = deps.api.addr_make("verifies").into();
390+
let beneficiary: String = deps.api.addr_make("benefits").into();
391+
let creator: String = deps.api.addr_make("creator").into();
402392
let msg = InstantiateMsg {
403393
verifier,
404394
beneficiary,
@@ -440,9 +430,9 @@ mod tests {
440430
let mut deps = mock_dependencies();
441431

442432
// initialize the store
443-
let creator = String::from("creator");
444-
let verifier = String::from("verifies");
445-
let beneficiary = String::from("benefits");
433+
let creator: String = deps.api.addr_make("creator").into();
434+
let verifier: String = deps.api.addr_make("verifies").into();
435+
let beneficiary: String = deps.api.addr_make("benefits").into();
446436

447437
let instantiate_msg = InstantiateMsg {
448438
verifier: verifier.clone(),
@@ -470,13 +460,13 @@ mod tests {
470460
assert_eq!(
471461
msg,
472462
&SubMsg::new(BankMsg::Send {
473-
to_address: beneficiary,
463+
to_address: beneficiary.clone(),
474464
amount: coins(1000, "earth"),
475465
}),
476466
);
477467
assert_eq!(
478468
execute_res.attributes,
479-
vec![("action", "release"), ("destination", "benefits")],
469+
vec![("action", "release"), ("destination", &beneficiary)],
480470
);
481471
assert_eq!(execute_res.data, Some(vec![0xF0, 0x0B, 0xAA].into()));
482472
}
@@ -486,9 +476,9 @@ mod tests {
486476
let mut deps = mock_dependencies();
487477

488478
// initialize the store
489-
let creator = String::from("creator");
490-
let verifier = String::from("verifies");
491-
let beneficiary = String::from("benefits");
479+
let creator: String = deps.api.addr_make("creator").into();
480+
let verifier: String = deps.api.addr_make("verifies").into();
481+
let beneficiary: String = deps.api.addr_make("benefits").into();
492482

493483
let instantiate_msg = InstantiateMsg {
494484
verifier: verifier.clone(),
@@ -531,9 +521,9 @@ mod tests {
531521
let mut deps = mock_dependencies();
532522

533523
// initialize the store
534-
let verifier = String::from("verifies");
535-
let beneficiary = String::from("benefits");
536-
let creator = String::from("creator");
524+
let verifier: String = deps.api.addr_make("verifies").into();
525+
let beneficiary: String = deps.api.addr_make("benefits").into();
526+
let creator: String = deps.api.addr_make("creator").into();
537527

538528
let instantiate_msg = InstantiateMsg {
539529
verifier,
@@ -558,8 +548,8 @@ mod tests {
558548
let mut deps = mock_dependencies();
559549

560550
let instantiate_msg = InstantiateMsg {
561-
verifier: String::from("verifies"),
562-
beneficiary: String::from("benefits"),
551+
verifier: deps.api.addr_make("verifies").into(),
552+
beneficiary: deps.api.addr_make("benefits").into(),
563553
};
564554
let init_info = mock_info("creator", &coins(1000, "earth"));
565555
let init_res = instantiate(deps.as_mut(), mock_env(), init_info, instantiate_msg).unwrap();
@@ -584,7 +574,7 @@ mod tests {
584574
let contract = Addr::unchecked("my-contract");
585575
let bin_contract: &[u8] = b"my-contract";
586576

587-
// return the unhashed value here
577+
// return the un-hashed value here
588578
let no_work_query = query_recurse(deps.as_ref(), 0, 0, contract.clone()).unwrap();
589579
assert_eq!(no_work_query.hashed, Binary::from(bin_contract));
590580

0 commit comments

Comments
 (0)