From 1ed4883baede0d9f936d84680d0fed0a446128c5 Mon Sep 17 00:00:00 2001 From: josojo Date: Thu, 11 Mar 2021 21:59:36 +0100 Subject: [PATCH 1/2] max bidding amount, but no atomic closure --- contracts/EasyAuction.sol | 56 +++++++++++---------------------------- 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/contracts/EasyAuction.sol b/contracts/EasyAuction.sol index ccc9a8e..bc17f79 100644 --- a/contracts/EasyAuction.sol +++ b/contracts/EasyAuction.sol @@ -104,12 +104,12 @@ contract EasyAuction is Ownable { uint256 auctionEndDate; bytes32 initialAuctionOrder; uint256 minimumBiddingAmountPerOrder; + uint256 maximumBiddingAmountPerAccount; uint256 interimSumBidAmount; bytes32 interimOrder; bytes32 clearingPriceOrder; uint96 volumeClearingPriceOrder; bool minFundingThresholdNotReached; - bool isAtomicClosureAllowed; uint256 feeNumerator; uint256 minFundingThreshold; } @@ -117,6 +117,7 @@ contract EasyAuction is Ownable { mapping(uint256 => AuctionData) public auctionData; mapping(uint256 => address) public auctionAccessManager; mapping(uint256 => bytes) public auctionAccessData; + mapping(uint256 => mapping(address => uint256)) public biddingAmountPerUser; IdToAddressBiMap.Data private registeredUsers; uint64 public numUsers; @@ -157,8 +158,8 @@ contract EasyAuction is Ownable { uint96 _auctionedSellAmount, uint96 _minBuyAmount, uint256 minimumBiddingAmountPerOrder, + uint256 maximumBiddingAmountPerAccount, uint256 minFundingThreshold, - bool isAtomicClosureAllowed, address accessManagerContract, bytes memory accessManagerContractData ) public returns (uint256) { @@ -198,12 +199,12 @@ contract EasyAuction is Ownable { _auctionedSellAmount ), minimumBiddingAmountPerOrder, + maximumBiddingAmountPerAccount, 0, IterableOrderedOrderSet.QUEUE_START, bytes32(0), 0, false, - isAtomicClosureAllowed, feeNumerator, minFundingThreshold ); @@ -332,6 +333,18 @@ contract EasyAuction is Ownable { ); } } + uint256 maxBiddingAmount = + auctionData[auctionId].maximumBiddingAmountPerAccount; + if (maxBiddingAmount > 0) { + maxBiddingAmount[auctionId][orderSubmitter] = maxBiddingAmount[ + auctionId + ][orderSubmitter] + .add(sumOfSellAmounts); + require( + maxBiddingAmount[auctionId][orderSubmitter] < maxBiddingAmount, + "Bids exceed max bidding amount" + ); + } auctionData[auctionId].biddingToken.safeTransferFrom( msg.sender, address(this), @@ -410,43 +423,6 @@ contract EasyAuction is Ownable { auctionData[auctionId].interimOrder = iterOrder; } - function settleAuctionAtomically( - uint256 auctionId, - uint96[] memory _minBuyAmount, - uint96[] memory _sellAmount, - bytes32[] memory _prevSellOrder, - bytes calldata allowListCallData - ) public atStageSolutionSubmission(auctionId) { - require( - auctionData[auctionId].isAtomicClosureAllowed, - "not allowed to settle auction atomically" - ); - require( - _minBuyAmount.length == 1 && _sellAmount.length == 1, - "Only one order can be placed atomically" - ); - uint64 userId = getUserId(msg.sender); - require( - auctionData[auctionId].interimOrder.smallerThan( - IterableOrderedOrderSet.encodeOrder( - userId, - _minBuyAmount[0], - _sellAmount[0] - ) - ), - "precalculateSellAmountSum is already too advanced" - ); - _placeSellOrders( - auctionId, - _minBuyAmount, - _sellAmount, - _prevSellOrder, - allowListCallData, - msg.sender - ); - settleAuction(auctionId); - } - // @dev function settling the auction and calculating the price function settleAuction(uint256 auctionId) public From 11ff0d6786544b21164a3b8f3eee881a475e2fa7 Mon Sep 17 00:00:00 2001 From: josojo Date: Thu, 11 Mar 2021 22:01:37 +0100 Subject: [PATCH 2/2] max bidding amount implemented --- contracts/EasyAuction.sol | 68 +++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/contracts/EasyAuction.sol b/contracts/EasyAuction.sol index bc17f79..5c3b9c4 100644 --- a/contracts/EasyAuction.sol +++ b/contracts/EasyAuction.sol @@ -301,47 +301,51 @@ contract EasyAuction is Ownable { } uint256 sumOfSellAmounts = 0; userId = getUserId(orderSubmitter); - uint256 minimumBiddingAmountPerOrder = - auctionData[auctionId].minimumBiddingAmountPerOrder; - for (uint256 i = 0; i < _minBuyAmounts.length; i++) { - require( - _minBuyAmounts[i] > 0, - "_minBuyAmounts must be greater than 0" - ); - // orders should have a minimum bid size in order to limit the gas - // required to compute the final price of the auction. - require( - _sellAmounts[i] > minimumBiddingAmountPerOrder, - "order too small" - ); - if ( - sellOrders[auctionId].insert( - IterableOrderedOrderSet.encodeOrder( + { + uint256 minimumBiddingAmountPerOrder = + auctionData[auctionId].minimumBiddingAmountPerOrder; + for (uint256 i = 0; i < _minBuyAmounts.length; i++) { + require( + _minBuyAmounts[i] > 0, + "_minBuyAmounts must be greater than 0" + ); + // orders should have a minimum bid size in order to limit the gas + // required to compute the final price of the auction. + require( + _sellAmounts[i] > minimumBiddingAmountPerOrder, + "order too small" + ); + if ( + sellOrders[auctionId].insert( + IterableOrderedOrderSet.encodeOrder( + userId, + _minBuyAmounts[i], + _sellAmounts[i] + ), + _prevSellOrders[i] + ) + ) { + sumOfSellAmounts = sumOfSellAmounts.add(_sellAmounts[i]); + emit NewSellOrder( + auctionId, userId, _minBuyAmounts[i], _sellAmounts[i] - ), - _prevSellOrders[i] - ) - ) { - sumOfSellAmounts = sumOfSellAmounts.add(_sellAmounts[i]); - emit NewSellOrder( - auctionId, - userId, - _minBuyAmounts[i], - _sellAmounts[i] - ); + ); + } } } uint256 maxBiddingAmount = auctionData[auctionId].maximumBiddingAmountPerAccount; if (maxBiddingAmount > 0) { - maxBiddingAmount[auctionId][orderSubmitter] = maxBiddingAmount[ - auctionId - ][orderSubmitter] - .add(sumOfSellAmounts); + biddingAmountPerUser[auctionId][ + orderSubmitter + ] = biddingAmountPerUser[auctionId][orderSubmitter].add( + sumOfSellAmounts + ); require( - maxBiddingAmount[auctionId][orderSubmitter] < maxBiddingAmount, + biddingAmountPerUser[auctionId][orderSubmitter] < + maxBiddingAmount, "Bids exceed max bidding amount" ); }