function testPanprogBugH3() public {
	initializeMigration(alice, bob, 10000, 4000, true);

	(nftReceiverSelectors, nftReceiverPlugins) = initializeNFTReceiver();
	// Migrate to a vault with no permissions (just to test out migration)
	address[] memory newModules = new address[](2);

	newModules[0] = migration;
	newModules[1] = modules[1];

	// Bob makes the proposal
	bob.migrationModule.propose(
		vault,
		newModules,
		nftReceiverPlugins,
		nftReceiverSelectors,
		TOTAL_SUPPLY * 2,
		1 ether
	);
	// Bob joins the proposal with 4000 fractions
	bob.migrationModule.join{value: 1 ether}(vault, 1, 4000);

	// since the target price is reached, bob starts the buyout
	bob.migrationModule.commit(vault, 1);

	vm.warp(rejectionPeriod + 1);

	// after buyout fails, bob ends it
	// note: bob's proposal is still commited even though it has failed
	bob.buyoutModule.end(vault, burnProof);
	bob.migrationModule.withdrawContribution(vault, 1);

	// Alice makes a different proposal (we use bob's data for simplicity)
	alice.migrationModule.propose(
		vault,
		newModules,
		nftReceiverPlugins,
		nftReceiverSelectors,
		TOTAL_SUPPLY * 10,
		1 ether
	);

	// Alice joins the proposal with 6000 fractions
	alice.migrationModule.join{value: 1 ether}(vault, 2, 6000);

	// since the target price is reached, alice starts the buyout
	alice.migrationModule.commit(vault, 2);

	vm.warp(proposalPeriod * 10);

	// after buyout succeeds (as it has >50% of fractions), alice ends it
	// note: both bob's and alice's proposals are commited at this point
	alice.buyoutModule.end(vault, burnProof);

	// Now bob (whose buyout has failed) settles his proposal
	// It should revert, but it succeeds
	vm.expectRevert(
		abi.encodeWithSelector(IMigration.UnsuccessfulMigration.selector)
	);
	bob.migrationModule.settleVault(vault, 2);
}
