@@ -21,13 +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- INVALID_AMOUNT_RATIO , INVALID_AMOUNT_TOO_LARGE , INVALID_DOWNCAST_AFTER_DIVISION ,
25- INVALID_HIGH_FEE , INVALID_HIGH_FEE_LIMIT , INVALID_TOKEN_PAIR , INVALID_TRADE_SAME_USER ,
26- INVALID_ZERO_ADDRESS , INVALID_ZERO_AMOUNT , INVALID_ZERO_TOKEN , ORDER_EXPIRED ,
27- TOKEN_ALREADY_REGISTERED , TOKEN_NOT_REGISTERED , UNALLOWED_ADDRESS , transfer_failed_error,
24+ ADDRESS_ALREADY_WHITELISTED , ADDRESS_NOT_WHITELISTED , 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 , transfer_failed_error,
2829 };
2930 use crate :: events :: {
30- FeeRecipientSet , FeeSet , OrderCanceled , TokenRegistered , TokenRemoved , TradeExecuted ,
31+ AddressRemovedFromWhitelist , AddressWhitelisted , FeeRecipientSet , FeeSet , OrderCanceled ,
32+ TokenRegistered , TokenRemoved , TradeExecuted ,
3133 };
3234 use crate :: interface :: IPayments ;
3335 use crate :: order :: Order ;
@@ -85,6 +87,8 @@ pub mod payments {
8587 fee : u128 ,
8688 // Whitelisted tokens.
8789 tokens : Map <ContractAddress , bool >,
90+ // Whitelisted addresses.
91+ whitelist : Map <ContractAddress , bool >,
8892 // Order hash to fulfilled sell amount.
8993 fulfillment : Map <HashType , u128 >,
9094 }
@@ -106,6 +110,8 @@ pub mod payments {
106110 FeeRecipientSet : FeeRecipientSet ,
107111 TokenRegistered : TokenRegistered ,
108112 TokenRemoved : TokenRemoved ,
113+ AddressWhitelisted : AddressWhitelisted ,
114+ AddressRemovedFromWhitelist : AddressRemovedFromWhitelist ,
109115 TradeExecuted : TradeExecuted ,
110116 OrderCanceled : OrderCanceled ,
111117 }
@@ -282,6 +288,35 @@ pub mod payments {
282288 self . tokens. read (token )
283289 }
284290
291+ // These functions are used by the contract to control who is allowed to take part in order
292+ // matching and settlement. Only whitelisted addresses are permitted to trade.
293+
294+ fn whitelist_address (ref self : ContractState , address : ContractAddress ) {
295+ self . roles. only_app_governor ();
296+
297+ assert (! self . is_whitelisted (address ), ADDRESS_ALREADY_WHITELISTED );
298+ self . whitelist. write (address , true );
299+
300+ // Emit an event.
301+ self . emit (AddressWhitelisted { address });
302+ }
303+
304+ fn remove_from_whitelist (ref self : ContractState , address : ContractAddress ) {
305+ self . roles. only_app_governor ();
306+
307+ assert (self . is_whitelisted (address ), ADDRESS_NOT_WHITELISTED );
308+ self . whitelist. write (address , false );
309+
310+ // Emit an event.
311+ self . emit (AddressRemovedFromWhitelist { address });
312+ }
313+
314+ fn is_whitelisted (self : @ ContractState , address : ContractAddress ) -> bool {
315+ assert (address . is_non_zero (), INVALID_ZERO_ADDRESS );
316+ self . whitelist. read (address )
317+ }
318+
319+
285320 fn cancel_orders (ref self : ContractState , orders : Span <Order >) {
286321 self . roles. only_operator ();
287322
@@ -370,7 +405,7 @@ pub mod payments {
370405 /// amounts.
371406 fn _validate_order (self : @ ContractState , order : Order ) {
372407 assert (order . expiry >= Time :: now (), ORDER_EXPIRED );
373- assert (order . user. is_non_zero ( ), INVALID_ZERO_ADDRESS );
408+ assert (self . is_whitelisted ( order . user), ADDRESS_NOT_WHITELISTED );
374409
375410 assert (order . sell_amount. is_non_zero (), INVALID_ZERO_AMOUNT );
376411 assert (order . buy_amount. is_non_zero (), INVALID_ZERO_AMOUNT );
0 commit comments