From 81fd75c9c90003501e540cd98edb8e2dfba90dc4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 2 Mar 2021 09:33:09 +0100 Subject: [PATCH] Use addr_validate import --- README.md | 1 + packages/std/src/imports.rs | 17 +++++++++++++++++ packages/std/src/mock.rs | 5 +++++ packages/std/src/traits.rs | 5 +---- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 99c8aa808b..242bd252b7 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,7 @@ extern "C" { #[cfg(feature = "iterator")] fn db_next(iterator_id: u32) -> u32; + fn addr_validate(source_ptr: u32) -> u32; fn addr_canonicalize(source: u32, destination: u32) -> u32; fn addr_humanize(source: u32, destination: u32) -> u32; diff --git a/packages/std/src/imports.rs b/packages/std/src/imports.rs index d6c47faf4b..6aedc54b23 100644 --- a/packages/std/src/imports.rs +++ b/packages/std/src/imports.rs @@ -36,6 +36,7 @@ extern "C" { #[cfg(feature = "iterator")] fn db_next(iterator_id: u32) -> u32; + fn addr_validate(source_ptr: u32) -> u32; fn addr_canonicalize(source_ptr: u32, destination_ptr: u32) -> u32; fn addr_humanize(source_ptr: u32, destination_ptr: u32) -> u32; @@ -155,6 +156,22 @@ impl ExternalApi { } impl Api for ExternalApi { + fn addr_validate(&self, human: &str) -> StdResult { + let source = build_region(human.as_bytes()); + let source_ptr = &*source as *const Region as u32; + + let result = unsafe { addr_validate(source_ptr) }; + if result != 0 { + let error = unsafe { consume_string_region_written_by_vm(result as *mut Region) }; + return Err(StdError::generic_err(format!( + "addr_validate errored: {}", + error + ))); + } + + Ok(human.into()) + } + fn addr_canonicalize(&self, human: &str) -> StdResult { let send = build_region(human.as_bytes()); let send_ptr = &*send as *const Region as u32; diff --git a/packages/std/src/mock.rs b/packages/std/src/mock.rs index 2933507026..df20609a40 100644 --- a/packages/std/src/mock.rs +++ b/packages/std/src/mock.rs @@ -71,6 +71,11 @@ impl Default for MockApi { } impl Api for MockApi { + fn addr_validate(&self, human: &str) -> StdResult { + self.addr_canonicalize(human).map(|_canonical| ())?; + Ok(human.into()) + } + fn addr_canonicalize(&self, human: &str) -> StdResult { // Dummy input validation. This is more sophisticated for formats like bech32, where format and checksum are validated. if human.len() < 3 { diff --git a/packages/std/src/traits.rs b/packages/std/src/traits.rs index 00c201127a..e18be8854d 100644 --- a/packages/std/src/traits.rs +++ b/packages/std/src/traits.rs @@ -77,10 +77,7 @@ pub trait Api { /// let validated: HumanAddr = api.addr_validate(input).unwrap(); /// assert_eq!(validated, input); /// ``` - fn addr_validate(&self, human: &str) -> StdResult { - self.addr_canonicalize(human).map(|_canonical| ())?; - Ok(human.into()) - } + fn addr_validate(&self, human: &str) -> StdResult; /// Takes a human readable address and returns a canonical binary representation of it. /// This can be used when a compact fixed length representation is needed.