97 lines
3.3 KiB
Solidity
97 lines
3.3 KiB
Solidity
// SPDX-License-Identifier: BUSL-1.1
|
|
pragma solidity ^0.8.26;
|
|
|
|
import "@src/executors/MaverickV2Executor.sol";
|
|
import {Test} from "../../lib/forge-std/src/Test.sol";
|
|
import {Constants} from "../Constants.sol";
|
|
|
|
contract MaverickV2ExecutorExposed is MaverickV2Executor {
|
|
constructor(address _factory) MaverickV2Executor(_factory) {}
|
|
|
|
function decodeParams(bytes calldata data)
|
|
external
|
|
pure
|
|
returns (IERC20 tokenIn, address target, address receiver)
|
|
{
|
|
return _decodeData(data);
|
|
}
|
|
}
|
|
|
|
contract MaverickV2ExecutorTest is Test, Constants {
|
|
using SafeERC20 for IERC20;
|
|
|
|
MaverickV2ExecutorExposed maverickV2Exposed;
|
|
IERC20 GHO = IERC20(GHO_ADDR);
|
|
IERC20 USDC = IERC20(USDC_ADDR);
|
|
|
|
function setUp() public {
|
|
uint256 forkBlock = 20127232;
|
|
vm.createSelectFork(vm.rpcUrl("mainnet"), forkBlock);
|
|
maverickV2Exposed = new MaverickV2ExecutorExposed(MAVERICK_V2_FACTORY);
|
|
}
|
|
|
|
function testDecodeParams() public view {
|
|
bytes memory params =
|
|
abi.encodePacked(GHO_ADDR, GHO_USDC_POOL, address(2));
|
|
|
|
(IERC20 tokenIn, address target, address receiver) =
|
|
maverickV2Exposed.decodeParams(params);
|
|
|
|
assertEq(address(tokenIn), GHO_ADDR);
|
|
assertEq(target, GHO_USDC_POOL);
|
|
assertEq(receiver, address(2));
|
|
}
|
|
|
|
function testDecodeParamsInvalidDataLength() public {
|
|
bytes memory invalidParams =
|
|
abi.encodePacked(GHO_ADDR, GHO_USDC_POOL, address(2), true);
|
|
|
|
vm.expectRevert(MaverickV2Executor__InvalidDataLength.selector);
|
|
maverickV2Exposed.decodeParams(invalidParams);
|
|
}
|
|
|
|
function testSwap() public {
|
|
uint256 amountIn = 10 ** 18;
|
|
bytes memory protocolData =
|
|
abi.encodePacked(GHO_ADDR, GHO_USDC_POOL, BOB);
|
|
|
|
deal(GHO_ADDR, address(maverickV2Exposed), amountIn);
|
|
uint256 balanceBefore = GHO.balanceOf(BOB);
|
|
|
|
uint256 amountOut = maverickV2Exposed.swap(amountIn, protocolData);
|
|
|
|
uint256 balanceAfter = GHO.balanceOf(BOB);
|
|
assertGt(balanceAfter, balanceBefore);
|
|
assertEq(balanceAfter - balanceBefore, amountOut);
|
|
}
|
|
|
|
function testDecodeIntegration() public view {
|
|
// Generated by the SwapEncoder - test_encode_maverick_v2
|
|
bytes memory protocolData =
|
|
hex"40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e";
|
|
|
|
(IERC20 tokenIn, address pool, address receiver) =
|
|
maverickV2Exposed.decodeParams(protocolData);
|
|
|
|
assertEq(address(tokenIn), GHO_ADDR);
|
|
assertEq(pool, GHO_USDC_POOL);
|
|
assertEq(receiver, BOB);
|
|
}
|
|
|
|
function testSwapIntegration() public {
|
|
// Generated by the SwapEncoder - test_encode_maverick_v2
|
|
bytes memory protocolData =
|
|
hex"40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e";
|
|
|
|
uint256 amountIn = 10 ** 18;
|
|
deal(GHO_ADDR, address(maverickV2Exposed), amountIn);
|
|
uint256 balanceBefore = GHO.balanceOf(BOB);
|
|
|
|
uint256 amountOut = maverickV2Exposed.swap(amountIn, protocolData);
|
|
|
|
uint256 balanceAfter = USDC.balanceOf(BOB);
|
|
assertGt(balanceAfter, balanceBefore);
|
|
assertEq(balanceAfter - balanceBefore, amountOut);
|
|
}
|
|
}
|