Skip to content

Commit

Permalink
Adapt tests to use new SkipSwapRouter and bugfixes
Browse files Browse the repository at this point in the history
  • Loading branch information
wirew0lf committed Aug 19, 2024
1 parent 18ffc6b commit 70c4c12
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 40 deletions.
14 changes: 4 additions & 10 deletions AxelarHandler/script/SimulateExecuteWithToken.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -50,21 +50,15 @@ contract SimulateExecuteWithToken is Script, Test {
mockGateway.saveTokenAddress(tokenInputSymbol, tokenIn);
deal(address(tokenIn), address(handler), amountIn);

bytes[] memory swaps = new bytes[](1);
swaps[0] = abi.encode(uint8(0), abi.encode(tokenOut, uint24(3000), uint160(0)));
bytes memory examplePayload = abi.encode(uint8(2), abi.encode(destination, amountOutMin, unwrap, swaps));
bytes memory swapPayload = abi.encode(uint8(0), tokenOut, amountOutMin, abi.encode(uint24(3000), uint160(0)));
bytes memory payload = abi.encode(uint8(2), abi.encode(destination, unwrap, swapPayload));

console2.logBytes(examplePayload);
console2.logBytes(payload);

console2.log("Token Out Destination Balance Before: %s", IERC20(tokenOut).balanceOf(destination));

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")),
"osmosis-7",
"mock_address",
examplePayload,
tokenInputSymbol,
amountIn
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, tokenInputSymbol, amountIn
);

