stellar-axelar-std-derive 2.1.0

Proc macros for Axelar contracts.
Documentation
#[stellar_axelar_std::contracttype]
enum DataKey {
    Counter,
    Message(Address),
    LastCaller(u64),
    Flag(String, Address),
    OptionalMessage(u32),
    Initialized,
    Paused,
}

pub fn counter(env: &stellar_axelar_std::Env) -> u32 {
    let key = DataKey::Counter;
    env.storage().instance().get::<_, u32>(&key).unwrap()
}

pub fn try_counter(env: &stellar_axelar_std::Env) -> Option<u32> {
    let key = DataKey::Counter;
    env.storage().instance().get::<_, u32>(&key)
}

pub fn set_counter(env: &stellar_axelar_std::Env, value: &u32) {
    let key = DataKey::Counter;
    env.storage().instance().set(&key, value);
}

pub fn remove_counter(env: &stellar_axelar_std::Env) {
    let key = DataKey::Counter;
    env.storage().instance().remove(&key);
}

pub fn extend_counter_ttl(
    env: &stellar_axelar_std::Env,
    threshold: u32,
    extend_to: u32,
) {
    let key = DataKey::Counter;
    env.storage().instance().extend_ttl(threshold, extend_to);
}

pub fn has_counter(env: &stellar_axelar_std::Env) -> bool {
    let key = DataKey::Counter;
    env.storage().instance().has(&key)
}

pub fn message(env: &stellar_axelar_std::Env, sender: Address) -> String {
    let key = DataKey::Message(sender);
    let value = env.storage().persistent().get::<_, String>(&key).unwrap();
    stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
    value
}

pub fn try_message(env: &stellar_axelar_std::Env, sender: Address) -> Option<String> {
    let key = DataKey::Message(sender);
    let value = env.storage().persistent().get::<_, String>(&key);
    if value.is_some() {
        stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
    }
    value
}

pub fn set_message(env: &stellar_axelar_std::Env, sender: Address, value: &String) {
    let key = DataKey::Message(sender);
    env.storage().persistent().set(&key, value);
    stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
}

pub fn remove_message(env: &stellar_axelar_std::Env, sender: Address) {
    let key = DataKey::Message(sender);
    env.storage().persistent().remove(&key);
}

pub fn extend_message_ttl(
    env: &stellar_axelar_std::Env,
    sender: Address,
    threshold: u32,
    extend_to: u32,
) {
    let key = DataKey::Message(sender);
    env.storage().persistent().extend_ttl(&key, threshold, extend_to);
}

pub fn has_message(env: &stellar_axelar_std::Env, sender: Address) -> bool {
    let key = DataKey::Message(sender);
    env.storage().persistent().has(&key)
}

pub fn last_caller(env: &stellar_axelar_std::Env, timestamp: u64) -> Address {
    let key = DataKey::LastCaller(timestamp);
    env.storage().temporary().get::<_, Address>(&key).unwrap()
}

pub fn try_last_caller(
    env: &stellar_axelar_std::Env,
    timestamp: u64,
) -> Option<Address> {
    let key = DataKey::LastCaller(timestamp);
    env.storage().temporary().get::<_, Address>(&key)
}

pub fn set_last_caller(env: &stellar_axelar_std::Env, timestamp: u64, value: &Address) {
    let key = DataKey::LastCaller(timestamp);
    env.storage().temporary().set(&key, value);
}

pub fn remove_last_caller(env: &stellar_axelar_std::Env, timestamp: u64) {
    let key = DataKey::LastCaller(timestamp);
    env.storage().temporary().remove(&key);
}

pub fn extend_last_caller_ttl(
    env: &stellar_axelar_std::Env,
    timestamp: u64,
    threshold: u32,
    extend_to: u32,
) {
    let key = DataKey::LastCaller(timestamp);
    env.storage().temporary().extend_ttl(&key, threshold, extend_to);
}

pub fn has_last_caller(env: &stellar_axelar_std::Env, timestamp: u64) -> bool {
    let key = DataKey::LastCaller(timestamp);
    env.storage().temporary().has(&key)
}

pub fn flag(env: &stellar_axelar_std::Env, key: String, owner: Address) -> bool {
    let key = DataKey::Flag(key, owner);
    let value = env.storage().persistent().get::<_, bool>(&key).unwrap();
    stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
    value
}

pub fn try_flag(
    env: &stellar_axelar_std::Env,
    key: String,
    owner: Address,
) -> Option<bool> {
    let key = DataKey::Flag(key, owner);
    let value = env.storage().persistent().get::<_, bool>(&key);
    if value.is_some() {
        stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
    }
    value
}

