diff --git a/.gitignore b/.gitignore index e2e7327..5353363 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /out +/cache diff --git a/Makefile b/Makefile index ecfccf2..790555e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -all :; DAPP_BUILD_OPTIMIZE=1 DAPP_BUILD_OPTIMIZE_RUNS=200 dapp --use solc:0.6.12 build -clean :; dapp clean -test :; dapp --use solc:0.6.12 test -v -deploy :; make && dapp create LerpFactory -flatten :; hevm flatten --source-file src/LerpFactory.sol > out/LerpFactory.sol && hevm flatten --source-file src/Lerp.sol > out/Lerp.sol +all :; forge build --use solc:0.6.12 --optimize --optimizer-runs 200 +clean :; forge clean +test :; forge test -vvv +deploy :; make && forge create LerpFactory +flatten :; forge flatten --output out/LerpFactory.flattened.sol src/LerpFactory.sol diff --git a/lib/ds-test b/lib/ds-test index 0a5da56..9310e87 160000 --- a/lib/ds-test +++ b/lib/ds-test @@ -1 +1 @@ -Subproject commit 0a5da56b0d65960e6a994d2ec8245e6edd38c248 +Subproject commit 9310e879db8ba3ea6d5c6489a579118fd264a3f5 diff --git a/src/Lerp.t.sol b/src/Lerp.t.sol index 0b6164a..4c53531 100644 --- a/src/Lerp.t.sol +++ b/src/Lerp.t.sol @@ -117,30 +117,32 @@ contract DssLerpTest is DSTest { } function test_lerp() public { - Lerp lerp = new Lerp(address(target), "value", block.timestamp, 1 * TOLL_ONE_PCT, 1 * TOLL_ONE_PCT / 10, 9 days); + uint256 startTime = block.timestamp; + Lerp lerp = new Lerp(address(target), "value", startTime, 1 * TOLL_ONE_PCT, 1 * TOLL_ONE_PCT / 10, 9 days); + assertEq(lerp.what(), "value"); assertEq(lerp.start(), 1 * TOLL_ONE_PCT); assertEq(lerp.end(), 1 * TOLL_ONE_PCT / 10); assertEq(lerp.duration(), 9 days); assertTrue(!lerp.done()); - assertEq(lerp.startTime(), 0); + assertEq(lerp.startTime(), block.timestamp); assertEq(target.value(), 0); target.rely(address(lerp)); lerp.tick(); assertTrue(!lerp.done()); assertEq(lerp.startTime(), block.timestamp); assertEq(target.value(), 1 * TOLL_ONE_PCT); - hevm.warp(1 days); + hevm.warp(startTime + 1 days); assertEq(target.value(), 1 * TOLL_ONE_PCT); lerp.tick(); assertEq(target.value(), 9 * TOLL_ONE_PCT / 10); // 0.9% - hevm.warp(2 days); + hevm.warp(startTime + 2 days); lerp.tick(); assertEq(target.value(), 8 * TOLL_ONE_PCT / 10); // 0.8% - hevm.warp(2 days + 12 hours); + hevm.warp(startTime + 2 days + 12 hours); lerp.tick(); assertEq(target.value(), 75 * TOLL_ONE_PCT / 100); // 0.75% - hevm.warp(12 days); + hevm.warp(startTime + 12 days); assertEq(target.wards(address(lerp)), 1); lerp.tick(); assertEq(target.value(), 1 * TOLL_ONE_PCT / 10); // 0.1% @@ -148,6 +150,62 @@ contract DssLerpTest is DSTest { assertEq(target.wards(address(lerp)), 0); } + // Confirm lerp can be used as a durational toggle switch for 0 --> 1 values. + function test_lerp_zero_to_one() public { + uint256 start = 0; + uint256 end = 1; + uint256 duration = 30 days; + uint256 testStart = block.timestamp; + + Lerp lerp = new Lerp(address(target), "value", testStart, start, end, duration); + target.rely(address(lerp)); + lerp.tick(); + assertEq(target.value(), 0); + + hevm.warp(testStart + duration/2); // Halfway through + + lerp.tick(); + assertEq(target.value(), 0); + + hevm.warp(testStart + duration - 1); // One block before completion + + lerp.tick(); + assertEq(target.value(), 0); + + hevm.warp(testStart + duration); // End of period + + lerp.tick(); + assertEq(target.value(), 1); + } + + // Confirm lerp can be used as a durational toggle switch for 1 --> 0 values. + function test_lerp_one_to_zero() public { + uint256 start = 1; + uint256 end = 0; + uint256 duration = 30 days; + uint256 testStart = block.timestamp; + + Lerp lerp = new Lerp(address(target), "value", testStart, start, end, duration); + target.rely(address(lerp)); + lerp.tick(); + assertEq(target.value(), 1); + + hevm.warp(testStart + duration/2); // Halfway through + + lerp.tick(); + assertEq(target.value(), 1); + + hevm.warp(testStart + duration - 1); // One block before completion + + lerp.tick(); + assertEq(target.value(), 1); + + hevm.warp(testStart + duration); // End of period + + lerp.tick(); + assertEq(target.value(), 0); + } + function test_lerp_max_values1() public { uint256 start = 10 ** 59; uint256 end = 10 ** 59 - 1;