Skip to content

Reversible recover_funds doesn't close out pending reversible transactions #406

@n13

Description

@n13

Add these unit tests at the end of high_security_tests

// --- Known issues tracked for future fix (require AccountId → PendingTransfers index) ---

#[test]
#[ignore = "recover_funds does not yet cancel pending transfers or release holds"]
fn recover_funds_includes_held_pending_amounts() {
	new_test_ext().execute_with(|| {
		System::set_block_number(1);
		let hs_user = alice();
		let guardian = bob();
		let dest = charlie();
		let amount = 500;

		let initial_hs_balance = Balances::free_balance(&hs_user);
		let initial_guardian_balance = Balances::free_balance(&guardian);

		assert_ok!(ReversibleTransfers::schedule_transfer(
			RuntimeOrigin::signed(hs_user.clone()),
			dest.clone(),
			amount,
		));

		assert_eq!(
			Balances::balance_on_hold(
				&RuntimeHoldReason::ReversibleTransfers(HoldReason::ScheduledTransfer),
				&hs_user
			),
			amount
		);

		assert_ok!(ReversibleTransfers::recover_funds(
			RuntimeOrigin::signed(guardian.clone()),
			hs_user.clone()
		));

		assert_eq!(
			Balances::free_balance(&guardian),
			initial_guardian_balance + initial_hs_balance,
			"Guardian should receive ALL funds including held amounts"
		);

		assert_eq!(
			Balances::balance_on_hold(
				&RuntimeHoldReason::ReversibleTransfers(HoldReason::ScheduledTransfer),
				&hs_user
			),
			0,
			"No holds should remain after recovery"
		);
	});
}

#[test]
#[ignore = "recover_funds does not yet cancel pending transfers or release holds"]
fn recover_funds_cancels_pending_transfers() {
	new_test_ext().execute_with(|| {
		System::set_block_number(1);
		let hs_user = alice();
		let guardian = bob();
		let dest = charlie();
		let amount = 500;

		let call = transfer_call(dest.clone(), amount);
		let tx_id = calculate_tx_id::<Test>(hs_user.clone(), &call);

		assert_ok!(ReversibleTransfers::schedule_transfer(
			RuntimeOrigin::signed(hs_user.clone()),
			dest.clone(),
			amount,
		));
		assert!(ReversibleTransfers::pending_dispatches(tx_id).is_some());

		assert_ok!(ReversibleTransfers::recover_funds(
			RuntimeOrigin::signed(guardian.clone()),
			hs_user.clone()
		));

		assert!(
			ReversibleTransfers::pending_dispatches(tx_id).is_none(),
			"Pending transfers should be cancelled after recovery"
		);
	});
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions