Skip to content

Commit 697d6be

Browse files
committed
chore: migrate E2E buyEth tests to Foundry
1 parent 5957d67 commit 697d6be

File tree

2 files changed

+149
-128
lines changed

2 files changed

+149
-128
lines changed

test/e2e/BuyEth.t.sol

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
// SPDX-License-Identifier: LGPL-3.0-or-later
2+
pragma solidity ^0.8;
3+
4+
import {Vm} from "forge-std/Vm.sol";
5+
6+
import {IERC20} from "src/contracts/interfaces/IERC20.sol";
7+
import {GPv2Transfer} from "src/contracts/libraries/GPv2Transfer.sol";
8+
9+
import {
10+
GPv2Interaction,
11+
GPv2Order,
12+
GPv2Signing,
13+
GPv2Trade,
14+
SettlementEncoder
15+
} from "test/libraries/encoders/SettlementEncoder.sol";
16+
import {Registry, TokenRegistry} from "test/libraries/encoders/TokenRegistry.sol";
17+
18+
import {ForkedTest} from "./ForkedTest.t.sol";
19+
20+
interface IUSDT {
21+
function getOwner() external view returns (address);
22+
function issue(uint256) external;
23+
// approve and transfer doesn't return the bool for USDT
24+
function approve(address, uint256) external;
25+
function transfer(address, uint256) external;
26+
}
27+
28+
IUSDT constant USDT = IUSDT(0xdAC17F958D2ee523a2206206994597C13D831ec7);
29+
IERC20 constant WETH = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
30+
31+
using SettlementEncoder for SettlementEncoder.State;
32+
using TokenRegistry for TokenRegistry.State;
33+
using TokenRegistry for Registry;
34+
35+
contract BuyEthTest is ForkedTest {
36+
// Settle a trivial batch between two overlapping trades:
37+
//
38+
// /----(1. SELL 1 WETH for USDT if p(WETH) >= 1100)----\
39+
// | v
40+
// [USDT] [(W)ETH]
41+
// ^ |
42+
// \-----(2. BUY 1 ETH for USDT if p(WETH) <= 1200)-----/
43+
function test_should_unwrap_weth_for_eth_buy_orders() external {
44+
Vm.Wallet memory trader1 = vm.createWallet("trader1");
45+
Vm.Wallet memory trader2 = vm.createWallet("trader2");
46+
47+
// give some weth to trader1
48+
deal(address(WETH), trader1.addr, 1.001 ether);
49+
// approve weth for trading on the vault
50+
vm.prank(trader1.addr);
51+
WETH.approve(vaultRelayer, type(uint256).max);
52+
// place the weth to usdt swap order
53+
encoder.signEncodeTrade(
54+
vm,
55+
trader1,
56+
GPv2Order.Data({
57+
sellToken: WETH,
58+
buyToken: IERC20(address(USDT)),
59+
receiver: trader1.addr,
60+
sellAmount: 1 ether,
61+
buyAmount: 1100e6,
62+
validTo: 0xffffffff,
63+
appData: bytes32(uint256(1)),
64+
feeAmount: 0.001 ether,
65+
kind: GPv2Order.KIND_SELL,
66+
partiallyFillable: false,
67+
sellTokenBalance: GPv2Order.BALANCE_ERC20,
68+
buyTokenBalance: GPv2Order.BALANCE_ERC20
69+
}),
70+
domainSeparator,
71+
GPv2Signing.Scheme.Eip712,
72+
0
73+
);
74+
75+
// give some usdt to trader2
76+
_mintUsdt(trader2.addr, 1201.2e6);
77+
// approve usdt for trading on the vault
78+
vm.startPrank(trader2.addr);
79+
USDT.approve(vaultRelayer, 0);
80+
USDT.approve(vaultRelayer, type(uint256).max);
81+
vm.stopPrank();
82+
// place the usdt to eth swap order
83+
encoder.signEncodeTrade(
84+
vm,
85+
trader2,
86+
GPv2Order.Data({
87+
sellToken: IERC20(address(USDT)),
88+
buyToken: IERC20(GPv2Transfer.BUY_ETH_ADDRESS),
89+
receiver: trader2.addr,
90+
sellAmount: 1200e6,
91+
buyAmount: 1 ether,
92+
validTo: 0xffffffff,
93+
appData: bytes32(uint256(1)),
94+
feeAmount: 1.2e6,
95+
kind: GPv2Order.KIND_BUY,
96+
partiallyFillable: false,
97+
sellTokenBalance: GPv2Order.BALANCE_ERC20,
98+
buyTokenBalance: GPv2Order.BALANCE_ERC20
99+
}),
100+
domainSeparator,
101+
GPv2Signing.Scheme.Eip712,
102+
0
103+
);
104+
105+
// encode the weth withdraw interaction
106+
encoder.addInteraction(
107+
GPv2Interaction.Data({
108+
target: address(WETH),
109+
value: 0,
110+
callData: abi.encodeWithSignature("withdraw(uint256)", 1 ether)
111+
}),
112+
SettlementEncoder.InteractionStage.INTRA
113+
);
114+
115+
// set the token prices
116+
IERC20[] memory tokens = new IERC20[](3);
117+
tokens[0] = WETH;
118+
tokens[1] = IERC20(GPv2Transfer.BUY_ETH_ADDRESS);
119+
tokens[2] = IERC20(address(USDT));
120+
uint256[] memory prices = new uint256[](3);
121+
prices[0] = 1150e6;
122+
prices[1] = 1150e6;
123+
prices[2] = 1 ether;
124+
encoder.tokenRegistry.tokenRegistry().setPrices(tokens, prices);
125+
126+
SettlementEncoder.EncodedSettlement memory encodedSettlement = encoder.encode(settlement);
127+
128+
uint256 trader2InitialBalance = trader2.addr.balance;
129+
vm.prank(solver);
130+
settle(encodedSettlement);
131+
assertEq(
132+
WETH.balanceOf(address(settlement)),
133+
0.001 ether,
134+
"settlement contract's weth balance from trade fee not as expected"
135+
); // the fee
136+
assertEq(WETH.balanceOf(trader1.addr), 0, "trader1 weth balance is not 0");
137+
assertEq(
138+
trader2.addr.balance, trader2InitialBalance + 1 ether, "trader2 eth balance did not increase as expected"
139+
);
140+
}
141+
142+
function _mintUsdt(address receiver, uint256 amt) internal {
143+
address owner = USDT.getOwner();
144+
vm.startPrank(owner);
145+
USDT.issue(amt);
146+
USDT.transfer(receiver, amt);
147+
vm.stopPrank();
148+
}
149+
}

test/e2e/buyEth.test.ts

Lines changed: 0 additions & 128 deletions
This file was deleted.

0 commit comments

Comments
 (0)