Skip to content

Commit f9d8b8e

Browse files
chore(payments): check non-zero amount before transfer
1 parent 621bee3 commit f9d8b8e

File tree

2 files changed

+35
-33
lines changed

2 files changed

+35
-33
lines changed

src/payments.cairo

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -214,42 +214,45 @@ pub mod payments {
214214
let fee_a = self._calculate_fee(order_a_actual_sell_amount);
215215
// For `order_b`, the actual sold amount is `order_a_actual_buy_amount`.
216216
let fee_b = self._calculate_fee(order_a_actual_buy_amount);
217-
assert_with_byte_array(
218-
sell_token.transfer_from(order_a.user, fee_recipient, fee_a.into()),
219-
transfer_failed_error(
220-
token: order_a.sell_token, sender: order_a.user, amount: fee_a,
221-
),
222-
);
223-
assert_with_byte_array(
224-
buy_token.transfer_from(order_b.user, fee_recipient, fee_b.into()),
225-
transfer_failed_error(
226-
token: order_a.buy_token, sender: order_b.user, amount: fee_b,
227-
),
228-
);
217+
218+
// Transfer fees only if they are non-zero
219+
if fee_a.is_non_zero() {
220+
assert_with_byte_array(
221+
sell_token.transfer_from(order_a.user, fee_recipient, fee_a.into()),
222+
transfer_failed_error(
223+
token: order_a.sell_token, sender: order_a.user, amount: fee_a,
224+
),
225+
);
226+
}
227+
if fee_b.is_non_zero() {
228+
assert_with_byte_array(
229+
buy_token.transfer_from(order_b.user, fee_recipient, fee_b.into()),
230+
transfer_failed_error(
231+
token: order_a.buy_token, sender: order_b.user, amount: fee_b,
232+
),
233+
);
234+
}
229235

230236
// Transfer the actual amounts.
231-
assert_with_byte_array(
232-
sell_token
233-
.transfer_from(
234-
order_a.user, order_b.user, (order_a_actual_sell_amount - fee_a).into(),
237+
let net_sell_amount = order_a_actual_sell_amount - fee_a;
238+
let net_buy_amount = order_a_actual_buy_amount - fee_b;
239+
240+
if net_sell_amount.is_non_zero() {
241+
assert_with_byte_array(
242+
sell_token.transfer_from(order_a.user, order_b.user, net_sell_amount.into()),
243+
transfer_failed_error(
244+
token: order_a.sell_token, sender: order_a.user, amount: net_sell_amount,
235245
),
236-
transfer_failed_error(
237-
token: order_a.sell_token,
238-
sender: order_a.user,
239-
amount: order_a_actual_sell_amount - fee_a,
240-
),
241-
);
242-
assert_with_byte_array(
243-
buy_token
244-
.transfer_from(
245-
order_b.user, order_a.user, (order_a_actual_buy_amount - fee_b).into(),
246+
);
247+
}
248+
if net_buy_amount.is_non_zero() {
249+
assert_with_byte_array(
250+
buy_token.transfer_from(order_b.user, order_a.user, net_buy_amount.into()),
251+
transfer_failed_error(
252+
token: order_a.buy_token, sender: order_b.user, amount: net_buy_amount,
246253
),
247-
transfer_failed_error(
248-
token: order_a.buy_token,
249-
sender: order_b.user,
250-
amount: order_a_actual_buy_amount - fee_b,
251-
),
252-
);
254+
);
255+
}
253256

254257
// Emit an event.
255258
self

src/tests/test_payments.cairo

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,6 @@ fn test_invalid_trade_scenarios() {
574574
initial_balance: constants::INITIAL_BALANCE,
575575
);
576576
let dispatcher = IPaymentsSafeDispatcher { contract_address };
577-
let mut spy = snforge_std::spy_events();
578577

579578
// Add tokens.
580579
cheat_caller_address_once(:contract_address, caller_address: testing_constants::APP_GOVERNOR);

0 commit comments

Comments
 (0)