Skip to content

Commit

Permalink
Add persistent and temporary storage fields to the setter contract + …
Browse files Browse the repository at this point in the history
…test
  • Loading branch information
thpani committed Sep 24, 2024
1 parent 0734137 commit 3a04627
Show file tree
Hide file tree
Showing 2 changed files with 170 additions and 76 deletions.
148 changes: 118 additions & 30 deletions ContractExamples/contracts/setter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
* @license
* [Apache-2.0](https://github.com/freespek/solarkraft/blob/main/LICENSE)
*/

use soroban_sdk::{bytes, bytesn, contract, contractimpl, contracttype, log, symbol_short, vec, Address, Bytes, BytesN, Env, Map, String, Symbol, Vec};
use soroban_sdk::{
bytes, bytesn, contract, contractimpl, contracttype, log, symbol_short, vec, Address, Bytes,
BytesN, Env, Map, String, Symbol, Vec,
};

// scalar types
const MY_BOOL: Symbol = symbol_short!("MY_BOOL");
Expand Down Expand Up @@ -46,7 +48,7 @@ pub struct MyStruct {
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum MyEnum {
A(u32),
B(i128)
B(i128),
}

#[contract]
Expand Down Expand Up @@ -92,12 +94,16 @@ impl SetterContract {
pub fn set_bool(env: Env, v: bool) -> bool {
let old: bool = env.storage().instance().get(&MY_BOOL).unwrap_or(false);
env.storage().instance().set(&MY_BOOL, &v);
env.storage().temporary().set(&MY_BOOL, &v);
env.storage().persistent().set(&MY_BOOL, &v);
log!(&env, "myBool: {}", v);
// bump the lifetime
// https://developers.stellar.org/docs/learn/smart-contract-internals/state-archival
//
// The TTL is extended to `max_ttl` when field TTL goes below `max_ttl` - 100
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}
Expand All @@ -109,9 +115,13 @@ impl SetterContract {
pub fn set_u32(env: Env, v: u32) -> u32 {
let old: u32 = env.storage().instance().get(&MY_U32).unwrap_or(0);
env.storage().instance().set(&MY_U32, &v);
env.storage().temporary().set(&MY_U32, &v);
env.storage().persistent().set(&MY_U32, &v);
log!(&env, "myU32: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}
Expand All @@ -123,9 +133,13 @@ impl SetterContract {
pub fn set_i32(env: Env, v: i32) -> i32 {
let old: i32 = env.storage().instance().get(&MY_I32).unwrap_or(0);
env.storage().instance().set(&MY_I32, &v);
env.storage().temporary().set(&MY_I32, &v);
env.storage().persistent().set(&MY_I32, &v);
log!(&env, "myI32: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}
Expand All @@ -137,9 +151,13 @@ impl SetterContract {
pub fn set_u64(env: Env, v: u64) -> u64 {
let old: u64 = env.storage().instance().get(&MY_U64).unwrap_or(0);
env.storage().instance().set(&MY_U64, &v);
env.storage().temporary().set(&MY_U64, &v);
env.storage().persistent().set(&MY_U64, &v);
log!(&env, "myU64: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}
Expand All @@ -151,9 +169,13 @@ impl SetterContract {
pub fn set_i64(env: Env, v: i64) -> i64 {
let old: i64 = env.storage().instance().get(&MY_I64).unwrap_or(0);
env.storage().instance().set(&MY_I64, &v);
env.storage().temporary().set(&MY_I64, &v);
env.storage().persistent().set(&MY_I64, &v);
log!(&env, "myi64: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}
Expand All @@ -165,9 +187,13 @@ impl SetterContract {
pub fn set_u128(env: Env, v: u128) -> u128 {
let old: u128 = env.storage().instance().get(&MY_U128).unwrap_or(0);
env.storage().instance().set(&MY_U128, &v);
env.storage().temporary().set(&MY_U128, &v);
env.storage().persistent().set(&MY_U128, &v);
log!(&env, "myU128: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}
Expand All @@ -179,9 +205,13 @@ impl SetterContract {
pub fn set_i128(env: Env, v: i128) -> i128 {
let old: i128 = env.storage().instance().get(&MY_I128).unwrap_or(0);
env.storage().instance().set(&MY_I128, &v);
env.storage().temporary().set(&MY_I128, &v);
env.storage().persistent().set(&MY_I128, &v);
log!(&env, "myi128: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}
Expand All @@ -191,47 +221,75 @@ impl SetterContract {
}

pub fn set_sym(env: Env, v: Symbol) -> Symbol {
let old: Symbol = env.storage().instance().get(&MY_SYM).unwrap_or(symbol_short!("NONE"));
let old: Symbol = env
.storage()
.instance()
.get(&MY_SYM)
.unwrap_or(symbol_short!("NONE"));
env.storage().instance().set(&MY_SYM, &v);
env.storage().temporary().set(&MY_SYM, &v);
env.storage().persistent().set(&MY_SYM, &v);
log!(&env, "mySym: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
// return the old value to the caller
old
}

pub fn get_sym(env: Env) -> Symbol {
env.storage().instance().get(&MY_SYM).unwrap_or(symbol_short!("NONE"))
env.storage()
.instance()
.get(&MY_SYM)
.unwrap_or(symbol_short!("NONE"))
}

pub fn set_bytes(env: Env, v: Bytes) -> () {
env.storage().instance().set(&MY_BYTES, &v);
env.storage().temporary().set(&MY_BYTES, &v);
env.storage().persistent().set(&MY_BYTES, &v);
log!(&env, "myBytes: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

pub fn get_bytes(env: Env) -> Bytes {
env.storage().instance().get(&MY_BYTES).unwrap_or(Bytes::new(&env))
env.storage()
.instance()
.get(&MY_BYTES)
.unwrap_or(Bytes::new(&env))
}

pub fn set_bytes32(env: Env, v: BytesN<32>) -> () {
env.storage().instance().set(&MY_BYTES32, &v);
env.storage().temporary().set(&MY_BYTES32, &v);
env.storage().persistent().set(&MY_BYTES32, &v);
log!(&env, "myBytes32: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

pub fn get_bytes32(env: Env) -> BytesN<32> {
env.storage().instance().get(&MY_BYTES32)
env.storage()
.instance()
.get(&MY_BYTES32)
.unwrap_or(BytesN::from_array(&env, &[0u8; 32]))
}

pub fn set_vec(env: Env, v: Vec<i32>) -> () {
env.storage().instance().set(&MY_VEC, &v);
env.storage().temporary().set(&MY_VEC, &v);
env.storage().persistent().set(&MY_VEC, &v);
log!(&env, "myVec: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

fn get_vec_internal(env: &Env) -> Vec<i32> {
Expand All @@ -246,18 +304,29 @@ impl SetterContract {
let mut vs = Self::get_vec_internal(&env);
vs.push_back(i);
env.storage().instance().set(&MY_VEC, &vs);
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage().temporary().set(&MY_VEC, &vs);
env.storage().persistent().set(&MY_VEC, &vs);
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

pub fn set_map(env: Env, v: Map<u32, i32>) -> () {
env.storage().instance().set(&MY_MAP, &v);
env.storage().temporary().set(&MY_MAP, &v);
env.storage().persistent().set(&MY_MAP, &v);
log!(&env, "myMap: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

fn get_map_internal(env: &Env) -> Map<u32, i32> {
env.storage().instance().get(&MY_MAP).unwrap_or(Map::from_array(&env, [(0, 0); 0]))
env.storage()
.instance()
.get(&MY_MAP)
.unwrap_or(Map::from_array(&env, [(0, 0); 0]))
}

pub fn get_map(env: Env) -> Map<u32, i32> {
Expand All @@ -268,7 +337,11 @@ impl SetterContract {
let mut map = Self::get_map_internal(&env);
map.set(key, value);
env.storage().instance().set(&MY_MAP, &map);
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage().temporary().set(&MY_MAP, &map);
env.storage().persistent().set(&MY_MAP, &map);
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

pub fn map_get(env: Env, key: u32) -> i32 {
Expand All @@ -277,9 +350,13 @@ impl SetterContract {

pub fn set_address(env: Env, v: Address) -> () {
env.storage().instance().set(&MY_ADDR, &v);
env.storage().temporary().set(&MY_ADDR, &v);
env.storage().persistent().set(&MY_ADDR, &v);
log!(&env, "myAddress: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

pub fn get_address(env: Env) -> Option<Address> {
Expand All @@ -288,27 +365,38 @@ impl SetterContract {

pub fn set_struct(env: Env, v: MyStruct) -> () {
env.storage().instance().set(&MY_STRUCT, &v);
env.storage().temporary().set(&MY_STRUCT, &v);
env.storage().persistent().set(&MY_STRUCT, &v);
log!(&env, "myStruct: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

pub fn get_struct(env: Env) -> MyStruct {
env.storage().instance().get(&MY_STRUCT)
.unwrap_or(MyStruct {
a: 0u32, b: 0i128
})
env.storage()
.instance()
.get(&MY_STRUCT)
.unwrap_or(MyStruct { a: 0u32, b: 0i128 })
}

pub fn set_enum(env: Env, v: MyEnum) -> () {
env.storage().instance().set(&MY_ENUM, &v);
env.storage().temporary().set(&MY_ENUM, &v);
env.storage().persistent().set(&MY_ENUM, &v);
log!(&env, "myEnum: {}", v);
// bump the lifetime
env.storage().instance().extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
env.storage()
.instance()
.extend_ttl(env.storage().max_ttl() - 100, env.storage().max_ttl());
}

pub fn get_enum(env: Env) -> MyEnum {
env.storage().instance().get(&MY_ENUM).unwrap_or(MyEnum::A(0u32))
env.storage()
.instance()
.get(&MY_ENUM)
.unwrap_or(MyEnum::A(0u32))
}
}

Expand Down
Loading

0 comments on commit 3a04627

Please sign in to comment.