When the number of teachers is large or if the bursary is low (e.g., due to only one student enrolling), the safeTransfer
call fails due to ERC20InsufficientBalance.
function test_bursary_increased() public {
vm.startPrank(clara);
usdc.approve(address(levelOneProxy), schoolFees);
levelOneProxy.enroll();
vm.stopPrank();
vm.startPrank(principal);
levelOneProxy.addTeacher(alice);
levelOneProxy.addTeacher(bob);
levelOneProxy.addTeacher(carlos);
levelOneProxy.addTeacher(Manc);
levelTwoImplementation = new LevelTwo();
address levelTwoImplementationAddress = address(levelTwoImplementation);
bytes memory data = abi.encodeCall(LevelTwo.graduate, ());
levelOneProxy.graduateAndUpgrade(levelTwoImplementationAddress, data);
LevelTwo levelTwoProxy = LevelTwo(address(levelOneProxy));
uint256 actualBursary = levelTwoProxy.bursary();
console2.log("Bursary after 2 students enrolled:", actualBursary);
assertEq(actualBursary, schoolFees);
}
[772109] LevelOneAndGraduateTest::test_bursary_increased()
├─ [0] VM::startPrank(first_student: [0x0e0C2a2596E7bCd5122Ae32390d8C0657fe5b879])
│ └─ ← [Return]
├─ [24739] MockUSDC::approve(ERC1967Proxy: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], 5000000000000000000000 [5e21])
│ ├─ emit Approval(owner: first_student: [0x0e0C2a2596E7bCd5122Ae32390d8C0657fe5b879], spender: ERC1967Proxy: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], value: 5000000000000000000000 [5e21])
│ └─ ← [Return] true
├─ [157516] ERC1967Proxy::enroll()
│ ├─ [152629] LevelOne::enroll() [delegatecall]
│ │ ├─ [30869] MockUSDC::transferFrom(first_student: [0x0e0C2a2596E7bCd5122Ae32390d8C0657fe5b879], ERC1967Proxy: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], 5000000000000000000000 [5e21])
│ │ │ ├─ emit Transfer(from: first_student: [0x0e0C2a2596E7bCd5122Ae32390d8C0657fe5b879], to: ERC1967Proxy: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], value: 5000000000000000000000 [5e21])
│ │ │ └─ ← [Return] true
│ │ ├─ emit Enrolled(: first_student: [0x0e0C2a2596E7bCd5122Ae32390d8C0657fe5b879])
│ │ └─ ← [Stop]
│ └─ ← [Return]
├─ [0] VM::stopPrank()
│ └─ ← [Return]
├─ [0] VM::startPrank(principal: [0x6b9470599cb23a06988C6332ABE964d6608A50ca])
│ └─ ← [Return]
├─ [71191] ERC1967Proxy::addTeacher(first_teacher: [0xeeEeC5A3afd714e3C63A0b1ef6d80722Bcc514b3])
│ ├─ [70801] LevelOne::addTeacher(first_teacher: [0xeeEeC5A3afd714e3C63A0b1ef6d80722Bcc514b3]) [delegatecall]
│ │ ├─ emit TeacherAdded(: first_teacher: [0xeeEeC5A3afd714e3C63A0b1ef6d80722Bcc514b3])
│ │ └─ ← [Stop]
│ └─ ← [Return]
├─ [49291] ERC1967Proxy::addTeacher(second_teacher: [0xb4c265c1f1d07474E3715F65724E8fa9d662BF0e])
│ ├─ [48901] LevelOne::addTeacher(second_teacher: [0xb4c265c1f1d07474E3715F65724E8fa9d662BF0e]) [delegatecall]
│ │ ├─ emit TeacherAdded(: second_teacher: [0xb4c265c1f1d07474E3715F65724E8fa9d662BF0e])
│ │ └─ ← [Stop]
│ └─ ← [Return]
├─ [49291] ERC1967Proxy::addTeacher(third_teacher: [0x274526F5338cEA789F7a2Df38cF5d9aFF6070F5a])
│ ├─ [48901] LevelOne::addTeacher(third_teacher: [0x274526F5338cEA789F7a2Df38cF5d9aFF6070F5a]) [delegatecall]
│ │ ├─ emit TeacherAdded(: third_teacher: [0x274526F5338cEA789F7a2Df38cF5d9aFF6070F5a])
│ │ └─ ← [Stop]
│ └─ ← [Return]
├─ [49291] ERC1967Proxy::addTeacher(fourth_teacher: [0x8e0CCf7D980f4A1963EEAc41B560e5D10B458cF8])
│ ├─ [48901] LevelOne::addTeacher(fourth_teacher: [0x8e0CCf7D980f4A1963EEAc41B560e5D10B458cF8]) [delegatecall]
│ │ ├─ emit TeacherAdded(: fourth_teacher: [0x8e0CCf7D980f4A1963EEAc41B560e5D10B458cF8])
│ │ └─ ← [Stop]
│ └─ ← [Return]
├─ [228469] → new LevelTwo@0x83a4207Df92bA7f9DeD23D61A8802172740D7077
│ └─ ← [Return] 1141 bytes of code
├─ [56232] ERC1967Proxy::graduateAndUpgrade(LevelTwo: [0x83a4207Df92bA7f9DeD23D61A8802172740D7077], 0xd3618cca)
│ ├─ [55814] LevelOne::graduateAndUpgrade(LevelTwo: [0x83a4207Df92bA7f9DeD23D61A8802172740D7077], 0xd3618cca) [delegatecall]
│ │ ├─ [25188] MockUSDC::transfer(first_teacher: [0xeeEeC5A3afd714e3C63A0b1ef6d80722Bcc514b3], 1750000000000000000000 [1.75e21])
│ │ │ ├─ emit Transfer(from: ERC1967Proxy: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], to: first_teacher: [0xeeEeC5A3afd714e3C63A0b1ef6d80722Bcc514b3], value: 1750000000000000000000 [1.75e21])
│ │ │ └─ ← [Return] true
│ │ ├─ [25188] MockUSDC::transfer(second_teacher: [0xb4c265c1f1d07474E3715F65724E8fa9d662BF0e], 1750000000000000000000 [1.75e21])
│ │ │ ├─ emit Transfer(from: ERC1967Proxy: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], to: second_teacher: [0xb4c265c1f1d07474E3715F65724E8fa9d662BF0e], value: 1750000000000000000000 [1.75e21])
│ │ │ └─ ← [Return] true
│ │ ├─ [897] MockUSDC::transfer(third_teacher: [0x274526F5338cEA789F7a2Df38cF5d9aFF6070F5a], 1750000000000000000000 [1.75e21])
│ │ │ └─ ← [Revert] ERC20InsufficientBalance(0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496, 1500000000000000000000 [1.5e21], 1750000000000000000000 [1.75e21])
│ │ └─ ← [Revert] ERC20InsufficientBalance(0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496, 1500000000000000000000 [1.5e21], 1750000000000000000000 [1.75e21])
│ └─ ← [Revert] ERC20InsufficientBalance(0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496, 1500000000000000000000 [1.5e21], 1750000000000000000000 [1.75e21])
└─ ← [Revert] ERC20InsufficientBalance(0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496, 1500000000000000000000 [1.5e21], 1750000000000000000000 [1.75e21])
Suite result: FAILED. 0 passed; 1 failed; 0 skipped; finished in 7.16ms (667.40µs CPU time)