Expand description
A unified representation of various types of Cosmos fungible assets, and helper functions for interacting with them
§Basic usage
The following code generates messages the sends some SDK coins and CW20 tokens to a recipient:
use cosmwasm_std::{Api, Response};
use cw_asset::{Asset, AssetError};
fn transfer_two_assets(api: &dyn Api) -> Result<Response, AssetError> {
let asset1 = Asset::native("uusd", 12345u128);
let msg1 = asset1.transfer_msg("recipient_addr")?;
let asset2 = Asset::cw20(api.addr_validate("token_addr")?, 67890u128);
let msg2 = asset1.transfer_msg("recipient_addr")?;
Ok(Response::new()
.add_message(msg1)
.add_message(msg2)
.add_attribute("asset_sent", asset1.to_string())
.add_attribute("asset_sent", asset2.to_string()))
}
§Asset list
An AssetList
struct is also provided for dealing with multiple assets at the same time:
use cosmwasm_std::{Api, Response};
use cw_asset::{Asset, AssetError, AssetList};
fn transfer_multiple_assets(api: &dyn Api) -> Result<Response, AssetError> {
let assets = AssetList::from(vec![
Asset::native("uusd", 12345u128),
Asset::cw20(api.addr_validate("token_addr")?, 67890u128),
]);
let msgs = assets.transfer_msgs(api.addr_validate("recipient_addr")?)?;
Ok(Response::new().add_messages(msgs).add_attribute("assets_sent", assets.to_string()))
}
§Use in messages
Asset
and AssetList
each comes with an unchecked counterpart which contains unverified
addresses and/or denoms, and implements traits that allow them to be serialized into JSON, so
that they can be directly used in Cosmos messages:
use cosmwasm_schema::cw_serde;
use cw_asset::AssetUnchecked;
#[cw_serde]
pub enum ExecuteMsg {
Deposit {
asset: AssetUnchecked,
},
}
Although Asset
and AssetList
also implement the related traits, hence can also be used
in messages, it is not recommended to do so; it is a good security practice to never trust
addresses passed in by messages to be valid. Instead, also validate them yourselves:
use cosmwasm_std::{Api, StdResult};
use cw_asset::{Asset, AssetError, AssetUnchecked};
const ACCEPTED_DENOMS: &[&str] = &["uatom", "uosmo", "uluna"];
fn validate_deposit(api: &dyn Api, asset_unchecked: AssetUnchecked) -> Result<(), AssetError> {
let asset: Asset = asset_unchecked.check(api, Some(ACCEPTED_DENOMS))?;
Ok(())
}
Structs§
- Asset
Base - Represents a fungible asset with a known amount
- Asset
List Base - Represents a list of fungible tokens, each with a known amount
Enums§
- Asset
Error - Asset
Info Base - Represents the type of an fungible asset.
Type Aliases§
- Asset
- Asset
Info - Represents an asset info instance containing only verified data; to be saved in contract storage.
- Asset
Info Unchecked - Represents an asset info instance that may contain unverified data; to be used in messages.
- Asset
List - Represents an asset list instance containing only verified data; to be used in contract storage.
- Asset
List Unchecked - Represents an asset list instance that may contain unverified data; to be used in messages.
- Asset
Unchecked