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 contractstorage attribute macro #216

Merged
merged 33 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
836c8da
feat(axelar-std-derive): add contractstorage attribute macro
nbayindirli Jan 27, 2025
c6de88f
diff lint
nbayindirli Jan 27, 2025
d19ef40
Merge branch 'main' into feature/storage-macro
nbayindirli Jan 28, 2025
03fdb1b
address comments
nbayindirli Jan 28, 2025
194d3ff
address comments
nbayindirli Jan 28, 2025
d83e509
breakup storage_attributes & add transform_variant doc
nbayindirli Jan 29, 2025
b0e388f
make value_type not optional + add fields_data helper
nbayindirli Jan 29, 2025
46bf998
Merge branch 'main' into feature/storage-macro
nbayindirli Jan 29, 2025
6fadf1e
expect lowercase
nbayindirli Jan 29, 2025
1db666a
improve encapsulation with storage_method on StorageType
nbayindirli Jan 29, 2025
0b30445
add ttl method
nbayindirli Jan 29, 2025
6f93793
account for Option<Option<...>> case on getter with ambiguous type
nbayindirli Jan 29, 2025
483e4d6
add deleter_name
nbayindirli Jan 29, 2025
e9d4500
add goldie on storage layout
nbayindirli Jan 29, 2025
4ad84c4
add testing on optional value type
nbayindirli Jan 29, 2025
2f2a4fb
support module-level public functions
nbayindirli Jan 29, 2025
9d035f3
enum private + public access fns
nbayindirli Jan 29, 2025
586ed70
remove println
nbayindirli Jan 29, 2025
0c0b710
remove semi-dupe test
nbayindirli Jan 29, 2025
2d6f63f
lint
nbayindirli Jan 29, 2025
6874515
remove test_storage_schema_stability
nbayindirli Jan 29, 2025
dbd645c
auto generate goldie test on generated code
nbayindirli Jan 29, 2025
b9f3c6a
lint
nbayindirli Jan 29, 2025
8f6416d
lint
nbayindirli Jan 29, 2025
ecfc0a3
remove dead golden file
nbayindirli Jan 29, 2025
3b26a9d
tests
nbayindirli Jan 29, 2025
875b896
tests
nbayindirli Jan 29, 2025
0162d95
tests
nbayindirli Jan 29, 2025
dfa5608
tests
nbayindirli Jan 29, 2025
1c76718
tests
nbayindirli Jan 29, 2025
5f9c95b
lint
nbayindirli Jan 29, 2025
b22d3b2
tests
nbayindirli Jan 29, 2025
c7576ac
address comments
nbayindirli Jan 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions contracts/stellar-example/src/storage_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use stellar_interchain_token_service::types::TokenManagerType;

#[contractstorage]
#[derive(Clone, Debug)]
pub enum DataKey {
enum DataKey {
#[instance]
#[value(Address)]
Gateway,
Expand All @@ -28,7 +28,7 @@ pub enum DataKey {

#[contracttype]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TokenIdConfig {
struct TokenIdConfig {
pub token_address: Address,
pub token_manager_type: TokenManagerType,
}
6 changes: 3 additions & 3 deletions packages/stellar-axelar-std-derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
//!
//! This ensures compatibility and prevents cyclic dependency issues during testing and release.

mod contractstorage;
mod into_event;
mod its_executable;
mod operatable;
mod ownable;
mod pausable;
mod storage;
mod upgradable;

use proc_macro::TokenStream;
Expand Down Expand Up @@ -249,7 +249,7 @@ pub fn derive_its_executable(input: TokenStream) -> TokenStream {
///
/// #[contractstorage]
/// #[derive(Clone, Debug)]
/// pub enum DataKey {
/// enum DataKey {
/// #[instance]
/// #[value(Address)]
/// Owner,
Expand Down Expand Up @@ -287,5 +287,5 @@ pub fn derive_its_executable(input: TokenStream) -> TokenStream {
#[proc_macro_attribute]
pub fn contractstorage(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as DeriveInput);
contractstorage::contractstorage(&input).into()
storage::contractstorage(&input).into()
}
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,7 @@ fn storage_fns(
extend_persistent_ttl(env, &key);
},
StorageType::Instance => quote! {
use stellar_axelar_std::ttl::extend_instance_ttl;
extend_instance_ttl(env);
stellar_axelar_std::ttl::extend_instance_ttl(env);
},
_ => quote! {},
};
Expand Down
54 changes: 29 additions & 25 deletions packages/stellar-axelar-std/src/tests/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,58 +7,62 @@ use crate::contractstorage;
#[contract]
pub struct Contract;

#[contractstorage]
pub enum DataKey {
#[instance]
#[value(u32)]
Counter,

#[persistent]
#[value(String)]
Message { sender: Address },

#[temporary]
#[value(Address)]
LastCaller { timestamp: u64 },

#[persistent]
#[value(bool)]
Flag { key: String, owner: Address },
mod storage {
use super::*;

#[contractstorage]
enum DataKey {
#[instance]
#[value(u32)]
Counter,

#[persistent]
#[value(String)]
Message { sender: Address },

#[temporary]
#[value(Address)]
LastCaller { timestamp: u64 },

#[persistent]
#[value(bool)]
Flag { key: String, owner: Address },
}
}

#[contractimpl]
impl Contract {
pub const fn __constructor() {}

pub fn increment_counter(env: &Env) -> u32 {
let current_counter = DataKey::get_counter(env).unwrap_or(0);
let current_counter = storage::DataKey::get_counter(env).unwrap_or(0);
let new_counter = current_counter + 1;
DataKey::set_counter(env, &new_counter);
storage::DataKey::set_counter(env, &new_counter);
new_counter
}

pub fn set_message(env: &Env, sender: Address, message: String) {
DataKey::set_message(env, sender, &message);
storage::DataKey::set_message(env, sender, &message);
}

pub fn message(env: &Env, sender: Address) -> Option<String> {
DataKey::get_message(env, sender)
storage::DataKey::get_message(env, sender)
}

pub fn set_last_caller(env: &Env, timestamp: u64, caller: Address) {
DataKey::set_last_caller(env, timestamp, &caller);
storage::DataKey::set_last_caller(env, timestamp, &caller);
}

pub fn last_caller(env: &Env, timestamp: u64) -> Option<Address> {
DataKey::get_last_caller(env, timestamp)
storage::DataKey::get_last_caller(env, timestamp)
}

pub fn set_flag(env: &Env, key: String, owner: Address, value: bool) {
DataKey::set_flag(env, key, owner, &value);
storage::DataKey::set_flag(env, key, owner, &value);
}

pub fn flag(env: &Env, key: String, owner: Address) -> Option<bool> {
DataKey::get_flag(env, key, owner)
storage::DataKey::get_flag(env, key, owner)
}
}

Expand Down
Loading