console2.log("Token Out Destination Balance After: %s", IERC20(tokenOut).balanceOf(destination));
Expand Down
21 changes: 13 additions & 8 deletions AxelarHandler/src/libraries/SkipSwapRouter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import {SafeERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/utils/
import {ISwapRouter02} from "../interfaces/ISwapRouter02.sol";
import {BytesLib, Path} from "./Path.sol";

import {console} from "forge-std/Test.sol";

pragma solidity >= 0.8.18;

library SkipSwapRouter {
Expand Down Expand Up @@ -40,7 +42,7 @@ library SkipSwapRouter {

function swap(ISwapRouter02 router, address destination, IERC20 inputToken, uint256 amountIn, bytes memory payload)
public
returns (IERC20 outputToken, uint256 amountOut)
returns (IERC20 outputToken, uint256 outputAmount)
{
(SwapCommands command, address tokenOut, uint256 amountOut, bytes memory swapData) =
abi.decode(payload, (SwapCommands, address, uint256, bytes));
Expand All @@ -65,16 +67,17 @@ library SkipSwapRouter {
router.exactInputSingle(params);
} else if (command == SwapCommands.ExactInput) {
ISwapRouter02.ExactInputParams memory params;
params.path = _fixPath(address(inputToken), tokenOut, swapData);
// params.path = _fixPath(address(inputToken), tokenOut, swapData);
params.path = swapData;
params.recipient = address(this);
params.amountIn = amountIn;
params.amountOutMinimum = amountOut;

router.exactInput(params);
} else if (command == SwapCommands.ExactTokensForTokens) {
address[] memory path = _fixPath(address(inputToken), tokenOut, abi.decode(swapData, (address[])));
//address[] memory path = _fixPath(address(inputToken), tokenOut, abi.decode(swapData, (address[])));

router.swapExactTokensForTokens(amountIn, amountOut, path, address(this));
router.swapExactTokensForTokens(amountIn, amountOut, abi.decode(swapData, (address[])), address(this));
} else if (command == SwapCommands.ExactOutputSingle) {
ISwapRouter02.ExactOutputSingleParams memory params;
params.tokenIn = address(inputToken);
Expand All @@ -88,19 +91,21 @@ library SkipSwapRouter {
router.exactOutputSingle(params);
} else if (command == SwapCommands.ExactOutput) {
ISwapRouter02.ExactOutputParams memory params;
params.path = _fixPath(tokenOut, address(inputToken), swapData);
// params.path = _fixPath(tokenOut, address(inputToken), swapData);
params.path = swapData;
params.recipient = address(this);
params.amountInMaximum = amountIn;
params.amountOut = amountOut;

router.exactOutput(params);
} else if (command == SwapCommands.TokensForExactTokens) {
address[] memory path = _fixPath(tokenOut, address(inputToken), abi.decode(swapData, (address[])));
//address[] memory path = _fixPath(tokenOut, address(inputToken), abi.decode(swapData, (address[])));

router.swapTokensForExactTokens(amountOut, amountIn, path, address(this));
router.swapTokensForExactTokens(amountOut, amountIn, abi.decode(swapData, (address[])), address(this));
}

if (amountOut < outputToken.balanceOf(address(this)) - preBalOut) {
outputAmount = outputToken.balanceOf(address(this)) - preBalOut;
if (outputAmount < amountOut) {
revert InsufficientOutputAmount();
}

Expand Down
57 changes: 35 additions & 22 deletions AxelarHandler/test/AxelarHandler.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -397,10 +397,8 @@ contract AxelarHandlerTest is Test {
assertEq(inputToken.balanceOf(destination), 0, "Destination input token balance before");
assertEq(outputToken.balanceOf(destination), 0, "Destination output token balance before");

bytes[] memory swaps = new bytes[](1);
swaps[0] = abi.encode(uint8(0), abi.encode(tokenOut, uint24(3000), uint160(0)));

bytes memory payload = abi.encode(uint8(2), abi.encode(destination, amountOutMin, unwrap, swaps));
bytes memory swapPayload = abi.encode(uint8(0), tokenOut, amountOutMin, abi.encode(uint24(3000), uint160(0)));
bytes memory payload = abi.encode(uint8(2), abi.encode(destination, unwrap, swapPayload));

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, symbol, amountIn
Expand Down Expand Up @@ -453,9 +451,9 @@ contract AxelarHandlerTest is Test {
MockGateway mockGateway = MockGateway(address(gateway));
mockGateway.saveTokenAddress(symbol, address(inputToken));

bytes[] memory swaps = new bytes[](1);
swaps[0] = abi.encode(uint8(1), abi.encodePacked(address(inputToken), uint24(500), address(outputToken)));
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, amountOutMinimum, false, swaps));
bytes memory path = abi.encodePacked(address(inputToken), uint24(500), address(outputToken));
bytes memory swapPayload = abi.encode(uint8(1), address(outputToken), amountOutMinimum, path);
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, false, swapPayload));

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, symbol, inputAmount
Expand Down Expand Up @@ -496,9 +494,8 @@ contract AxelarHandlerTest is Test {
path[0] = address(inputToken);
path[1] = address(outputToken);

bytes[] memory swaps = new bytes[](1);
swaps[0] = abi.encode(uint8(2), abi.encode(path));
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, minOutput, false, swaps));
bytes memory swapPayload = abi.encode(uint8(2), address(outputToken), minOutput, abi.encode(path));
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, false, swapPayload));

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, symbol, inputAmount
Expand Down Expand Up @@ -535,9 +532,9 @@ contract AxelarHandlerTest is Test {
MockGateway mockGateway = MockGateway(address(gateway));
mockGateway.saveTokenAddress(symbol, address(inputToken));

bytes[] memory swaps = new bytes[](1);
swaps[0] = abi.encode(uint8(3), abi.encode(address(outputToken), uint256(amountOut), uint24(3000), uint160(0)));
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, amountOut, false, swaps));
bytes memory swapPayload =
abi.encode(uint8(3), address(outputToken), amountOut, abi.encode(uint24(3000), uint160(0)));
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, false, swapPayload));

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, symbol, inputAmount
Expand Down Expand Up @@ -574,12 +571,9 @@ contract AxelarHandlerTest is Test {
MockGateway mockGateway = MockGateway(address(gateway));
mockGateway.saveTokenAddress(symbol, address(inputToken));

bytes[] memory swaps = new bytes[](1);
swaps[0] = abi.encode(
uint8(4),
abi.encode(uint256(amountOut), abi.encodePacked(address(outputToken), uint24(500), address(inputToken)))
);
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, amountOut, false, swaps));
bytes memory path = abi.encodePacked(address(outputToken), uint24(500), address(inputToken));
bytes memory swapPayload = abi.encode(uint8(4), address(outputToken), amountOut, path);
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, false, swapPayload));

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, symbol, inputAmount
Expand Down Expand Up @@ -620,9 +614,8 @@ contract AxelarHandlerTest is Test {
path[0] = address(inputToken);
path[1] = address(outputToken);

bytes[] memory swaps = new bytes[](1);
swaps[0] = abi.encode(uint8(5), abi.encode(amountOut, path));
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, amountOut, false, swaps));
bytes memory swapPayload = abi.encode(uint8(5), address(outputToken), amountOut, abi.encode(path));
bytes memory payload = abi.encode(uint8(2), abi.encode(ALICE, false, swapPayload));

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, symbol, inputAmount
Expand All @@ -635,6 +628,26 @@ contract AxelarHandlerTest is Test {
assertEq(inputToken.allowance(address(handler), address(router)), 0, "Router Allowance Remaining After Payment");
}

function test_executeWithToken_custom() public forked {
uint256 inputAmount = 5 ether;
string memory symbol = "WETH";
IERC20Upgradeable inputToken = IERC20Upgradeable(IAxelarGateway(gateway).tokenAddresses(symbol));

deployCodeTo("MockGateway.sol", address(gateway));
MockGateway mockGateway = MockGateway(address(gateway));
mockGateway.saveTokenAddress(symbol, address(inputToken));

deal(address(inputToken), address(this), inputAmount);
inputToken.transfer(address(handler), inputAmount);

bytes memory payload =
hex"000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000ef211076b8d8b46797e09c9a374fb4cdc1df09160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000";

handler.executeWithToken(
keccak256(abi.encodePacked("COMMAND_ID")), "osmosis-7", "mock_address", payload, symbol, inputAmount
);
}

// function test_executeWithToken_swap_refundDust() public {
// uint256 inputAmount = 4.95 ether;
// uint256 dust = 0.05 ether;
Expand Down

0 comments on commit 70c4c12

Please sign in to comment.