Crates.io | cw-address-like |
lib.rs | cw-address-like |
version | 2.0.0 |
source | src |
created_at | 2022-11-27 17:22:07.092385 |
updated_at | 2024-08-12 13:13:57.970633 |
description | A trait that marks unchecked or checked CosmWasm address strings |
homepage | https://larry.engineer |
repository | https://github.com/larry0x/cw-plus-plus |
max_upload_size | |
id | 723841 |
size | 4,807 |
This crate provides an trait AddressLike
, which marks types that can be used as addresses in CosmWasm, namely String
and cosmwasm_std::Addr
.
In CosmWasm, there are two types that are typically used to represent addresses:
String
- Represents an unverified address, which are used in contract APIs, i.e. messages and query responses.cosmwasm_std::Addr
- Represents an verified address, used in contract internal logics.When a contract receives an address (as a String
) from a message, it must not simply assume it is valid. Instead, it should use the deps.api.addr_validate
method to verify it, which returns an Addr
. The contract can then use the Addr
in its business logics or save it in storage.
Similarly, the contract should also converts Addr
s back to String
s when returning them in query responses.
A problem arises when we want to define a struct or enum that is to be used in both the API and internal logics. For example, consider a contract that saves a "config" in its storage, which uses an Addr
inside to represent the address of the contract's owner, while also providing a query method for the config, which uses a String
.
In such cases, developers may either define two types, one for each case:
struct Config {
pub owner: Addr,
}
struct ConfigResponse {
pub owner: String,
}
This approach works, but is somewhat cumbersome, especially when the config contains more fields.
Another approach is to define a single type that contains a generic:
struct Config<T> {
pub owner: T,
}
Then use Config<String>
in the API and Config<Addr>
in internal logics.
The main drawback of this approach is there's no restriction on what T
can be. It is theoretically possible to plug any type in as T
here, not limited to String
and Addr
.
In this crate we provide an AddressLike
trait, which is defined simply as:
pub trait AddressLike {}
impl AddressLike for Addr {}
impl AddressLike for String {}
The developer can then define their type as:
struct Config<T: AddressLike> {
pub owner: T,
}
This restricts that only String
and Addr
can be used as T
.
Contents of this crate at or prior to version 1.0.3
are published under GNU Affero General Public License v3 or later; contents after the said version are published under Apache-2.0 license.