Skip to content

Commit 23e72ca

Browse files
feat(payments): add dust limit (#23)
1 parent d8bbe8e commit 23e72ca

File tree

6 files changed

+186
-114
lines changed

6 files changed

+186
-114
lines changed

src/errors.cairo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use starknet::ContractAddress;
22

33
pub const ADDRESS_ALREADY_ALLOWED: felt252 = 'ADDRESS_ALREADY_ALLOWED';
4+
pub const INVALID_AMOUNT_BELOW_DUST_LIMIT: felt252 = 'INVALID_AMOUNT_BELOW_DUST_LIMIT';
45
pub const INVALID_AMOUNT_RATIO: felt252 = 'INVALID_AMOUNT_RATIO';
56
pub const INVALID_AMOUNT_TOO_LARGE: felt252 = 'INVALID_AMOUNT_TOO_LARGE';
67
pub const INVALID_DOWNCAST_AFTER_DIVISION: felt252 = 'INVALID_DOWNCAST_AFTER_DIVISION';

src/events.cairo

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
use starknet::ContractAddress;
22
use starkware_utils::signature::stark::HashType;
33

4+
#[derive(Debug, Drop, PartialEq, starknet::Event)]
5+
pub struct DustLimitSet {
6+
pub dust_limit: u128,
7+
}
8+
49
#[derive(Debug, Drop, PartialEq, starknet::Event)]
510
pub struct FeeSet {
611
pub fee: u128,

src/interface.cairo

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ pub trait IPayments<TContractState> {
2626

2727
// Setters:
2828

29+
fn set_dust_limit(ref self: TContractState, dust_limit: u128);
2930
fn set_fee(ref self: TContractState, fee: u128);
3031
fn set_fee_recipient(ref self: TContractState, recipient: ContractAddress);
3132

3233
// Getters:
3334

35+
fn get_dust_limit(self: @TContractState) -> u128;
3436
fn get_fee_limit(self: @TContractState) -> u128;
3537
fn get_fee(self: @TContractState) -> u128;
3638
fn get_fee_recipient(self: @TContractState) -> ContractAddress;

src/payments.cairo

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ pub mod payments {
2121
use starkware_utils::signature::stark::{HashType, Signature};
2222
use starkware_utils::time::time::Time;
2323
use crate::errors::{
24-
ADDRESS_ALREADY_ALLOWED, INVALID_AMOUNT_RATIO, INVALID_AMOUNT_TOO_LARGE,
25-
INVALID_DOWNCAST_AFTER_DIVISION, INVALID_HIGH_FEE, INVALID_HIGH_FEE_LIMIT,
26-
INVALID_TOKEN_PAIR, INVALID_TRADE_SAME_USER, INVALID_ZERO_ADDRESS, INVALID_ZERO_AMOUNT,
27-
INVALID_ZERO_TOKEN, ORDER_EXPIRED, TOKEN_ALREADY_REGISTERED, TOKEN_NOT_REGISTERED,
28-
UNALLOWED_ADDRESS, UNAPPROVED_COUNTERPARTY, transfer_failed_error,
24+
ADDRESS_ALREADY_ALLOWED, INVALID_AMOUNT_BELOW_DUST_LIMIT, INVALID_AMOUNT_RATIO,
25+
INVALID_AMOUNT_TOO_LARGE, INVALID_DOWNCAST_AFTER_DIVISION, INVALID_HIGH_FEE,
26+
INVALID_HIGH_FEE_LIMIT, INVALID_TOKEN_PAIR, INVALID_TRADE_SAME_USER, INVALID_ZERO_ADDRESS,
27+
INVALID_ZERO_AMOUNT, INVALID_ZERO_TOKEN, ORDER_EXPIRED, TOKEN_ALREADY_REGISTERED,
28+
TOKEN_NOT_REGISTERED, UNALLOWED_ADDRESS, UNAPPROVED_COUNTERPARTY, transfer_failed_error,
2929
};
3030
use crate::events::{
31-
AddressAllowed, AddressDisallowed, FeeRecipientSet, FeeSet, OrderCanceled, TokenRegistered,
32-
TokenRemoved, TradeExecuted,
31+
AddressAllowed, AddressDisallowed, DustLimitSet, FeeRecipientSet, FeeSet, OrderCanceled,
32+
TokenRegistered, TokenRemoved, TradeExecuted,
3333
};
3434
use crate::interface::IPayments;
3535
use crate::order::Order;
@@ -82,6 +82,7 @@ pub mod payments {
8282
#[substorage(v0)]
8383
src5: SRC5Component::Storage,
8484
// --- Payment ---
85+
dust_limit: u128,
8586
fee_limit: u128,
8687
fee_recipient: ContractAddress,
8788
fee: u128,
@@ -114,6 +115,7 @@ pub mod payments {
114115
AddressDisallowed: AddressDisallowed,
115116
TradeExecuted: TradeExecuted,
116117
OrderCanceled: OrderCanceled,
118+
DustLimitSet: DustLimitSet,
117119
}
118120

119121

@@ -122,13 +124,15 @@ pub mod payments {
122124
ref self: ContractState,
123125
governance_admin: ContractAddress,
124126
upgrade_delay: u64,
127+
dust_limit: u128,
125128
fee_limit: u128,
126129
fee_recipient: ContractAddress,
127130
fee: u128,
128131
) {
129132
self.roles.initialize(:governance_admin);
130133
self.replaceability.initialize(:upgrade_delay);
131134

135+
self._set_dust_limit(dust_limit);
132136
assert(fee_limit <= MAX_BASIS_POINTS.into(), INVALID_HIGH_FEE_LIMIT);
133137
self.fee_limit.write(fee_limit);
134138
self._set_fee_recipient(recipient: fee_recipient);
@@ -329,6 +333,11 @@ pub mod payments {
329333

330334
// Setters:
331335

336+
fn set_dust_limit(ref self: ContractState, dust_limit: u128) {
337+
self.roles.only_operator();
338+
339+
self._set_dust_limit(:dust_limit);
340+
}
332341
fn set_fee(ref self: ContractState, fee: u128) {
333342
self.roles.only_operator();
334343

@@ -342,6 +351,10 @@ pub mod payments {
342351

343352
// Getters:
344353

354+
fn get_dust_limit(self: @ContractState) -> u128 {
355+
self.dust_limit.read()
356+
}
357+
345358
fn get_fee_limit(self: @ContractState) -> u128 {
346359
self.fee_limit.read()
347360
}
@@ -368,6 +381,14 @@ pub mod payments {
368381
// Internal methods
369382
#[generate_trait]
370383
pub impl ImplInternalPayments of InternalPaymentsTrait {
384+
fn _set_dust_limit(ref self: ContractState, dust_limit: u128) {
385+
assert(dust_limit.is_non_zero(), INVALID_ZERO_AMOUNT);
386+
self.dust_limit.write(dust_limit);
387+
388+
// Emit an event.
389+
self.emit(DustLimitSet { dust_limit });
390+
}
391+
371392
fn _set_fee(ref self: ContractState, fee: u128) {
372393
assert(fee <= self.fee_limit.read(), INVALID_HIGH_FEE);
373394
self.fee.write(fee);
@@ -476,8 +497,9 @@ pub mod payments {
476497
INVALID_AMOUNT_RATIO,
477498
);
478499

479-
assert(order_a_actual_sell_amount.is_non_zero(), INVALID_ZERO_AMOUNT);
480-
assert(order_a_actual_buy_amount.is_non_zero(), INVALID_ZERO_AMOUNT);
500+
let dust_limit = self.dust_limit.read();
501+
assert(order_a_actual_sell_amount >= dust_limit, INVALID_AMOUNT_BELOW_DUST_LIMIT);
502+
assert(order_a_actual_buy_amount >= dust_limit, INVALID_AMOUNT_BELOW_DUST_LIMIT);
481503

482504
// Validate approved counterparties.
483505
assert(

0 commit comments

Comments
 (0)