Skip to content

Commit

Permalink
Migrate via previous approval from urn owner
Browse files Browse the repository at this point in the history
  • Loading branch information
sunbreak1211 committed Nov 28, 2023
1 parent b69c955 commit c83060c
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/LockstakeEngine.sol
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ interface JugLike {
function drip(bytes32) external returns (uint256);
}

interface MovLike {
function registerMigration(address, address) external;
}

contract LockstakeEngine {
// --- storage variables ---

Expand All @@ -65,6 +69,7 @@ contract LockstakeEngine {
mapping(address => address) public urnDelegates; // urn => current associated delegate
mapping(address => address) public selectedFarm; // urn => current selected farm
JugLike public jug;
address public mov;

// --- constants ---

Expand All @@ -90,6 +95,7 @@ contract LockstakeEngine {
event AddFarm(address farm);
event DelFarm(address farm);
event Open(address indexed owner, address urn);
event Migrate(address indexed urn, address mov_);
event Delegate(address indexed urn, address indexed delegate);
event Lock(address indexed urn, uint256 wad);
event Free(address indexed urn, uint256 wad, uint256 burn);
Expand Down Expand Up @@ -156,6 +162,8 @@ contract LockstakeEngine {
function file(bytes32 what, address data) external auth {
if (what == "jug") {
jug = JugLike(data);
} else if (what == "mov") {
mov = data;
} else revert("LockstakeEngine/file-unrecognized-param");
emit File(what, data);
}
Expand Down Expand Up @@ -198,6 +206,13 @@ contract LockstakeEngine {
emit Open(msg.sender, urn);
}

function migrate(address urn, address mov_) external urnOwner(urn) {
require(mov == mov_ && mov_ != address(0), "LockstakeEngine/mover-not-available");
urnOwners[urn] = mov_;
MovLike(mov_).registerMigration(urn, msg.sender);
emit Migrate(urn, mov_);
}

function lock(address urn, uint256 wad) external urnOwner(urn) {
require(wad <= uint256(type(int256).max), "LockstakeEngine/wad-overflow");
gov.transferFrom(msg.sender, address(this), wad);
Expand Down
30 changes: 30 additions & 0 deletions test/LockstakeEngine.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ interface CalcLike {
function file(bytes32, uint256) external;
}

contract MigratorMock {
mapping (address => address) public registeredUrns;
function registerMigration(address urn, address owner) external {
registeredUrns[urn] = owner;
}
}

contract AllocatorVaultTest is DssTest {
using stdStorage for StdStorage;

Expand Down Expand Up @@ -214,6 +221,29 @@ contract AllocatorVaultTest is DssTest {
assertEq(engine.usrAmts(address(this)), 3);
}

function testMigrator() external {
address urnOwner = address(123);
MigratorMock migrator = new MigratorMock();
deal(address(gov), urnOwner, 100_000 * 10**18, true);
vm.prank(urnOwner); address urn = engine.open();
assertEq(engine.urnOwners(urn), urnOwner);
vm.prank(urnOwner); gov.approve(address(engine), 100_000 * 10**18);
vm.prank(urnOwner); engine.lock(urn, 100_000 * 10**18);
assertEq(engine.mov(), address(0));
vm.expectRevert("LockstakeEngine/mover-not-available");
vm.prank(urnOwner); engine.migrate(urn, address(0));
vm.prank(pauseProxy); engine.file("mov", address(migrator));
assertEq(engine.mov(), address(migrator));
vm.expectRevert("LockstakeEngine/mover-not-available");
vm.prank(urnOwner); engine.migrate(urn, address(789));
vm.prank(urnOwner); engine.migrate(urn, address(migrator));
assertEq(engine.urnOwners(urn), address(migrator));
assertEq(migrator.registeredUrns(urn), urnOwner);
assertEq(gov.balanceOf(address(migrator)), 0);
vm.prank(address(migrator)); engine.free(urn, 100_000 * 10**18);
assertEq(gov.balanceOf(address(migrator)), 85_000 * 10**18);
}

function _testLockFree(bool withDelegate) internal {
uint256 initialSupply = gov.totalSupply();
assertEq(gov.balanceOf(address(this)), 100_000 * 10**18);
Expand Down

0 comments on commit c83060c

Please sign in to comment.