soroban_env_host/builtin_contracts/stellar_asset_contract/
public_types.rs

1use crate::{
2    builtin_contracts::base_types::{BytesN, String},
3    xdr::Asset,
4    Host, HostError, TryFromVal, TryIntoVal,
5};
6use soroban_builtin_sdk_macros::contracttype;
7
8#[derive(Clone)]
9#[contracttype]
10pub(crate) struct AlphaNum4AssetInfo {
11    pub asset_code: String,
12    pub issuer: BytesN<32>,
13}
14
15#[derive(Clone)]
16#[contracttype]
17pub(crate) struct AlphaNum12AssetInfo {
18    pub asset_code: String,
19    pub issuer: BytesN<32>,
20}
21
22#[derive(Clone)]
23#[contracttype]
24pub(crate) enum AssetInfo {
25    Native,
26    AlphaNum4(AlphaNum4AssetInfo),
27    AlphaNum12(AlphaNum12AssetInfo),
28}
29
30impl TryFromVal<Host, AssetInfo> for Asset {
31    type Error = HostError;
32
33    fn try_from_val(env: &Host, v: &AssetInfo) -> Result<Self, Self::Error> {
34        match v {
35            AssetInfo::Native => Ok(Asset::Native),
36            AssetInfo::AlphaNum4(asset) => {
37                let issuer_account_id = env.account_id_from_bytesobj(asset.issuer.as_object())?;
38                Ok(env.create_asset_4(asset.asset_code.to_array()?, issuer_account_id))
39            }
40            AssetInfo::AlphaNum12(asset) => {
41                let issuer_account_id = env.account_id_from_bytesobj(asset.issuer.as_object())?;
42                Ok(env.create_asset_12(asset.asset_code.to_array()?, issuer_account_id))
43            }
44        }
45    }
46}