Skip to content

Commit f0b0c81

Browse files
authored
Merge pull request #18 from Marvy247/feat/pool-pay-multi-token
feat: add multi-token batch payment support to pool_pay
2 parents 82fbb39 + 670f0b9 commit f0b0c81

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

contracts/sharpy/src/lib.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -245,20 +245,26 @@ impl SharpyContract {
245245
payer.require_auth();
246246
assert!(!payments.is_empty(), "payments must not be empty");
247247

248-
let mut total: i128 = 0;
248+
// Phase 1: Validate all invoices and group totals by token
249+
let mut token_totals: Map<Address, i128> = Map::new(&env);
249250
for p in payments.iter() {
250251
let inv = load_invoice(&env, p.invoice_id);
251252
assert!(inv.status == InvoiceStatus::Pending, "invoice is not pending");
252253
assert!(p.amount > 0, "payment amount must be positive");
253254
let inv_total: i128 = inv.amounts.iter().sum();
254255
assert!(inv.funded + p.amount <= inv_total, "payment exceeds remaining balance");
255-
total += p.amount;
256+
let token = inv.tokens.get(0).expect("no token");
257+
let prev = token_totals.get(token.clone()).unwrap_or(0);
258+
token_totals.set(token, prev + p.amount);
256259
}
257260

258-
let first = load_invoice(&env, payments.get(0).unwrap().invoice_id);
259-
let token_client = token::Client::new(&env, &first.tokens.get(0).expect("no token"));
260-
token_client.transfer(&payer, &env.current_contract_address(), &total);
261+
// Phase 2: Transfer tokens — one transfer per unique token
262+
for (token, amount) in token_totals.iter() {
263+
let token_client = token::Client::new(&env, &token);
264+
token_client.transfer(&payer, &env.current_contract_address(), &amount);
265+
}
261266

267+
// Phase 3: Update each invoice's state
262268
for p in payments.iter() {
263269
let mut inv = load_invoice(&env, p.invoice_id);
264270
inv.payments.push_back(Payment { payer: payer.clone(), amount: p.amount, tip: 0 });

contracts/sharpy/src/test.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@ mod tests {
77
SharpyContractClient,
88
};
99

10+
fn setup_with_tokens(
11+
env: &Env,
12+
payer: &Address,
13+
amounts: &[i128],
14+
) -> (Address, Address) {
15+
let admin = Address::generate(env);
16+
let token_a = env.register_stellar_asset_contract(admin.clone());
17+
let token_b = env.register_stellar_asset_contract(admin);
18+
let sac_a = token::StellarAssetClient::new(env, &token_a);
19+
let sac_b = token::StellarAssetClient::new(env, &token_b);
20+
sac_a.mint(payer, &amounts[0]);
21+
sac_b.mint(payer, &amounts[1]);
22+
(token_a, token_b)
23+
}
24+
1025
fn setup() -> (Env, SharpyContractClient<'static>) {
1126
let env = Env::default();
1227
env.mock_all_auths();

0 commit comments

Comments
 (0)