@@ -5,8 +5,8 @@ use crate::common::{FEE_PENALTY_INCREASE_EPOCHS, FEE_PENALTY_INCREASE_PERCENT};
55use super :: { common, events, validation} ;
66
77use super :: common:: {
8- FREE_ORDER_FROM_STORAGE_MIN_PENALTIES , Order , OrderBookFungiblePayment , OrderInputParams ,
9- OrderType , PERCENT_BASE_POINTS , Transfer ,
8+ FREE_ORDER_FROM_STORAGE_MIN_PENALTIES , Order , OrderInputParams , OrderType , PERCENT_BASE_POINTS ,
9+ Transfer ,
1010} ;
1111
1212#[ multiversx_sc:: module]
@@ -15,7 +15,7 @@ pub trait OrdersModule:
1515{
1616 fn create_order (
1717 & self ,
18- payment : OrderBookFungiblePayment < Self :: Api > ,
18+ payment : FungiblePayment < Self :: Api > ,
1919 params : OrderInputParams < Self :: Api > ,
2020 order_type : OrderType ,
2121 ) {
@@ -150,33 +150,35 @@ pub trait OrdersModule:
150150 "Too early to free order"
151151 ) ;
152152
153+ // penalty_count is at least FREE_ORDER_FROM_STORAGE_MIN_PENALTIES (6),
154+ // so this cannot be zero
153155 let penalty_percent = penalty_count * FEE_PENALTY_INCREASE_PERCENT ;
154- let penalty_amount = self . rule_of_three (
155- & BigUint :: from ( penalty_percent) ,
156- & BigUint :: from ( PERCENT_BASE_POINTS ) ,
157- & order. input_amount ,
158- ) ;
159- let amount = & order. input_amount - & penalty_amount;
160-
161- let creator_transfer = Transfer {
162- to : order. creator . clone ( ) ,
163- payment : OrderBookFungiblePayment {
164- token_id : token_id. clone ( ) ,
165- amount,
166- } ,
167- } ;
168- let caller_transfer = Transfer {
169- to : caller. clone ( ) ,
170- payment : OrderBookFungiblePayment {
171- token_id,
172- amount : penalty_amount,
173- } ,
174- } ;
156+
157+ let penalty_amount = order
158+ . input_amount
159+ . as_big_uint ( )
160+ . proportion ( penalty_percent, PERCENT_BASE_POINTS ) ;
161+
162+ let creator_amount = order. input_amount . as_big_uint ( ) - & penalty_amount;
175163
176164 self . orders ( order_id) . clear ( ) ;
165+
177166 let mut transfers = ManagedVec :: new ( ) ;
178- transfers. push ( creator_transfer) ;
179- transfers. push ( caller_transfer) ;
167+ if let Some ( creator_amount_nz) = NonZeroBigUint :: new ( creator_amount) {
168+ let creator_transfer = Transfer {
169+ to : order. creator . clone ( ) ,
170+ payment : FungiblePayment :: new ( token_id. clone ( ) , creator_amount_nz) ,
171+ } ;
172+ transfers. push ( creator_transfer) ;
173+ }
174+
175+ if let Some ( penalty_amount_nz) = NonZeroBigUint :: new ( penalty_amount) {
176+ let caller_transfer = Transfer {
177+ to : caller. clone ( ) ,
178+ payment : FungiblePayment :: new ( token_id. clone ( ) , penalty_amount_nz) ,
179+ } ;
180+ transfers. push ( caller_transfer) ;
181+ }
180182 self . execute_transfers ( transfers) ;
181183
182184 order
@@ -199,21 +201,23 @@ pub trait OrdersModule:
199201
200202 let penalty_count = ( epoch - order. create_epoch ) / FEE_PENALTY_INCREASE_EPOCHS ;
201203 let penalty_percent = penalty_count * FEE_PENALTY_INCREASE_PERCENT ;
202- let penalty_amount = self . rule_of_three (
203- & BigUint :: from ( penalty_percent) ,
204- & BigUint :: from ( PERCENT_BASE_POINTS ) ,
205- & order. input_amount ,
206- ) ;
207- let amount = & order. input_amount - & penalty_amount;
204+ let penalty_amount = order
205+ . input_amount
206+ . as_big_uint ( )
207+ . proportion ( penalty_percent, PERCENT_BASE_POINTS ) ;
208208
209- let transfer = Transfer {
210- to : caller. clone ( ) ,
211- payment : OrderBookFungiblePayment { token_id, amount } ,
212- } ;
209+ let amount = order. input_amount . as_big_uint ( ) - & penalty_amount;
213210
214211 self . orders ( order_id) . clear ( ) ;
212+
215213 let mut transfers = ManagedVec :: new ( ) ;
216- transfers. push ( transfer) ;
214+ if let Some ( nz_amount) = NonZeroBigUint :: new ( amount) {
215+ let transfer = Transfer {
216+ to : caller. clone ( ) ,
217+ payment : FungiblePayment :: new ( token_id, nz_amount) ,
218+ } ;
219+ transfers. push ( transfer) ;
220+ }
217221 self . execute_transfers ( transfers) ;
218222
219223 order
@@ -297,8 +301,8 @@ pub trait OrdersModule:
297301 let mut amount_requested = BigUint :: zero ( ) ;
298302
299303 orders. iter ( ) . for_each ( |x| {
300- amount_paid += & x. input_amount ;
301- amount_requested += & x. output_amount ;
304+ amount_paid += x. input_amount . as_big_uint ( ) ;
305+ amount_requested += x. output_amount . as_big_uint ( ) ;
302306 } ) ;
303307
304308 ( amount_paid, amount_requested)
@@ -312,54 +316,50 @@ pub trait OrdersModule:
312316 leftover : BigUint ,
313317 ) -> ManagedVec < Transfer < Self :: Api > > {
314318 let mut transfers: ManagedVec < Self :: Api , Transfer < Self :: Api > > = ManagedVec :: new ( ) ;
315-
316- let mut match_provider_transfer = Transfer {
317- to : self . blockchain ( ) . get_caller ( ) ,
318- payment : OrderBookFungiblePayment {
319- token_id : token_requested. clone ( ) ,
320- amount : BigUint :: zero ( ) ,
321- } ,
322- } ;
319+ let mut match_provider_amount_accumulator = BigUint :: zero ( ) ;
323320
324321 for order in orders. iter ( ) {
325322 let match_provider_amount =
326323 self . calculate_fee_amount ( & order. output_amount , & order. fee_config ) ;
327- let creator_amount = & order. output_amount - & match_provider_amount;
324+ let creator_amount = order. output_amount . as_big_uint ( ) - & match_provider_amount;
328325
329- let order_deal = self . rule_of_three ( & order. input_amount , & total_paid, & leftover) ;
330- let match_provider_deal_amount = self . rule_of_three (
331- & order. deal_config . match_provider_percent . into ( ) ,
332- & PERCENT_BASE_POINTS . into ( ) ,
333- & order_deal,
326+ let order_deal = order. input_amount . as_big_uint ( ) * & leftover / & total_paid;
327+ let match_provider_deal_amount = order_deal. proportion (
328+ order. deal_config . match_provider_percent ,
329+ PERCENT_BASE_POINTS ,
334330 ) ;
335331 let creator_deal_amount = & order_deal - & match_provider_deal_amount;
336332
337333 transfers. push ( Transfer {
338334 to : order. creator . clone ( ) ,
339- payment : OrderBookFungiblePayment {
340- token_id : token_requested. clone ( ) ,
341- amount : creator_amount + creator_deal_amount,
342- } ,
335+ payment : FungiblePayment :: new (
336+ token_requested. clone ( ) ,
337+ NonZeroBigUint :: new_or_panic ( creator_amount + creator_deal_amount) ,
338+ ) ,
343339 } ) ;
344340
345- match_provider_transfer. payment . amount +=
346- match_provider_amount + match_provider_deal_amount;
341+ match_provider_amount_accumulator += match_provider_amount + match_provider_deal_amount;
342+ }
343+
344+ if match_provider_amount_accumulator > 0 {
345+ transfers. push ( Transfer {
346+ to : self . blockchain ( ) . get_caller ( ) ,
347+ payment : FungiblePayment :: new (
348+ token_requested. clone ( ) ,
349+ NonZeroBigUint :: new_or_panic ( match_provider_amount_accumulator) ,
350+ ) ,
351+ } ) ;
347352 }
348- transfers. push ( match_provider_transfer) ;
349353
350354 transfers
351355 }
352356
353357 fn execute_transfers ( & self , transfers : ManagedVec < Transfer < Self :: Api > > ) {
354358 for transfer in & transfers {
355- if transfer. payment . amount > 0 {
356- let token_id = transfer. payment . token_id . clone ( ) ;
357- let amount = NonZeroBigUint :: new ( transfer. payment . amount . clone ( ) ) . unwrap ( ) ;
358- self . tx ( )
359- . to ( & transfer. to )
360- . payment ( Payment :: new ( token_id, 0 , amount) )
361- . transfer ( ) ;
362- }
359+ self . tx ( )
360+ . to ( & transfer. to )
361+ . payment ( transfer. payment . as_payment_refs ( ) )
362+ . transfer ( ) ;
363363 }
364364 }
365365
0 commit comments