From d28c732f70b55f5fc5008664790521ffe3e3e800 Mon Sep 17 00:00:00 2001 From: e6f4e37l <66016924+fiveoutofnine@users.noreply.github.com> Date: Fri, 17 Nov 2023 12:16:58 -0500 Subject: [PATCH] fix: allow transfers to team 0 (individual) --- src/TeamRegistry.sol | 2 +- test/TeamRegistry.t.sol | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/TeamRegistry.sol b/src/TeamRegistry.sol index e28623a..319b930 100644 --- a/src/TeamRegistry.sol +++ b/src/TeamRegistry.sol @@ -210,7 +210,7 @@ contract TeamRegistry { if (team.isLeader) revert IsTeamLeader(team.id); // Revert if `msg.sender` is not approved to join the team. - if (!getApproved[_to][msg.sender]) revert Unauthorized(); + if (_to > 0 && !getApproved[_to][msg.sender]) revert Unauthorized(); // Transfer team. getTeam[msg.sender].id = uint248(_to); diff --git a/test/TeamRegistry.t.sol b/test/TeamRegistry.t.sol index 5e036ba..d13ce95 100644 --- a/test/TeamRegistry.t.sol +++ b/test/TeamRegistry.t.sol @@ -422,7 +422,22 @@ contract TeamRegistyTest is Test { tr.transferTeam(1); } - /// @notice Test events emitted and state updates upon transferring teams. + /// @notice Test that transferring teams to 0 (individual) succeeds. + function test_transferFrom_ToZero_Succeeds() public { + _createTeam(); + + // Repeatedly transfer `makeAddr("sudolabel")` between team 1 and 0 + // (individual). + vm.startPrank(makeAddr("sudolabel")); + tr.transferTeam(1); + tr.transferTeam(0); + tr.transferTeam(1); + tr.transferTeam(0); + vm.stopPrank(); + } + + /// @notice Test events emitted and state updates upon transferring teams, + /// then transferring to `0` (individual). function test_transferTeam() public { _createTeam(); @@ -432,7 +447,7 @@ contract TeamRegistyTest is Test { assertEq(teamId, 0); } - // Transfer team 1 to `makeAddr("sudolabel")`. + // Transfer `makeAddr("sudolabel")` to team 1. vm.expectEmit(true, true, true, true); emit TransferTeam(0, 1, makeAddr("sudolabel")); vm.prank(makeAddr("sudolabel")); @@ -443,6 +458,18 @@ contract TeamRegistyTest is Test { (uint248 teamId,) = tr.getTeam(makeAddr("sudolabel")); assertEq(teamId, 1); } + + // Transfer `makeAddr("sudolabel")` to individual. + vm.expectEmit(true, true, true, true); + emit TransferTeam(1, 0, makeAddr("sudolabel")); + vm.prank(makeAddr("sudolabel")); + tr.transferTeam(0); + + // Test that `makeAddr("sudolabel")` is now marked as individual. + { + (uint248 teamId,) = tr.getTeam(makeAddr("sudolabel")); + assertEq(teamId, 0); + } } // -------------------------------------------------------------------------