diff --git a/Cargo.lock b/Cargo.lock index 8035d1d..35ac18c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -773,6 +773,7 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" name = "locked_in" version = "0.0.1" dependencies = [ + "loktin-common", "mock_pool", "soroban-sdk", "stellar-xdr", @@ -784,6 +785,13 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "loktin-common" +version = "0.0.1" +dependencies = [ + "soroban-sdk", +] + [[package]] name = "macro-string" version = "0.1.4" @@ -805,6 +813,7 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" name = "mock_pool" version = "0.0.1" dependencies = [ + "loktin-common", "soroban-sdk", "stellar-xdr", ] @@ -892,6 +901,7 @@ dependencies = [ name = "plans" version = "0.0.1" dependencies = [ + "loktin-common", "soroban-sdk", "stellar-xdr", ] @@ -1349,6 +1359,7 @@ dependencies = [ name = "spend_save" version = "0.0.1" dependencies = [ + "loktin-common", "soroban-sdk", "stellar-xdr", ] @@ -1442,6 +1453,7 @@ dependencies = [ name = "target_savings" version = "0.0.1" dependencies = [ + "loktin-common", "mock_pool", "soroban-sdk", "stellar-xdr", diff --git a/Cargo.toml b/Cargo.toml index ad48642..0f754e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["contracts/*"] +members = ["contracts/*", "crates/*"] resolver = "2" [workspace.package] @@ -12,6 +12,9 @@ version = "0.0.1" [workspace.dependencies.soroban-sdk] version = "23.0.2" +[workspace.dependencies.loktin-common] +path = "crates/loktin-common" + [workspace.dependencies.stellar-access] git = "https://github.com/OpenZeppelin/stellar-contracts" tag = "v0.5.1" diff --git a/contracts/locked_in/Cargo.toml b/contracts/locked_in/Cargo.toml index d17e015..7a82d98 100644 --- a/contracts/locked_in/Cargo.toml +++ b/contracts/locked_in/Cargo.toml @@ -15,6 +15,7 @@ crate-type = ["cdylib"] doctest = false [dependencies] +loktin-common.workspace = true soroban-sdk = "23.0.3" [dev-dependencies] diff --git a/contracts/locked_in/src/lib.rs b/contracts/locked_in/src/lib.rs index 8d55516..5528456 100644 --- a/contracts/locked_in/src/lib.rs +++ b/contracts/locked_in/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +use loktin_common::{LEDGER_TTL_THRESHOLD, LEDGER_TTL_EXTEND}; mod error; mod events; @@ -14,9 +15,7 @@ use soroban_sdk::{ use error::Error; use types::{DataKey, Lock}; -const DAY_IN_LEDGERS: u32 = 17280; -const LEDGER_TTL_THRESHOLD: u32 = DAY_IN_LEDGERS * 30; -const LEDGER_TTL_EXTEND: u32 = DAY_IN_LEDGERS * 365; + const SECONDS_PER_MONTH: u64 = 2_592_000; // 30 days const SECONDS_PER_YEAR: i128 = 31_536_000; diff --git a/contracts/mock_pool/Cargo.toml b/contracts/mock_pool/Cargo.toml index 5038a5c..3dba0c1 100644 --- a/contracts/mock_pool/Cargo.toml +++ b/contracts/mock_pool/Cargo.toml @@ -15,6 +15,7 @@ crate-type = ["lib", "cdylib"] doctest = false [dependencies] +loktin-common.workspace = true soroban-sdk = "23.0.3" [dev-dependencies] diff --git a/contracts/mock_pool/src/lib.rs b/contracts/mock_pool/src/lib.rs index 7c0d949..d8b3a82 100644 --- a/contracts/mock_pool/src/lib.rs +++ b/contracts/mock_pool/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +use loktin_common::{LEDGER_TTL_THRESHOLD, LEDGER_TTL_EXTEND}; //! Mock Blend pool. //! @@ -23,9 +24,7 @@ use soroban_sdk::{contract, contractimpl, token, Address, Env}; use error::Error; use types::{DataKey, Position}; -const DAY_IN_LEDGERS: u32 = 17280; -const LEDGER_TTL_THRESHOLD: u32 = DAY_IN_LEDGERS * 30; -const LEDGER_TTL_EXTEND: u32 = DAY_IN_LEDGERS * 365; + const BPS_DENOMINATOR: i128 = 10_000; const SECONDS_PER_YEAR: i128 = 31_536_000; diff --git a/contracts/plans/Cargo.toml b/contracts/plans/Cargo.toml index 2c340a3..d22b8c1 100644 --- a/contracts/plans/Cargo.toml +++ b/contracts/plans/Cargo.toml @@ -15,6 +15,7 @@ crate-type = ["cdylib"] doctest = false [dependencies] +loktin-common.workspace = true soroban-sdk = "23.0.3" [dev-dependencies] diff --git a/contracts/plans/src/lib.rs b/contracts/plans/src/lib.rs index e07f34c..795d181 100644 --- a/contracts/plans/src/lib.rs +++ b/contracts/plans/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +use loktin_common::{LEDGER_TTL_THRESHOLD, LEDGER_TTL_EXTEND}; mod error; mod events; @@ -10,9 +11,7 @@ use soroban_sdk::{contract, contractimpl, token, Address, Env, String, Vec}; use error::Error; use types::{Bill, BillCycle, DataKey}; -const DAY_IN_LEDGERS: u32 = 17280; // ~24 hours -const LEDGER_TTL_THRESHOLD: u32 = DAY_IN_LEDGERS * 30; // 30 days -const LEDGER_TTL_EXTEND: u32 = DAY_IN_LEDGERS * 365; // 1 year + #[contract] pub struct Plans; diff --git a/contracts/spend_save/Cargo.toml b/contracts/spend_save/Cargo.toml index 845b016..b4dbb41 100644 --- a/contracts/spend_save/Cargo.toml +++ b/contracts/spend_save/Cargo.toml @@ -15,6 +15,7 @@ crate-type = ["cdylib"] doctest = false [dependencies] +loktin-common.workspace = true soroban-sdk = "23.0.3" [dev-dependencies] diff --git a/contracts/spend_save/src/lib.rs b/contracts/spend_save/src/lib.rs index a7367c8..b9a328e 100644 --- a/contracts/spend_save/src/lib.rs +++ b/contracts/spend_save/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +use loktin_common::{LEDGER_TTL_THRESHOLD, LEDGER_TTL_EXTEND}; mod error; mod events; @@ -9,9 +10,7 @@ use soroban_sdk::{contract, contractimpl, token, Address, Env}; use error::Error; use types::{DataKey, SpendSavePosition}; -const DAY_IN_LEDGERS: u32 = 17280; -const LEDGER_TTL_THRESHOLD: u32 = DAY_IN_LEDGERS * 30; -const LEDGER_TTL_EXTEND: u32 = DAY_IN_LEDGERS * 365; + const BPS_DENOMINATOR: i128 = 10_000; const SECONDS_PER_DAY: u64 = 86_400; diff --git a/contracts/target_savings/Cargo.toml b/contracts/target_savings/Cargo.toml index f007feb..327e312 100644 --- a/contracts/target_savings/Cargo.toml +++ b/contracts/target_savings/Cargo.toml @@ -15,6 +15,7 @@ crate-type = ["cdylib"] doctest = false [dependencies] +loktin-common.workspace = true soroban-sdk = "23.0.3" [dev-dependencies] diff --git a/contracts/target_savings/src/lib.rs b/contracts/target_savings/src/lib.rs index 9d50b5f..5f90476 100644 --- a/contracts/target_savings/src/lib.rs +++ b/contracts/target_savings/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +use loktin_common::{LEDGER_TTL_THRESHOLD, LEDGER_TTL_EXTEND}; mod error; mod events; @@ -24,9 +25,7 @@ pub trait Pool { fn get_position(env: Env, supplier: Address) -> i128; } -const DAY_IN_LEDGERS: u32 = 17280; // ~24h -const LEDGER_TTL_THRESHOLD: u32 = DAY_IN_LEDGERS * 30; -const LEDGER_TTL_EXTEND: u32 = DAY_IN_LEDGERS * 365; + const FORFEIT_BPS: u32 = 100; // 1% on early withdrawal const BPS_DENOMINATOR: i128 = 10_000; diff --git a/crates/loktin-common/Cargo.toml b/crates/loktin-common/Cargo.toml new file mode 100644 index 0000000..08c6a20 --- /dev/null +++ b/crates/loktin-common/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "loktin-common" +version.workspace = true +edition.workspace = true +authors.workspace = true +repository.workspace = true +license.workspace = true + +[dependencies] +soroban-sdk.workspace = true + +[dev-dependencies] diff --git a/crates/loktin-common/src/lib.rs b/crates/loktin-common/src/lib.rs new file mode 100644 index 0000000..a01fbf4 --- /dev/null +++ b/crates/loktin-common/src/lib.rs @@ -0,0 +1,53 @@ +#![no_std] + +use soroban_sdk::{Env, IntoVal, Val}; + +pub const DAY_IN_LEDGERS: u32 = 17280; +pub const LEDGER_TTL_THRESHOLD: u32 = DAY_IN_LEDGERS * 30; +pub const LEDGER_TTL_EXTEND: u32 = DAY_IN_LEDGERS * 365; + +pub fn extend_ttl_instance(env: &Env) { + env.storage() + .instance() + .extend_ttl(LEDGER_TTL_THRESHOLD, LEDGER_TTL_EXTEND); +} + +pub fn extend_ttl_persistent(env: &Env, key: &K) +where + K: IntoVal, +{ + env.storage() + .persistent() + .extend_ttl(key, LEDGER_TTL_THRESHOLD, LEDGER_TTL_EXTEND); +} + +pub fn next_id(env: &Env, key: &K) -> u64 +where + K: IntoVal, +{ + let mut id: u64 = env.storage().instance().get(key).unwrap_or(0); + id += 1; + env.storage().instance().set(key, &id); + id +} + +#[cfg(test)] +mod test { + use super::*; + use soroban_sdk::{symbol_short, Env}; + + #[test] + fn test_next_id() { + let env = Env::default(); + let key = symbol_short!("ID"); + + let id1 = next_id(&env, &key); + assert_eq!(id1, 1); + + let id2 = next_id(&env, &key); + assert_eq!(id2, 2); + + let id3 = next_id(&env, &key); + assert_eq!(id3, 3); + } +}