@@ -7,6 +7,7 @@ import "forge-std/console2.sol";
7
7
8
8
import {QuarkBuilderTest} from "test/builder/lib/QuarkBuilderTest.sol " ;
9
9
import {SimulationFFI} from "test/mocks/SimulationFFI.sol " ;
10
+ import {GasPriceFFI} from "test/mocks/GasPriceFFI.sol " ;
10
11
11
12
import {CCTPBridgeActions} from "src/BridgeScripts.sol " ;
12
13
import {Multicall} from "src/Multicall.sol " ;
@@ -91,11 +92,21 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
91
92
});
92
93
}
93
94
94
- function setupSimulation () internal {
95
+ function setUp () external {
96
+ setupSimulationFFI ();
97
+ setupGasEstimateFFI ();
98
+ }
99
+
100
+ function setupSimulationFFI () internal {
95
101
SimulationFFI mockFFI = new SimulationFFI ();
96
102
vm.etch (Actions.SIMULATION_FFI_ADDRESS, address (mockFFI).code);
97
103
}
98
104
105
+ function setupGasEstimateFFI () internal {
106
+ GasPriceFFI mockFFI = new GasPriceFFI ();
107
+ vm.etch (Actions.GAS_PRICE_FFI_ADDRESS, address (mockFFI).code);
108
+ }
109
+
99
110
function testInsufficientFunds () public {
100
111
QuarkBuilder builder = new QuarkBuilder ();
101
112
vm.expectRevert (abi.encodeWithSelector (QuarkBuilderBase.FundsUnavailable.selector , "USDC " , 10e6 , 0e6 ));
@@ -143,7 +154,6 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
143
154
144
155
function testSimpleLocalTransferSucceeds () public {
145
156
QuarkBuilder builder = new QuarkBuilder ();
146
- setupSimulation ();
147
157
QuarkBuilder.BuilderResult memory result = builder.transfer (
148
158
transferUsdc_ (1 , 1e6 , address (0xceecee ), BLOCK_TIMESTAMP), // transfer 1 USDC on chain 1 to 0xceecee
149
159
chainAccountsList_ (3e6 ), // holding 3 USDC in total across chains 1, 8453
@@ -218,12 +228,11 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
218
228
219
229
function testSimpleLocalTransferWithPaycallSucceeds () public {
220
230
QuarkBuilder builder = new QuarkBuilder ();
221
- setupSimulation ();
222
231
PaymentInfo.PaymentMaxCost[] memory maxCosts = new PaymentInfo.PaymentMaxCost [](1 );
223
232
maxCosts[0 ] = PaymentInfo.PaymentMaxCost ({chainId: 1 , amount: 1e5 });
224
233
QuarkBuilder.BuilderResult memory result = builder.transfer (
225
234
transferUsdc_ (1 , 1e6 , address (0xceecee ), BLOCK_TIMESTAMP), // transfer 1 usdc on chain 1 to 0xceecee
226
- chainAccountsList_ (3e6 ), // holding 3USDC on chains 1, 8453
235
+ chainAccountsList_ (14e6 ), // holding 14USDC on chains 1, 8453
227
236
paymentUsdc_ (maxCosts)
228
237
);
229
238
@@ -245,7 +254,7 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
245
254
Paycall.run.selector ,
246
255
transferActionsAddress,
247
256
abi.encodeWithSelector (TransferActions.transferERC20Token.selector , usdc_ (1 ), address (0xceecee ), 1e6 ),
248
- 1.1e6
257
+ 5562742 // Mock simulation cost
249
258
),
250
259
"calldata is Paycall.run(TransferActions.transferERC20Token(USDC_1, address(0xceecee), 1e6), 20e6); "
251
260
);
@@ -262,7 +271,7 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
262
271
assertEq (result.actions[0 ].actionType, "TRANSFER " , "action type is 'TRANSFER' " );
263
272
assertEq (result.actions[0 ].paymentMethod, "PAY_CALL " , "payment method is 'PAY_CALL' " );
264
273
assertEq (result.actions[0 ].paymentToken, USDC_1, "payment token is USDC " );
265
- assertEq (result.actions[0 ].paymentMaxCost, 1e5 , "payment max is set to 1e5 in this test case " );
274
+ assertEq (result.actions[0 ].paymentMaxCost, 5562742 , "payment max is set to 5562742 in this test case " );
266
275
assertEq (result.actions[0 ].nonceSecret, ALICE_DEFAULT_SECRET, "unexpected nonce secret " );
267
276
assertEq (result.actions[0 ].totalPlays, 1 , "total plays is 1 " );
268
277
assertEq (
@@ -443,12 +452,12 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
443
452
transferToken_ ({
444
453
assetSymbol: "USDC " ,
445
454
chainId: 8453 ,
446
- amount: 5e6 ,
455
+ amount: 12e6 ,
447
456
sender: address (0xb0b ),
448
457
recipient: address (0xceecee ),
449
458
blockTimestamp: BLOCK_TIMESTAMP
450
459
}), // transfer 5 USDC on chain 8453 to 0xceecee
451
- chainAccountsList_ (6e6 ), // holding 6 USDC in total across chains 1, 8453
460
+ chainAccountsList_ (20e6 ), // holding 6 USDC in total across chains 1, 8453
452
461
paymentUsdc_ (maxCosts)
453
462
);
454
463
address paycallAddress = paycallUsdc_ (1 );
@@ -472,12 +481,12 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
472
481
abi.encodeWithSelector (
473
482
CCTPBridgeActions.bridgeUSDC.selector ,
474
483
address (0xBd3fa81B58Ba92a82136038B25aDec7066af3155 ),
475
- 2.1e6 ,
484
+ 2006409 ,
476
485
6 ,
477
486
bytes32 (uint256 (uint160 (0xb0b ))),
478
487
usdc_ (1 )
479
488
),
480
- 0.5e6
489
+ 5562742
481
490
),
482
491
"calldata is Paycall.run(CCTPBridgeActions.bridgeUSDC(address(0xBd3fa81B58Ba92a82136038B25aDec7066af3155), 2.1e6, 6, bytes32(uint256(uint160(0xb0b))), usdc_(1))), 5e5); "
483
492
);
@@ -497,8 +506,10 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
497
506
abi.encodeWithSelector (
498
507
Paycall.run.selector ,
499
508
CodeJarHelper.getCodeAddress (type (TransferActions).creationCode),
500
- abi.encodeWithSelector (TransferActions.transferERC20Token.selector , usdc_ (8453 ), address (0xceecee ), 5e6 ),
501
- 0.1e6
509
+ abi.encodeWithSelector (
510
+ TransferActions.transferERC20Token.selector , usdc_ (8453 ), address (0xceecee ), 12e6
511
+ ),
512
+ 6409
502
513
),
503
514
"calldata is Paycall.run(TransferActions.transferERC20Token(USDC_8453, address(0xceecee), 5e6), 1e5); "
504
515
);
@@ -515,14 +526,14 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
515
526
assertEq (result.actions[0 ].actionType, "BRIDGE " , "action type is 'BRIDGE' " );
516
527
assertEq (result.actions[0 ].paymentMethod, "PAY_CALL " , "payment method is 'PAY_CALL' " );
517
528
assertEq (result.actions[0 ].paymentToken, USDC_1, "payment token is USDC on mainnet " );
518
- assertEq (result.actions[0 ].paymentMaxCost, 0.5e6 , "payment should have max cost of 5e5 " );
529
+ assertEq (result.actions[0 ].paymentMaxCost, 5562742 , "payment should have max cost of 5562742 " );
519
530
assertEq (result.actions[0 ].nonceSecret, ALICE_DEFAULT_SECRET, "unexpected nonce secret " );
520
531
assertEq (result.actions[0 ].totalPlays, 1 , "total plays is 1 " );
521
532
assertEq (
522
533
result.actions[0 ].actionContext,
523
534
abi.encode (
524
535
Actions.BridgeActionContext ({
525
- amount: 2.1e6 ,
536
+ amount: 2006409 ,
526
537
price: USDC_PRICE,
527
538
token: USDC_1,
528
539
assetSymbol: "USDC " ,
@@ -539,14 +550,14 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
539
550
assertEq (result.actions[1 ].actionType, "TRANSFER " , "action type is 'TRANSFER' " );
540
551
assertEq (result.actions[1 ].paymentMethod, "PAY_CALL " , "payment method is 'PAY_CALL' " );
541
552
assertEq (result.actions[1 ].paymentToken, USDC_8453, "payment token is USDC on Base " );
542
- assertEq (result.actions[1 ].paymentMaxCost, 0.1e6 , "payment should have max cost of 1e5 " );
553
+ assertEq (result.actions[1 ].paymentMaxCost, 6409 , "payment should have max cost of 6409 " );
543
554
assertEq (result.actions[1 ].nonceSecret, BOB_DEFAULT_SECRET, "unexpected nonce secret " );
544
555
assertEq (result.actions[1 ].totalPlays, 1 , "total plays is 1 " );
545
556
assertEq (
546
557
result.actions[1 ].actionContext,
547
558
abi.encode (
548
559
Actions.TransferActionContext ({
549
- amount: 5e6 ,
560
+ amount: 12e6 ,
550
561
price: USDC_PRICE,
551
562
token: USDC_8453,
552
563
assetSymbol: "USDC " ,
@@ -573,13 +584,13 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
573
584
QuarkBuilder.BuilderResult memory result = builder.transfer (
574
585
transferToken_ ({
575
586
assetSymbol: "USDT " ,
576
- chainId: 8453 ,
587
+ chainId: 1 ,
577
588
amount: 3e6 ,
578
589
sender: address (0xb0b ),
579
590
recipient: address (0xceecee ),
580
591
blockTimestamp: BLOCK_TIMESTAMP
581
592
}), // transfer 3 USDT on chain 8453 to 0xceecee
582
- chainAccountsList_ (6e6 ), // holding 6 USDC and USDT in total across chains 1, 8453
593
+ chainAccountsList_ (9e6 ), // USDC and USDT in total across chains 1, 8453
583
594
paymentUsdc_ (maxCosts)
584
595
);
585
596
address paycallAddress = paycallUsdc_ (1 );
@@ -592,7 +603,7 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
592
603
assertEq (result.quarkOperations.length , 2 , "two operations " );
593
604
assertEq (
594
605
result.quarkOperations[0 ].scriptAddress,
595
- paycallAddress ,
606
+ paycallAddressBase ,
596
607
"script address[0] has been wrapped with paycall address "
597
608
);
598
609
assertEq (
@@ -602,34 +613,34 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
602
613
cctpBridgeActionsAddress,
603
614
abi.encodeWithSelector (
604
615
CCTPBridgeActions.bridgeUSDC.selector ,
605
- address (0xBd3fa81B58Ba92a82136038B25aDec7066af3155 ),
606
- 1.5e6 ,
607
- 6 ,
616
+ address (0x1682Ae6375C4E4A97e4B583BC394c861A46D8962 ),
617
+ 1062742 ,
618
+ 0 ,
608
619
bytes32 (uint256 (uint160 (0xb0b ))),
609
- usdc_ (1 )
620
+ usdc_ (8453 )
610
621
),
611
- 0.5e6
622
+ 6409
612
623
),
613
624
"calldata is Paycall.run(CCTPBridgeActions.bridgeUSDC(address(0xBd3fa81B58Ba92a82136038B25aDec7066af3155), 1.5e6, 6, bytes32(uint256(uint160(0xb0b))), usdc_(1))), 0.5e6); "
614
625
);
615
626
assertEq (
616
627
result.quarkOperations[0 ].expiry, BLOCK_TIMESTAMP + 7 days, "expiry is current blockTimestamp + 7 days "
617
628
);
618
- assertEq (result.quarkOperations[0 ].nonce, ALICE_DEFAULT_SECRET , "unexpected nonce " );
629
+ assertEq (result.quarkOperations[0 ].nonce, BOB_DEFAULT_SECRET , "unexpected nonce " );
619
630
assertEq (result.quarkOperations[0 ].isReplayable, false , "isReplayable is false " );
620
631
621
632
assertEq (
622
633
result.quarkOperations[1 ].scriptAddress,
623
- paycallAddressBase ,
634
+ paycallAddress ,
624
635
"script address[1] has been wrapped with paycall address "
625
636
);
626
637
assertEq (
627
638
result.quarkOperations[1 ].scriptCalldata,
628
639
abi.encodeWithSelector (
629
640
Paycall.run.selector ,
630
641
CodeJarHelper.getCodeAddress (type (TransferActions).creationCode),
631
- abi.encodeWithSelector (TransferActions.transferERC20Token.selector , usdt_ (8453 ), address (0xceecee ), 3e6 ),
632
- 4.5e6
642
+ abi.encodeWithSelector (TransferActions.transferERC20Token.selector , usdt_ (1 ), address (0xceecee ), 3e6 ),
643
+ 5562742
633
644
),
634
645
"calldata is Paycall.run(TransferActions.transferERC20Token(USDT_8453, address(0xceecee), 3e6), 4.5e6); "
635
646
);
@@ -641,36 +652,37 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
641
652
642
653
// Check the actions
643
654
assertEq (result.actions.length , 2 , "one action " );
644
- assertEq (result.actions[0 ].chainId, 1 , "operation is on chainid 1 " );
645
- assertEq (result.actions[0 ].quarkAccount, address (0xa11ce ), "0xa11ce sends the funds " );
655
+ assertEq (result.actions[0 ].chainId, 8453 , "operation is on chainid 8453 " );
656
+ // TODO: It's not clear to me how this was A11ce before, seems should be b0b?
657
+ assertEq (result.actions[0 ].quarkAccount, address (0xb0b ), "0xb0b sends the funds " );
646
658
assertEq (result.actions[0 ].actionType, "BRIDGE " , "action type is 'BRIDGE' " );
647
659
assertEq (result.actions[0 ].paymentMethod, "PAY_CALL " , "payment method is 'PAY_CALL' " );
648
- assertEq (result.actions[0 ].paymentToken, USDC_1 , "payment token is USDC on mainnet " );
649
- assertEq (result.actions[0 ].paymentMaxCost, 0.5e6 , "payment should have max cost of 0.5e6 " );
650
- assertEq (result.actions[0 ].nonceSecret, ALICE_DEFAULT_SECRET , "unexpected nonce secret " );
660
+ assertEq (result.actions[0 ].paymentToken, USDC_8453 , "payment token is USDC on base " );
661
+ assertEq (result.actions[0 ].paymentMaxCost, 6409 , "payment should have max cost of 6409 " );
662
+ assertEq (result.actions[0 ].nonceSecret, BOB_DEFAULT_SECRET , "unexpected nonce secret " );
651
663
assertEq (result.actions[0 ].totalPlays, 1 , "total plays is 1 " );
652
664
assertEq (
653
665
result.actions[0 ].actionContext,
654
666
abi.encode (
655
667
Actions.BridgeActionContext ({
656
- amount: 1.5e6 ,
668
+ amount: 1062742 ,
657
669
price: USDC_PRICE,
658
- token: USDC_1 ,
670
+ token: USDC_8453 ,
659
671
assetSymbol: "USDC " ,
660
- chainId: 1 ,
672
+ chainId: 8453 ,
661
673
recipient: address (0xb0b ),
662
- destinationChainId: 8453 ,
674
+ destinationChainId: 1 ,
663
675
bridgeType: Actions.BRIDGE_TYPE_CCTP
664
676
})
665
677
),
666
678
"action context encoded from BridgeActionContext "
667
679
);
668
- assertEq (result.actions[1 ].chainId, 8453 , "operation is on chainid 8453 " );
680
+ assertEq (result.actions[1 ].chainId, 1 , "operation is on chainid 8453 " );
669
681
assertEq (result.actions[1 ].quarkAccount, address (0xb0b ), "0xb0b sends the funds " );
670
682
assertEq (result.actions[1 ].actionType, "TRANSFER " , "action type is 'TRANSFER' " );
671
683
assertEq (result.actions[1 ].paymentMethod, "PAY_CALL " , "payment method is 'PAY_CALL' " );
672
- assertEq (result.actions[1 ].paymentToken, USDC_8453 , "payment token is USDC on Base " );
673
- assertEq (result.actions[1 ].paymentMaxCost, 4.5e6 , "payment should have max cost of 4.5e6 " );
684
+ assertEq (result.actions[1 ].paymentToken, USDC_1 , "payment token is USDC on Mainnet " );
685
+ assertEq (result.actions[1 ].paymentMaxCost, 5562742 , "payment should have max cost of 5562742 " );
674
686
assertEq (result.actions[1 ].nonceSecret, BOB_DEFAULT_SECRET, "unexpected nonce secret " );
675
687
assertEq (result.actions[1 ].totalPlays, 1 , "total plays is 1 " );
676
688
assertEq (
@@ -679,9 +691,9 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest {
679
691
Actions.TransferActionContext ({
680
692
amount: 3e6 ,
681
693
price: USDT_PRICE,
682
- token: USDT_8453 ,
694
+ token: USDT_1 ,
683
695
assetSymbol: "USDT " ,
684
- chainId: 8453 ,
696
+ chainId: 1 ,
685
697
recipient: address (0xceecee )
686
698
})
687
699
),
0 commit comments