- The old way was useful when we just had split swaps. Unfortunately, we now have split, sequential, and single swaps, which don't always require token indices or split percentages, so we need to decode differently for each case.
87 lines
2.9 KiB
Solidity
87 lines
2.9 KiB
Solidity
// SPDX-License-Identifier: BUSL-1.1
|
|
pragma solidity ^0.8.26;
|
|
|
|
import "forge-std/Test.sol";
|
|
import "../lib/LibSwap.sol";
|
|
|
|
contract LibSwapTest is Test {
|
|
using LibSwap for bytes;
|
|
|
|
function testSingleSwap() public view {
|
|
address executor = 0x1234567890123456789012345678901234567890;
|
|
bytes memory protocolData = abi.encodePacked(uint256(123));
|
|
|
|
bytes memory swap = abi.encodePacked(executor, protocolData);
|
|
this.assertSingleSwap(swap, executor, protocolData);
|
|
}
|
|
|
|
function assertSingleSwap(
|
|
bytes calldata swap,
|
|
address executor,
|
|
bytes calldata protocolData
|
|
) public pure {
|
|
(address decodedExecutor, bytes memory decodedProtocolData) =
|
|
swap.decodeSingleSwap();
|
|
assertEq(decodedExecutor, executor);
|
|
assertEq(decodedProtocolData, protocolData);
|
|
}
|
|
|
|
function testSequentialSwap() public view {
|
|
address executor = 0x1234567890123456789012345678901234567890;
|
|
bytes memory protocolData = abi.encodePacked(uint256(234));
|
|
|
|
bytes memory swap = abi.encodePacked(executor, protocolData);
|
|
this.assertSequentialSwap(swap, executor, protocolData);
|
|
}
|
|
|
|
function assertSequentialSwap(
|
|
bytes calldata swap,
|
|
address executor,
|
|
bytes calldata protocolData
|
|
) public pure {
|
|
(address decodedExecutor, bytes memory decodedProtocolData) =
|
|
swap.decodeSequentialSwap();
|
|
assertEq(decodedExecutor, executor);
|
|
assertEq(decodedProtocolData, protocolData);
|
|
}
|
|
|
|
function testSplitSwap() public view {
|
|
uint8 tokenInIndex = 1;
|
|
uint8 tokenOutIndex = 2;
|
|
uint24 split = 3;
|
|
address executor = 0x1234567890123456789012345678901234567890;
|
|
bytes memory protocolData = abi.encodePacked(uint256(456));
|
|
|
|
bytes memory swap = abi.encodePacked(
|
|
tokenInIndex, tokenOutIndex, split, executor, protocolData
|
|
);
|
|
this.assertSplitSwap(
|
|
swap, tokenInIndex, tokenOutIndex, split, executor, protocolData
|
|
);
|
|
}
|
|
|
|
// This is necessary so that the compiler accepts bytes as a LibSwap.sol for testing
|
|
// This is because this function takes calldata as input
|
|
function assertSplitSwap(
|
|
bytes calldata swap,
|
|
uint8 tokenInIndex,
|
|
uint8 tokenOutIndex,
|
|
uint24 split,
|
|
address executor,
|
|
bytes calldata protocolData
|
|
) public pure {
|
|
(
|
|
uint8 decodedTokenInIndex,
|
|
uint8 decodedTokenOutIndex,
|
|
uint24 decodedSplit,
|
|
address decodedExecutor,
|
|
bytes memory decodedProtocolData
|
|
) = swap.decodeSplitSwap();
|
|
assertEq(decodedTokenInIndex, tokenInIndex);
|
|
assertEq(decodedTokenOutIndex, tokenOutIndex);
|
|
assertEq(decodedSplit, split);
|
|
assertEq(decodedExecutor, executor);
|
|
assertEq(decodedProtocolData, protocolData);
|
|
}
|
|
}
|