Skip to content

Commit 27397b5

Browse files
authored
Merge pull request #149 from movementlabsxyz/andygolay/pfs-transfer-create-account
fix: on `primary_fungible_store::transfer` create account if needed
2 parents cac54ca + 065ed5b commit 27397b5

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

aptos-move/framework/aptos-framework/sources/primary_fungible_store.move

+27
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module aptos_framework::primary_fungible_store {
1515
use aptos_framework::dispatchable_fungible_asset;
1616
use aptos_framework::fungible_asset::{Self, FungibleAsset, FungibleStore, Metadata, MintRef, TransferRef, BurnRef};
1717
use aptos_framework::object::{Self, Object, ConstructorRef, DeriveRef};
18+
use aptos_framework::account;
1819

1920
use std::option::Option;
2021
use std::signer;
@@ -182,6 +183,8 @@ module aptos_framework::primary_fungible_store {
182183
recipient: address,
183184
amount: u64,
184185
) 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);
185188
let sender_store = ensure_primary_store_exists(signer::address_of(sender), metadata);
186189
// Check if the sender store object has been burnt or not. If so, unburn it first.
187190
may_be_unburn(sender, sender_store);
@@ -402,4 +405,28 @@ module aptos_framework::primary_fungible_store {
402405
assert!(balance(user_2_address, metadata) == 10, 0);
403406
deposit(user_2_address, coins);
404407
}
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+
405432
}

0 commit comments

Comments
 (0)