From 6392cc57be21c6700e494042f9ff9a8f01f0a93f Mon Sep 17 00:00:00 2001 From: 0x2 <75550506+Code0x2@users.noreply.github.com> Date: Wed, 6 Dec 2023 22:37:01 -0800 Subject: [PATCH] update arb --- test/FlashLoan.sol | 58 ++++++++++++++++++++++++++++------- test/base/ArbitrageTest.t.sol | 2 +- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/test/FlashLoan.sol b/test/FlashLoan.sol index 97ffa318..df591c5f 100644 --- a/test/FlashLoan.sol +++ b/test/FlashLoan.sol @@ -13,6 +13,7 @@ import { DAppControl } from "../src/contracts/dapp/DAppControl.sol"; import { CallConfig } from "../src/contracts/types/DAppApprovalTypes.sol"; import { UserOperation } from "../src/contracts/types/UserCallTypes.sol"; import { SolverOperation } from "../src/contracts/types/SolverCallTypes.sol"; +import { DAppOperation } from "../src/contracts/types/DAppApprovalTypes.sol"; contract FlashLoanTest is BaseTest { DummyController public controller; @@ -29,13 +30,25 @@ contract FlashLoanTest is BaseTest { function setUp() public virtual override { BaseTest.setUp(); + // Creating new gov address (ERR-V49 OwnerActive if already registered with controller) + governancePK = 11_112; + governanceEOA = vm.addr(governancePK); + + // Deploy + vm.startPrank(governanceEOA); + controller = new DummyController(address(escrow), WETH_ADDRESS); + atlasVerification.initializeGovernance(address(controller)); + atlasVerification.integrateDApp(address(controller)); + txBuilder = new TxBuilder({ controller: address(controller), atlasAddress: address(atlas), _verification: address(atlasVerification) }); + vm.stopPrank(); + arb = new ArbitrageTest(); arb.setUpArbitragePools(chain.weth, chain.dai, 50e18, 100_000e18, address(arb.v2Router()), address(arb.s2Router())); @@ -44,8 +57,14 @@ contract FlashLoanTest is BaseTest { function testFlashLoanArbitrage() public { // Pools should already be setup for arbitrage. First try arbitraging without paying eth back to pool + // Arbitrage is fulfilled by swapping WETH for DAI on Uniswap, then DAI for WETH on Sushiswap + (uint256 revenue, uint256 optimalAmountIn) = + arb.ternarySearch(chain.weth, chain.dai, arb.v2Router(), arb.s2Router(), 1, 50e18, 0, 20); + vm.startPrank(solverOneEOA); SimpleArbitrageSolver solver = new SimpleArbitrageSolver(WETH_ADDRESS, address(atlas)); + deal(WETH_ADDRESS, address(solver), 1e18); // 1 WETH to solver to pay bid + atlas.deposit{ value: 1e18 }(); vm.stopPrank(); // Input params for Atlas.metacall() - will be populated below @@ -65,16 +84,33 @@ contract FlashLoanTest is BaseTest { data: new bytes(0) }); - // SolverOperation[] memory solverOps = new SolverOperation[](1); - // solverOps[0] = txBuilder.buildSolverOperation({ - // userOp: userOp, - // solverOpData: solverOpData, - // solverEOA: solverOneEOA, - // solverContract: address(solver), - // bidAmount: 1e18 - // }); + SolverOperation[] memory solverOps = new SolverOperation[](1); + bytes memory solverOpData = + abi.encodeWithSelector(SimpleArbitrageSolver.arbitrageNoPayback.selector, arb.v2Router(), arb.s2Router(), chain.dai, optimalAmountIn); + solverOps[0] = txBuilder.buildSolverOperation({ + userOp: userOp, + solverOpData: solverOpData, + solverEOA: solverOneEOA, + solverContract: address(solver), + bidAmount: 1e18, + value: optimalAmountIn + }); + + // Solver signs the solverOp + (sig.v, sig.r, sig.s) = vm.sign(solverOnePK, atlasVerification.getSolverPayload(solverOps[0])); + solverOps[0].signature = abi.encodePacked(sig.r, sig.s, sig.v); + + // Frontend creates dAppOp calldata after seeing rest of data + DAppOperation memory dAppOp = txBuilder.buildDAppOperation(governanceEOA, userOp, solverOps); + // Frontend signs the dAppOp payload + (sig.v, sig.r, sig.s) = vm.sign(governancePK, atlasVerification.getDAppOperationPayload(dAppOp)); + dAppOp.signature = abi.encodePacked(sig.r, sig.s, sig.v); + // make the actual atlas call + vm.startPrank(userEOA); + atlas.metacall({ userOp: userOp, solverOps: solverOps, dAppOp: dAppOp }); + vm.stopPrank(); } @@ -124,11 +160,11 @@ contract DummyController is DAppControl { contract SimpleArbitrageSolver is SolverBase { constructor(address weth, address atlas) SolverBase(weth, atlas, msg.sender) { } - function arbitrateNoPayback(address poolA, address poolB, uint256[3] calldata amounts) public payable { - + function arbitrageNoPayback() external payable { + // Empty function, take the weth and not return anything - should fail } - function arbitrageWithPayback() external payable { + function arbitrageWithPayback(address routerA, address routerB, address tradeToken, uint256 amountIn) external payable { } } \ No newline at end of file diff --git a/test/base/ArbitrageTest.t.sol b/test/base/ArbitrageTest.t.sol index 0a6f65f8..c0231995 100644 --- a/test/base/ArbitrageTest.t.sol +++ b/test/base/ArbitrageTest.t.sol @@ -127,7 +127,7 @@ contract ArbitrageTest is BaseTest { uint24 c, uint24 m ) - internal + public returns (uint256 revenue, uint256 optimalAmountIn) { uint256 mid1 = left + (right - left) / 3;