diff --git a/src/Allocator.sol b/src/Allocator.sol index efd4134..62efe54 100644 --- a/src/Allocator.sol +++ b/src/Allocator.sol @@ -110,10 +110,11 @@ contract Allocator is Initializable, Ownable2StepUpgradeable, UUPSUpgradeable, I uint256 allowanceBefore = allowance(allocator); if (allowanceBefore == 0) { revert AlreadyZero(); - } else if (allowanceBefore < amount) { - amount = allowanceBefore; + } else if (allowanceBefore <= amount) { + _allocators.remove(allocator); + } else { + _allocators.set(allocator, allowanceBefore - amount); } - _allocators.set(allocator, allowanceBefore - amount); emit AllowanceChanged(allocator, allowanceBefore, allowance(allocator)); } diff --git a/test/Allocator.t.sol b/test/Allocator.t.sol index a56cc87..61ba0f9 100644 --- a/test/Allocator.t.sol +++ b/test/Allocator.t.sol @@ -301,4 +301,20 @@ contract AllocatorTest is Test { emit IAllocator.AllowanceChanged(vm.addr(1), 100, 50); allocator.decreaseAllowance(vm.addr(1), 50); } + + function testDecreaseAllowanceRemoveAllocator() public { + allocator.setAllowance(vm.addr(1), 100); + allocator.setAllowance(vm.addr(2), 100); + address[] memory allocators = allocator.getAllocators(); + assertEq(allocators[0], vm.addr(1)); + assertEq(allocators[1], vm.addr(2)); + assertEq(allocators.length, 2); + allocator.decreaseAllowance(vm.addr(1), 150); + allocators = allocator.getAllocators(); + assertEq(allocators[0], vm.addr(2)); + assertEq(allocators.length, 1); + allocator.decreaseAllowance(vm.addr(2), 100); + allocators = allocator.getAllocators(); + assertEq(allocators.length, 0); + } }