From 995e88f4cc516660e40ec2df2b6d68d33a78b2b7 Mon Sep 17 00:00:00 2001 From: Geoffrey Hayes Date: Fri, 15 Nov 2024 15:24:11 -0800 Subject: [PATCH] Build an Across specific transfer bridge test --- src/builder/actions/CometActionsBuilder.sol | 12 +- src/builder/actions/MorphoActionsBuilder.sol | 9 +- .../actions/MorphoVaultActionsBuilder.sol | 6 +- src/builder/actions/SwapActionsBuilder.sol | 6 +- .../actions/TransferActionsBuilder.sol | 3 +- test/builder/BridgingLogic.t.sol | 3 +- test/builder/QuarkBuilderCometBorrow.t.sol | 3 +- test/builder/QuarkBuilderCometRepay.t.sol | 3 +- test/builder/QuarkBuilderCometSupply.t.sol | 6 +- test/builder/QuarkBuilderCometWithdraw.t.sol | 3 +- test/builder/QuarkBuilderMorphoBorrow.t.sol | 3 +- .../QuarkBuilderMorphoClaimRewards.t.sol | 3 +- test/builder/QuarkBuilderMorphoRepay.t.sol | 3 +- .../QuarkBuilderMorphoVaultSupply.t.sol | 18 +- .../QuarkBuilderMorphoVaultWithdraw.t.sol | 3 +- test/builder/QuarkBuilderRecurringSwap.t.sol | 3 +- test/builder/QuarkBuilderSwap.t.sol | 3 +- test/builder/QuarkBuilderTransfer.t.sol | 190 +++++++++++++++++- 18 files changed, 249 insertions(+), 31 deletions(-) diff --git a/src/builder/actions/CometActionsBuilder.sol b/src/builder/actions/CometActionsBuilder.sol index 6ba5c5b..a7d3b09 100644 --- a/src/builder/actions/CometActionsBuilder.sol +++ b/src/builder/actions/CometActionsBuilder.sol @@ -27,6 +27,7 @@ contract CometActionsBuilder is QuarkBuilderBase { string[] collateralAssetSymbols; address comet; address repayer; + bool preferAcross; } function cometRepay( @@ -84,7 +85,7 @@ contract CometActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: repayIntent.preferAcross }); } @@ -115,6 +116,7 @@ contract CometActionsBuilder is QuarkBuilderBase { uint256[] collateralAmounts; string[] collateralAssetSymbols; address comet; + bool preferAcross; } function cometBorrow( @@ -162,7 +164,7 @@ contract CometActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: borrowIntent.preferAcross }); } @@ -191,6 +193,7 @@ contract CometActionsBuilder is QuarkBuilderBase { uint256 chainId; address comet; address sender; + bool preferAcross; } function cometSupply( @@ -248,7 +251,7 @@ contract CometActionsBuilder is QuarkBuilderBase { useQuotecall: isMaxSupply, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: cometSupplyIntent.preferAcross }), chainAccountsList: chainAccountsList, payment: payment, @@ -273,6 +276,7 @@ contract CometActionsBuilder is QuarkBuilderBase { uint256 chainId; address comet; address withdrawer; + bool preferAcross; } function cometWithdraw( @@ -334,7 +338,7 @@ contract CometActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: cometWithdrawIntent.preferAcross }), chainAccountsList: chainAccountsList, payment: payment, diff --git a/src/builder/actions/MorphoActionsBuilder.sol b/src/builder/actions/MorphoActionsBuilder.sol index 38b3019..7ab67ee 100644 --- a/src/builder/actions/MorphoActionsBuilder.sol +++ b/src/builder/actions/MorphoActionsBuilder.sol @@ -26,6 +26,7 @@ contract MorphoActionsBuilder is QuarkBuilderBase { uint256 chainId; uint256 collateralAmount; string collateralAssetSymbol; + bool preferAcross; } function morphoBorrow( @@ -72,7 +73,7 @@ contract MorphoActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: borrowIntent.preferAcross }); } @@ -102,6 +103,7 @@ contract MorphoActionsBuilder is QuarkBuilderBase { uint256 chainId; uint256 collateralAmount; string collateralAssetSymbol; + bool preferAcross; } function morphoRepay( @@ -165,7 +167,7 @@ contract MorphoActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: repayIntent.preferAcross }), chainAccountsList: chainAccountsList, payment: payment, @@ -192,6 +194,7 @@ contract MorphoActionsBuilder is QuarkBuilderBase { address[] distributors; address[] rewards; bytes32[][] proofs; + bool preferAcross; } function morphoClaimRewards( @@ -249,7 +252,7 @@ contract MorphoActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: claimIntent.preferAcross }); } diff --git a/src/builder/actions/MorphoVaultActionsBuilder.sol b/src/builder/actions/MorphoVaultActionsBuilder.sol index 27f0ce2..a8f7637 100644 --- a/src/builder/actions/MorphoVaultActionsBuilder.sol +++ b/src/builder/actions/MorphoVaultActionsBuilder.sol @@ -24,6 +24,7 @@ contract MorphoVaultActionsBuilder is QuarkBuilderBase { uint256 blockTimestamp; address sender; uint256 chainId; + bool preferAcross; } function morphoVaultSupply( @@ -81,7 +82,7 @@ contract MorphoVaultActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: supplyIntent.preferAcross }), chainAccountsList: chainAccountsList, payment: payment, @@ -105,6 +106,7 @@ contract MorphoVaultActionsBuilder is QuarkBuilderBase { uint256 blockTimestamp; uint256 chainId; address withdrawer; + bool preferAcross; } function morphoVaultWithdraw( @@ -168,7 +170,7 @@ contract MorphoVaultActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: withdrawIntent.preferAcross }); } diff --git a/src/builder/actions/SwapActionsBuilder.sol b/src/builder/actions/SwapActionsBuilder.sol index 792fbb9..f67f85c 100644 --- a/src/builder/actions/SwapActionsBuilder.sol +++ b/src/builder/actions/SwapActionsBuilder.sol @@ -31,6 +31,7 @@ contract SwapActionsBuilder is QuarkBuilderBase { address sender; bool isExactOut; uint256 blockTimestamp; + bool preferAcross; } function swap( @@ -112,7 +113,7 @@ contract SwapActionsBuilder is QuarkBuilderBase { useQuotecall: isMaxSwap, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: swapIntent.preferAcross }); } @@ -146,6 +147,7 @@ contract SwapActionsBuilder is QuarkBuilderBase { uint256 interval; address sender; uint256 blockTimestamp; + bool preferAcross; } // Note: We don't currently bridge the input token or the payment token for recurring swaps. Recurring swaps @@ -207,7 +209,7 @@ contract SwapActionsBuilder is QuarkBuilderBase { useQuotecall: false, bridgeEnabled: false, autoWrapperEnabled: false, - preferAcross: true + preferAcross: swapIntent.preferAcross }); } diff --git a/src/builder/actions/TransferActionsBuilder.sol b/src/builder/actions/TransferActionsBuilder.sol index 8693853..2664b20 100644 --- a/src/builder/actions/TransferActionsBuilder.sol +++ b/src/builder/actions/TransferActionsBuilder.sol @@ -25,6 +25,7 @@ contract TransferActionsBuilder is QuarkBuilderBase { address sender; address recipient; uint256 blockTimestamp; + bool preferAcross; } function transfer( @@ -82,7 +83,7 @@ contract TransferActionsBuilder is QuarkBuilderBase { useQuotecall: useQuotecall, bridgeEnabled: true, autoWrapperEnabled: true, - preferAcross: true + preferAcross: transferIntent.preferAcross }); } diff --git a/test/builder/BridgingLogic.t.sol b/test/builder/BridgingLogic.t.sol index c8f9bc1..a5f2a34 100644 --- a/test/builder/BridgingLogic.t.sol +++ b/test/builder/BridgingLogic.t.sol @@ -61,7 +61,8 @@ contract BridgingLogicTest is Test, QuarkBuilderTest { amount: 1e18, sender: address(0xb0b), recipient: address(0xceecee), - blockTimestamp: BLOCK_TIMESTAMP + blockTimestamp: BLOCK_TIMESTAMP, + preferAcross: false }), // transfer 1e18 WETH on chain 8453 to 0xceecee chainAccountsList, paymentUsd_() diff --git a/test/builder/QuarkBuilderCometBorrow.t.sol b/test/builder/QuarkBuilderCometBorrow.t.sol index 93020c5..b41fb8a 100644 --- a/test/builder/QuarkBuilderCometBorrow.t.sol +++ b/test/builder/QuarkBuilderCometBorrow.t.sol @@ -33,7 +33,8 @@ contract QuarkBuilderCometBorrowTest is Test, QuarkBuilderTest { chainId: chainId, collateralAmounts: collateralAmounts, collateralAssetSymbols: collateralAssetSymbols, - comet: cometUsdc_(1) + comet: cometUsdc_(1), + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderCometRepay.t.sol b/test/builder/QuarkBuilderCometRepay.t.sol index 12b1a13..3051f52 100644 --- a/test/builder/QuarkBuilderCometRepay.t.sol +++ b/test/builder/QuarkBuilderCometRepay.t.sol @@ -34,7 +34,8 @@ contract QuarkBuilderCometRepayTest is Test, QuarkBuilderTest { collateralAmounts: collateralAmounts, collateralAssetSymbols: collateralAssetSymbols, comet: comet, - repayer: address(0xa11ce) + repayer: address(0xa11ce), + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderCometSupply.t.sol b/test/builder/QuarkBuilderCometSupply.t.sol index d1d9ba5..65cd105 100644 --- a/test/builder/QuarkBuilderCometSupply.t.sol +++ b/test/builder/QuarkBuilderCometSupply.t.sol @@ -31,7 +31,8 @@ contract QuarkBuilderCometSupplyTest is Test, QuarkBuilderTest { blockTimestamp: BLOCK_TIMESTAMP, chainId: chainId, comet: COMET_ETH, - sender: address(0xa11ce) + sender: address(0xa11ce), + preferAcross: false }); } @@ -54,7 +55,8 @@ contract QuarkBuilderCometSupplyTest is Test, QuarkBuilderTest { blockTimestamp: BLOCK_TIMESTAMP, chainId: chainId, comet: COMET, - sender: sender + sender: sender, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderCometWithdraw.t.sol b/test/builder/QuarkBuilderCometWithdraw.t.sol index 295cdb6..bba1858 100644 --- a/test/builder/QuarkBuilderCometWithdraw.t.sol +++ b/test/builder/QuarkBuilderCometWithdraw.t.sol @@ -41,7 +41,8 @@ contract QuarkBuilderCometWithdrawTest is Test, QuarkBuilderTest { blockTimestamp: BLOCK_TIMESTAMP, chainId: chainId, comet: comet, - withdrawer: withdrawer + withdrawer: withdrawer, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderMorphoBorrow.t.sol b/test/builder/QuarkBuilderMorphoBorrow.t.sol index d607fe4..8ec9774 100644 --- a/test/builder/QuarkBuilderMorphoBorrow.t.sol +++ b/test/builder/QuarkBuilderMorphoBorrow.t.sol @@ -52,7 +52,8 @@ contract QuarkBuilderMorphoBorrowTest is Test, QuarkBuilderTest { borrower: borrower, chainId: chainId, collateralAmount: collateralAmount, - collateralAssetSymbol: collateralAssetSymbol + collateralAssetSymbol: collateralAssetSymbol, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderMorphoClaimRewards.t.sol b/test/builder/QuarkBuilderMorphoClaimRewards.t.sol index 091d03d..002373c 100644 --- a/test/builder/QuarkBuilderMorphoClaimRewards.t.sol +++ b/test/builder/QuarkBuilderMorphoClaimRewards.t.sol @@ -72,7 +72,8 @@ contract QuarkBuilderMorphoClaimRewardsTest is Test, QuarkBuilderTest { claimables: claimables, distributors: distributors, rewards: rewards, - proofs: proofs + proofs: proofs, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderMorphoRepay.t.sol b/test/builder/QuarkBuilderMorphoRepay.t.sol index 941fcc0..d5ca4fd 100644 --- a/test/builder/QuarkBuilderMorphoRepay.t.sol +++ b/test/builder/QuarkBuilderMorphoRepay.t.sol @@ -53,7 +53,8 @@ contract QuarkBuilderMorphoRepayTest is Test, QuarkBuilderTest { repayer: repayer, chainId: chainId, collateralAmount: collateralAmount, - collateralAssetSymbol: collateralAssetSymbol + collateralAssetSymbol: collateralAssetSymbol, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderMorphoVaultSupply.t.sol b/test/builder/QuarkBuilderMorphoVaultSupply.t.sol index ceabe36..b8d5037 100644 --- a/test/builder/QuarkBuilderMorphoVaultSupply.t.sol +++ b/test/builder/QuarkBuilderMorphoVaultSupply.t.sol @@ -39,7 +39,8 @@ contract QuarkBuilderMorphoVaultTest is Test, QuarkBuilderTest { assetSymbol: assetSymbol, blockTimestamp: BLOCK_TIMESTAMP, chainId: chainId, - sender: sender + sender: sender, + preferAcross: false }); } @@ -52,7 +53,8 @@ contract QuarkBuilderMorphoVaultTest is Test, QuarkBuilderTest { assetSymbol: "USDC", blockTimestamp: BLOCK_TIMESTAMP, sender: address(0xa11ce), - chainId: 1 + chainId: 1, + preferAcross: false }), chainAccountsList_(0e6), // but we are holding 0 USDC in total across 1, 8453 paymentUsd_() @@ -69,7 +71,8 @@ contract QuarkBuilderMorphoVaultTest is Test, QuarkBuilderTest { assetSymbol: "USDC", blockTimestamp: BLOCK_TIMESTAMP, sender: address(0xa11ce), - chainId: 1 + chainId: 1, + preferAcross: false }), chainAccountsList_(2e6), // holding 2 USDC in total across 1, 8453 paymentUsdc_(maxCosts_(1, 1_000e6)) // but costs 1,000 USDC @@ -112,7 +115,8 @@ contract QuarkBuilderMorphoVaultTest is Test, QuarkBuilderTest { assetSymbol: "USDC", blockTimestamp: BLOCK_TIMESTAMP, sender: address(0xa11ce), - chainId: 1 + chainId: 1, + preferAcross: false }), chainAccountsList, paymentUsd_() @@ -127,7 +131,8 @@ contract QuarkBuilderMorphoVaultTest is Test, QuarkBuilderTest { assetSymbol: "USDC", blockTimestamp: BLOCK_TIMESTAMP, sender: address(0xa11ce), - chainId: 1 + chainId: 1, + preferAcross: false }), chainAccountsList_(3e6), // holding 3 USDC in total across chains 1, 8453 paymentUsd_() @@ -202,7 +207,8 @@ contract QuarkBuilderMorphoVaultTest is Test, QuarkBuilderTest { assetSymbol: "USDC", blockTimestamp: BLOCK_TIMESTAMP, sender: address(0xa11ce), - chainId: 1 + chainId: 1, + preferAcross: false }), chainAccountsList, // holding 3 USDC in total across chains 1, 8453 paymentUsd_() diff --git a/test/builder/QuarkBuilderMorphoVaultWithdraw.t.sol b/test/builder/QuarkBuilderMorphoVaultWithdraw.t.sol index 5270cbb..06d68b3 100644 --- a/test/builder/QuarkBuilderMorphoVaultWithdraw.t.sol +++ b/test/builder/QuarkBuilderMorphoVaultWithdraw.t.sol @@ -40,7 +40,8 @@ contract QuarkBuilderMorphoVaultWithdrawTest is Test, QuarkBuilderTest { assetSymbol: assetSymbol, blockTimestamp: BLOCK_TIMESTAMP, chainId: chainId, - withdrawer: withdrawer + withdrawer: withdrawer, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderRecurringSwap.t.sol b/test/builder/QuarkBuilderRecurringSwap.t.sol index 36c0423..cd23c5c 100644 --- a/test/builder/QuarkBuilderRecurringSwap.t.sol +++ b/test/builder/QuarkBuilderRecurringSwap.t.sol @@ -72,7 +72,8 @@ contract QuarkBuilderRecurringSwapTest is Test, QuarkBuilderTest { path: path, interval: interval, sender: sender, - blockTimestamp: blockTimestamp + blockTimestamp: blockTimestamp, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderSwap.t.sol b/test/builder/QuarkBuilderSwap.t.sol index aee386b..b3e6af2 100644 --- a/test/builder/QuarkBuilderSwap.t.sol +++ b/test/builder/QuarkBuilderSwap.t.sol @@ -92,7 +92,8 @@ contract QuarkBuilderSwapTest is Test, QuarkBuilderTest { feeAmount: 10, sender: sender, isExactOut: false, - blockTimestamp: blockTimestamp + blockTimestamp: blockTimestamp, + preferAcross: false }); } diff --git a/test/builder/QuarkBuilderTransfer.t.sol b/test/builder/QuarkBuilderTransfer.t.sol index ebff7d7..185d847 100644 --- a/test/builder/QuarkBuilderTransfer.t.sol +++ b/test/builder/QuarkBuilderTransfer.t.sol @@ -20,8 +20,18 @@ import {PaymentInfo} from "src/builder/PaymentInfo.sol"; import {QuarkBuilder} from "src/builder/QuarkBuilder.sol"; import {QuarkBuilderBase} from "src/builder/QuarkBuilderBase.sol"; import {Quotecall} from "src/Quotecall.sol"; +import {AcrossActions} from "src/AcrossScripts.sol"; + +import {FFI} from "src/builder/FFI.sol"; +import {AcrossFFI} from "test/builder/mocks/AcrossFFI.sol"; contract QuarkBuilderTransferTest is Test, QuarkBuilderTest { + function setUp() public { + // Deploy mock FFI for calling Across API + AcrossFFI mockFFI = new AcrossFFI(); + vm.etch(FFI.ACROSS_FFI_ADDRESS, address(mockFFI).code); + } + function transferUsdc_(uint256 chainId, uint256 amount, address recipient, uint256 blockTimestamp) internal pure @@ -85,7 +95,28 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest { recipient: recipient, amount: amount, assetSymbol: assetSymbol, - blockTimestamp: blockTimestamp + blockTimestamp: blockTimestamp, + preferAcross: false + }); + } + + function transferToken_( + string memory assetSymbol, + uint256 chainId, + uint256 amount, + address sender, + address recipient, + uint256 blockTimestamp, + bool preferAcross + ) internal pure returns (TransferActionsBuilder.TransferIntent memory) { + return TransferActionsBuilder.TransferIntent({ + chainId: chainId, + sender: sender, + recipient: recipient, + amount: amount, + assetSymbol: assetSymbol, + blockTimestamp: blockTimestamp, + preferAcross: preferAcross }); } @@ -424,6 +455,163 @@ contract QuarkBuilderTransferTest is Test, QuarkBuilderTest { assertNotEq(result.eip712Data.hashStruct, hex"", "non-empty hashStruct"); } + function testSimpleBridgeWithAcrossTransferSucceeds() public { + QuarkBuilder builder = new QuarkBuilder(); + // Note: There are 3e6 USDC on each chain, so the Builder should attempt to bridge 2 USDC to chain 8453 + QuarkBuilder.BuilderResult memory result = builder.transfer( + transferToken_({ + assetSymbol: "USDC", + chainId: 8453, + amount: 5e6, + sender: address(0xb0b), + recipient: address(0xceecee), + blockTimestamp: BLOCK_TIMESTAMP, + preferAcross: true + }), // transfer 5 USDC on chain 8453 to 0xceecee + chainAccountsList_(6e6), // holding 6 USDC in total across chains 1, 8453 + paymentUsd_() + ); + + assertEq(result.paymentCurrency, "usd", "usd currency"); + + // Check the quark operations + assertEq(result.quarkOperations.length, 2, "two operations"); + assertEq( + result.quarkOperations[0].scriptAddress, + address( + uint160( + uint256( + keccak256( + abi.encodePacked( + bytes1(0xff), + /* codeJar address */ + address(CodeJarHelper.CODE_JAR_ADDRESS), + uint256(0), + /* script bytecode */ + keccak256(type(AcrossActions).creationCode) + ) + ) + ) + ) + ), + "script address for bridge action is correct given the code jar address" + ); + assertEq( + result.quarkOperations[0].scriptCalldata, + abi.encodeCall( + AcrossActions.depositV3, + ( + 0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5, // spokePool + address(0xb0b), // depositor + address(0xb0b), // recipient + address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48), // inputToken + address(0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913), // outputToken + 0x2e14e0, // inputAmount + 0x1e8480, // outputAmount + 8453, // destinationChainId + address(0), // exclusiveRelayer + uint32(BLOCK_TIMESTAMP) - 30 seconds, // quoteTimestamp + uint32(BLOCK_TIMESTAMP + 10 minutes), // fillDeadline + 0, // exclusivityDeadline + new bytes(0), // message + false // useNativeToken + ) + ), + "calldata is AcrossActions.depositV3(...);" + ); + assertEq( + result.quarkOperations[0].expiry, BLOCK_TIMESTAMP + 7 days, "expiry is current blockTimestamp + 7 days" + ); + assertEq(result.quarkOperations[0].nonce, ALICE_DEFAULT_SECRET, "unexpected nonce"); + assertEq(result.quarkOperations[0].isReplayable, false, "isReplayable is false"); + + assertEq( + result.quarkOperations[1].scriptAddress, + address( + uint160( + uint256( + keccak256( + abi.encodePacked( + bytes1(0xff), + /* codeJar address */ + address(CodeJarHelper.CODE_JAR_ADDRESS), + uint256(0), + /* script bytecode */ + keccak256(type(TransferActions).creationCode) + ) + ) + ) + ) + ), + "script address for transfer is correct given the code jar address" + ); + assertEq( + result.quarkOperations[1].scriptCalldata, + abi.encodeCall(TransferActions.transferERC20Token, (usdc_(8453), address(0xceecee), 5e6)), + "calldata is TransferActions.transferERC20Token(USDC_8453, address(0xceecee), 5e6);" + ); + assertEq( + result.quarkOperations[1].expiry, BLOCK_TIMESTAMP + 7 days, "expiry is current blockTimestamp + 7 days" + ); + assertEq(result.quarkOperations[1].nonce, BOB_DEFAULT_SECRET, "unexpected nonce"); + assertEq(result.quarkOperations[1].isReplayable, false, "isReplayable is false"); + + // Check the actions + assertEq(result.actions.length, 2, "two actions"); + assertEq(result.actions[0].chainId, 1, "operation is on chainid 1"); + assertEq(result.actions[0].quarkAccount, address(0xa11ce), "0xa11ce sends the funds"); + assertEq(result.actions[0].actionType, "BRIDGE", "action type is 'BRIDGE'"); + assertEq(result.actions[0].paymentMethod, "OFFCHAIN", "payment method is 'OFFCHAIN'"); + assertEq(result.actions[0].paymentToken, address(0), "payment token is null"); + assertEq(result.actions[0].paymentMaxCost, 0, "payment has no max cost, since 'OFFCHAIN'"); + assertEq(result.actions[0].nonceSecret, ALICE_DEFAULT_SECRET, "unexpected nonce secret"); + assertEq(result.actions[0].totalPlays, 1, "total plays is 1"); + assertEq( + result.actions[0].actionContext, + abi.encode( + Actions.BridgeActionContext({ + price: USDC_PRICE, + token: USDC_1, + assetSymbol: "USDC", + inputAmount: 0x2e14e0, + outputAmount: 0x1e8480, + chainId: 1, + recipient: address(0xb0b), + destinationChainId: 8453, + bridgeType: Actions.BRIDGE_TYPE_ACROSS + }) + ), + "action context encoded from BridgeActionContext" + ); + assertEq(result.actions[1].chainId, 8453, "operation is on chainid 8453"); + assertEq(result.actions[1].quarkAccount, address(0xb0b), "0xb0b sends the funds"); + assertEq(result.actions[1].actionType, "TRANSFER", "action type is 'TRANSFER'"); + assertEq(result.actions[1].paymentMethod, "OFFCHAIN", "payment method is 'OFFCHAIN'"); + assertEq(result.actions[1].paymentToken, address(0), "payment token is null"); + assertEq(result.actions[1].paymentMaxCost, 0, "payment has no max cost, since 'OFFCHAIN'"); + assertEq(result.actions[1].nonceSecret, BOB_DEFAULT_SECRET, "unexpected nonce secret"); + assertEq(result.actions[1].totalPlays, 1, "total plays is 1"); + assertEq( + result.actions[1].actionContext, + abi.encode( + Actions.TransferActionContext({ + amount: 5e6, + price: USDC_PRICE, + token: USDC_8453, + assetSymbol: "USDC", + chainId: 8453, + recipient: address(0xceecee) + }) + ), + "action context encoded from TransferActionContext" + ); + + // TODO: Check the contents of the EIP712 data + assertNotEq(result.eip712Data.digest, hex"", "non-empty digest"); + assertNotEq(result.eip712Data.domainSeparator, hex"", "non-empty domain separator"); + assertNotEq(result.eip712Data.hashStruct, hex"", "non-empty hashStruct"); + } + function testSimpleBridgeTransferWithPaycallSucceeds() public { QuarkBuilder builder = new QuarkBuilder(); PaymentInfo.PaymentMaxCost[] memory maxCosts = new PaymentInfo.PaymentMaxCost[](2);