@@ -255,6 +255,17 @@ contract Base7683Test is Test, DeployPermit2 {
255255 return _balances;
256256 }
257257
258+ function balances () internal view returns (uint256 [] memory ) {
259+ uint256 [] memory _balances = new uint256 [](5 );
260+ _balances[0 ] = kakaroto.balance;
261+ _balances[1 ] = karpincho.balance;
262+ _balances[2 ] = vegeta.balance;
263+ _balances[3 ] = counterpart.balance;
264+ _balances[4 ] = address (base).balance;
265+
266+ return _balances;
267+ }
268+
258269 function orderDataById (bytes32 orderId ) internal view returns (OrderData memory orderData ) {
259270 (
260271 bytes32 _sender ,
@@ -348,6 +359,70 @@ contract Base7683Test is Test, DeployPermit2 {
348359 vm.stopPrank ();
349360 }
350361
362+ function test_open__native_token_works (uint32 _fillDeadline ) public {
363+ OrderData memory orderData = prepareOrderData ();
364+ orderData.inputToken = TypeCasts.addressToBytes32 (address (0 ));
365+ orderData.outputToken = TypeCasts.addressToBytes32 (address (0 ));
366+
367+ OnchainCrossChainOrder memory order =
368+ prepareOnchainOrder (orderData, _fillDeadline, OrderEncoder.orderDataType ());
369+
370+ deal (kakaroto, 1_000_000 );
371+
372+ vm.startPrank (kakaroto);
373+
374+ uint256 nonceBefore = base.senderNonce (kakaroto);
375+ uint256 [] memory balancesBefore = balances ();
376+
377+ vm.recordLogs ();
378+ base.open {value: amount}(order);
379+
380+ (bytes32 orderId , ResolvedCrossChainOrder memory resolvedOrder ) = getOrderIDFromLogs ();
381+
382+ // assertResolvedOrder(resolvedOrder, orderData, kakaroto, _fillDeadline, type(uint32).max);
383+ assertEq (resolvedOrder.maxSpent.length , 1 );
384+ assertEq (resolvedOrder.maxSpent[0 ].token, TypeCasts.addressToBytes32 (address (0 )));
385+ assertEq (resolvedOrder.maxSpent[0 ].amount, amount);
386+ assertEq (resolvedOrder.maxSpent[0 ].recipient, base.counterpart ());
387+ assertEq (resolvedOrder.maxSpent[0 ].chainId, destination);
388+
389+ assertEq (resolvedOrder.minReceived.length , 1 );
390+ assertEq (resolvedOrder.minReceived[0 ].token, TypeCasts.addressToBytes32 (address (0 )));
391+ assertEq (resolvedOrder.minReceived[0 ].amount, amount);
392+ assertEq (resolvedOrder.minReceived[0 ].recipient, bytes32 (0 ));
393+ assertEq (resolvedOrder.minReceived[0 ].chainId, origin);
394+
395+ assertEq (resolvedOrder.fillInstructions.length , 1 );
396+ assertEq (resolvedOrder.fillInstructions[0 ].destinationChainId, destination);
397+ assertEq (resolvedOrder.fillInstructions[0 ].destinationSettler, base.counterpart ());
398+
399+ orderData.fillDeadline = _fillDeadline;
400+ assertEq (resolvedOrder.fillInstructions[0 ].originData, OrderEncoder.encode (orderData));
401+
402+ assertEq (resolvedOrder.user, kakaroto);
403+ assertEq (resolvedOrder.originChainId, base.localDomain ());
404+ assertEq (resolvedOrder.openDeadline, type (uint32 ).max);
405+ assertEq (resolvedOrder.fillDeadline, _fillDeadline);
406+
407+ // assertOpenOrder(orderId, kakaroto, orderData, balancesBefore, kakaroto, nonceBefore);
408+ OrderData memory savedOrderData = orderDataById (orderId);
409+
410+ assertEq (base.senderNonce (kakaroto), nonceBefore + 1 );
411+ assertEq (OrderEncoder.encode (savedOrderData), OrderEncoder.encode (orderData));
412+ // assertOrder(orderId, orderData, balancesBefore, inputToken, user, address(base), Base7683.OrderStatus.OPENED);
413+
414+ Base7683.OrderStatus status = base.orderStatus (orderId);
415+
416+ assertEq (OrderEncoder.encode (savedOrderData), OrderEncoder.encode (orderData));
417+ assertTrue (status == Base7683.OrderStatus.OPENED);
418+
419+ uint256 [] memory balancesAfter = balances ();
420+ assertEq (balancesBefore[balanceId[kakaroto]] - amount, balancesAfter[balanceId[kakaroto]]);
421+ assertEq (balancesBefore[balanceId[address (base)]] + amount, balancesAfter[balanceId[address (base)]]);
422+
423+ vm.stopPrank ();
424+ }
425+
351426 function getPermitWitnessTransferSignature (
352427 ISignatureTransfer.PermitTransferFrom memory permit ,
353428 uint256 privateKey ,
@@ -475,6 +550,45 @@ contract Base7683Test is Test, DeployPermit2 {
475550 vm.stopPrank ();
476551 }
477552
553+ function test_fill_native_works () public {
554+ OrderData memory orderData = prepareOrderData ();
555+ orderData.inputToken = TypeCasts.addressToBytes32 (address (0 ));
556+ orderData.outputToken = TypeCasts.addressToBytes32 (address (0 ));
557+
558+ orderData.originDomain = destination;
559+ orderData.destinationDomain = origin;
560+
561+ bytes32 orderId = OrderEncoder.id (orderData);
562+
563+ deal (vegeta, 1_000_000 );
564+
565+ uint256 [] memory balancesBefore = balances ();
566+
567+ vm.startPrank (vegeta);
568+
569+ bytes memory fillerData = abi.encode (TypeCasts.addressToBytes32 (vegeta));
570+
571+ vm.expectEmit (false , false , false , true );
572+ emit Filled (orderId, OrderEncoder.encode (orderData), fillerData);
573+
574+ base.fill {value: amount}(orderId, OrderEncoder.encode (orderData), fillerData);
575+
576+ // assertOrder(orderId, orderData, balancesBefore, outputToken, vegeta, karpincho, Base7683.OrderStatus.FILLED);
577+ OrderData memory savedOrderData = orderDataById (orderId);
578+ Base7683.OrderStatus status = base.orderStatus (orderId);
579+
580+ assertEq (OrderEncoder.encode (savedOrderData), OrderEncoder.encode (orderData));
581+ assertTrue (status == Base7683.OrderStatus.FILLED);
582+
583+ uint256 [] memory balancesAfter = balances ();
584+ assertEq (balancesBefore[balanceId[vegeta]] - amount, balancesAfter[balanceId[vegeta]]);
585+ assertEq (balancesBefore[balanceId[karpincho]] + amount, balancesAfter[balanceId[karpincho]]);
586+
587+ assertEq (base.orderFillerData (orderId), fillerData);
588+
589+ vm.stopPrank ();
590+ }
591+
478592 // settle
479593 function test_settle_works () public {
480594 OrderData memory orderData = prepareOrderData ();
@@ -562,6 +676,40 @@ contract Base7683Test is Test, DeployPermit2 {
562676 assertEq (balancesBefore[balanceId[vegeta]] + amount, balancesAfter[balanceId[vegeta]]);
563677 }
564678
679+ function test_settleOrder_native_works () public {
680+ OrderData memory orderData = prepareOrderData ();
681+ orderData.inputToken = TypeCasts.addressToBytes32 (address (0 ));
682+ orderData.outputToken = TypeCasts.addressToBytes32 (address (0 ));
683+
684+ OnchainCrossChainOrder memory order =
685+ prepareOnchainOrder (orderData, orderData.fillDeadline, OrderEncoder.orderDataType ());
686+
687+ deal (kakaroto, 1_000_000 );
688+
689+ vm.startPrank (kakaroto);
690+
691+ vm.recordLogs ();
692+ base.open {value: amount}(order);
693+
694+ (bytes32 orderId ,) = getOrderIDFromLogs ();
695+
696+ vm.stopPrank ();
697+
698+ uint256 [] memory balancesBefore = balances ();
699+
700+ vm.expectEmit (false , false , false , true );
701+ emit Settled (orderId, vegeta);
702+
703+ vm.prank (vegeta);
704+ base.settleOrder (orderId);
705+
706+ uint256 [] memory balancesAfter = balances ();
707+
708+ assertTrue (base.orderStatus (orderId) == Base7683.OrderStatus.SETTLED);
709+ assertEq (balancesBefore[balanceId[address (base)]] - amount, balancesAfter[balanceId[address (base)]]);
710+ assertEq (balancesBefore[balanceId[vegeta]] + amount, balancesAfter[balanceId[vegeta]]);
711+ }
712+
565713 // _refundOrder
566714 function test_refundOrder_works () public {
567715 OrderData memory orderData = prepareOrderData ();
@@ -594,4 +742,40 @@ contract Base7683Test is Test, DeployPermit2 {
594742 assertEq (balancesBefore[balanceId[address (base)]] - amount, balancesAfter[balanceId[address (base)]]);
595743 assertEq (balancesBefore[balanceId[kakaroto]] + amount, balancesAfter[balanceId[kakaroto]]);
596744 }
745+
746+ function test_refundOrder_native_works () public {
747+ OrderData memory orderData = prepareOrderData ();
748+ orderData.inputToken = TypeCasts.addressToBytes32 (address (0 ));
749+ orderData.outputToken = TypeCasts.addressToBytes32 (address (0 ));
750+
751+ OnchainCrossChainOrder memory order =
752+ prepareOnchainOrder (orderData, orderData.fillDeadline, OrderEncoder.orderDataType ());
753+
754+ deal (kakaroto, 1_000_000 );
755+
756+ vm.startPrank (kakaroto);
757+
758+ vm.recordLogs ();
759+ base.open {value: amount}(order);
760+
761+ (bytes32 orderId ,) = getOrderIDFromLogs ();
762+
763+ vm.stopPrank ();
764+
765+ vm.warp (orderData.fillDeadline + 1 );
766+
767+ uint256 [] memory balancesBefore = balances ();
768+
769+ vm.expectEmit (false , false , false , true );
770+ emit Refunded (orderId, kakaroto);
771+
772+ vm.prank (vegeta);
773+ base.refundOrder (orderId);
774+
775+ uint256 [] memory balancesAfter = balances ();
776+
777+ assertTrue (base.orderStatus (orderId) == Base7683.OrderStatus.REFUNDED);
778+ assertEq (balancesBefore[balanceId[address (base)]] - amount, balancesAfter[balanceId[address (base)]]);
779+ assertEq (balancesBefore[balanceId[kakaroto]] + amount, balancesAfter[balanceId[kakaroto]]);
780+ }
597781}
0 commit comments