Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 76 additions & 55 deletions src/sales/SettlementSale.sol

Large diffs are not rendered by default.

10 changes: 6 additions & 4 deletions test/BidSubmission.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,9 @@ contract SettlementSalePurchasePermitValidationTest is SettlementSaleBidTestBase
price: 10,
amount: 1000e6,
purchasePermit: permit,
err: abi.encodeWithSelector(SettlementSale.PurchasePermitExpired.selector)
err: abi.encodeWithSelector(
SettlementSale.PurchasePermitExpired.selector, permit.expiresAt, block.timestamp
)
});
}

Expand Down Expand Up @@ -490,7 +492,7 @@ contract SettlementSalePurchasePermitValidationTest is SettlementSaleBidTestBase
amount: 1000e6,
token: usdc,
purchasePermit: permit,
err: abi.encodeWithSelector(SettlementSale.PurchasePermitExpired.selector)
err: abi.encodeWithSelector(SettlementSale.PurchasePermitExpired.selector, expiresAt, block.timestamp)
});
}
}
Expand Down Expand Up @@ -554,7 +556,7 @@ contract SettlementSaleBidTest is SettlementSaleBidTestBase {
price: 10,
amount: 1000e6,
token: usdc,
err: abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Closed)
err: encodeInvalidStage(SettlementSale.Stage.Closed, SettlementSale.Stage.Commitment)
});
}

Expand All @@ -567,7 +569,7 @@ contract SettlementSaleBidTest is SettlementSaleBidTestBase {
price: 10,
amount: 1000e6,
token: usdc,
err: abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.PreOpen)
err: encodeInvalidStage(SettlementSale.Stage.PreOpen, SettlementSale.Stage.Commitment)
});
}

Expand Down
10 changes: 4 additions & 6 deletions test/Cancellation.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,7 @@ contract SettlementSaleCancellationTest is SettlementSaleBaseTest {
openCancellation();
openSettlement();

cancelBidFail(
alice, abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Settlement)
);
cancelBidFail(alice, encodeInvalidStage(SettlementSale.Stage.Settlement, SettlementSale.Stage.Cancellation));
}

function testCancelBid_DuringWrongStage_RevertsOrSucceeds(uint8 s) public {
Expand All @@ -104,7 +102,7 @@ contract SettlementSaleCancellationTest is SettlementSaleBaseTest {
if (stage == SettlementSale.Stage.Cancellation) {
cancelBidSuccess(alice);
} else {
cancelBidFail(alice, abi.encodeWithSelector(SettlementSale.InvalidStage.selector, stage));
cancelBidFail(alice, encodeInvalidStage(stage, SettlementSale.Stage.Cancellation));
}
}

Expand Down Expand Up @@ -184,10 +182,10 @@ contract SettlementSaleCancellationTest is SettlementSaleBaseTest {
emit SettlementSale.BidCancelled(aliceID, aliceWallet2, 5000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(aliceID, alice, usdc, 2000e6);
emit SettlementSale.WalletRefunded(aliceID, alice, address(usdc), 2000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(aliceID, aliceWallet2, usdt, 3000e6);
emit SettlementSale.WalletRefunded(aliceID, aliceWallet2, address(usdt), 3000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.EntityRefunded(aliceID, 5000e6);
Expand Down
47 changes: 34 additions & 13 deletions test/General.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,7 @@ contract SettlementSaleConstructorTest is BaseTest {
});

vm.expectRevert(
abi.encodeWithSelector(
SettlementSale.InvalidPaymentTokenDecimals.selector, IERC20Metadata(address(invalidToken))
)
abi.encodeWithSelector(SettlementSale.InvalidPaymentTokenDecimals.selector, address(invalidToken), 18, 6)
);
new TestableSettlementSale(init);
}
Expand Down Expand Up @@ -604,27 +602,41 @@ contract SettlementSaleStageTest is SettlementSaleBaseTest {
openCommitment();
assertEq(uint8(sale.stage()), uint8(SettlementSale.Stage.Commitment));

// Try to open commitment phase while in Commitment stage
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Commitment));
// Try to open commitment while in Commitment stage
vm.expectRevert(
encodeInvalidStage(
SettlementSale.Stage.Commitment, SettlementSale.Stage.PreOpen, SettlementSale.Stage.Closed
)
);
vm.prank(manager);
sale.openCommitment();

// Try to open commitment phase while in Cancellation stage
closeCommitment();
openCancellation();
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Cancellation));
vm.expectRevert(
encodeInvalidStage(
SettlementSale.Stage.Cancellation, SettlementSale.Stage.PreOpen, SettlementSale.Stage.Closed
)
);
vm.prank(manager);
sale.openCommitment();

// Try to open commitment phase while in Settlement stage
openSettlement();
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Settlement));
vm.expectRevert(
encodeInvalidStage(
SettlementSale.Stage.Settlement, SettlementSale.Stage.PreOpen, SettlementSale.Stage.Closed
)
);
vm.prank(manager);
sale.openCommitment();

