Skip to content

Commit 59b0a51

Browse files
committedOct 11, 2024··
test(DssVestSuckable): add coverage for USDS vest
1 parent 70cd780 commit 59b0a51

File tree

2 files changed

+68
-23
lines changed

2 files changed

+68
-23
lines changed
 

‎src/DssVest.sol

+7
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,13 @@ contract DssVestSuckable is DssVest {
458458
vat.suck(chainlog.getAddress("MCD_VOW"), address(this), mul(_amt, RAY));
459459
join.exit(_guy, _amt);
460460
}
461+
462+
/**
463+
@dev Compatibility with older implementations of `DssVestSuckable`
464+
*/
465+
function daiJoin() external view returns (address) {
466+
return address(join);
467+
}
461468
}
462469

463470
/*

‎src/DssVest.t.sol

+61-23
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ interface GemLike {
2626
function approve(address, uint256) external returns (bool);
2727
}
2828

29-
interface DaiLike is GemLike {
29+
interface ERC20Like is GemLike {
3030
function balanceOf(address) external returns (uint256);
3131
}
3232

@@ -92,15 +92,17 @@ contract DssVestTest is DSTest {
9292

9393
DssVestMintable mVest;
9494
DssVestSuckable sVest;
95+
DssVestSuckable sVestUsds;
9596
DssVestTransferrable tVest;
9697
Manager boss;
9798

9899
ChainlogLike chainlog;
99100
DSTokenLike gem;
100101
MkrAuthorityLike authority;
101102
VatLike vat;
102-
DaiLike dai;
103+
ERC20Like dai;
103104
JoinLike daiJoin;
105+
ERC20Like usds;
104106
JoinLike usdsJoin;
105107
EndLike end;
106108

@@ -113,16 +115,19 @@ contract DssVestTest is DSTest {
113115
gem = DSTokenLike ( chainlog.getAddress("MCD_GOV"));
114116
authority = MkrAuthorityLike( chainlog.getAddress("GOV_GUARD"));
115117
vat = VatLike( chainlog.getAddress("MCD_VAT"));
116-
dai = DaiLike( chainlog.getAddress("MCD_DAI"));
118+
dai = ERC20Like( chainlog.getAddress("MCD_DAI"));
117119
daiJoin = JoinLike( chainlog.getAddress("MCD_JOIN_DAI"));
120+
usds = ERC20Like( chainlog.getAddress("USDS"));
118121
usdsJoin = JoinLike( chainlog.getAddress("USDS_JOIN"));
119122
end = EndLike( chainlog.getAddress("MCD_END"));
120123
VOW = chainlog.getAddress("MCD_VOW");
121124

122125
mVest = new DssVestMintable(address(gem));
123126
mVest.file("cap", (2000 * WAD) / (4 * 365 days));
124-
sVest = new DssVestSuckable(address(chainlog), address(usdsJoin));
127+
sVest = new DssVestSuckable(address(chainlog), address(daiJoin));
125128
sVest.file("cap", (2000 * WAD) / (4 * 365 days));
129+
sVestUsds = new DssVestSuckable(address(chainlog), address(usdsJoin));
130+
sVestUsds.file("cap", (2000 * WAD) / (4 * 365 days));
126131
boss = new Manager();
127132
tVest = new DssVestTransferrable(address(boss), address(dai));
128133
tVest.file("cap", (2000 * WAD) / (4 * 365 days));
@@ -145,13 +150,28 @@ contract DssVestTest is DSTest {
145150
);
146151
assertEq(vat.wards(address(sVest)), 1);
147152

153+
hevm.store(
154+
address(vat),
155+
keccak256(abi.encode(address(sVestUsds), uint256(0))),
156+
bytes32(uint256(1))
157+
);
158+
assertEq(vat.wards(address(sVestUsds)), 1);
159+
148160
// Give boss 10000 DAI
149161
hevm.store(
150162
address(dai),
151163
keccak256(abi.encode(address(boss), uint(2))),
152164
bytes32(uint256(10000 * WAD))
153165
);
154166
assertEq(dai.balanceOf(address(boss)), 10000 * WAD);
167+
168+
// Give boss 10000 USDS
169+
hevm.store(
170+
address(usds),
171+
keccak256(abi.encode(address(boss), uint(2))),
172+
bytes32(uint256(10000 * WAD))
173+
);
174+
assertEq(usds.balanceOf(address(boss)), 10000 * WAD, "Failed to check usds balance");
155175
}
156176

157177
function testCost() public {
@@ -290,34 +310,34 @@ contract DssVestTest is DSTest {
290310

291311
function testAccrued() public {
292312
uint256 id = mVest.create(address(this), 100 * days_vest, block.timestamp + 10 days, 100 days, 0, address(0));
293-
assertTrue(mVest.valid(id));
313+
assertTrue(mVest.valid(id), "0");
294314

295-
assertEq(mVest.accrued(id), 0);
315+
assertEq(mVest.accrued(id), 0, "1");
296316
hevm.warp(block.timestamp + 43200);
297-
assertEq(mVest.unpaid(id), 0); // inside cliff
298-
assertEq(mVest.accrued(id), 0);
317+
assertEq(mVest.unpaid(id), 0, "2"); // inside cliff
318+
assertEq(mVest.accrued(id), 0, "3");
299319
hevm.warp(block.timestamp + 12 hours + 11 days);
300-
assertEq(mVest.unpaid(id), days_vest * 2); // past cliff
301-
assertEq(mVest.accrued(id), days_vest * 2);
320+
assertEq(mVest.unpaid(id), days_vest * 2, "3.1"); // past cliff
321+
assertEq(mVest.accrued(id), days_vest * 2, "4");
302322
hevm.warp(block.timestamp + 2 days);
303-
assertEq(mVest.unpaid(id), days_vest * 4); // past cliff
304-
assertEq(mVest.accrued(id), days_vest * 4);
323+
assertEq(mVest.unpaid(id), days_vest * 4, "5"); // past cliff
324+
assertEq(mVest.accrued(id), days_vest * 4, "6");
305325
mVest.vest(id);
306-
assertEq(mVest.unpaid(id), 0);
307-
assertEq(mVest.accrued(id), days_vest * 4);
308-
assertEq(gem.balanceOf(address(this)), days_vest * 4);
326+
assertEq(mVest.unpaid(id), 0, "7");
327+
assertEq(mVest.accrued(id), days_vest * 4, "8");
328+
assertEq(gem.balanceOf(address(this)), days_vest * 4, "9");
309329
hevm.warp(block.timestamp + 10 days);
310-
assertEq(mVest.unpaid(id), days_vest * 10);
311-
assertEq(mVest.accrued(id), days_vest * 14);
330+
assertEq(mVest.unpaid(id), days_vest * 10, "10");
331+
assertEq(mVest.accrued(id), days_vest * 14, "11");
312332
mVest.vest(id);
313-
assertEq(mVest.unpaid(id), 0);
314-
assertEq(mVest.accrued(id), days_vest * 14);
315-
assertEq(gem.balanceOf(address(this)), days_vest * 14);
333+
assertEq(mVest.unpaid(id), 0, "12");
334+
assertEq(mVest.accrued(id), days_vest * 14, "13");
335+
assertEq(gem.balanceOf(address(this)), days_vest * 14, "14");
316336
hevm.warp(block.timestamp + 120 days); // vesting complete
317-
assertEq(mVest.unpaid(id), days_vest * 86);
318-
assertEq(mVest.accrued(id), days_vest * 100);
337+
assertEq(mVest.unpaid(id), days_vest * 86, "15");
338+
assertEq(mVest.accrued(id), days_vest * 100, "16");
319339
mVest.vest(id);
320-
assertEq(gem.balanceOf(address(this)), 100 * days_vest);
340+
assertEq(gem.balanceOf(address(this)), 100 * days_vest, "17");
321341
}
322342

323343
function testFutureAccrual() public {
@@ -676,6 +696,24 @@ contract DssVestTest is DSTest {
676696
assertEq(vat.sin(VOW), originalSin + 100 * days_vest * RAY);
677697
}
678698

699+
function testSuckableVestUsds() public {
700+
uint256 originalSin = vat.sin(VOW);
701+
uint256 id = sVestUsds.create(address(this), 100 * days_vest, block.timestamp, 100 days, 0, address(0));
702+
assertTrue(sVestUsds.valid(id));
703+
hevm.warp(block.timestamp + 1 days);
704+
sVestUsds.vest(id);
705+
assertEq(usds.balanceOf(address(this)), 1 * days_vest);
706+
assertEq(vat.sin(VOW), originalSin + 1 * days_vest * RAY);
707+
hevm.warp(block.timestamp + 9 days);
708+
sVestUsds.vest(id);
709+
assertEq(usds.balanceOf(address(this)), 10 * days_vest);
710+
assertEq(vat.sin(VOW), originalSin + 10 * days_vest * RAY);
711+
hevm.warp(block.timestamp + 365 days);
712+
sVestUsds.vest(id);
713+
assertEq(usds.balanceOf(address(this)), 100 * days_vest);
714+
assertEq(vat.sin(VOW), originalSin + 100 * days_vest * RAY);
715+
}
716+
679717
function testSuckableVestCaged() public {
680718
uint256 originalSin = vat.sin(VOW);
681719
uint256 id = sVest.create(address(this), 100 * days_vest, block.timestamp, 100 days, 0, address(0));

0 commit comments

Comments
 (0)
Please sign in to comment.