Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(axelar-std-derive): add status support to contractstorage macro #234

Merged
merged 12 commits into from
Jan 31, 2025
4 changes: 4 additions & 0 deletions contracts/stellar-example/src/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ enum DataKey {
#[instance]
#[value(Address)]
InterchainTokenService,

#[instance]
#[status]
Paused,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#[contracttype] enum DataKey
{ Gateway, GasService, InterchainTokenService, Paused, } pub fn
gateway(env : & soroban_sdk :: Env) -> Option < Address >
{
let key = DataKey :: Gateway; let value = env.storage().instance().get ::
< _, Address > (& key); if value.is_some()
{ stellar_axelar_std :: ttl :: extend_instance_ttl(env); } value
} pub fn set_gateway(env : & soroban_sdk :: Env, value : & Address)
{
let key = DataKey :: Gateway; env.storage().instance().set(& key, value);
stellar_axelar_std :: ttl :: extend_instance_ttl(env);
} pub fn remove_gateway(env : & soroban_sdk :: Env)
{ let key = DataKey :: Gateway; env.storage().instance().remove(& key); } pub
fn gas_service(env : & soroban_sdk :: Env) -> Option < Address >
{
let key = DataKey :: GasService; let value = env.storage().instance().get
:: < _, Address > (& key); if value.is_some()
{ stellar_axelar_std :: ttl :: extend_instance_ttl(env); } value
} pub fn set_gas_service(env : & soroban_sdk :: Env, value : & Address)
{
let key = DataKey :: GasService;
env.storage().instance().set(& key, value); stellar_axelar_std :: ttl ::
extend_instance_ttl(env);
} pub fn remove_gas_service(env : & soroban_sdk :: Env)
{ let key = DataKey :: GasService; env.storage().instance().remove(& key); }
pub fn interchain_token_service(env : & soroban_sdk :: Env) -> Option <
Address >
{
let key = DataKey :: InterchainTokenService; let value =
env.storage().instance().get :: < _, Address > (& key); if value.is_some()
{ stellar_axelar_std :: ttl :: extend_instance_ttl(env); } value
} pub fn
set_interchain_token_service(env : & soroban_sdk :: Env, value : & Address)
{
let key = DataKey :: InterchainTokenService;
env.storage().instance().set(& key, value); stellar_axelar_std :: ttl ::
extend_instance_ttl(env);
} pub fn remove_interchain_token_service(env : & soroban_sdk :: Env)
{
let key = DataKey :: InterchainTokenService;
env.storage().instance().remove(& key);
} pub fn paused(env : & soroban_sdk :: Env) -> bool
{ let key = DataKey :: Paused; env.storage().instance().has(& key) } pub fn
set_paused(env : & soroban_sdk :: Env)
{ let key = DataKey :: Paused; env.storage().instance().set(& key, & ()); }
pub fn remove_paused(env : & soroban_sdk :: Env)
{ let key = DataKey :: Paused; env.storage().instance().remove(& key); }
4 changes: 2 additions & 2 deletions packages/stellar-axelar-std-derive/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ proc-macro = true
[features]

[dependencies]
goldie = { workspace = true }
heck = "0.5"
itertools = "0.14"
prettyplease = "0.2"
proc-macro2 = { workspace = true }
quote = { version = "1.0", default-features = false }
syn = { version = "2.0", features = ["full", "extra-traits"] }

[dev-dependencies]
goldie = { workspace = true }
prettyplease = "0.2"

[lints]
workspace = true
20 changes: 13 additions & 7 deletions packages/stellar-axelar-std-derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ pub fn derive_its_executable(input: TokenStream) -> TokenStream {
/// Implements a storage interface for a Stellar contract storage enum.
///
/// The enum variants define contract data keys, with optional named fields as contract data map keys.
/// Each variant requires a `#[value(Type)]` attribute to specify the stored value type.
/// Each variant requires a `#[value(Type)]` xor `#[status]` attribute to specify the stored value type.
/// Storage type can be specified with `#[instance]`, `#[persistent]`, or `#[temporary]` attributes (defaults to instance).
///
/// # Example
Expand All @@ -261,6 +261,10 @@ pub fn derive_its_executable(input: TokenStream) -> TokenStream {
/// #[temporary]
/// #[value(u64)]
/// LastUpdate { account: Address },
///
/// #[instance]
/// #[status]
/// Paused,
/// }
///
/// #[contract]
Expand All @@ -273,19 +277,21 @@ pub fn derive_its_executable(input: TokenStream) -> TokenStream {
/// token_id: u32,
/// name: String,
/// ) {
/// // Generates: DataKey::set_token_name(env, token_id, &name);
/// DataKey::set_token_name(env, token_id, &name);
/// storage::set_token_name(env, token_id, &name);
/// }
///
/// pub fn foo(env: &Env, token_id: u32) -> Option<String> {
/// storage::token_name(env, token_id);
/// }
///
/// pub fn token_name(env: &Env, token_id: u32) -> Option<String> {
/// // Generates: DataKey::get_token_name(env, token_id)
/// DataKey::get_token_name(env, token_id)
/// pub fn bar(env: &Env, token_id: u32) -> Option<String> {
/// storage::remove_token_name(env, token_id)
/// }
/// }
/// # }
/// ```
#[proc_macro_attribute]
pub fn contractstorage(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as DeriveInput);
storage::contractstorage(&input).into()
storage::contract_storage(&input).into()
}
Loading
Loading