// Try to open commitment phase while in Done stage
finalizeSettlement();
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Done));
vm.expectRevert(
encodeInvalidStage(SettlementSale.Stage.Done, SettlementSale.Stage.PreOpen, SettlementSale.Stage.Closed)
);
vm.prank(manager);
sale.openCommitment();
}
Expand All @@ -641,33 +653,42 @@ contract SettlementSaleStageTest is SettlementSaleBaseTest {

function testCloseCommitment_WhenNotCommitment_Reverts() public {
// Try to close while in PreOpen
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.PreOpen));
vm.expectRevert(encodeInvalidStage(SettlementSale.Stage.PreOpen, SettlementSale.Stage.Commitment));
vm.prank(manager);
sale.closeCommitment();
}

function testOpenCancellation_WhenNotClosed_Reverts() public {
// Try to open cancellation while in PreOpen
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.PreOpen));
vm.expectRevert(encodeInvalidStage(SettlementSale.Stage.PreOpen, SettlementSale.Stage.Closed));
vm.prank(manager);
sale.openCancellation();

// Try to open cancellation while in Commitment
openCommitment();
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Commitment));
vm.expectRevert(encodeInvalidStage(SettlementSale.Stage.Commitment, SettlementSale.Stage.Closed));

vm.prank(manager);
sale.openCancellation();
}

function testOpenSettlement_WhenNotClosedOrCancellation_Reverts() public {
// Try while in PreOpen
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.PreOpen));
vm.expectRevert(
encodeInvalidStage(
SettlementSale.Stage.PreOpen, SettlementSale.Stage.Closed, SettlementSale.Stage.Cancellation
)
);
vm.prank(manager);
sale.openSettlement();

// Try while in Commitment
openCommitment();
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Commitment));
vm.expectRevert(
encodeInvalidStage(
SettlementSale.Stage.Commitment, SettlementSale.Stage.Closed, SettlementSale.Stage.Cancellation
)
);
vm.prank(manager);
sale.openSettlement();
}
Expand Down
8 changes: 4 additions & 4 deletions test/Refund.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ contract SettlementSaleRefundsTest is SettlementSaleBaseTest {
entityIDs[1] = bobID; // repeated

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(charlieID, charlie, usdt, 10000e6);
emit SettlementSale.WalletRefunded(charlieID, charlie, address(usdt), 10000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.EntityRefunded(charlieID, 10000e6);
Expand All @@ -98,7 +98,7 @@ contract SettlementSaleRefundsTest is SettlementSaleBaseTest {
bytes16[] memory entityIDs = new bytes16[](1);
entityIDs[0] = aliceID;

vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Settlement));
vm.expectRevert(encodeInvalidStage(SettlementSale.Stage.Settlement, SettlementSale.Stage.Done));
vm.prank(refunder);
sale.processRefunds(entityIDs, false);
}
Expand Down Expand Up @@ -327,10 +327,10 @@ contract SettlementSaleRefundsTest is SettlementSaleBaseTest {
entityIDs[0] = aliceID;

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(aliceID, alice, usdc, 1000e6);
emit SettlementSale.WalletRefunded(aliceID, alice, address(usdc), 1000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(aliceID, aliceWallet2, usdt, 1000e6);
emit SettlementSale.WalletRefunded(aliceID, aliceWallet2, address(usdt), 1000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.EntityRefunded(aliceID, 2000e6);
Expand Down
10 changes: 5 additions & 5 deletions test/Settlement.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ contract SettlementSaleSettlementTest is SettlementSaleBaseTest {
});

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.AllocationSet(entityID, wallet, token, amount);
emit SettlementSale.AllocationSet(entityID, wallet, address(token), amount);

vm.prank(settler);
sale.setAllocations({allocations: allocations, allowOverwrite: allowOverwrite});
Expand Down Expand Up @@ -204,7 +204,7 @@ contract SettlementSaleSettlementTest is SettlementSaleBaseTest {
token: usdc,
amount: 3000e6,
allowOverwrite: false,
err: abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.PreOpen)
err: encodeInvalidStage(SettlementSale.Stage.PreOpen, SettlementSale.Stage.Settlement)
});

openCommitment();
Expand All @@ -214,7 +214,7 @@ contract SettlementSaleSettlementTest is SettlementSaleBaseTest {
token: usdc,
amount: 3000e6,
allowOverwrite: false,
err: abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Commitment)
err: encodeInvalidStage(SettlementSale.Stage.Commitment, SettlementSale.Stage.Settlement)
});

closeCommitment();
Expand All @@ -230,7 +230,7 @@ contract SettlementSaleSettlementTest is SettlementSaleBaseTest {
token: usdc,
amount: 3000e6,
allowOverwrite: false,
err: abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Done)
err: encodeInvalidStage(SettlementSale.Stage.Done, SettlementSale.Stage.Settlement)
});
}

