Initialize the contract. Must be called once after deployment.
fn initialize(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
) -> Result<(), RoscaError>
Upgrade the contract WASM. Only the contract admin can call this.
fn upgrade(
env: soroban_sdk::Env,
new_wasm_hash: soroban_sdk::BytesN<32>,
) -> Result<(), RoscaError>
Transfer contract admin role.
fn set_contract_admin(
env: soroban_sdk::Env,
new_admin: soroban_sdk::Address,
) -> Result<(), RoscaError>
Create a new ROSCA group. Caller becomes admin.
fn create_group(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
config: GroupConfig,
) -> Result
Admin invites a member. For AdminOnly policy, member is directly approved. For vote policies, a pending vote is created (may resolve immediately). During Active status, MajorityVote is forced regardless of admission_policy.
fn invite_member(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
candidate: soroban_sdk::Address,
) -> Result<(), RoscaError>
Cast a vote on a pending membership.
fn cast_vote(
env: soroban_sdk::Env,
voter: soroban_sdk::Address,
group_id: u64,
candidate: soroban_sdk::Address,
approve: bool,
) -> Result<(), RoscaError>
Invited member accepts the invitation. Transitions from Invited → Approved.
fn accept_invite(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Invited member declines the invitation. Removes them from the group.
fn decline_invite(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Member deposits collateral. Required before group can start.
fn deposit_collateral(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Admin locks the group — no more members can join.
fn lock_group(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Admin starts the ROSCA. All members must be in Ready status.
fn start_group(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Transfer group admin role to another member.
fn transfer_group_admin(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
new_admin: soroban_sdk::Address,
) -> Result<(), RoscaError>
Member voluntarily leaves the group (Recruiting or Locked only). Admin cannot leave — must transfer_group_admin first. Refunds any deposited collateral.
fn leave_group(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Approved member joins an Active group. Deposits collateral + back-payment. Back-payment = settled_rounds × contribution, distributed to each past beneficiary. total_rounds is incremented by 1.
fn join_active(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Member contributes to the current round.
fn contribute(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Advance to next round. Handles defaults, payouts, and bid resolution. Can be called by anyone after the deadline (+ grace period).
fn advance_round(env: soroban_sdk::Env, group_id: u64) -> Result<(), RoscaError>
Submit a bid in Bidding mode (before round deadline).
fn submit_bid(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
discount_bps: u32,
) -> Result<(), RoscaError>
Admin cancels group (only in Recruiting or Locked status).
fn cancel_group(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Admin dissolves an active group. Returns remaining collateral.
fn dissolve_group(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
After a completed group, admin can start a new cycle.
fn start_new_cycle(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
Member withdraws collateral after group is Completed.
fn withdraw_collateral(
env: soroban_sdk::Env,
member: soroban_sdk::Address,
group_id: u64,
) -> Result<(), RoscaError>
fn remove_member(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
group_id: u64,
member: soroban_sdk::Address,
) -> Result<(), RoscaError>
fn get_group(env: soroban_sdk::Env, group_id: u64) -> Result
fn get_members_list(
env: soroban_sdk::Env,
group_id: u64,
) -> soroban_sdk::Vec
fn get_member(
env: soroban_sdk::Env,
group_id: u64,
address: soroban_sdk::Address,
) -> Result
fn get_rounds_list(
env: soroban_sdk::Env,
group_id: u64,
) -> soroban_sdk::Vec
fn get_round(
env: soroban_sdk::Env,
group_id: u64,
round_index: u32,
) -> Result
fn get_current_round(
env: soroban_sdk::Env,
group_id: u64,
) -> Result
fn get_user_groups(
env: soroban_sdk::Env,
user: soroban_sdk::Address,
) -> soroban_sdk::Vec
fn get_votes_list(
env: soroban_sdk::Env,
group_id: u64,
) -> soroban_sdk::Vec
fn get_bids_list(env: soroban_sdk::Env, group_id: u64) -> soroban_sdk::Vec
fn get_contract_admin(
env: soroban_sdk::Env,
) -> Result