From 4c98c71b82be0a8da2be0a771a5d76852bb5c6aa Mon Sep 17 00:00:00 2001 From: Spoyte Date: Sun, 13 Oct 2024 03:24:57 +0100 Subject: [PATCH 1/2] new test, set_member is the only one working --- contracts/StellarPay2.rs | 98 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 contracts/StellarPay2.rs diff --git a/contracts/StellarPay2.rs b/contracts/StellarPay2.rs new file mode 100644 index 0000000..ec2c8ad --- /dev/null +++ b/contracts/StellarPay2.rs @@ -0,0 +1,98 @@ +#![no_std] +use soroban_sdk::{contract, contracttype, contractimpl, Address, Env, Map, String, Symbol, Vec, Error}; + +#[contracttype] +pub enum DataKey { + Member(Address), + Group(Symbol), + Transaction(Address, Symbol, u32), +} + +#[contracttype] +pub struct Member { + nickname: String, + address: Address, +} + +#[contracttype] +pub struct Group { + group_id: Symbol, + owner: Address, + total_amount: i128, + members: Map, +} + +#[contracttype] +pub struct Transaction { + user_id: Address, + group_id: Symbol, + amount: i128, + proof: String, + approvals: Vec
, +} + +#[contract] +pub struct Contract; + +#[contractimpl] +impl Contract { + // Member functions + pub fn set_member(env: Env, address: Address, nickname: String) { + let member = Member { nickname, address: address.clone() }; + env.storage().instance().set(&DataKey::Member(address), &member); + } + + pub fn get_member(env: Env, address: Address) -> Result { + env.storage().instance().get(&DataKey::Member(address)).ok_or_else(|| Error::from_contract_error(1)) + } + + // Group functions + pub fn set_group(env: Env, group_id: Symbol, owner: Address, total_amount: i128, members: Map) { + let group = Group { group_id: group_id.clone(), owner, total_amount, members }; + env.storage().instance().set(&DataKey::Group(group_id), &group); + } + + pub fn get_group(env: Env, group_id: Symbol) -> Result { + env.storage().instance().get(&DataKey::Group(group_id)).ok_or_else(|| Error::from_contract_error(2)) + } + + pub fn add_group_member(env: Env, group_id: Symbol, member_address: Address, balance: i128) -> Result<(), Error> { + let mut group: Group = env.storage().instance().get(&DataKey::Group(group_id.clone())).ok_or_else(|| Error::from_contract_error(2))?; + group.members.set(member_address, balance); + env.storage().instance().set(&DataKey::Group(group_id), &group); + Ok(()) + } + + pub fn update_group_member_balance(env: Env, group_id: Symbol, member_address: Address, new_balance: i128) -> Result<(), Error> { + let mut group: Group = env.storage().instance().get(&DataKey::Group(group_id.clone())).ok_or_else(|| Error::from_contract_error(2))?; + group.members.set(member_address, new_balance); + env.storage().instance().set(&DataKey::Group(group_id), &group); + Ok(()) + } + + // Transaction functions + pub fn set_transaction(env: Env, user_id: Address, group_id: Symbol, amount: i128, proof: String) { + let transaction = Transaction { + user_id: user_id.clone(), + group_id: group_id.clone(), + amount, + proof, + approvals: Vec::new(&env), + }; + let key = DataKey::Transaction(user_id, group_id, env.ledger().sequence()); + env.storage().instance().set(&key, &transaction); + } + + pub fn get_transaction(env: Env, user_id: Address, group_id: Symbol, sequence: u32) -> Result { + let key = DataKey::Transaction(user_id, group_id, sequence); + env.storage().instance().get(&key).ok_or_else(|| Error::from_contract_error(3)) + } + + pub fn add_approval(env: Env, user_id: Address, group_id: Symbol, sequence: u32, approver: Address) -> Result<(), Error> { + let key = DataKey::Transaction(user_id, group_id, sequence); + let mut transaction: Transaction = env.storage().instance().get(&key).ok_or_else(|| Error::from_contract_error(3))?; + transaction.approvals.push_back(approver); + env.storage().instance().set(&key, &transaction); + Ok(()) + } +} \ No newline at end of file From ef0bea54dc8d73d9a553832b2b561bdd516ecff7 Mon Sep 17 00:00:00 2001 From: Spoyte <104215259+Spoyte@users.noreply.github.com> Date: Sun, 13 Oct 2024 05:20:21 +0100 Subject: [PATCH 2/2] get and set mostly working --- contracts/StellarPay2.rs | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/contracts/StellarPay2.rs b/contracts/StellarPay2.rs index ec2c8ad..e7da138 100644 --- a/contracts/StellarPay2.rs +++ b/contracts/StellarPay2.rs @@ -5,7 +5,7 @@ use soroban_sdk::{contract, contracttype, contractimpl, Address, Env, Map, Strin pub enum DataKey { Member(Address), Group(Symbol), - Transaction(Address, Symbol, u32), + Transaction(Address), // Modified to only use Address } #[contracttype] @@ -18,7 +18,6 @@ pub struct Member { pub struct Group { group_id: Symbol, owner: Address, - total_amount: i128, members: Map, } @@ -26,7 +25,7 @@ pub struct Group { pub struct Transaction { user_id: Address, group_id: Symbol, - amount: i128, + amounts: Map, proof: String, approvals: Vec
, } @@ -47,8 +46,8 @@ impl Contract { } // Group functions - pub fn set_group(env: Env, group_id: Symbol, owner: Address, total_amount: i128, members: Map) { - let group = Group { group_id: group_id.clone(), owner, total_amount, members }; + pub fn set_group(env: Env, group_id: Symbol, owner: Address, members: Map) { + let group = Group { group_id: group_id.clone(), owner, members }; env.storage().instance().set(&DataKey::Group(group_id), &group); } @@ -71,28 +70,25 @@ impl Contract { } // Transaction functions - pub fn set_transaction(env: Env, user_id: Address, group_id: Symbol, amount: i128, proof: String) { + pub fn set_transaction(env: Env, user_id: Address, group_id: Symbol, amounts: Map, proof: String) { let transaction = Transaction { user_id: user_id.clone(), - group_id: group_id.clone(), - amount, + group_id, + amounts, proof, approvals: Vec::new(&env), }; - let key = DataKey::Transaction(user_id, group_id, env.ledger().sequence()); - env.storage().instance().set(&key, &transaction); + env.storage().instance().set(&DataKey::Transaction(user_id), &transaction); } - pub fn get_transaction(env: Env, user_id: Address, group_id: Symbol, sequence: u32) -> Result { - let key = DataKey::Transaction(user_id, group_id, sequence); - env.storage().instance().get(&key).ok_or_else(|| Error::from_contract_error(3)) + pub fn get_transaction(env: Env, user_id: Address) -> Result { + env.storage().instance().get(&DataKey::Transaction(user_id)).ok_or_else(|| Error::from_contract_error(3)) } - pub fn add_approval(env: Env, user_id: Address, group_id: Symbol, sequence: u32, approver: Address) -> Result<(), Error> { - let key = DataKey::Transaction(user_id, group_id, sequence); - let mut transaction: Transaction = env.storage().instance().get(&key).ok_or_else(|| Error::from_contract_error(3))?; + pub fn add_approval(env: Env, user_id: Address, approver: Address) -> Result<(), Error> { + let mut transaction: Transaction = env.storage().instance().get(&DataKey::Transaction(user_id.clone())).ok_or_else(|| Error::from_contract_error(3))?; transaction.approvals.push_back(approver); - env.storage().instance().set(&key, &transaction); + env.storage().instance().set(&DataKey::Transaction(user_id), &transaction); Ok(()) } -} \ No newline at end of file +}