diff --git a/contracts/StellarPay2.rs b/contracts/StellarPay2.rs new file mode 100644 index 0000000..e7da138 --- /dev/null +++ b/contracts/StellarPay2.rs @@ -0,0 +1,94 @@ +#![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), // Modified to only use Address +} + +#[contracttype] +pub struct Member { + nickname: String, + address: Address, +} + +#[contracttype] +pub struct Group { + group_id: Symbol, + owner: Address, + members: Map, +} + +#[contracttype] +pub struct Transaction { + user_id: Address, + group_id: Symbol, + amounts: Map, + 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, members: Map) { + let group = Group { group_id: group_id.clone(), owner, 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, amounts: Map, proof: String) { + let transaction = Transaction { + user_id: user_id.clone(), + group_id, + amounts, + proof, + approvals: Vec::new(&env), + }; + env.storage().instance().set(&DataKey::Transaction(user_id), &transaction); + } + + 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, 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(&DataKey::Transaction(user_id), &transaction); + Ok(()) + } +}