pragma solidity 0.8.26;
import {Test, console} from "forge-std/Test.sol";
import {InheritanceManager} from "../src/InheritanceManager.sol";
import {ERC20Mock} from "@openzeppelin/contracts/mocks/token/ERC20Mock.sol";
contract ArrayOutOfBoundsTest is Test {
InheritanceManager im;
ERC20Mock usdc;
address owner = makeAddr("owner");
address beneficiary1 = makeAddr("beneficiary1");
address beneficiary2 = makeAddr("beneficiary2");
address nonBeneficiary = makeAddr("nonBeneficiary");
function setUp() public {
vm.prank(owner);
im = new InheritanceManager();
usdc = new ERC20Mock();
}
function testArrayOutOfBoundsInOnlyBeneficiaryModifier() public {
vm.startPrank(owner);
im.addBeneficiery(beneficiary1);
im.addBeneficiery(beneficiary2);
im.createEstateNFT("test property", 1000, address(usdc));
vm.stopPrank();
vm.warp(block.timestamp + 91 days);
vm.prank(beneficiary1);
im.inherit();
assertTrue(im.getIsInherited());
vm.startPrank(nonBeneficiary);
vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x32));
im.appointTrustee(nonBeneficiary);
vm.stopPrank();
}
function testValidBeneficiaryPassesModifier() public {
vm.startPrank(owner);
im.addBeneficiery(beneficiary1);
im.addBeneficiery(beneficiary2);
vm.stopPrank();
vm.warp(block.timestamp + 91 days);
vm.prank(beneficiary1);
im.inherit();
vm.startPrank(beneficiary1);
im.appointTrustee(nonBeneficiary);
assertEq(im.getTrustee(), nonBeneficiary);
vm.stopPrank();
}
function testBuyOutEstateWithArrayOutOfBounds() public {
vm.startPrank(owner);
im.addBeneficiery(beneficiary1);
im.addBeneficiery(beneficiary2);
im.createEstateNFT("vacation home", 3e6, address(usdc));
vm.stopPrank();
vm.warp(block.timestamp + 91 days);
vm.prank(beneficiary1);
im.inherit();
assertTrue(im.getIsInherited());
vm.startPrank(nonBeneficiary);
vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x32));
im.buyOutEstateNFT(1);
vm.stopPrank();
}
function testMultipleBeneficiariesEdgeCase() public {
vm.startPrank(owner);
address[] memory beneficiaries = new address[](5);
for (uint i = 0; i < 5; i++) {
beneficiaries[i] = makeAddr(string(abi.encodePacked("beneficiary", i)));
im.addBeneficiery(beneficiaries[i]);
}
vm.stopPrank();
vm.warp(block.timestamp + 91 days);
vm.prank(beneficiaries[0]);
im.inherit();
assertTrue(im.getIsInherited());
vm.startPrank(nonBeneficiary);
vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x32));
im.appointTrustee(nonBeneficiary);
vm.stopPrank();
}
}
forge test --match-contract ArrayOutOfBoundsTest -vvv
[⠰] Compiling...
No files changed, compilation skipped
Ran 4 tests for test/ArrayOut-of-BoundsPoC.t.sol:ArrayOutOfBoundsTest
[PASS] testArrayOutOfBoundsInOnlyBeneficiaryModifier() (gas: 294171)
[PASS] testBuyOutEstateWithArrayOutOfBounds() (gas: 294022)
[PASS] testMultipleBeneficiariesEdgeCase() (gas: 227176)
[PASS] testValidBeneficiaryPassesModifier() (gas: 163037)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 5.69ms (1.78ms CPU time)
Ran 1 test suite in 40.08ms (5.69ms CPU time): 4 tests passed, 0 failed, 0 skipped (4 total tests)