pub fn set_flag(
    env: &stellar_axelar_std::Env,
    key: String,
    owner: Address,
    value: &bool,
) {
    let key = DataKey::Flag(key, owner);
    env.storage().persistent().set(&key, value);
    stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
}

pub fn remove_flag(env: &stellar_axelar_std::Env, key: String, owner: Address) {
    let key = DataKey::Flag(key, owner);
    env.storage().persistent().remove(&key);
}

pub fn extend_flag_ttl(
    env: &stellar_axelar_std::Env,
    key: String,
    owner: Address,
    threshold: u32,
    extend_to: u32,
) {
    let key = DataKey::Flag(key, owner);
    env.storage().persistent().extend_ttl(&key, threshold, extend_to);
}

pub fn has_flag(env: &stellar_axelar_std::Env, key: String, owner: Address) -> bool {
    let key = DataKey::Flag(key, owner);
    env.storage().persistent().has(&key)
}

pub fn optional_message(env: &stellar_axelar_std::Env, id: u32) -> Option<String> {
    let key = DataKey::OptionalMessage(id);
    let value = env.storage().persistent().get::<_, Option<String>>(&key).unwrap();
    stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
    value
}

pub fn try_optional_message(
    env: &stellar_axelar_std::Env,
    id: u32,
) -> Option<Option<String>> {
    let key = DataKey::OptionalMessage(id);
    let value = env.storage().persistent().get::<_, Option<String>>(&key);
    if value.is_some() {
        stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
    }
    value
}

pub fn set_optional_message(
    env: &stellar_axelar_std::Env,
    id: u32,
    value: &Option<String>,
) {
    let key = DataKey::OptionalMessage(id);
    env.storage().persistent().set(&key, value);
    stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
}

pub fn remove_optional_message(env: &stellar_axelar_std::Env, id: u32) {
    let key = DataKey::OptionalMessage(id);
    env.storage().persistent().remove(&key);
}

pub fn extend_optional_message_ttl(
    env: &stellar_axelar_std::Env,
    id: u32,
    threshold: u32,
    extend_to: u32,
) {
    let key = DataKey::OptionalMessage(id);
    env.storage().persistent().extend_ttl(&key, threshold, extend_to);
}

pub fn has_optional_message(env: &stellar_axelar_std::Env, id: u32) -> bool {
    let key = DataKey::OptionalMessage(id);
    env.storage().persistent().has(&key)
}

pub fn is_initialized(env: &stellar_axelar_std::Env) -> bool {
    let key = DataKey::Initialized;
    env.storage().instance().has(&key)
}

pub fn set_initialized_status(env: &stellar_axelar_std::Env) {
    let key = DataKey::Initialized;
    env.storage().instance().set(&key, &());
}

pub fn remove_initialized_status(env: &stellar_axelar_std::Env) {
    let key = DataKey::Initialized;
    env.storage().instance().remove(&key);
}

pub fn extend_initialized_ttl(
    env: &stellar_axelar_std::Env,
    threshold: u32,
    extend_to: u32,
) {
    let key = DataKey::Initialized;
    env.storage().instance().extend_ttl(threshold, extend_to);
}

pub fn is_paused(env: &stellar_axelar_std::Env) -> bool {
    let key = DataKey::Paused;
    let value = env.storage().persistent().has(&key);
    if value {
        stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
    }
    value
}

pub fn set_paused_status(env: &stellar_axelar_std::Env) {
    let key = DataKey::Paused;
    env.storage().persistent().set(&key, &());
    stellar_axelar_std::ttl::extend_persistent_ttl(env, &key);
}

pub fn remove_paused_status(env: &stellar_axelar_std::Env) {
    let key = DataKey::Paused;
    env.storage().persistent().remove(&key);
}

pub fn extend_paused_ttl(env: &stellar_axelar_std::Env, threshold: u32, extend_to: u32) {
    let key = DataKey::Paused;
    env.storage().persistent().extend_ttl(&key, threshold, extend_to);
}

#[cfg(test)]
mod data_key_storage_layout_tests {
    use super::*;
    #[test]
    fn ensure_data_key_storage_schema_is_unchanged() {
        stellar_axelar_std::assert_matches_golden_file!(
            "enum DataKey {\n\n    #[instance]\n    #[value(u32)]\n    Counter,\n\n    #[persistent]\n    #[value(String)]\n    Message { sender: Address },\n\n    #[temporary]\n    #[value(Address)]\n    LastCaller { timestamp: u64 },\n\n    #[persistent]\n    #[value(bool)]\n    Flag { key: String, owner: Address },\n\n    #[persistent]\n    #[value(Option<String>)]\n    OptionalMessage { id: u32 },\n\n    #[instance]\n    #[status]\n    Initialized,\n\n    #[persistent]\n    #[status]\n    Paused,\n}\n"
        );
    }
}