Skip to content

Commit

Permalink
fix: Add salt to orders and a deadline to matchings
Browse files Browse the repository at this point in the history
  • Loading branch information
mgnfy-view committed Oct 5, 2024
1 parent 63e1cd4 commit f3062ff
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 25 deletions.
9 changes: 7 additions & 2 deletions src/Soho.sol
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,15 @@ contract Soho is Ownable2Step, EIP712 {
uint256 inputAmount;
address outputToken;
uint256 outputAmount;
uint256 salt;
}

struct Matching {
Order makerOrder;
Order takerOrder;
bytes makerSignature;
bytes takerSignature;
uint256 deadline;
}

address private immutable i_engine;
Expand All @@ -49,12 +51,12 @@ contract Soho is Ownable2Step, EIP712 {
event CounterIncremented(address indexed by, uint256 indexed value);
event TradingFeeChanged(uint256 indexed newTradingFeeBPS);

error Soho__DeadlinePassed();
error Soho__NotEngine();
error Soho__AddressZero();
error Soho__IncorrectChains();
error Soho__NotTargetChain();
error Soho__TradeNotStartedYet();
error Soho__DeadlinePassed();
error Soho__NotCorrectSettler();
error Soho__InvalidTokens();
error Soho__InsufficientMakerInputAmount();
Expand Down Expand Up @@ -105,6 +107,8 @@ contract Soho is Ownable2Step, EIP712 {
* and taker signatures.
*/
function settleOrders(Matching calldata _matching) external onlyEngine {
if (_matching.deadline < block.timestamp) revert Soho__DeadlinePassed();

if (_matching.makerOrder.creator == address(0) || _matching.takerOrder.creator == address(0)) {
revert Soho__AddressZero();
}
Expand Down Expand Up @@ -266,7 +270,8 @@ contract Soho is Ownable2Step, EIP712 {
_order.inputToken,
_order.inputAmount,
_order.outputToken,
_order.outputAmount
_order.outputAmount,
_order.salt
)
)
);
Expand Down
62 changes: 44 additions & 18 deletions test/unit/Soho.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ contract SohoTest is Helper {
}

function testSettleOrders() public {
Soho.Matching memory matching = _createOrdersAndMatching(user1, user2);
Soho.Matching memory matching = _createOrdersAndMatching(user1, user2, block.timestamp);

uint256 user1TokenABalanceBefore = soho.getUserBalance(user1, address(tokenA));
uint256 user1TokenBBalanceBefore = soho.getUserBalance(user1, address(tokenB));
Expand Down Expand Up @@ -108,7 +108,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectEmit(true, true, true, true);
Expand All @@ -118,21 +119,34 @@ contract SohoTest is Helper {
}

function testOnlyEngineCanSettleOrders() public {
Soho.Matching memory matching = _createOrdersAndMatching(user1, user2);
Soho.Matching memory matching = _createOrdersAndMatching(user1, user2, block.timestamp);

vm.expectRevert(Soho__NotEngine.selector);
soho.settleOrders(matching);
}

function testSettleOrdersFailsDueToPassedDeadline() public {
uint256 warpBy = 1 minutes;
vm.warp(block.timestamp + warpBy);
uint256 deadline = block.timestamp - 1;

Soho.Matching memory matching = _createOrdersAndMatching(address(0), user2, deadline);

vm.startPrank(engine);
vm.expectRevert(Soho__DeadlinePassed.selector);
soho.settleOrders(matching);
vm.stopPrank();
}

function testSettleOrdersFailsDueToAddressZeroCreator() public {
Soho.Matching memory matching = _createOrdersAndMatching(address(0), user2);
Soho.Matching memory matching = _createOrdersAndMatching(address(0), user2, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__AddressZero.selector);
soho.settleOrders(matching);
vm.stopPrank();

matching = _createOrdersAndMatching(user1, address(0));
matching = _createOrdersAndMatching(user1, address(0), block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__AddressZero.selector);
Expand Down Expand Up @@ -166,7 +180,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__IncorrectChains.selector);
Expand Down Expand Up @@ -200,7 +215,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__NotTargetChain.selector);
Expand Down Expand Up @@ -236,7 +252,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__TradeNotStartedYet.selector);
Expand Down Expand Up @@ -272,7 +289,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__TradeNotStartedYet.selector);
Expand Down Expand Up @@ -308,7 +326,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__DeadlinePassed.selector);
Expand Down Expand Up @@ -344,7 +363,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__NotCorrectSettler.selector);
Expand Down Expand Up @@ -378,7 +398,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__InvalidTokens.selector);
Expand Down Expand Up @@ -414,7 +435,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__InsufficientMakerInputAmount.selector);
Expand Down Expand Up @@ -448,7 +470,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__InsufficientTakerInputAmount.selector);
Expand Down Expand Up @@ -482,7 +505,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(user1);
soho.incrementCounter();
Expand Down Expand Up @@ -520,7 +544,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, takerSignature, block.timestamp);

vm.startPrank(engine);
soho.settleOrders(matching);
Expand Down Expand Up @@ -555,7 +580,8 @@ contract SohoTest is Helper {
inputAmount
);

Soho.Matching memory matching = _createMatching(makerOrder, takerOrder, makerSignature, makerSignature);
Soho.Matching memory matching =
_createMatching(makerOrder, takerOrder, makerSignature, makerSignature, block.timestamp);

vm.startPrank(engine);
vm.expectRevert(Soho__InvalidSignature.selector);
Expand Down Expand Up @@ -615,7 +641,7 @@ contract SohoTest is Helper {
}

function testGetOrderStatus() public {
Soho.Matching memory matching = _createOrdersAndMatching(user1, user2);
Soho.Matching memory matching = _createOrdersAndMatching(user1, user2, block.timestamp);

vm.startPrank(engine);
soho.settleOrders(matching);
Expand Down
14 changes: 9 additions & 5 deletions test/utils/Helper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -63,22 +63,24 @@ abstract contract Helper is Test, EventsAndErrors {

function _createOrdersAndMatching(
address _maker,
address _taker
address _taker,
uint256 _deadline
)
internal
view
returns (Soho.Matching memory _matching)
{
(Soho.Order memory makerOrder, bytes memory makerSignature) = _createMakerOrder(_maker);
(Soho.Order memory takerOrder, bytes memory takerSignature) = _createTakerOrder(_taker);
_matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature);
_matching = _createMatching(makerOrder, takerOrder, makerSignature, takerSignature, _deadline);
}

function _createMatching(
Soho.Order memory _makerOrder,
Soho.Order memory _takerOrder,
bytes memory _makerSignature,
bytes memory _takerSignature
bytes memory _takerSignature,
uint256 _deadline
)
internal
pure
Expand All @@ -88,7 +90,8 @@ abstract contract Helper is Test, EventsAndErrors {
makerOrder: _makerOrder,
takerOrder: _takerOrder,
makerSignature: _makerSignature,
takerSignature: _takerSignature
takerSignature: _takerSignature,
deadline: _deadline
});
}

Expand Down Expand Up @@ -160,7 +163,8 @@ abstract contract Helper is Test, EventsAndErrors {
inputToken: _inputToken,
inputAmount: _inputAmount,
outputToken: _outputToken,
outputAmount: _outputAmount
outputAmount: _outputAmount,
salt: 1
});

bytes32 hash = soho.getOrderStructHash(_order);
Expand Down

0 comments on commit f3062ff

Please sign in to comment.