Skip to main content

soroban_token_spec/
lib.rs

1#![no_std]
2
3mod tests;
4
5use soroban_sdk::{contractevent, Address, BytesN, String};
6
7// Events that are a special case generated by the Stellar Asset Contract, but are part of SEP-41,
8// but are not expected to be generated by other contracts. Defined here privately only for the
9// purpose of generating the complete contract spec.
10
11/// Transfer event published when a classic payment uses the MEMO_TEXT memo type.
12#[contractevent(topics = ["transfer"], data_format = "map", export = false)]
13#[doc(hidden)]
14pub struct TransferWithMuxedString {
15    #[topic]
16    pub from: Address,
17    #[topic]
18    pub to: Address,
19    pub to_muxed_id: Option<String>,
20    pub amount: i128,
21}
22
23/// Transfer event published when a classic payment uses the MEMO_HASH or MEMO_RETURN memo type.
24#[contractevent(topics = ["transfer"], data_format = "map", export = false)]
25#[doc(hidden)]
26pub struct TransferWithMuxedBytes {
27    #[topic]
28    pub from: Address,
29    #[topic]
30    pub to: Address,
31    pub to_muxed_id: Option<BytesN<32>>,
32    pub amount: i128,
33}
34
35/// Mint event published when a classic payment uses the MEMO_TEXT memo type.
36#[contractevent(topics = ["mint"], data_format = "map", export = false)]
37#[doc(hidden)]
38pub struct MintWithMuxedString {
39    #[topic]
40    pub to: Address,
41    pub to_muxed_id: Option<String>,
42    pub amount: i128,
43}
44
45/// Mint event published when a classic payment uses the MEMO_HASH or MEMO_RETURN memo type.
46#[contractevent(topics = ["mint"], data_format = "map", export = false)]
47#[doc(hidden)]
48pub struct MintWithMuxedBytes {
49    #[topic]
50    pub to: Address,
51    pub to_muxed_id: Option<BytesN<32>>,
52    pub amount: i128,
53}
54
55pub(crate) const XDR_INPUT: &[&[u8]] = &[
56    &soroban_sdk::token::TokenFnSpec::spec_xdr_allowance(),
57    &soroban_sdk::token::TokenFnSpec::spec_xdr_approve(),
58    &soroban_sdk::token::TokenFnSpec::spec_xdr_balance(),
59    &soroban_sdk::token::TokenFnSpec::spec_xdr_burn(),
60    &soroban_sdk::token::TokenFnSpec::spec_xdr_burn_from(),
61    &soroban_sdk::token::TokenFnSpec::spec_xdr_decimals(),
62    &soroban_sdk::token::TokenFnSpec::spec_xdr_name(),
63    &soroban_sdk::token::TokenFnSpec::spec_xdr_symbol(),
64    &soroban_sdk::token::TokenFnSpec::spec_xdr_transfer(),
65    &soroban_sdk::token::TokenFnSpec::spec_xdr_transfer_from(),
66    &soroban_token_sdk::events::Approve::spec_xdr(),
67    &soroban_token_sdk::events::TransferWithAmountOnly::spec_xdr(),
68    &soroban_token_sdk::events::Transfer::spec_xdr(),
69    &TransferWithMuxedString::spec_xdr(),
70    &TransferWithMuxedBytes::spec_xdr(),
71    &soroban_token_sdk::events::Burn::spec_xdr(),
72    &soroban_token_sdk::events::MintWithAmountOnly::spec_xdr(),
73    &soroban_token_sdk::events::Mint::spec_xdr(),
74    &MintWithMuxedString::spec_xdr(),
75    &MintWithMuxedBytes::spec_xdr(),
76    &soroban_token_sdk::events::Clawback::spec_xdr(),
77];
78
79pub(crate) const XDR_LEN: usize = 6620;
80
81/// Returns the contract spec for a SEP-41 Token contract.
82pub const fn xdr() -> &'static [u8] {
83    &XDR
84}
85
86/// The contract spec for a SEP-41 Token contract.
87const XDR: [u8; XDR_LEN] = {
88    let input = XDR_INPUT;
89    // Concatenate all XDR for each item that makes up the token spec.
90    let mut output = [0u8; XDR_LEN];
91    let mut input_i = 0;
92    let mut output_i = 0;
93    while input_i < input.len() {
94        let subinput = input[input_i];
95        let mut subinput_i = 0;
96        while subinput_i < subinput.len() {
97            output[output_i] = subinput[subinput_i];
98            output_i += 1;
99            subinput_i += 1;
100        }
101        input_i += 1;
102    }
103
104    // Check that the numbers of bytes written is equal to the number of bytes
105    // expected in the output.
106    if output_i != output.len() {
107        panic!("unexpected output length",);
108    }
109
110    output
111};