Skip to content

Commit

Permalink
Revert on selecting the same farm as existing one
Browse files Browse the repository at this point in the history
  • Loading branch information
oldchili committed Dec 28, 2023
1 parent cab89b5 commit eb5e999
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
17 changes: 9 additions & 8 deletions src/LockstakeEngine.sol
Original file line number Diff line number Diff line change
Expand Up @@ -258,16 +258,17 @@ contract LockstakeEngine is Multicall {

function selectFarm(address urn, address farm, uint16 ref) external urnAuth(urn) {
require(farm == address(0) || farms[farm] == 1, "LockstakeEngine/non-existing-farm");
_selectFarm(urn, farm, ref);
address prevFarm = urnFarms[urn];
require(prevFarm != farm, "LockstakeEngine/same-farm");
_selectFarm(urn, prevFarm, farm, ref);
emit SelectFarm(urn, farm, ref);
}

function _selectFarm(address urn, address farm, uint16 ref) internal {
address urnFarm = urnFarms[urn];
if (urnFarm != address(0)) {
uint256 balance = GemLike(urnFarm).balanceOf(address(urn));
function _selectFarm(address urn, address prevFarm, address farm, uint16 ref) internal {
if (prevFarm != address(0)) {
uint256 balance = GemLike(prevFarm).balanceOf(address(urn));
if (balance > 0) {
LockstakeUrn(urn).withdraw(urnFarm, balance);
LockstakeUrn(urn).withdraw(prevFarm, balance);
}
}
if (farm != address(0)) {
Expand Down Expand Up @@ -375,7 +376,7 @@ contract LockstakeEngine is Multicall {
function onKick(address urn, uint256 wad) external auth {
(uint256 ink,) = vat.urns(ilk, urn);
_selectDelegate(urn, ink + wad, urnDelegates[urn], address(0));
_selectFarm(urn, address(0), 0);
_selectFarm(urn, urnFarms[urn], address(0), 0);
stkMkr.burn(urn, wad); // Burn the liquidated amount of staking token
// Urn confiscation happens in Dog contract where ilk vat.gem is sent to the LockstakeClipper
emit OnKick(urn, wad);
Expand All @@ -401,7 +402,7 @@ contract LockstakeEngine is Multicall {
vat.frob(ilk, urn, urn, address(0), int256(left), 0);
stkMkr.mint(urn, left);
_selectDelegate(urn, ink, urnDelegates[urn], address(0));
_selectFarm(urn, address(0), 0);
_selectFarm(urn, urnFarms[urn], address(0), 0);
}
emit OnTakeLeftovers(urn, tot, left, burn);
}
Expand Down
2 changes: 2 additions & 0 deletions test/LockstakeEngine.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,8 @@ contract LockstakeEngineTest is DssTest {
emit SelectFarm(urn, address(farm), 5);
engine.selectFarm(urn, address(farm), 5);
assertEq(engine.urnFarms(urn), address(farm));
vm.expectRevert("LockstakeEngine/same-farm");
engine.selectFarm(urn, address(farm), 5);
vm.prank(pauseProxy); engine.addFarm(address(farm2));
engine.selectFarm(urn, address(farm2), 5);
assertEq(engine.urnFarms(urn), address(farm2));
Expand Down

0 comments on commit eb5e999

Please sign in to comment.