Skip to content

Commit c39213e

Browse files
committed
another test
1 parent 8b0e457 commit c39213e

File tree

3 files changed

+214
-153
lines changed

3 files changed

+214
-153
lines changed
Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {IERC1155Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.
1010
import {ConditionalTokens} from "@lay3rlabs/conditional-tokens-contracts/ConditionalTokens.sol";
1111
import {IERC20} from "forge-std/interfaces/IERC20.sol";
1212

13-
abstract contract LMSRGasCostsTests is Test {
13+
abstract contract LMSRMarketMakerGasCostsTests is Test {
1414
ConditionalTokens public conditionalTokens;
1515
LMSRMarketMakerFactory public lmsrMarketMakerFactory;
1616
ERC20Mintable public collateralToken;
@@ -43,23 +43,40 @@ abstract contract LMSRGasCostsTests is Test {
4343
collateralToken.mint(TRADER, TOTAL_COLLATERAL_AVAILABLE);
4444

4545
vm.prank(LMSR_OWNER);
46-
collateralToken.approve(address(lmsrMarketMakerFactory), type(uint256).max);
46+
collateralToken.approve(
47+
address(lmsrMarketMakerFactory),
48+
type(uint256).max
49+
);
4750
}
4851

4952
function testHappyPath() public {
5053
// prepare conditions
5154
bytes32[] memory conditionIds = new bytes32[](numConditions);
5255
for (uint256 i = 0; i < numConditions; i++) {
5356
bytes32 questionId = keccak256(abi.encodePacked("question", i));
54-
conditionalTokens.prepareCondition(ORACLE, questionId, outcomesPerCondition);
55-
conditionIds[i] = conditionalTokens.getConditionId(ORACLE, questionId, outcomesPerCondition);
57+
conditionalTokens.prepareCondition(
58+
ORACLE,
59+
questionId,
60+
outcomesPerCondition
61+
);
62+
conditionIds[i] = conditionalTokens.getConditionId(
63+
ORACLE,
64+
questionId,
65+
outcomesPerCondition
66+
);
5667
}
5768

5869
// create market maker
5970
vm.prank(LMSR_OWNER);
60-
LMSRMarketMaker lmsrMarketMaker = lmsrMarketMakerFactory.createLMSRMarketMaker(
61-
conditionalTokens, IERC20(address(collateralToken)), conditionIds, FEE_FACTOR, whitelist, FUNDING
62-
);
71+
LMSRMarketMaker lmsrMarketMaker = lmsrMarketMakerFactory
72+
.createLMSRMarketMaker(
73+
conditionalTokens,
74+
IERC20(address(collateralToken)),
75+
conditionIds,
76+
FEE_FACTOR,
77+
whitelist,
78+
FUNDING
79+
);
6380

6481
// approve LMSR for trading
6582
vm.prank(TRADER);
@@ -68,7 +85,9 @@ abstract contract LMSRGasCostsTests is Test {
6885
conditionalTokens.setApprovalForAll(address(lmsrMarketMaker), true);
6986

7087
// buy tokens
71-
int256[] memory buyAmounts = new int256[](outcomesPerCondition ** numConditions);
88+
int256[] memory buyAmounts = new int256[](
89+
outcomesPerCondition ** numConditions
90+
);
7291
for (uint256 i = 0; i < outcomesPerCondition ** numConditions; i++) {
7392
buyAmounts[i] = i % 2 != 0 ? int256(0) : int256(1e16);
7493
}
@@ -77,7 +96,9 @@ abstract contract LMSRGasCostsTests is Test {
7796
lmsrMarketMaker.trade(buyAmounts, 0);
7897

7998
// sell tokens
80-
int256[] memory sellAmounts = new int256[](outcomesPerCondition ** numConditions);
99+
int256[] memory sellAmounts = new int256[](
100+
outcomesPerCondition ** numConditions
101+
);
81102
for (uint256 i = 0; i < outcomesPerCondition ** numConditions; i++) {
82103
sellAmounts[i] = i % 2 != 0 ? int256(0) : int256(-5e15);
83104
}
@@ -87,79 +108,79 @@ abstract contract LMSRGasCostsTests is Test {
87108
}
88109
}
89110

90-
contract LMSRGasCostsTests_1_2 is LMSRGasCostsTests {
111+
contract LMSRMarketMakerGasCosts_1_2 is LMSRMarketMakerGasCostsTests {
91112
function setUp() public override {
92113
super.setUp();
93114
numConditions = 1;
94115
outcomesPerCondition = 2;
95116
}
96117
}
97118

98-
contract LMSRGasCostsTests_1_3 is LMSRGasCostsTests {
119+
contract LMSRMarketMakerGasCosts_1_3 is LMSRMarketMakerGasCostsTests {
99120
function setUp() public override {
100121
super.setUp();
101122
numConditions = 1;
102123
outcomesPerCondition = 3;
103124
}
104125
}
105126

106-
contract LMSRGasCostsTests_1_4 is LMSRGasCostsTests {
127+
contract LMSRMarketMakerGasCosts_1_4 is LMSRMarketMakerGasCostsTests {
107128
function setUp() public override {
108129
super.setUp();
109130
numConditions = 1;
110131
outcomesPerCondition = 4;
111132
}
112133
}
113134

114-
contract LMSRGasCostsTests_1_10 is LMSRGasCostsTests {
135+
contract LMSRMarketMakerGasCosts_1_10 is LMSRMarketMakerGasCostsTests {
115136
function setUp() public override {
116137
super.setUp();
117138
numConditions = 1;
118139
outcomesPerCondition = 10;
119140
}
120141
}
121142

122-
contract LMSRGasCostsTests_2_2 is LMSRGasCostsTests {
143+
contract LMSRMarketMakerGasCosts_2_2 is LMSRMarketMakerGasCostsTests {
123144
function setUp() public override {
124145
super.setUp();
125146
numConditions = 2;
126147
outcomesPerCondition = 2;
127148
}
128149
}
129150

130-
contract LMSRGasCostsTests_2_3 is LMSRGasCostsTests {
151+
contract LMSRMarketMakerGasCosts_2_3 is LMSRMarketMakerGasCostsTests {
131152
function setUp() public override {
132153
super.setUp();
133154
numConditions = 2;
134155
outcomesPerCondition = 3;
135156
}
136157
}
137158

138-
contract LMSRGasCostsTests_2_4 is LMSRGasCostsTests {
159+
contract LMSRMarketMakerGasCosts_2_4 is LMSRMarketMakerGasCostsTests {
139160
function setUp() public override {
140161
super.setUp();
141162
numConditions = 2;
142163
outcomesPerCondition = 4;
143164
}
144165
}
145166

146-
contract LMSRGasCostsTests_3_2 is LMSRGasCostsTests {
167+
contract LMSRMarketMakerGasCosts_3_2 is LMSRMarketMakerGasCostsTests {
147168
function setUp() public override {
148169
super.setUp();
149170
numConditions = 3;
150171
outcomesPerCondition = 2;
151172
}
152173
}
153174

154-
contract LMSRGasCostsTests_3_3 is LMSRGasCostsTests {
175+
contract LMSRMarketMakerGasCosts_3_3 is LMSRMarketMakerGasCostsTests {
155176
function setUp() public override {
156177
super.setUp();
157178
numConditions = 3;
158179
outcomesPerCondition = 3;
159180
}
160181
}
161182

162-
contract LMSRGasCostsTests_4_2 is LMSRGasCostsTests {
183+
contract LMSRMarketMakerGasCosts_4_2 is LMSRMarketMakerGasCostsTests {
163184
function setUp() public override {
164185
super.setUp();
165186
numConditions = 4;
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
// SPDX-License-Identifier: LGPL-3.0
2+
pragma solidity ^0.8.22;
3+
4+
import "forge-std/Test.sol";
5+
import {LMSRMarketMakerFactory} from "../contracts/LMSRMarketMakerFactory.sol";
6+
import {LMSRMarketMaker} from "../contracts/LMSRMarketMaker.sol";
7+
import {ERC20Mintable} from "./ERC20Mintable.sol";
8+
import {Whitelist} from "../contracts/Whitelist.sol";
9+
import {IERC1155Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
10+
import {ConditionalTokens} from "@lay3rlabs/conditional-tokens-contracts/ConditionalTokens.sol";
11+
import {IERC20} from "forge-std/interfaces/IERC20.sol";
12+
13+
contract LMSRMarketMakerMultiPositionTests is Test {
14+
ConditionalTokens public conditionalTokens;
15+
LMSRMarketMakerFactory public lmsrMarketMakerFactory;
16+
LMSRMarketMaker public lmsrMarketMaker;
17+
ERC20Mintable public collateralToken;
18+
Whitelist public whitelist;
19+
20+
bytes32 public constant NULL_BYTES32 = bytes32(0);
21+
uint256 public constant FUNDING = 1e17;
22+
23+
address public LMSR_OWNER = vm.addr(1);
24+
address public ORACLE1 = vm.addr(2);
25+
address public ORACLE2 = vm.addr(3);
26+
address public TRADER = vm.addr(4);
27+
28+
bytes32 public questionId1;
29+
bytes32 public questionId2;
30+
bytes32 public conditionId1;
31+
bytes32 public conditionId2;
32+
uint256 public positionId1;
33+
uint256 public positionId2;
34+
uint256 public positionId3;
35+
uint256 public positionId4;
36+
37+
function setUp() public virtual {
38+
conditionalTokens = new ConditionalTokens("");
39+
lmsrMarketMakerFactory = new LMSRMarketMakerFactory();
40+
collateralToken = new ERC20Mintable();
41+
whitelist = new Whitelist(LMSR_OWNER);
42+
43+
address[] memory users = new address[](1);
44+
users[0] = TRADER;
45+
vm.prank(LMSR_OWNER);
46+
whitelist.addToWhitelist(users);
47+
48+
questionId1 = keccak256(abi.encodePacked("question1"));
49+
questionId2 = keccak256(abi.encodePacked("question2"));
50+
51+
conditionalTokens.prepareCondition(ORACLE1, questionId1, 2);
52+
conditionalTokens.prepareCondition(ORACLE2, questionId2, 2);
53+
54+
conditionId1 = conditionalTokens.getConditionId(
55+
ORACLE1,
56+
questionId1,
57+
2
58+
);
59+
conditionId2 = conditionalTokens.getConditionId(
60+
ORACLE2,
61+
questionId2,
62+
2
63+
);
64+
65+
collateralToken.mint(TRADER, FUNDING);
66+
vm.prank(TRADER);
67+
collateralToken.approve(address(lmsrMarketMakerFactory), FUNDING);
68+
69+
bytes32[] memory conditionIds = new bytes32[](2);
70+
conditionIds[0] = conditionId1;
71+
conditionIds[1] = conditionId2;
72+
73+
vm.prank(TRADER);
74+
lmsrMarketMaker = lmsrMarketMakerFactory.createLMSRMarketMaker(
75+
conditionalTokens,
76+
IERC20(address(collateralToken)),
77+
conditionIds,
78+
0,
79+
whitelist,
80+
FUNDING
81+
);
82+
83+
bytes32 c1o1CollectionId = conditionalTokens.getCollectionId(
84+
NULL_BYTES32,
85+
conditionId1,
86+
1
87+
);
88+
bytes32 c1o2CollectionId = conditionalTokens.getCollectionId(
89+
NULL_BYTES32,
90+
conditionId1,
91+
2
92+
);
93+
94+
positionId1 = conditionalTokens.getPositionId(
95+
IERC20(address(collateralToken)),
96+
conditionalTokens.getCollectionId(c1o1CollectionId, conditionId2, 1)
97+
);
98+
positionId2 = conditionalTokens.getPositionId(
99+
IERC20(address(collateralToken)),
100+
conditionalTokens.getCollectionId(c1o2CollectionId, conditionId2, 1)
101+
);
102+
positionId3 = conditionalTokens.getPositionId(
103+
IERC20(address(collateralToken)),
104+
conditionalTokens.getCollectionId(c1o1CollectionId, conditionId2, 2)
105+
);
106+
positionId4 = conditionalTokens.getPositionId(
107+
IERC20(address(collateralToken)),
108+
conditionalTokens.getCollectionId(c1o2CollectionId, conditionId2, 2)
109+
);
110+
}
111+
112+
function testHappyPath() public {
113+
// should have conditions in the system with the listed IDs
114+
assertEq(conditionalTokens.payoutNumerators(conditionId1, 0), 0);
115+
assertEq(conditionalTokens.payoutNumerators(conditionId2, 0), 0);
116+
117+
// should have an LMSR deployed with the correct funding
118+
assertEq(lmsrMarketMaker.funding(), FUNDING);
119+
assertEq(lmsrMarketMaker.atomicOutcomeSlotCount(), 4);
120+
121+
// LMSR should have the correct amount of tokens at the specified positions
122+
assertEq(
123+
conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId1),
124+
FUNDING
125+
);
126+
assertEq(
127+
conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId2),
128+
FUNDING
129+
);
130+
assertEq(
131+
conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId3),
132+
FUNDING
133+
);
134+
assertEq(
135+
conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId4),
136+
FUNDING
137+
);
138+
139+
// users should be able to buy a position
140+
uint256 amount = 1e18;
141+
collateralToken.mint(TRADER, amount);
142+
vm.prank(TRADER);
143+
collateralToken.approve(address(lmsrMarketMaker), amount);
144+
int256[] memory buyAmounts = new int256[](4);
145+
buyAmounts[0] = 1e9;
146+
buyAmounts[1] = 0;
147+
buyAmounts[2] = 1e9;
148+
buyAmounts[3] = 0;
149+
vm.prank(TRADER);
150+
lmsrMarketMaker.trade(buyAmounts, 0);
151+
152+
// should have the correct amount of tokens at the specified positions
153+
assertEq(conditionalTokens.balanceOf(TRADER, positionId1), 1e9);
154+
assertEq(conditionalTokens.balanceOf(TRADER, positionId2), 0);
155+
assertEq(conditionalTokens.balanceOf(TRADER, positionId3), 1e9);
156+
assertEq(conditionalTokens.balanceOf(TRADER, positionId4), 0);
157+
158+
// users should be able to make complex buy/sell orders
159+
vm.prank(TRADER);
160+
conditionalTokens.setApprovalForAll(address(lmsrMarketMaker), true);
161+
buyAmounts[0] = -1e9;
162+
buyAmounts[1] = 0;
163+
buyAmounts[2] = -1e9;
164+
buyAmounts[3] = 0;
165+
vm.prank(TRADER);
166+
lmsrMarketMaker.trade(buyAmounts, 1e18);
167+
168+
// should have the correct amount of tokens at the specified positions
169+
assertEq(conditionalTokens.balanceOf(TRADER, positionId1), 0);
170+
assertEq(conditionalTokens.balanceOf(TRADER, positionId2), 0);
171+
assertEq(conditionalTokens.balanceOf(TRADER, positionId3), 0);
172+
assertEq(conditionalTokens.balanceOf(TRADER, positionId4), 0);
173+
}
174+
}

0 commit comments

Comments
 (0)