Skip to content

Latest commit

 

History

History
93 lines (73 loc) · 2.64 KB

File metadata and controls

93 lines (73 loc) · 2.64 KB

Validate Payout Recipient Implementation Summary

Issue #226: Implement validate_payout_recipient Function

Implementation Complete ✓

Location: contracts/stellar-save/src/lib.rs

Function Signature

pub fn validate_payout_recipient(
    env: Env,
    group_id: u64,
    recipient: Address,
) -> Result<bool, StellarSaveError>

Implementation Details

1. Check is Member

  • Verifies recipient has a member profile in the group
  • Uses StorageKeyBuilder::member_profile to check existence
  • Returns false if not a member

2. Check Hasn't Received Payout

  • Calls has_received_payout() to verify recipient hasn't already been paid
  • Returns false if already received payout
  • Ensures each member receives exactly one payout

3. Check is Next in Queue

  • Gets recipient's payout position using get_payout_position()
  • Compares position with group's current cycle
  • Returns false if position doesn't match current cycle
  • Ensures correct rotation order

4. Return Validation Result

  • Returns Ok(true) if all checks pass
  • Returns Ok(false) if any check fails
  • Returns Err(StellarSaveError::GroupNotFound) if group doesn't exist

Tests Added (5 tests)

  1. test_validate_payout_recipient_not_member

    • Verifies non-members return false
    • Expected: false
  2. test_validate_payout_recipient_already_received

    • Verifies members who already received payout return false
    • Expected: false
  3. test_validate_payout_recipient_wrong_position

    • Verifies members not next in queue return false
    • Expected: false
  4. test_validate_payout_recipient_valid

    • Verifies eligible recipient returns true
    • Expected: true
  5. test_validate_payout_recipient_group_not_found

    • Verifies error when group doesn't exist
    • Expected: StellarSaveError::GroupNotFound

Error Handling

  • GroupNotFound - When group doesn't exist
  • NotMember - Handled internally by returning false
  • All other validation failures return Ok(false)

Usage Example

let is_eligible = contract.validate_payout_recipient(
    env,
    group_id,
    recipient_address
)?;

if is_eligible {
    // Execute payout
} else {
    // Reject payout
}

Integration Points

  • Uses has_received_payout() for payout history check
  • Uses get_payout_position() for queue position check
  • Uses StorageKeyBuilder::member_profile() for membership check
  • Uses StorageKeyBuilder::group_data() for group validation

Status: Ready for Testing

  • Code compiles successfully (pending existing codebase fixes)
  • All 5 tests added
  • Function integrated into contract impl block
  • Follows existing code patterns