Skip to content

Commit

Permalink
Add unit tests for new pricing mechanism
Browse files Browse the repository at this point in the history
  • Loading branch information
stevieraykatz committed Jul 12, 2024
1 parent 65de742 commit a65e73b
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 7 deletions.
7 changes: 4 additions & 3 deletions test/RegistrarController/DiscountedRegister.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,12 @@ contract DiscountedRegister is RegistrarControllerBase {
vm.deal(user, 1 ether);
vm.prank(owner);
controller.setDiscountDetails(_getDefaultDiscount());
uint256 price = controller.discountedRegisterPrice(name, duration, discountKey);
validator.setReturnValue(true);
base.setAvailable(uint256(nameLabel), true);
RegistrarController.RegisterRequest memory request = _getDefaultRegisterRequest();
uint256 expires = block.timestamp + request.duration;
base.setNameExpires(uint256(nameLabel), expires);
uint256 price = controller.discountedRegisterPrice(name, duration, discountKey);

vm.expectEmit(address(controller));
emit RegistrarController.ETHPaymentProcessed(user, price);
Expand All @@ -108,12 +108,12 @@ contract DiscountedRegister is RegistrarControllerBase {
vm.deal(user, 1 ether);
vm.prank(owner);
controller.setDiscountDetails(_getDefaultDiscount());
uint256 price = controller.discountedRegisterPrice(name, duration, discountKey);
validator.setReturnValue(true);
base.setAvailable(uint256(nameLabel), true);
RegistrarController.RegisterRequest memory request = _getDefaultRegisterRequest();
uint256 expires = block.timestamp + request.duration;
base.setNameExpires(uint256(nameLabel), expires);
uint256 price = controller.discountedRegisterPrice(name, duration, discountKey);

vm.prank(user);
controller.discountedRegister{value: price + 1}(request, discountKey, "");
Expand All @@ -126,12 +126,13 @@ contract DiscountedRegister is RegistrarControllerBase {
vm.deal(user, 1 ether);
vm.prank(owner);
controller.setDiscountDetails(_getDefaultDiscount());
uint256 price = controller.discountedRegisterPrice(name, duration, discountKey);
validator.setReturnValue(true);
base.setAvailable(uint256(nameLabel), true);
RegistrarController.RegisterRequest memory request = _getDefaultRegisterRequest();
uint256 expires = block.timestamp + request.duration;
base.setNameExpires(uint256(nameLabel), expires);
uint256 price = controller.discountedRegisterPrice(name, duration, discountKey);

vm.prank(user);
controller.discountedRegister{value: price}(request, discountKey, "");

Expand Down
4 changes: 2 additions & 2 deletions test/RegistrarController/Register.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ contract Register is RegistrarControllerBase {
vm.deal(user, 1 ether);
RegistrarController.RegisterRequest memory request = _getDefaultRegisterRequest();

uint256 price = controller.registerPrice(request.name, request.duration);
base.setAvailable(uint256(nameLabel), true);
uint256 expires = block.timestamp + request.duration;
base.setNameExpires(uint256(nameLabel), expires);
uint256 price = controller.registerPrice(request.name, request.duration);

vm.expectEmit(address(controller));
emit RegistrarController.ETHPaymentProcessed(user, price);
Expand All @@ -72,10 +72,10 @@ contract Register is RegistrarControllerBase {
vm.deal(user, 1 ether);
RegistrarController.RegisterRequest memory request = _getDefaultRegisterRequest();

uint256 price = controller.registerPrice(request.name, request.duration);
base.setAvailable(uint256(nameLabel), true);
uint256 expires = block.timestamp + request.duration;
base.setNameExpires(uint256(nameLabel), expires);
uint256 price = controller.registerPrice(request.name, request.duration);

vm.prank(user);
controller.register{value: price + 1}(request);
Expand Down
4 changes: 4 additions & 0 deletions test/RegistrarController/RegistrarControllerBase.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ contract RegistrarControllerBase is Test {
uint256 discountAmount = 0.1 ether;
uint256 duration = 365 days;

uint256 deployTime = 1720000000; // July 3, 2024
uint256 launchTime = 1720800000; // July 12, 2024

function setUp() public {
base = new MockBaseRegistrar();
reverse = new MockReverseRegistrar();
Expand All @@ -53,6 +56,7 @@ contract RegistrarControllerBase is Test {

_establishNamespace();

vm.warp(deployTime);
vm.prank(owner);
controller = new RegistrarController(
BaseRegistrar(address(base)),
Expand Down
10 changes: 10 additions & 0 deletions test/RegistrarController/RentPrice.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ contract RentPrice is RegistrarControllerBase {
assertEq(retPrices.premium, prices.DEFAULT_PERMIUM_WEI());
}

function test_returnsPremium_ifTimeIsNearLaunchTime() public {
vm.prank(owner);
controller.setLaunchTime(launchTime);

vm.warp(launchTime + 1);
IPriceOracle.Price memory retPrices = controller.rentPrice(name, 0);
assertEq(retPrices.base, prices.DEFAULT_BASE_WEI());
assertEq(retPrices.premium, prices.DEFAULT_INCLUDED_PREMIUM());
}

function test_fuzz_returnsPrice_fromPricingOracle(uint256 fuzzBase, uint256 fuzzPremium) public {
vm.assume(fuzzBase != 0 && fuzzBase < type(uint128).max);
vm.assume(fuzzPremium < type(uint128).max);
Expand Down
25 changes: 25 additions & 0 deletions test/RegistrarController/SetLaunchTime.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {RegistrarControllerBase} from "./RegistrarControllerBase.t.sol";
import {Ownable} from "solady/auth/Ownable.sol";

contract SetLaunchTime is RegistrarControllerBase {
function test_reverts_ifCalledByNonOwner(address caller) public {
vm.assume(caller != owner);
vm.expectRevert(Ownable.Unauthorized.selector);
vm.prank(caller);
controller.setLaunchTime(launchTime);
}

function test_allowsTheOwnerToSetTheLaunchTime() public {
uint256 before_launchTime = controller.launchTime();
assertEq(before_launchTime, 0);

vm.prank(owner);
controller.setLaunchTime(launchTime);

uint256 after_launchTime = controller.launchTime();
assertEq(after_launchTime, launchTime);
}
}
12 changes: 10 additions & 2 deletions test/mocks/MockPriceOracle.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {IPriceOracle} from "src/L2/interface/IPriceOracle.sol";
contract MockPriceOracle is IPriceOracle {
uint256 public constant DEFAULT_BASE_WEI = 0.1 ether;
uint256 public constant DEFAULT_PERMIUM_WEI = 0;
uint256 public constant DEFAULT_INCLUDED_PREMIUM = 0.2 ether;

IPriceOracle.Price public defaultPrice = IPriceOracle.Price({base: DEFAULT_BASE_WEI, premium: DEFAULT_PERMIUM_WEI});

Expand All @@ -15,7 +16,14 @@ contract MockPriceOracle is IPriceOracle {
prices[name] = priceData;
}

function price(string calldata name, uint256, uint256) external view returns (IPriceOracle.Price memory) {
return (prices[name].base == 0) ? (defaultPrice) : prices[name];
function price(string calldata name, uint256 expires, uint256 duration)
external
view
returns (IPriceOracle.Price memory)
{
if ((expires == block.timestamp + duration) || expires == 0) {
return (prices[name].base == 0) ? (defaultPrice) : prices[name];
}
return IPriceOracle.Price({base: DEFAULT_BASE_WEI, premium: DEFAULT_INCLUDED_PREMIUM});
}
}

0 comments on commit a65e73b

Please sign in to comment.