20
20
use super :: * ;
21
21
22
22
// The main implementation block for the module.
23
- impl < T : Config > Pallet < T > {
23
+ impl < T : Config < I > , I : ' static > Pallet < T , I > {
24
24
// Public immutables
25
25
26
26
/// Return the extra "sid-car" data for `id`/`who`, or `None` if the account doesn't exist.
27
- pub fn adjust_extra ( id : T :: AssetId , who : impl sp_std:: borrow:: Borrow < T :: AccountId > )
28
- -> Option < ExtraMutator < T > >
29
- {
27
+ pub fn adjust_extra (
28
+ id : T :: AssetId ,
29
+ who : impl sp_std:: borrow:: Borrow < T :: AccountId > ,
30
+ ) -> Option < ExtraMutator < T , I > > {
30
31
ExtraMutator :: maybe_new ( id, who)
31
32
}
32
33
33
34
/// Get the asset `id` balance of `who`.
34
35
pub fn balance ( id : T :: AssetId , who : impl sp_std:: borrow:: Borrow < T :: AccountId > ) -> T :: Balance {
35
- Account :: < T > :: get ( id, who. borrow ( ) ) . balance
36
+ Account :: < T , I > :: get ( id, who. borrow ( ) ) . balance
36
37
}
37
38
38
39
/// Get the total supply of an asset `id`.
39
40
pub fn total_supply ( id : T :: AssetId ) -> T :: Balance {
40
- Asset :: < T > :: get ( id) . map ( |x| x. supply ) . unwrap_or_else ( Zero :: zero)
41
+ Asset :: < T , I > :: get ( id)
42
+ . map ( |x| x. supply )
43
+ . unwrap_or_else ( Zero :: zero)
41
44
}
42
45
43
46
pub ( super ) fn new_account (
44
47
who : & T :: AccountId ,
45
- d : & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T > > ,
48
+ d : & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T , I > > ,
46
49
) -> Result < bool , DispatchError > {
47
- let accounts = d. accounts . checked_add ( 1 ) . ok_or ( Error :: < T > :: Overflow ) ?;
50
+ let accounts = d. accounts . checked_add ( 1 ) . ok_or ( Error :: < T , I > :: Overflow ) ?;
48
51
let is_sufficient = if d. is_sufficient {
49
52
frame_system:: Pallet :: < T > :: inc_sufficients ( who) ;
50
53
d. sufficients += 1 ;
51
54
true
52
55
} else {
53
- frame_system:: Pallet :: < T > :: inc_consumers ( who) . map_err ( |_| Error :: < T > :: NoProvider ) ?;
56
+ frame_system:: Pallet :: < T > :: inc_consumers ( who) . map_err ( |_| Error :: < T , I > :: NoProvider ) ?;
54
57
false
55
58
} ;
56
59
d. accounts = accounts;
@@ -60,7 +63,7 @@ impl<T: Config> Pallet<T> {
60
63
pub ( super ) fn dead_account (
61
64
what : T :: AssetId ,
62
65
who : & T :: AccountId ,
63
- d : & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T > > ,
66
+ d : & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T , I > > ,
64
67
sufficient : bool ,
65
68
) {
66
69
if sufficient {
@@ -73,15 +76,19 @@ impl<T: Config> Pallet<T> {
73
76
T :: Freezer :: died ( what, who)
74
77
}
75
78
76
- pub ( super ) fn can_increase ( id : T :: AssetId , who : & T :: AccountId , amount : T :: Balance ) -> DepositConsequence {
77
- let details = match Asset :: < T > :: get ( id) {
79
+ pub ( super ) fn can_increase (
80
+ id : T :: AssetId ,
81
+ who : & T :: AccountId ,
82
+ amount : T :: Balance ,
83
+ ) -> DepositConsequence {
84
+ let details = match Asset :: < T , I > :: get ( id) {
78
85
Some ( details) => details,
79
86
None => return DepositConsequence :: UnknownAsset ,
80
87
} ;
81
88
if details. supply . checked_add ( & amount) . is_none ( ) {
82
89
return DepositConsequence :: Overflow
83
90
}
84
- let account = Account :: < T > :: get ( id, who) ;
91
+ let account = Account :: < T , I > :: get ( id, who) ;
85
92
if account. balance . checked_add ( & amount) . is_none ( ) {
86
93
return DepositConsequence :: Overflow
87
94
}
@@ -108,7 +115,7 @@ impl<T: Config> Pallet<T> {
108
115
keep_alive : bool ,
109
116
) -> WithdrawConsequence < T :: Balance > {
110
117
use WithdrawConsequence :: * ;
111
- let details = match Asset :: < T > :: get ( id) {
118
+ let details = match Asset :: < T , I > :: get ( id) {
112
119
Some ( details) => details,
113
120
None => return UnknownAsset ,
114
121
} ;
@@ -118,7 +125,7 @@ impl<T: Config> Pallet<T> {
118
125
if details. is_frozen {
119
126
return Frozen
120
127
}
121
- let account = Account :: < T > :: get ( id, who) ;
128
+ let account = Account :: < T , I > :: get ( id, who) ;
122
129
if account. is_frozen {
123
130
return Frozen
124
131
}
@@ -155,19 +162,21 @@ impl<T: Config> Pallet<T> {
155
162
id : T :: AssetId ,
156
163
who : & T :: AccountId ,
157
164
keep_alive : bool ,
158
- ) -> Result < T :: Balance , Error < T > > {
159
- let details = match Asset :: < T > :: get ( id) {
165
+ ) -> Result < T :: Balance , Error < T , I > > {
166
+ let details = match Asset :: < T , I > :: get ( id) {
160
167
Some ( details) => details,
161
- None => return Err ( Error :: < T > :: Unknown ) ,
168
+ None => return Err ( Error :: < T , I > :: Unknown ) ,
162
169
} ;
163
- ensure ! ( !details. is_frozen, Error :: <T >:: Frozen ) ;
170
+ ensure ! ( !details. is_frozen, Error :: <T , I >:: Frozen ) ;
164
171
165
- let account = Account :: < T > :: get ( id, who) ;
166
- ensure ! ( !account. is_frozen, Error :: <T >:: Frozen ) ;
172
+ let account = Account :: < T , I > :: get ( id, who) ;
173
+ ensure ! ( !account. is_frozen, Error :: <T , I >:: Frozen ) ;
167
174
168
175
let amount = if let Some ( frozen) = T :: Freezer :: frozen_balance ( id, who) {
169
176
// Frozen balance: account CANNOT be deleted
170
- let required = frozen. checked_add ( & details. min_balance ) . ok_or ( Error :: < T > :: Overflow ) ?;
177
+ let required = frozen
178
+ . checked_add ( & details. min_balance )
179
+ . ok_or ( Error :: < T , I > :: Overflow ) ?;
171
180
account. balance . saturating_sub ( required)
172
181
} else {
173
182
let is_provider = false ;
@@ -204,9 +213,8 @@ impl<T: Config> Pallet<T> {
204
213
amount : T :: Balance ,
205
214
f : DebitFlags ,
206
215
) -> Result < T :: Balance , DispatchError > {
207
- let actual = Self :: reducible_balance ( id, target, f. keep_alive ) ?
208
- . min ( amount) ;
209
- ensure ! ( f. best_effort || actual >= amount, Error :: <T >:: BalanceLow ) ;
216
+ let actual = Self :: reducible_balance ( id, target, f. keep_alive ) ?. min ( amount) ;
217
+ ensure ! ( f. best_effort || actual >= amount, Error :: <T , I >:: BalanceLow ) ;
210
218
211
219
let conseq = Self :: can_decrease ( id, target, actual, f. keep_alive ) ;
212
220
let actual = match conseq. into_result ( ) {
@@ -263,7 +271,10 @@ impl<T: Config> Pallet<T> {
263
271
) -> DispatchResult {
264
272
Self :: increase_balance ( id, beneficiary, amount, |details| -> DispatchResult {
265
273
if let Some ( check_issuer) = maybe_check_issuer {
266
- ensure ! ( & check_issuer == & details. issuer, Error :: <T >:: NoPermission ) ;
274
+ ensure ! (
275
+ & check_issuer == & details. issuer,
276
+ Error :: <T , I >:: NoPermission
277
+ ) ;
267
278
}
268
279
debug_assert ! ( T :: Balance :: max_value( ) - details. supply >= amount, "checked in prep; qed" ) ;
269
280
details. supply = details. supply . saturating_add ( amount) ;
@@ -283,17 +294,19 @@ impl<T: Config> Pallet<T> {
283
294
id : T :: AssetId ,
284
295
beneficiary : & T :: AccountId ,
285
296
amount : T :: Balance ,
286
- check : impl FnOnce ( & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T > > ) -> DispatchResult ,
297
+ check : impl FnOnce (
298
+ & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T , I > > ,
299
+ ) -> DispatchResult ,
287
300
) -> DispatchResult {
288
301
if amount. is_zero ( ) { return Ok ( ( ) ) }
289
302
290
303
Self :: can_increase ( id, beneficiary, amount) . into_result ( ) ?;
291
- Asset :: < T > :: try_mutate ( id, |maybe_details| -> DispatchResult {
292
- let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T > :: Unknown ) ?;
304
+ Asset :: < T , I > :: try_mutate ( id, |maybe_details| -> DispatchResult {
305
+ let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T , I > :: Unknown ) ?;
293
306
294
307
check ( details) ?;
295
308
296
- Account :: < T > :: try_mutate ( id, beneficiary, |t| -> DispatchResult {
309
+ Account :: < T , I > :: try_mutate ( id, beneficiary, |t| -> DispatchResult {
297
310
let new_balance = t. balance . saturating_add ( amount) ;
298
311
ensure ! ( new_balance >= details. min_balance, TokenError :: BelowMinimum ) ;
299
312
if t. balance . is_zero ( ) {
@@ -324,7 +337,7 @@ impl<T: Config> Pallet<T> {
324
337
let actual = Self :: decrease_balance ( id, target, amount, f, |actual, details| {
325
338
// Check admin rights.
326
339
if let Some ( check_admin) = maybe_check_admin {
327
- ensure ! ( & check_admin == & details. admin, Error :: <T >:: NoPermission ) ;
340
+ ensure ! ( & check_admin == & details. admin, Error :: <T , I >:: NoPermission ) ;
328
341
}
329
342
330
343
debug_assert ! ( details. supply >= actual, "checked in prep; qed" ) ;
@@ -351,19 +364,19 @@ impl<T: Config> Pallet<T> {
351
364
f : DebitFlags ,
352
365
check : impl FnOnce (
353
366
T :: Balance ,
354
- & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T > > ,
367
+ & mut AssetDetails < T :: Balance , T :: AccountId , DepositBalanceOf < T , I > > ,
355
368
) -> DispatchResult ,
356
369
) -> Result < T :: Balance , DispatchError > {
357
370
if amount. is_zero ( ) { return Ok ( amount) }
358
371
359
372
let actual = Self :: prep_debit ( id, target, amount, f) ?;
360
373
361
- Asset :: < T > :: try_mutate ( id, |maybe_details| -> DispatchResult {
362
- let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T > :: Unknown ) ?;
374
+ Asset :: < T , I > :: try_mutate ( id, |maybe_details| -> DispatchResult {
375
+ let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T , I > :: Unknown ) ?;
363
376
364
377
check ( actual, details) ?;
365
378
366
- Account :: < T > :: try_mutate_exists ( id, target, |maybe_account| -> DispatchResult {
379
+ Account :: < T , I > :: try_mutate_exists ( id, target, |maybe_account| -> DispatchResult {
367
380
let mut account = maybe_account. take ( ) . unwrap_or_default ( ) ;
368
381
debug_assert ! ( account. balance >= actual, "checked in prep; qed" ) ;
369
382
@@ -411,14 +424,14 @@ impl<T: Config> Pallet<T> {
411
424
let debit = Self :: prep_debit ( id, & source, amount, f. into ( ) ) ?;
412
425
let ( credit, maybe_burn) = Self :: prep_credit ( id, & dest, amount, debit, f. burn_dust ) ?;
413
426
414
- let mut source_account = Account :: < T > :: get ( id, & source) ;
427
+ let mut source_account = Account :: < T , I > :: get ( id, & source) ;
415
428
416
- Asset :: < T > :: try_mutate ( id, |maybe_details| -> DispatchResult {
417
- let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T > :: Unknown ) ?;
429
+ Asset :: < T , I > :: try_mutate ( id, |maybe_details| -> DispatchResult {
430
+ let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T , I > :: Unknown ) ?;
418
431
419
432
// Check admin rights.
420
433
if let Some ( need_admin) = maybe_need_admin {
421
- ensure ! ( & need_admin == & details. admin, Error :: <T >:: NoPermission ) ;
434
+ ensure ! ( & need_admin == & details. admin, Error :: <T , I >:: NoPermission ) ;
422
435
}
423
436
424
437
// Skip if source == dest
@@ -437,7 +450,7 @@ impl<T: Config> Pallet<T> {
437
450
debug_assert ! ( source_account. balance >= debit, "checked in prep; qed" ) ;
438
451
source_account. balance = source_account. balance . saturating_sub ( debit) ;
439
452
440
- Account :: < T > :: try_mutate ( id, & dest, |a| -> DispatchResult {
453
+ Account :: < T , I > :: try_mutate ( id, & dest, |a| -> DispatchResult {
441
454
// Calculate new balance; this will not saturate since it's already checked in prep.
442
455
debug_assert ! ( a. balance. checked_add( & credit) . is_some( ) , "checked in prep; qed" ) ;
443
456
let new_balance = a. balance . saturating_add ( credit) ;
@@ -455,9 +468,9 @@ impl<T: Config> Pallet<T> {
455
468
if source_account. balance < details. min_balance {
456
469
debug_assert ! ( source_account. balance. is_zero( ) , "checked in prep; qed" ) ;
457
470
Self :: dead_account ( id, & source, details, source_account. sufficient ) ;
458
- Account :: < T > :: remove ( id, & source) ;
471
+ Account :: < T , I > :: remove ( id, & source) ;
459
472
} else {
460
- Account :: < T > :: insert ( id, & source, & source_account)
473
+ Account :: < T , I > :: insert ( id, & source, & source_account)
461
474
}
462
475
463
476
Ok ( ( ) )
0 commit comments