Skip to main content

stellar_asset_spec/
lib.rs

1#![no_std]
2
3mod tests;
4
5use soroban_sdk::{contractevent, Address};
6
7// Events that are unique to the Stellar Asset Contract and not part of SEP-41 are defined here
8// privately only for the purpose of generating the complete contract spec.
9
10#[contractevent(topics = ["set_admin"], data_format = "single-value", export = false)]
11pub(crate) struct SetAdmin {
12    #[topic]
13    pub admin: Address,
14    pub new_admin: Address,
15}
16
17#[contractevent(topics = ["set_authorized"], data_format = "single-value", export = false)]
18pub(crate) struct SetAuthorized {
19    #[topic]
20    pub id: Address,
21    pub authorize: bool,
22}
23
24pub(crate) const XDR_INPUT: &[&[u8]] = &[
25    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_allowance(),
26    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_authorized(),
27    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_approve(),
28    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_balance(),
29    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_burn(),
30    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_burn_from(),
31    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_clawback(),
32    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_decimals(),
33    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_mint(),
34    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_name(),
35    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_set_admin(),
36    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_admin(),
37    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_set_authorized(),
38    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_symbol(),
39    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_transfer(),
40    &soroban_sdk::token::StellarAssetFnSpec::spec_xdr_transfer_from(),
41    &soroban_token_sdk::events::Approve::spec_xdr(),
42    &soroban_token_sdk::events::TransferWithAmountOnly::spec_xdr(),
43    &soroban_token_sdk::events::Transfer::spec_xdr(),
44    &soroban_token_spec::TransferWithMuxedString::spec_xdr(),
45    &soroban_token_spec::TransferWithMuxedBytes::spec_xdr(),
46    &soroban_token_sdk::events::Burn::spec_xdr(),
47    &soroban_token_sdk::events::MintWithAmountOnly::spec_xdr(),
48    &soroban_token_sdk::events::Mint::spec_xdr(),
49    &soroban_token_spec::MintWithMuxedString::spec_xdr(),
50    &soroban_token_spec::MintWithMuxedBytes::spec_xdr(),
51    &soroban_token_sdk::events::Clawback::spec_xdr(),
52    &SetAdmin::spec_xdr(),
53    &SetAuthorized::spec_xdr(),
54];
55
56pub(crate) const XDR_LEN: usize = 8560;
57
58/// Returns the contract spec for Stellar Asset contract.
59pub const fn xdr() -> &'static [u8] {
60    &XDR
61}
62
63/// The contract spec for the Stellar Asset contract.
64const XDR: [u8; XDR_LEN] = {
65    let input = XDR_INPUT;
66    // Concatenate all XDR for each item that makes up the token spec.
67    let mut output = [0u8; XDR_LEN];
68    let mut input_i = 0;
69    let mut output_i = 0;
70    while input_i < input.len() {
71        let subinput = input[input_i];
72        let mut subinput_i = 0;
73        while subinput_i < subinput.len() {
74            output[output_i] = subinput[subinput_i];
75            output_i += 1;
76            subinput_i += 1;
77        }
78        input_i += 1;
79    }
80
81    // Check that the numbers of bytes written is equal to the number of bytes
82    // expected in the output.
83    if output_i != output.len() {
84        panic!("unexpected output length",);
85    }
86
87    output
88};