1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// Supported platforms
#[cfg(feature = "scrt")]
pub use fadroma_platform_scrt as scrt;
#[cfg(feature = "scrt")]
pub use scrt::cosmwasm_std;
#[cfg(feature = "scrt")]
pub use scrt::schemars;
#[cfg(feature = "scrt")]
pub use scrt::serde;

#[cfg(feature = "scrt")]
pub mod core;

// Contract scaffoldings
#[cfg(feature = "derive")]
pub use fadroma_proc_derive as derive_contract;
#[cfg(feature = "composability")]
pub mod composability;

// Safety features
#[cfg(feature = "killswitch")]
pub mod killswitch;

// Authentication primitives
#[cfg(feature = "admin")]
pub mod admin;
#[cfg(feature = "permit")]
pub mod permit;
#[cfg(feature = "vk")]
pub mod vk;

// Tokenomics primitives
#[cfg(feature = "math")]
pub mod math;
#[cfg(feature = "snip20-client")]
pub mod snip20_client;
#[cfg(feature = "snip20-impl")]
pub mod snip20_impl;

// Data and I/O helpers
#[cfg(feature = "storage")]
pub mod storage;
#[cfg(feature = "message")]
pub use fadroma_proc_message as proc_message;
#[cfg(feature = "response")]
pub mod response;

// Testing system
#[cfg(all(feature = "ensemble", not(target_arch = "wasm32")))]
pub mod ensemble;

// TODO: Remove or compartmentalize dependency on this
#[cfg(feature = "reexport-secret-toolkit")]
pub use secret_toolkit;

/// **Start here.** `use fadroma::prelude::*` to get the essentials for
/// writing smart contracts with Fadroma.
pub mod prelude {

    /// Alias for `StdResult<()>`.
    pub type UsuallyOk = StdResult<()>;

    /// Alias for `StdResult<Option<V>>`.
    pub type Eventually<V> = StdResult<Option<V>>;

    pub use crate::core::*;

    #[cfg(feature = "scrt")]
    pub use crate::scrt::{*, cosmwasm_std, cosmwasm_std::*};

    #[cfg(feature = "scrt")]
    pub use schemars::{self, JsonSchema};

    #[cfg(feature = "math")]
    pub use crate::math::*;

    #[cfg(feature = "storage")]
    pub use crate::storage::{
        load, save, remove,
        ns_load, ns_save, ns_remove
    };

    #[cfg(feature = "snip20-client")]
    pub use crate::snip20_client::ISnip20;

    #[cfg(feature = "message")]
    pub use crate::proc_message::message;

    #[cfg(feature = "response")]
    pub use crate::response::*;

    #[cfg(feature = "vk")]
    pub use crate::vk::ViewingKey;

    #[cfg(feature = "permit")]
    pub use crate::permit::{Permit, Permission};

    #[cfg(feature = "composability")]
    pub use crate::composability::Composable;

}

/// Define the `mod wasm` entrypoint of production builds.
#[cfg(feature = "scrt")]
#[macro_export] macro_rules! entrypoint {
    ($($fadroma:ident)::+, $($contract:ident)::+ $(,)?) => {
        $($fadroma)::+::entrypoint!(
            $($fadroma)::+,
            $($contract)::+::init,
            $($contract)::+::handle,
            $($contract)::+::query,
        );
    };
    ($($fadroma:ident)::+, $($init:ident)::+, $($handle:ident)::+, $($query:ident)::+ $(,)?) => {
        #[cfg(target_arch = "wasm32")]
        mod wasm {
            use $($fadroma)::+::{scrt::cosmwasm_std::{
                do_init,
                do_handle,
                do_query,
                ExternalStorage as EStorage,
                ExternalApi     as EApi,
                ExternalQuerier as EQuerier,
            }};
            #[no_mangle] extern "C" fn init(env_ptr: u32, msg_ptr: u32) -> u32 {
                do_init(&super::$($init)::+::<EStorage, EApi, EQuerier>, env_ptr, msg_ptr)
            }
            #[no_mangle] extern "C" fn handle(env_ptr: u32, msg_ptr: u32) -> u32 {
                do_handle(&super::$($handle)::+::<EStorage, EApi, EQuerier>, env_ptr, msg_ptr)
            }
            #[no_mangle] extern "C" fn query(msg_ptr: u32) -> u32 {
                do_query(&super::$($query)::+::<EStorage, EApi, EQuerier>, msg_ptr)
            }
        }
    }
}