Location: contracts/stellar-save/src/lib.rs
pub fn get_payout_queue(
env: Env,
group_id: u64,
) -> Result<Vec<Address>, StellarSaveError>- Loads group data to verify existence
- Retrieves all members from storage using
StorageKeyBuilder::group_members() - Returns vector of member addresses
- Gets each member's payout position using
get_payout_position() - Implements selection sort to order by position
- Maintains position-address pairs during sorting
- Checks each member using
has_received_payout() - Only includes members who haven't received payout yet
- Skips members who already got their payout
- Returns
Vec<Address>sorted by payout position - Only contains members still waiting for payout
- Empty vector if all members received payout
-
test_get_payout_queue_all_pending
- Verifies queue with all members pending
- Expected: 3 members in order
-
test_get_payout_queue_some_received
- Verifies queue after one member received payout
- Expected: 2 remaining members in order
-
test_get_payout_queue_all_received
- Verifies empty queue when all received payout
- Expected: Empty vector
-
test_get_payout_queue_group_not_found
- Verifies error when group doesn't exist
- Expected:
StellarSaveError::GroupNotFound
Selection Sort Implementation:
1. For each position i in queue:
- Find minimum position from i to end
- Swap if needed
2. Extract addresses in sorted order
3. Return ordered vector
GroupNotFound- When group doesn't exist- Propagates errors from
has_received_payout()andget_payout_position()
let queue = contract.get_payout_queue(env, group_id)?;
// queue[0] = next recipient
// queue[1] = second in line
// queue[2] = third in line
// etc.- Uses
StorageKeyBuilder::group_data()for group validation - Uses
StorageKeyBuilder::group_members()for member list - Uses
has_received_payout()to filter - Uses
get_payout_position()for sorting
- Time complexity: O(n²) for sorting (selection sort)
- Space complexity: O(n) for queue entries
- Storage reads: 2 + 2n (group + members + n positions + n payout checks)
- Acceptable for typical group sizes (< 100 members)
- Display upcoming payout order to users
- Determine next recipient for payout execution
- Show remaining members in rotation
- Track payout progress
- Code compiles successfully (pending existing codebase fixes)
- All 4 tests added
- Function integrated into contract impl block
- Follows existing code patterns