soroban_env_host/builtin_contracts/stellar_asset_contract/
public_types.rs1use 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}