Skip to content

Commit

Permalink
test setups
Browse files Browse the repository at this point in the history
  • Loading branch information
Code0x2 committed Nov 17, 2023
1 parent b43845d commit 64bc461
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 84 deletions.
40 changes: 20 additions & 20 deletions src/contracts/examples/intents-example/V4SwapIntent.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,6 @@ struct SwapData {
address recipient;
}

struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint256 maxFee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint256 sqrtPriceLimitX96;
}

struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint256 maxFee;
address recipient;
uint256 amountInMaximum;
uint256 amountOut;
uint256 sqrtPriceLimitX96;
}

contract V4SwapIntentController is DAppControl {
using SafeTransferLib for ERC20;

Expand Down Expand Up @@ -107,6 +87,16 @@ contract V4SwapIntentController is DAppControl {
_;
}

struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint256 maxFee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint256 sqrtPriceLimitX96;
}

// selector 0x04e45aaf
function exactInputSingle(ExactInputSingleParams calldata params) external payable verifyCall(params.tokenIn, params.tokenOut, params.amountIn) returns (SwapData memory) {
SwapData memory swapData = SwapData({
Expand All @@ -120,6 +110,16 @@ contract V4SwapIntentController is DAppControl {
return swapData;
}

struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint256 maxFee;
address recipient;
uint256 amountInMaximum;
uint256 amountOut;
uint256 sqrtPriceLimitX96;
}

// selector 0x5023b4df
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable verifyCall(params.tokenIn, params.tokenOut, params.amountInMaximum) returns (SwapData memory) {
SwapData memory swapData = SwapData({
Expand Down
133 changes: 69 additions & 64 deletions test/V4SwapIntent.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -96,80 +96,85 @@ contract V4SwapIntentTest is BaseTest {
// Deploy the solver contract
vm.startPrank(solverOneEOA);
UniswapV4IntentSolver solver = new UniswapV4IntentSolver(address(atlas), poolManager);
deal(WETH_ADDRESS, address(solver), 1e18); // 1 WETH to solver to pay bid
atlas.deposit{value: 1e18}();
vm.stopPrank();
}

// function testAtlasV4SwapIntentWithUniswapSolver() public {
// // Swap 10 WETH to 100 DAI

// // Solver deploys the RFQ solver contract (defined at bottom of this file)
// vm.startPrank(solverOneEOA);
// UniswapIntentSolver uniswapSolver = new UniswapIntentSolver(address(atlas));
// deal(WETH_ADDRESS, address(uniswapSolver), 1e18); // 1 WETH to solver to pay bid
// atlas.deposit{value: 1e18}();
// vm.stopPrank();
// Input params for Atlas.metacall() - will be populated below
UserOperation memory userOp;
SolverOperation[] memory solverOps = new SolverOperation[](1);
DAppOperation memory dAppOp;

// // Input params for Atlas.metacall() - will be populated below
// UserOperation memory userOp;
// SolverOperation[] memory solverOps = new SolverOperation[](1);
// DAppOperation memory dAppOp;

// vm.startPrank(userEOA);
// address executionEnvironment = atlas.createExecutionEnvironment(txBuilder.control());
// console.log("executionEnvironment a",executionEnvironment);
// vm.stopPrank();
// vm.label(address(executionEnvironment), "EXECUTION ENV");
vm.startPrank(userEOA);
address executionEnvironment = atlas.createExecutionEnvironment(txBuilder.control());
console.log("executionEnvironment a",executionEnvironment);
vm.stopPrank();
vm.label(address(executionEnvironment), "EXECUTION ENV");

// // userOpData is used in delegatecall from exec env to control, calling preOpsCall
// // first 4 bytes are "userSelector" param in preOpsCall in DAppControl - swap() selector
// // rest of data is "userData" param
// userOpData is used in delegatecall from exec env to control, calling preOpsCall
// first 4 bytes are "userSelector" param in preOpsCall in DAppControl - swap() selector
// rest of data is "userData" param

// // swap(SwapIntent calldata) selector = 0x98434997
// bytes memory userOpData = abi.encodeWithSelector(SwapIntentController.swap.selector, swapIntent);

// // Builds the metaTx and to parts of userOp, signature still to be set
// userOp = txBuilder.buildUserOperation({
// from: userEOA, // NOTE: Would from ever not be user?
// to: address(swapIntentController),
// maxFeePerGas: tx.gasprice + 1, // TODO update
// value: 0,
// deadline: block.number + 2,
// data: userOpData
// });
// swap(SwapIntent calldata) selector = 0x98434997
bytes memory userOpData = abi.encodeWithSelector(
V4SwapIntentController.exactInputSingle.selector,
V4SwapIntentController.ExactInputSingleParams({
tokenIn: address(WETH),
tokenOut: address(DAI),
maxFee: 3000,
recipient: address(userEOA),
amountIn: 10e18,
amountOutMinimum: 0,
sqrtPriceLimitX96: address(WETH) < address(DAI) ? 4295128740 : 1461446703485210103287273052203988822378723970341
})
);

// Builds the metaTx and to parts of userOp, signature still to be set
userOp = txBuilder.buildUserOperation({
from: userEOA, // NOTE: Would from ever not be user?
to: address(swapIntentController),
maxFeePerGas: tx.gasprice + 1, // TODO update
value: 0,
deadline: block.number + 2,
data: userOpData
});

// // User signs the userOp
// // user doees NOT sign the userOp when they are bundling
// // (sig.v, sig.r, sig.s) = vm.sign(userPK, atlas.getUserOperationPayload(userOp));
// // userOp.signature = abi.encodePacked(sig.r, sig.s, sig.v);
// Build solver calldata (function selector on solver contract and its params)
bytes memory solverOpData = abi.encodeWithSelector(
UniswapV4IntentSolver.fulfillWithSwap.selector,
poolKey,
SwapData({
tokenIn: address(WETH),
tokenOut: address(DAI),
requestedAmount: 10e18,
limitAmount: 0,
recipient: address(userEOA)
}),
executionEnvironment,
1e18
);

// Builds the SolverOperation
solverOps[0] = txBuilder.buildSolverOperation({
userOp: userOp,
solverOpData: solverOpData,
solverEOA: solverOneEOA,
solverContract: address(solver),
bidAmount: 1e18
});

// // Build solver calldata (function selector on solver contract and its params)
// bytes memory solverOpData = abi.encodeWithSelector(
// UniswapIntentSolver.fulfillWithSwap.selector,
// swapIntent,
// executionEnvironment
// );
// Solver signs the solverOp
(sig.v, sig.r, sig.s) = vm.sign(solverOnePK, atlas.getSolverPayload(solverOps[0]));
solverOps[0].signature = abi.encodePacked(sig.r, sig.s, sig.v);

// // Builds the SolverOperation
// solverOps[0] = txBuilder.buildSolverOperation({
// userOp: userOp,
// solverOpData: solverOpData,
// solverEOA: solverOneEOA,
// solverContract: address(uniswapSolver),
// bidAmount: 1e18
// });
// Frontend creates dAppOp calldata after seeing rest of data
dAppOp = txBuilder.buildDAppOperation(governanceEOA, userOp, solverOps);

// // Solver signs the solverOp
// (sig.v, sig.r, sig.s) = vm.sign(solverOnePK, atlas.getSolverPayload(solverOps[0]));
// solverOps[0].signature = abi.encodePacked(sig.r, sig.s, sig.v);

// // Frontend creates dAppOp calldata after seeing rest of data
// dAppOp = txBuilder.buildDAppOperation(governanceEOA, userOp, solverOps);
// Frontend signs the dAppOp payload
(sig.v, sig.r, sig.s) = vm.sign(governancePK, atlas.getDAppOperationPayload(dAppOp));
dAppOp.signature = abi.encodePacked(sig.r, sig.s, sig.v);
}

// // Frontend signs the dAppOp payload
// (sig.v, sig.r, sig.s) = vm.sign(governancePK, atlas.getDAppOperationPayload(dAppOp));
// dAppOp.signature = abi.encodePacked(sig.r, sig.s, sig.v);
// function testAtlasV4SwapIntentWithUniswapSolver() public {
// // Swap 10 WETH to 100 DAI

// // Check user token balances before
// uint256 userWethBalanceBefore = WETH.balanceOf(userEOA);
Expand Down

0 comments on commit 64bc461

Please sign in to comment.