packages/contracts-rfq/test/zaps/TokenZapV1.GasBench.t.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {TokenZapV1} from "../../contracts/zaps/TokenZapV1.sol";
import {MockERC20} from "../mocks/MockERC20.sol";
import {SimpleVaultMock} from "../mocks/SimpleVaultMock.sol";
import {Test} from "forge-std/Test.sol";
// solhint-disable func-name-mixedcase, ordering
contract TokenZapV1GasBenchmarkTest is Test {
uint256 internal constant AMOUNT = 0.1337 ether;
SimpleVaultMock internal vault;
TokenZapV1 internal tokenZap;
MockERC20 internal erc20;
address internal user;
address internal nativeGasToken = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
function setUp() public {
tokenZap = new TokenZapV1();
vault = new SimpleVaultMock();
erc20 = new MockERC20("TKN", 18);
user = makeAddr("user");
erc20.mint(address(this), AMOUNT);
deal(address(this), AMOUNT);
// To simulate an average case we assume that the Vault contract has already other deposited funds.
erc20.mint(address(vault), 1000 * AMOUNT);
deal(address(vault), 1000 * AMOUNT);
// We also assume that this is not the first tx through the Zap, so the infinite approval has already been set.
vm.prank(address(tokenZap));
erc20.approve(address(vault), type(uint256).max);
}
function getVaultPayload(address token, uint256 amount) public view returns (bytes memory) {
return abi.encodeCall(vault.deposit, (token, amount, user));
}
function getZapData(bytes memory originalPayload) public view returns (bytes memory) {
// Amount is the second argument of the deposit function.
return tokenZap.encodeZapData(address(vault), originalPayload, 4 + 32, address(0), address(0));
}
function test_deposit_erc20() public {
bytes memory depositPayload = getVaultPayload(address(erc20), AMOUNT);
bytes memory zapData = getZapData(depositPayload);
// Transfer tokens to the zap contract first.
erc20.transfer(address(tokenZap), AMOUNT);
tokenZap.zap(address(erc20), AMOUNT, zapData);
// Check that the vault registered the deposit.
assertEq(vault.balanceOf(user, address(erc20)), AMOUNT);
}
function test_deposit_native() public {
bytes memory depositPayload = getVaultPayload(nativeGasToken, AMOUNT);
bytes memory zapData = getZapData(depositPayload);
tokenZap.zap{value: AMOUNT}(nativeGasToken, AMOUNT, zapData);
// Check that the vault registered the deposit.
assertEq(vault.balanceOf(user, nativeGasToken), AMOUNT);
}
}