@@ -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