@@ -15,6 +15,7 @@ module aptos_framework::primary_fungible_store {
15
15
use aptos_framework::dispatchable_fungible_asset;
16
16
use aptos_framework::fungible_asset::{Self , FungibleAsset , FungibleStore , Metadata , MintRef , TransferRef , BurnRef };
17
17
use aptos_framework::object::{Self , Object , ConstructorRef , DeriveRef };
18
+ use aptos_framework::account;
18
19
19
20
use std::option::Option ;
20
21
use std::signer;
@@ -182,6 +183,8 @@ module aptos_framework::primary_fungible_store {
182
183
recipient: address ,
183
184
amount: u64 ,
184
185
) acquires DeriveRefPod {
186
+ // Create account if it does not yet exist, otherwise funds may get stuck in new accounts.
187
+ account::create_account_if_does_not_exist (recipient);
185
188
let sender_store = ensure_primary_store_exists (signer ::address_of (sender), metadata);
186
189
// Check if the sender store object has been burnt or not. If so, unburn it first.
187
190
may_be_unburn (sender, sender_store);
@@ -402,4 +405,28 @@ module aptos_framework::primary_fungible_store {
402
405
assert !(balance (user_2_address, metadata) == 10 , 0 );
403
406
deposit (user_2_address, coins);
404
407
}
408
+
409
+ #[test(user_1 = @0xcafe , user_2 = @0xface )]
410
+ fun test_transfer_epilogue (user_1: &signer , user_2: &signer ) acquires DeriveRefPod {
411
+ let (creator_ref, metadata) = create_test_token (user_1);
412
+ let (mint_ref, _, _) = init_test_metadata_with_primary_store_enabled (&creator_ref);
413
+ let user_1_address = signer ::address_of (user_1);
414
+ let user_2_address = signer ::address_of (user_2);
415
+
416
+ // Mint 100 tokens to user_1
417
+ mint (&mint_ref, user_1_address, 100 );
418
+ assert !(balance (user_1_address, metadata) == 100 , 1 );
419
+ assert !(balance (user_2_address, metadata) == 0 , 2 );
420
+
421
+ // First transfer: user_1 to user_2
422
+ transfer (user_1, metadata, user_2_address, 50 );
423
+ assert !(balance (user_1_address, metadata) == 50 , 3 );
424
+ assert !(balance (user_2_address, metadata) == 50 , 4 );
425
+
426
+ // Second transfer: user_1 to user_2
427
+ transfer (user_1, metadata, user_2_address, 30 );
428
+ assert !(balance (user_1_address, metadata) == 20 , 5 );
429
+ assert !(balance (user_2_address, metadata) == 80 , 6 );
430
+ }
431
+
405
432
}
0 commit comments