Skip to content

Commit

Permalink
revert if not exact contribution to finalize
Browse files Browse the repository at this point in the history
  • Loading branch information
0xble committed Nov 23, 2023
1 parent e3aa3c1 commit e10f773
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 19 deletions.
24 changes: 7 additions & 17 deletions contracts/authorities/SellPartyCardsAuthority.sol
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ contract SellPartyCardsAuthority {
bytes gateData
);
error OutOfBoundsContributionsError(uint96 amount, uint96 bound);
error ExceedsRemainingContributionsError(uint96 amount, uint96 remaining);
error ArityMismatch();

/// @notice Create a new fixed membership sale.
Expand Down Expand Up @@ -542,23 +543,12 @@ contract SellPartyCardsAuthority {
}

uint96 minContribution = state.minContribution;
uint96 newTotalContributions = totalContributions + amount;
if (newTotalContributions >= maxTotalContributions) {
// This occurs before refunding excess contribution to act as a
// reentrancy guard.
_saleStates[party][saleId]
.totalContributions = totalContributions = maxTotalContributions;

// Finalize the crowdfund.
emit Finalized(party, saleId);

// Refund excess contribution.
uint96 refundAmount = newTotalContributions - maxTotalContributions;
if (refundAmount > 0) {
contribution -= refundAmount;
// Revert if the refund fails.
payable(msg.sender).transferEth(refundAmount);
}
uint96 newTotalContributions = totalContributions + contribution;
if (newTotalContributions > maxTotalContributions) {
revert ExceedsRemainingContributionsError(
contribution,
maxTotalContributions - totalContributions
);
} else {
_saleStates[party][saleId]
.totalContributions = totalContributions = newTotalContributions;
Expand Down
29 changes: 27 additions & 2 deletions test/authorities/SellPartyCardsAuthority.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,11 @@ contract SellPartyCardsAuthorityTest is SetupPartyHelper {

// Reduce contribution to available amount
address buyer = _randomAddress();
vm.deal(buyer, 1 ether);
vm.deal(buyer, 0.003 ether);
vm.prank(buyer);
vm.expectEmit(true, true, true, true);
emit MintedFromSale(party, saleId, lastTokenId + 4, buyer, buyer, 0.003 ether, buyer);
sellPartyCardsAuthority.contribute{ value: 1 ether }(party, saleId, buyer, "");
sellPartyCardsAuthority.contribute{ value: 0.003 ether }(party, saleId, buyer, "");

// Don't allow further contributions
buyer = _randomAddress();
Expand Down Expand Up @@ -200,6 +200,31 @@ contract SellPartyCardsAuthorityTest is SetupPartyHelper {
sellPartyCardsAuthority.contribute{ value: 0.0005 ether }(party, saleId, buyer, "");
}

function testSellPartyCards_contributeAboveRemaining() public {
uint256 saleId = _createNewFlexibleSale();

address buyer = _randomAddress();
vm.deal(buyer, 2 ether);
vm.prank(buyer);
sellPartyCardsAuthority.contribute{ value: 2 ether }(party, saleId, buyer, "");

// Contributing above maxTotalContributions (1 ETH remaining) should fail
vm.deal(buyer, 1 ether + 1);
vm.prank(buyer);
vm.expectRevert(
abi.encodeWithSelector(
SellPartyCardsAuthority.ExceedsRemainingContributionsError.selector,
1 ether + 1,
1 ether
)
);
sellPartyCardsAuthority.contribute{ value: 1 ether + 1 }(party, saleId, buyer, "");

// Contributing to maxTotalContributions should succeed and finalize sale
emit Finalized(party, saleId);
sellPartyCardsAuthority.contribute{ value: 1 ether }(party, saleId, buyer, "");
}

function testSellPartyCards_createSale_minAboveMax() public {
SellPartyCardsAuthority.FlexibleMembershipSaleOpts memory opts = SellPartyCardsAuthority
.FlexibleMembershipSaleOpts({
Expand Down

0 comments on commit e10f773

Please sign in to comment.