Skip to content

Commit

Permalink
update arb
Browse files Browse the repository at this point in the history
  • Loading branch information
Code0x2 committed Dec 7, 2023
1 parent 8d2a36c commit 6392cc5
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 12 deletions.
58 changes: 47 additions & 11 deletions test/FlashLoan.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()));

Expand All @@ -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
Expand All @@ -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();

}

Expand Down Expand Up @@ -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 {

}
}
2 changes: 1 addition & 1 deletion test/base/ArbitrageTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 6392cc5

Please sign in to comment.