Expand All @@ -244,7 +244,7 @@ contract SettlementSaleSettlementTest is SettlementSaleBaseTest {

setAllocationSuccess(alice, usdc, 1000e6, false);

vm.expectRevert(abi.encodeWithSelector(SettlementSale.UnexpectedTotalAcceptedAmount.selector, 2000e6, 1000e6));
vm.expectRevert(abi.encodeWithSelector(SettlementSale.UnexpectedTotalAcceptedAmount.selector, 1000e6, 2000e6));
vm.prank(admin);
sale.finalizeSettlement(2000e6);

Expand Down
22 changes: 22 additions & 0 deletions test/SettlementSaleBaseTest.sol
Original file line number Diff line number Diff line change
Expand Up @@ -659,4 +659,26 @@ contract SettlementSaleBaseTest is BaseTest {
balances[1] = TokenAmount({token: address(usdt), amount: usdt.balanceOf(owner)});
return balances;
}

/// @notice Helper to encode InvalidStage error with a single expected stage.
function encodeInvalidStage(
SettlementSale.Stage got,
SettlementSale.Stage want
) internal pure returns (bytes memory) {
SettlementSale.Stage[] memory wanted = new SettlementSale.Stage[](1);
wanted[0] = want;
return abi.encodeWithSelector(SettlementSale.InvalidStage.selector, got, wanted);
}

/// @notice Helper to encode InvalidStage error with two expected stages.
function encodeInvalidStage(
SettlementSale.Stage got,
SettlementSale.Stage want1,
SettlementSale.Stage want2
) internal pure returns (bytes memory) {
SettlementSale.Stage[] memory wanted = new SettlementSale.Stage[](2);
wanted[0] = want1;
wanted[1] = want2;
return abi.encodeWithSelector(SettlementSale.InvalidStage.selector, got, wanted);
}
}
14 changes: 7 additions & 7 deletions test/Withdraw.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ contract SettlementSaleWithdrawTest is SettlementSaleBaseTest {
finalizeSettlement();

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(aliceID, alice, usdc, 3000e6);
emit SettlementSale.WalletRefunded(aliceID, alice, address(usdc), 3000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.EntityRefunded(aliceID, 3000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(charlieID, charlie, usdt, 10000e6);
emit SettlementSale.WalletRefunded(charlieID, charlie, address(usdt), 10000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.EntityRefunded(charlieID, 10000e6);
Expand All @@ -58,7 +58,7 @@ contract SettlementSaleWithdrawTest is SettlementSaleBaseTest {
sale.withdraw();

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.WalletRefunded(bobID, bob, usdt, 4000e6);
emit SettlementSale.WalletRefunded(bobID, bob, address(usdt), 4000e6);

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.EntityRefunded(bobID, 4000e6);
Expand Down Expand Up @@ -106,7 +106,7 @@ contract SettlementSaleWithdrawTest is SettlementSaleBaseTest {
}

function testWithdraw_WrongStage_Reverts() public {
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Settlement));
vm.expectRevert(encodeInvalidStage(SettlementSale.Stage.Settlement, SettlementSale.Stage.Done));
vm.prank(admin);
sale.withdraw();
}
Expand All @@ -115,7 +115,7 @@ contract SettlementSaleWithdrawTest is SettlementSaleBaseTest {
finalizeSettlement();

vm.expectEmit(true, true, true, true, address(sale));
emit SettlementSale.ProceedsWithdrawn(receiver, usdc, 3000e6);
emit SettlementSale.ProceedsWithdrawn(receiver, address(usdc), 3000e6);

vm.prank(admin);
sale.withdrawPartial(usdc, 3000e6);
Expand Down Expand Up @@ -155,7 +155,7 @@ contract SettlementSaleWithdrawTest is SettlementSaleBaseTest {

vm.prank(admin);
vm.expectRevert(
abi.encodeWithSelector(SettlementSale.WithdrawalExceedsAvailable.selector, usdc, 10000e6, 7000e6)
abi.encodeWithSelector(SettlementSale.WithdrawalExceedsAvailable.selector, address(usdc), 10000e6, 7000e6)
);
sale.withdrawPartial(usdc, 10000e6);
}
Expand All @@ -171,7 +171,7 @@ contract SettlementSaleWithdrawTest is SettlementSaleBaseTest {
}

function testwithdrawPartial_WrongStage_Reverts() public {
vm.expectRevert(abi.encodeWithSelector(SettlementSale.InvalidStage.selector, SettlementSale.Stage.Settlement));
vm.expectRevert(encodeInvalidStage(SettlementSale.Stage.Settlement, SettlementSale.Stage.Done));
vm.prank(admin);
sale.withdrawPartial(usdc, 1000e6);
}
Expand Down