@@ -2,15 +2,12 @@ use std::ops::Neg;
2
2
3
3
use cid:: Cid ;
4
4
pub use error:: TokenError ;
5
- use fvm_actor_utils:: messaging:: {
6
- Messaging , MessagingError , Result as MessagingResult , RECEIVER_HOOK_METHOD_NUM ,
7
- } ;
5
+ use fvm_actor_utils:: messaging:: { Messaging , MessagingError , RECEIVER_HOOK_METHOD_NUM } ;
8
6
use fvm_ipld_blockstore:: Blockstore ;
9
7
use fvm_ipld_encoding:: RawBytes ;
10
8
use fvm_shared:: address:: Address ;
11
9
use fvm_shared:: econ:: TokenAmount ;
12
10
use fvm_shared:: error:: ExitCode ;
13
- use fvm_shared:: ActorID ;
14
11
use num_traits:: Zero ;
15
12
16
13
use self :: state:: { StateError as TokenStateError , TokenState } ;
@@ -156,9 +153,9 @@ where
156
153
) -> Result < ReceiverHook < MintReturn > > {
157
154
let amount = validate_amount_with_granularity ( amount, "mint" , self . granularity ) ?;
158
155
// init the operator account so that its actor ID can be referenced in the receiver hook
159
- let operator_id = self . resolve_or_init ( operator) ?;
156
+ let operator_id = self . msg . resolve_or_init ( operator) ?;
160
157
// init the owner account as allowance and balance checks are not performed for minting
161
- let owner_id = self . resolve_or_init ( initial_owner) ?;
158
+ let owner_id = self . msg . resolve_or_init ( initial_owner) ?;
162
159
163
160
// Increase the balance of the actor and increase total supply
164
161
let result = self . transaction ( |state, bs| {
@@ -194,7 +191,7 @@ where
194
191
pub fn balance_of ( & self , owner : & Address ) -> Result < TokenAmount > {
195
192
// Don't instantiate an account if unable to resolve to an ID address, as non-initialized
196
193
// addresses have an implicit zero balance
197
- match self . get_id ( owner) {
194
+ match self . msg . resolve_id ( owner) {
198
195
Ok ( owner) => Ok ( self . state . get_balance ( & self . bs , owner) ?) ,
199
196
Err ( MessagingError :: AddressNotResolved ( _) ) => {
200
197
// uninitialized address has implicit zero balance
@@ -211,7 +208,7 @@ where
211
208
pub fn allowance ( & self , owner : & Address , operator : & Address ) -> Result < TokenAmount > {
212
209
// Don't instantiate an account if unable to resolve owner-ID, as non-initialized addresses
213
210
// give implicit zero allowances to all addresses
214
- let owner = match self . get_id ( owner) {
211
+ let owner = match self . msg . resolve_id ( owner) {
215
212
Ok ( owner) => owner,
216
213
Err ( MessagingError :: AddressNotResolved ( _) ) => {
217
214
return Ok ( TokenAmount :: zero ( ) ) ;
@@ -221,7 +218,7 @@ where
221
218
222
219
// Don't instantiate an account if unable to resolve operator-ID, as non-initialized
223
220
// addresses have an implicit zero allowance
224
- let operator = match self . get_id ( operator) {
221
+ let operator = match self . msg . resolve_id ( operator) {
225
222
Ok ( operator) => operator,
226
223
Err ( MessagingError :: AddressNotResolved ( _) ) => {
227
224
return Ok ( TokenAmount :: zero ( ) ) ;
@@ -249,8 +246,8 @@ where
249
246
let delta = validate_allowance ( delta, "increase allowance delta" ) ?;
250
247
251
248
// Attempt to instantiate the accounts if they don't exist
252
- let owner = self . resolve_or_init ( owner) ?;
253
- let operator = self . resolve_or_init ( operator) ?;
249
+ let owner = self . msg . resolve_or_init ( owner) ?;
250
+ let operator = self . msg . resolve_or_init ( operator) ?;
254
251
let new_amount = self . state . change_allowance_by ( & self . bs , owner, operator, delta) ?;
255
252
256
253
Ok ( new_amount)
@@ -273,8 +270,8 @@ where
273
270
let delta = validate_allowance ( delta, "decrease allowance delta" ) ?;
274
271
275
272
// Attempt to instantiate the accounts if they don't exist
276
- let owner = self . resolve_or_init ( owner) ?;
277
- let operator = self . resolve_or_init ( operator) ?;
273
+ let owner = self . msg . resolve_or_init ( owner) ?;
274
+ let operator = self . msg . resolve_or_init ( operator) ?;
278
275
let new_allowance =
279
276
self . state . change_allowance_by ( & self . bs , owner, operator, & delta. neg ( ) ) ?;
280
277
@@ -283,15 +280,15 @@ where
283
280
284
281
/// Sets the allowance between owner and operator to zero, returning the old allowance
285
282
pub fn revoke_allowance ( & mut self , owner : & Address , operator : & Address ) -> Result < TokenAmount > {
286
- let owner = match self . get_id ( owner) {
283
+ let owner = match self . msg . resolve_id ( owner) {
287
284
Ok ( owner) => owner,
288
285
Err ( MessagingError :: AddressNotResolved ( _) ) => {
289
286
// uninitialized address has implicit zero allowance already
290
287
return Ok ( TokenAmount :: zero ( ) ) ;
291
288
}
292
289
Err ( e) => return Err ( e. into ( ) ) ,
293
290
} ;
294
- let operator = match self . get_id ( operator) {
291
+ let operator = match self . msg . resolve_id ( operator) {
295
292
Ok ( operator) => operator,
296
293
Err ( MessagingError :: AddressNotResolved ( _) ) => {
297
294
// uninitialized address has implicit zero allowance already
@@ -318,8 +315,8 @@ where
318
315
}
319
316
320
317
// Attempt to instantiate the accounts if they don't exist
321
- let owner = self . resolve_or_init ( owner) ?;
322
- let operator = self . resolve_or_init ( operator) ?;
318
+ let owner = self . msg . resolve_or_init ( owner) ?;
319
+ let operator = self . msg . resolve_or_init ( operator) ?;
323
320
324
321
// if both accounts resolved, explicitly set allowance
325
322
Ok ( self . state . set_allowance ( & self . bs , owner, operator, amount) ?)
@@ -338,7 +335,7 @@ where
338
335
pub fn burn ( & mut self , owner : & Address , amount : & TokenAmount ) -> Result < BurnReturn > {
339
336
let amount = validate_amount_with_granularity ( amount, "burn" , self . granularity ) ?;
340
337
341
- let owner = self . resolve_or_init ( owner) ?;
338
+ let owner = self . msg . resolve_or_init ( owner) ?;
342
339
self . transaction ( |state, bs| {
343
340
// attempt to burn the requested amount
344
341
let new_amount = state. change_balance_by ( & bs, owner, & amount. clone ( ) . neg ( ) ) ?;
@@ -369,12 +366,12 @@ where
369
366
amount : & TokenAmount ,
370
367
) -> Result < BurnFromReturn > {
371
368
let amount = validate_amount_with_granularity ( amount, "burn" , self . granularity ) ?;
372
- if self . same_address ( operator, owner) {
369
+ if self . msg . same_address ( operator, owner) {
373
370
return Err ( TokenError :: InvalidOperator ( * operator) ) ;
374
371
}
375
372
376
373
// operator must exist to have a non-zero allowance
377
- let operator = match self . get_id ( operator) {
374
+ let operator = match self . msg . resolve_id ( operator) {
378
375
Ok ( operator) => operator,
379
376
Err ( MessagingError :: AddressNotResolved ( addr) ) => {
380
377
// if not resolved, implicit zero allowance is not permitted to burn, so return an
@@ -391,7 +388,7 @@ where
391
388
} ;
392
389
393
390
// owner must exist to have set a non-zero allowance
394
- let owner = match self . get_id ( owner) {
391
+ let owner = match self . msg . resolve_id ( owner) {
395
392
Ok ( owner) => owner,
396
393
Err ( MessagingError :: AddressNotResolved ( addr) ) => {
397
394
return Err ( TokenStateError :: InsufficientAllowance {
@@ -441,8 +438,8 @@ where
441
438
let amount = validate_amount_with_granularity ( amount, "transfer" , self . granularity ) ?;
442
439
443
440
// owner-initiated transfer
444
- let from = self . resolve_or_init ( from) ?;
445
- let to_id = self . resolve_or_init ( to) ?;
441
+ let from = self . msg . resolve_or_init ( from) ?;
442
+ let to_id = self . msg . resolve_or_init ( to) ?;
446
443
// skip allowance check for self-managed transfers
447
444
let res = self . transaction ( |state, bs| {
448
445
// don't change balance if to == from, but must check that the transfer doesn't exceed balance
@@ -507,12 +504,12 @@ where
507
504
token_data : RawBytes ,
508
505
) -> Result < ReceiverHook < TransferFromReturn > > {
509
506
let amount = validate_amount_with_granularity ( amount, "transfer" , self . granularity ) ?;
510
- if self . same_address ( operator, from) {
507
+ if self . msg . same_address ( operator, from) {
511
508
return Err ( TokenError :: InvalidOperator ( * operator) ) ;
512
509
}
513
510
514
511
// operator-initiated transfer must have a resolvable operator
515
- let operator_id = match self . get_id ( operator) {
512
+ let operator_id = match self . msg . resolve_id ( operator) {
516
513
// if operator resolved, we can continue with other checks
517
514
Ok ( id) => id,
518
515
// if we cannot resolve the operator, they are forbidden to transfer
@@ -528,7 +525,7 @@ where
528
525
} ;
529
526
530
527
// the owner must exist to have specified a non-zero allowance
531
- let from = match self . get_id ( from) {
528
+ let from = match self . msg . resolve_id ( from) {
532
529
Ok ( id) => id,
533
530
Err ( MessagingError :: AddressNotResolved ( from) ) => {
534
531
return Err ( TokenError :: TokenState ( TokenStateError :: InsufficientAllowance {
@@ -542,7 +539,7 @@ where
542
539
} ;
543
540
544
541
// attempt to initialize the receiving account if not present
545
- let to_id = self . resolve_or_init ( to) ?;
542
+ let to_id = self . msg . resolve_or_init ( to) ?;
546
543
547
544
// update token state
548
545
let ret = self . transaction ( |state, bs| {
@@ -595,7 +592,7 @@ where
595
592
/// hook on recipient accounts. Returns the old balance.
596
593
pub fn set_balance ( & mut self , owner : & Address , amount : & TokenAmount ) -> Result < TokenAmount > {
597
594
let amount = validate_amount_with_granularity ( amount, "set_balance" , self . granularity ) ?;
598
- let owner = self . resolve_or_init ( owner) ?;
595
+ let owner = self . msg . resolve_or_init ( owner) ?;
599
596
let old_balance =
600
597
self . transaction ( |state, bs| Ok ( state. set_balance ( bs, owner, amount) ?) ) ?;
601
598
Ok ( old_balance)
@@ -607,49 +604,6 @@ where
607
604
BS : Blockstore ,
608
605
MSG : Messaging ,
609
606
{
610
- /// Resolves an address to an ID address, sending a message to initialise an account there if
611
- /// it doesn't exist
612
- ///
613
- /// If the account cannot be created, this function returns MessagingError::AddressNotInitialized
614
- fn resolve_or_init ( & self , address : & Address ) -> MessagingResult < ActorID > {
615
- let id = match self . msg . resolve_id ( address) {
616
- Ok ( addr) => addr,
617
- Err ( MessagingError :: AddressNotResolved ( _e) ) => self . msg . initialize_account ( address) ?,
618
- Err ( e) => return Err ( e) ,
619
- } ;
620
- Ok ( id)
621
- }
622
-
623
- /// Attempts to resolve an address to an ActorID, returning MessagingError::AddressNotResolved
624
- /// if it wasn't found
625
- fn get_id ( & self , address : & Address ) -> MessagingResult < ActorID > {
626
- self . msg . resolve_id ( address)
627
- }
628
-
629
- /// Attempts to compare two addresses, seeing if they would resolve to the same Actor without
630
- /// actually initiating accounts for them
631
- ///
632
- /// If a and b are of the same type, simply do an equality check. Otherwise, attempt to resolve
633
- /// to an ActorID and compare
634
- fn same_address ( & self , address_a : & Address , address_b : & Address ) -> bool {
635
- let protocol_a = address_a. protocol ( ) ;
636
- let protocol_b = address_b. protocol ( ) ;
637
- if protocol_a == protocol_b {
638
- address_a == address_b
639
- } else {
640
- // attempt to resolve both to ActorID
641
- let id_a = match self . get_id ( address_a) {
642
- Ok ( id) => id,
643
- Err ( _) => return false ,
644
- } ;
645
- let id_b = match self . get_id ( address_b) {
646
- Ok ( id) => id,
647
- Err ( _) => return false ,
648
- } ;
649
- id_a == id_b
650
- }
651
- }
652
-
653
607
/// Calls the receiver hook, returning the result
654
608
pub fn call_receiver_hook (
655
609
& mut self ,
@@ -1078,7 +1032,7 @@ mod test {
1078
1032
FRC46TokenReceived {
1079
1033
operator : TOKEN_ACTOR . id ( ) . unwrap ( ) ,
1080
1034
from : TOKEN_ACTOR . id ( ) . unwrap ( ) ,
1081
- to : token. get_id ( & secp_address) . unwrap ( ) ,
1035
+ to : token. msg . resolve_id ( & secp_address) . unwrap ( ) ,
1082
1036
amount : TokenAmount :: from_atto ( 1_000_000 ) ,
1083
1037
operator_data : Default :: default ( ) ,
1084
1038
token_data : Default :: default ( ) ,
@@ -1113,7 +1067,7 @@ mod test {
1113
1067
FRC46TokenReceived {
1114
1068
operator : TOKEN_ACTOR . id ( ) . unwrap ( ) ,
1115
1069
from : TOKEN_ACTOR . id ( ) . unwrap ( ) ,
1116
- to : token. get_id ( & bls_address) . unwrap ( ) ,
1070
+ to : token. msg . resolve_id ( & bls_address) . unwrap ( ) ,
1117
1071
amount : TokenAmount :: from_atto ( 1_000_000 ) ,
1118
1072
operator_data : Default :: default ( ) ,
1119
1073
token_data : Default :: default ( ) ,
@@ -1506,7 +1460,7 @@ mod test {
1506
1460
FRC46TokenReceived {
1507
1461
operator : ALICE . id ( ) . unwrap ( ) ,
1508
1462
from : ALICE . id ( ) . unwrap ( ) ,
1509
- to : token. get_id ( secp_address) . unwrap ( ) ,
1463
+ to : token. msg . resolve_id ( secp_address) . unwrap ( ) ,
1510
1464
amount : TokenAmount :: from_atto ( 10 ) ,
1511
1465
operator_data : Default :: default ( ) ,
1512
1466
token_data : Default :: default ( ) ,
@@ -1557,7 +1511,7 @@ mod test {
1557
1511
assert_eq ! ( token. total_supply( ) , TokenAmount :: zero( ) ) ;
1558
1512
1559
1513
// secp_address was initialized
1560
- assert ! ( token. get_id ( secp_address) . is_ok( ) ) ;
1514
+ assert ! ( token. msg . resolve_id ( secp_address) . is_ok( ) ) ;
1561
1515
1562
1516
let actor_address = & actor_address ( ) ;
1563
1517
// transfers from actors fail with uninitializable
@@ -1584,7 +1538,7 @@ mod test {
1584
1538
assert_eq ! ( token. total_supply( ) , TokenAmount :: zero( ) ) ;
1585
1539
1586
1540
// actor address was not initialized
1587
- assert ! ( token. get_id ( actor_address) . is_err( ) ) ;
1541
+ assert ! ( token. msg . resolve_id ( actor_address) . is_err( ) ) ;
1588
1542
token. check_invariants ( ) . unwrap ( ) ;
1589
1543
}
1590
1544
@@ -2527,13 +2481,13 @@ mod test {
2527
2481
assert_eq ! ( allowance, TokenAmount :: zero( ) ) ;
2528
2482
2529
2483
// accounts were not initialized
2530
- let err = token. get_id ( bls) . unwrap_err ( ) ;
2484
+ let err = token. msg . resolve_id ( bls) . unwrap_err ( ) ;
2531
2485
if let MessagingError :: AddressNotResolved ( e) = err {
2532
2486
assert_eq ! ( e, * bls) ;
2533
2487
} else {
2534
2488
panic ! ( "expected AddressNotResolved error" ) ;
2535
2489
}
2536
- let err = token. get_id ( secp) . unwrap_err ( ) ;
2490
+ let err = token. msg . resolve_id ( secp) . unwrap_err ( ) ;
2537
2491
if let MessagingError :: AddressNotResolved ( e) = err {
2538
2492
assert_eq ! ( e, * secp) ;
2539
2493
} else {
@@ -2547,13 +2501,13 @@ mod test {
2547
2501
assert_eq ! ( balance, TokenAmount :: zero( ) ) ;
2548
2502
2549
2503
// accounts were not initialized
2550
- let err = token. get_id ( bls) . unwrap_err ( ) ;
2504
+ let err = token. msg . resolve_id ( bls) . unwrap_err ( ) ;
2551
2505
if let MessagingError :: AddressNotResolved ( e) = err {
2552
2506
assert_eq ! ( e, * bls) ;
2553
2507
} else {
2554
2508
panic ! ( "expected AddressNotResolved error" ) ;
2555
2509
}
2556
- let err = token. get_id ( secp) . unwrap_err ( ) ;
2510
+ let err = token. msg . resolve_id ( secp) . unwrap_err ( ) ;
2557
2511
if let MessagingError :: AddressNotResolved ( e) = err {
2558
2512
assert_eq ! ( e, * secp) ;
2559
2513
} else {
@@ -2651,7 +2605,7 @@ mod test {
2651
2605
}
2652
2606
} ;
2653
2607
2654
- if token. same_address ( operator, from) {
2608
+ if token. msg . same_address ( operator, from) {
2655
2609
let res = token. transfer (
2656
2610
from,
2657
2611
operator,
0 commit comments