@@ -107,44 +107,11 @@ pub mod module {
107
107
#[ pallet:: event]
108
108
#[ pallet:: generate_deposit( fn deposit_event) ]
109
109
pub enum Event < T : Config > {
110
- /// Transferred.
111
- Transferred {
112
- sender : T :: AccountId ,
113
- currency_id : T :: CurrencyId ,
114
- amount : T :: Balance ,
115
- dest : MultiLocation ,
116
- } ,
117
- /// Transferred with fee.
118
- TransferredWithFee {
119
- sender : T :: AccountId ,
120
- currency_id : T :: CurrencyId ,
121
- amount : T :: Balance ,
122
- fee : T :: Balance ,
123
- dest : MultiLocation ,
124
- } ,
125
- /// Transferred `MultiAsset`.
126
- TransferredMultiAsset {
127
- sender : T :: AccountId ,
128
- asset : MultiAsset ,
129
- dest : MultiLocation ,
130
- } ,
131
- /// Transferred `MultiAsset` with fee.
132
- TransferredMultiAssetWithFee {
133
- sender : T :: AccountId ,
134
- asset : MultiAsset ,
135
- fee : MultiAsset ,
136
- dest : MultiLocation ,
137
- } ,
138
- /// Transferred `MultiAsset` with fee.
139
- TransferredMultiCurrencies {
140
- sender : T :: AccountId ,
141
- currencies : Vec < ( T :: CurrencyId , T :: Balance ) > ,
142
- dest : MultiLocation ,
143
- } ,
144
110
/// Transferred `MultiAsset` with fee.
145
111
TransferredMultiAssets {
146
112
sender : T :: AccountId ,
147
113
assets : MultiAssets ,
114
+ fee : MultiAsset ,
148
115
dest : MultiLocation ,
149
116
} ,
150
117
}
@@ -169,8 +136,8 @@ pub mod module {
169
136
CannotReanchor ,
170
137
/// Could not get ancestry of asset reserve location.
171
138
InvalidAncestry ,
172
- /// Not fungible asset .
173
- NotFungible ,
139
+ /// The MultiAsset is invalid .
140
+ InvalidAsset ,
174
141
/// The destination `MultiLocation` provided cannot be inverted.
175
142
DestinationNotInvertible ,
176
143
/// The version of the `Versioned` value used is not able to be
@@ -179,9 +146,10 @@ pub mod module {
179
146
/// We tried sending distinct asset and fee but they have different
180
147
/// reserve chains
181
148
DistinctReserveForAssetAndFee ,
182
- /// The fee amount was zero when the fee specification extrinsic is
183
- /// being used.
184
- FeeCannotBeZero ,
149
+ /// The fee is zero.
150
+ ZeroFee ,
151
+ /// The transfering asset amount is zero.
152
+ ZeroAmount ,
185
153
/// The number of assets to be sent is over the maximum
186
154
TooManyAssetsBeingSent ,
187
155
/// The specified index does not exist in a MultiAssets struct
@@ -281,10 +249,6 @@ pub mod module {
281
249
) -> DispatchResult {
282
250
let who = ensure_signed ( origin) ?;
283
251
let dest: MultiLocation = ( * dest) . try_into ( ) . map_err ( |( ) | Error :: < T > :: BadVersion ) ?;
284
- // Zero fee is an error
285
- if fee. is_zero ( ) {
286
- return Err ( Error :: < T > :: FeeCannotBeZero . into ( ) ) ;
287
- }
288
252
289
253
Self :: do_transfer_with_fee ( who, currency_id, amount, fee, dest, dest_weight)
290
254
}
@@ -323,10 +287,6 @@ pub mod module {
323
287
let asset: MultiAsset = ( * asset) . try_into ( ) . map_err ( |( ) | Error :: < T > :: BadVersion ) ?;
324
288
let fee: MultiAsset = ( * fee) . try_into ( ) . map_err ( |( ) | Error :: < T > :: BadVersion ) ?;
325
289
let dest: MultiLocation = ( * dest) . try_into ( ) . map_err ( |( ) | Error :: < T > :: BadVersion ) ?;
326
- // Zero fee is an error
327
- if fungible_amount ( & fee) . is_zero ( ) {
328
- return Err ( Error :: < T > :: FeeCannotBeZero . into ( ) ) ;
329
- }
330
290
331
291
Self :: do_transfer_multiasset_with_fee ( who, asset, fee, dest, dest_weight)
332
292
}
@@ -392,7 +352,7 @@ pub mod module {
392
352
// We first grab the fee
393
353
let fee: & MultiAsset = assets. get ( fee_item as usize ) . ok_or ( Error :: < T > :: AssetIndexNonExistent ) ?;
394
354
395
- Self :: do_transfer_multiassets ( who, assets. clone ( ) , fee. clone ( ) , dest, dest_weight, true )
355
+ Self :: do_transfer_multiassets ( who, assets. clone ( ) , fee. clone ( ) , dest, dest_weight)
396
356
}
397
357
}
398
358
@@ -404,26 +364,13 @@ pub mod module {
404
364
dest : MultiLocation ,
405
365
dest_weight : Weight ,
406
366
) -> DispatchResult {
407
- let location: MultiLocation = T :: CurrencyIdConvert :: convert ( currency_id. clone ( ) )
408
- . ok_or ( Error :: < T > :: NotCrossChainTransferableCurrency ) ?;
367
+ let location: MultiLocation =
368
+ T :: CurrencyIdConvert :: convert ( currency_id) . ok_or ( Error :: < T > :: NotCrossChainTransferableCurrency ) ?;
369
+
370
+ ensure ! ( !amount. is_zero( ) , Error :: <T >:: ZeroAmount ) ;
409
371
410
372
let asset: MultiAsset = ( location, amount. into ( ) ) . into ( ) ;
411
- Self :: do_transfer_multiassets (
412
- who. clone ( ) ,
413
- vec ! [ asset. clone( ) ] . into ( ) ,
414
- asset,
415
- dest. clone ( ) ,
416
- dest_weight,
417
- false ,
418
- ) ?;
419
-
420
- Self :: deposit_event ( Event :: < T > :: Transferred {
421
- sender : who,
422
- currency_id,
423
- amount,
424
- dest,
425
- } ) ;
426
- Ok ( ( ) )
373
+ Self :: do_transfer_multiassets ( who, vec ! [ asset. clone( ) ] . into ( ) , asset, dest, dest_weight)
427
374
}
428
375
429
376
fn do_transfer_with_fee (
@@ -434,8 +381,11 @@ pub mod module {
434
381
dest : MultiLocation ,
435
382
dest_weight : Weight ,
436
383
) -> DispatchResult {
437
- let location: MultiLocation = T :: CurrencyIdConvert :: convert ( currency_id. clone ( ) )
438
- . ok_or ( Error :: < T > :: NotCrossChainTransferableCurrency ) ?;
384
+ let location: MultiLocation =
385
+ T :: CurrencyIdConvert :: convert ( currency_id) . ok_or ( Error :: < T > :: NotCrossChainTransferableCurrency ) ?;
386
+
387
+ ensure ! ( !amount. is_zero( ) , Error :: <T >:: ZeroAmount ) ;
388
+ ensure ! ( !fee. is_zero( ) , Error :: <T >:: ZeroFee ) ;
439
389
440
390
let asset = ( location. clone ( ) , amount. into ( ) ) . into ( ) ;
441
391
let fee_asset: MultiAsset = ( location, fee. into ( ) ) . into ( ) ;
@@ -445,16 +395,7 @@ pub mod module {
445
395
assets. push ( asset) ;
446
396
assets. push ( fee_asset. clone ( ) ) ;
447
397
448
- Self :: do_transfer_multiassets ( who. clone ( ) , assets, fee_asset, dest. clone ( ) , dest_weight, false ) ?;
449
-
450
- Self :: deposit_event ( Event :: < T > :: TransferredWithFee {
451
- sender : who,
452
- currency_id,
453
- fee,
454
- amount,
455
- dest,
456
- } ) ;
457
- Ok ( ( ) )
398
+ Self :: do_transfer_multiassets ( who, assets, fee_asset, dest, dest_weight)
458
399
}
459
400
460
401
fn do_transfer_multiasset (
@@ -463,30 +404,7 @@ pub mod module {
463
404
dest : MultiLocation ,
464
405
dest_weight : Weight ,
465
406
) -> DispatchResult {
466
- if !asset. is_fungible ( None ) {
467
- return Err ( Error :: < T > :: NotFungible . into ( ) ) ;
468
- }
469
-
470
- if fungible_amount ( & asset) . is_zero ( ) {
471
- return Ok ( ( ) ) ;
472
- }
473
-
474
- Self :: do_transfer_multiassets (
475
- who. clone ( ) ,
476
- vec ! [ asset. clone( ) ] . into ( ) ,
477
- asset. clone ( ) ,
478
- dest. clone ( ) ,
479
- dest_weight,
480
- false ,
481
- ) ?;
482
-
483
- Self :: deposit_event ( Event :: < T > :: TransferredMultiAsset {
484
- sender : who,
485
- asset,
486
- dest,
487
- } ) ;
488
-
489
- Ok ( ( ) )
407
+ Self :: do_transfer_multiassets ( who, vec ! [ asset. clone( ) ] . into ( ) , asset, dest, dest_weight)
490
408
}
491
409
492
410
fn do_transfer_multiasset_with_fee (
@@ -496,27 +414,12 @@ pub mod module {
496
414
dest : MultiLocation ,
497
415
dest_weight : Weight ,
498
416
) -> DispatchResult {
499
- if !asset. is_fungible ( None ) || !fee. is_fungible ( None ) {
500
- return Err ( Error :: < T > :: NotFungible . into ( ) ) ;
501
- }
502
-
503
- if fungible_amount ( & asset) . is_zero ( ) {
504
- return Ok ( ( ) ) ;
505
- }
506
-
507
417
// Push contains saturated addition, so we should be able to use it safely
508
418
let mut assets = MultiAssets :: new ( ) ;
509
- assets. push ( asset. clone ( ) ) ;
419
+ assets. push ( asset) ;
510
420
assets. push ( fee. clone ( ) ) ;
511
421
512
- Self :: do_transfer_multiassets ( who. clone ( ) , assets, fee. clone ( ) , dest. clone ( ) , dest_weight, false ) ?;
513
-
514
- Self :: deposit_event ( Event :: < T > :: TransferredMultiAssetWithFee {
515
- sender : who,
516
- asset,
517
- fee,
518
- dest,
519
- } ) ;
422
+ Self :: do_transfer_multiassets ( who, assets, fee, dest, dest_weight) ?;
520
423
521
424
Ok ( ( ) )
522
425
}
@@ -538,6 +441,7 @@ pub mod module {
538
441
for ( currency_id, amount) in & currencies {
539
442
let location: MultiLocation = T :: CurrencyIdConvert :: convert ( currency_id. clone ( ) )
540
443
. ok_or ( Error :: < T > :: NotCrossChainTransferableCurrency ) ?;
444
+ ensure ! ( !amount. is_zero( ) , Error :: <T >:: ZeroAmount ) ;
541
445
// Push contains saturated addition, so we should be able to use it safely
542
446
assets. push ( ( location, ( * amount) . into ( ) ) . into ( ) )
543
447
}
@@ -549,14 +453,7 @@ pub mod module {
549
453
550
454
let fee: MultiAsset = ( fee_location, ( * fee_amount) . into ( ) ) . into ( ) ;
551
455
552
- Self :: do_transfer_multiassets ( who. clone ( ) , assets, fee, dest. clone ( ) , dest_weight, false ) ?;
553
-
554
- Self :: deposit_event ( Event :: < T > :: TransferredMultiCurrencies {
555
- sender : who,
556
- currencies,
557
- dest,
558
- } ) ;
559
- Ok ( ( ) )
456
+ Self :: do_transfer_multiassets ( who, assets, fee, dest, dest_weight)
560
457
}
561
458
562
459
fn do_transfer_multiassets (
@@ -565,7 +462,6 @@ pub mod module {
565
462
fee : MultiAsset ,
566
463
dest : MultiLocation ,
567
464
dest_weight : Weight ,
568
- deposit_event : bool ,
569
465
) -> DispatchResult {
570
466
ensure ! (
571
467
assets. len( ) <= T :: MaxAssetsForTransfer :: get( ) ,
@@ -575,12 +471,10 @@ pub mod module {
575
471
// We check that all assets are valid and share the same reserve
576
472
for i in 0 ..assets. len ( ) {
577
473
let asset = assets. get ( i) . ok_or ( Error :: < T > :: AssetIndexNonExistent ) ?;
578
- if !asset. is_fungible ( None ) {
579
- return Err ( Error :: < T > :: NotFungible . into ( ) ) ;
580
- }
581
- if fungible_amount ( asset) . is_zero ( ) {
582
- return Ok ( ( ) ) ;
583
- }
474
+ ensure ! (
475
+ matches!( asset. fun, Fungibility :: Fungible ( x) if !x. is_zero( ) ) ,
476
+ Error :: <T >:: InvalidAsset
477
+ ) ;
584
478
ensure ! (
585
479
fee. reserve( ) == asset. reserve( ) ,
586
480
Error :: <T >:: DistinctReserveForAssetAndFee
@@ -589,13 +483,24 @@ pub mod module {
589
483
590
484
let ( transfer_kind, dest, reserve, recipient) = Self :: transfer_kind ( & fee, & dest) ?;
591
485
let mut msg = match transfer_kind {
592
- SelfReserveAsset => {
593
- Self :: transfer_self_reserve_asset ( assets. clone ( ) , fee, dest. clone ( ) , recipient, dest_weight) ?
594
- }
595
- ToReserve => Self :: transfer_to_reserve ( assets. clone ( ) , fee, dest. clone ( ) , recipient, dest_weight) ?,
596
- ToNonReserve => {
597
- Self :: transfer_to_non_reserve ( assets. clone ( ) , fee, reserve, dest. clone ( ) , recipient, dest_weight) ?
486
+ SelfReserveAsset => Self :: transfer_self_reserve_asset (
487
+ assets. clone ( ) ,
488
+ fee. clone ( ) ,
489
+ dest. clone ( ) ,
490
+ recipient,
491
+ dest_weight,
492
+ ) ?,
493
+ ToReserve => {
494
+ Self :: transfer_to_reserve ( assets. clone ( ) , fee. clone ( ) , dest. clone ( ) , recipient, dest_weight) ?
598
495
}
496
+ ToNonReserve => Self :: transfer_to_non_reserve (
497
+ assets. clone ( ) ,
498
+ fee. clone ( ) ,
499
+ reserve,
500
+ dest. clone ( ) ,
501
+ recipient,
502
+ dest_weight,
503
+ ) ?,
599
504
} ;
600
505
601
506
let origin_location = T :: AccountIdToMultiLocation :: convert ( who. clone ( ) ) ;
@@ -607,13 +512,12 @@ pub mod module {
607
512
Error :: < T > :: XcmExecutionFailed
608
513
} ) ?;
609
514
610
- if deposit_event {
611
- Self :: deposit_event ( Event :: < T > :: TransferredMultiAssets {
612
- sender : who,
613
- assets,
614
- dest,
615
- } ) ;
616
- }
515
+ Self :: deposit_event ( Event :: < T > :: TransferredMultiAssets {
516
+ sender : who,
517
+ assets,
518
+ fee,
519
+ dest,
520
+ } ) ;
617
521
618
522
Ok ( ( ) )
619
523
}
0 commit comments