Description
Implement a batch donation feature that allows donors to contribute to multiple campaigns in a single transaction. This enhancement significantly improves user experience by reducing transaction costs and time for donors who want to support multiple campaigns.
Code Reference
/// Batch donations to multiple campaigns
fn batch_donate(
ref self: TContractState,
campaign_amounts: Array<(u256, u256)> // Array of (campaign_id, amount)
);
Functional Requirements
The batch_donate function should:
- Accept an array of (campaign_id, amount) tuples
- Process multiple donations in a single transaction
- Validate each donation individually
- Handle partial failures gracefully
- Emit events for each successful donation
Tasks
Technical Considerations
1. Token Approval Optimization
// Calculate total amount needed
let total_amount = calculate_total_amount(campaign_amounts);
// Single transfer for all donations
token.transfer_from(donor, contract, total_amount);
// Then distribute to individual campaigns
2. Error Handling Strategies
All-or-Nothing
- If any donation fails, revert entire transaction
- Pros: Simple, atomic
- Cons: One invalid campaign blocks all donations
3. Gas Optimization
- Limit maximum campaigns per batch (e.g., 10-20)
- Consider gas refunds for unused donations
- Optimize storage access patterns
4. Event Structure
#[derive(Drop, starknet::Event)]
struct BatchDonationProcessed {
donor: ContractAddress,
total_campaigns: u32,
successful_donations: u32,
total_amount: u256,
results: Array<DonationResult>,
}
#[derive(Drop, starknet::Event)]
struct DonationResult {
campaign_id: u256,
amount: u256,
success: bool,
donation_id: u256,
}
Acceptance Criteria
Security Considerations
- Reentrancy protection
- Integer overflow in the total calculation
- Denial of Service via large arrays
Description
Implement a batch donation feature that allows donors to contribute to multiple campaigns in a single transaction. This enhancement significantly improves user experience by reducing transaction costs and time for donors who want to support multiple campaigns.
Code Reference
Functional Requirements
The
batch_donatefunction should:Tasks
Technical Considerations
1. Token Approval Optimization
2. Error Handling Strategies
All-or-Nothing
3. Gas Optimization
4. Event Structure
Acceptance Criteria
Security Considerations