Skip to content

Commit 3cd52d9

Browse files
committed
another test
1 parent 8b0e457 commit 3cd52d9

File tree

3 files changed

+148
-145
lines changed

3 files changed

+148
-145
lines changed
Lines changed: 11 additions & 11 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;
@@ -87,79 +87,79 @@ abstract contract LMSRGasCostsTests is Test {
8787
}
8888
}
8989

90-
contract LMSRGasCostsTests_1_2 is LMSRGasCostsTests {
90+
contract LMSRMarketMakerGasCosts_1_2 is LMSRMarketMakerGasCostsTests {
9191
function setUp() public override {
9292
super.setUp();
9393
numConditions = 1;
9494
outcomesPerCondition = 2;
9595
}
9696
}
9797

98-
contract LMSRGasCostsTests_1_3 is LMSRGasCostsTests {
98+
contract LMSRMarketMakerGasCosts_1_3 is LMSRMarketMakerGasCostsTests {
9999
function setUp() public override {
100100
super.setUp();
101101
numConditions = 1;
102102
outcomesPerCondition = 3;
103103
}
104104
}
105105

106-
contract LMSRGasCostsTests_1_4 is LMSRGasCostsTests {
106+
contract LMSRMarketMakerGasCosts_1_4 is LMSRMarketMakerGasCostsTests {
107107
function setUp() public override {
108108
super.setUp();
109109
numConditions = 1;
110110
outcomesPerCondition = 4;
111111
}
112112
}
113113

114-
contract LMSRGasCostsTests_1_10 is LMSRGasCostsTests {
114+
contract LMSRMarketMakerGasCosts_1_10 is LMSRMarketMakerGasCostsTests {
115115
function setUp() public override {
116116
super.setUp();
117117
numConditions = 1;
118118
outcomesPerCondition = 10;
119119
}
120120
}
121121

122-
contract LMSRGasCostsTests_2_2 is LMSRGasCostsTests {
122+
contract LMSRMarketMakerGasCosts_2_2 is LMSRMarketMakerGasCostsTests {
123123
function setUp() public override {
124124
super.setUp();
125125
numConditions = 2;
126126
outcomesPerCondition = 2;
127127
}
128128
}
129129

130-
contract LMSRGasCostsTests_2_3 is LMSRGasCostsTests {
130+
contract LMSRMarketMakerGasCosts_2_3 is LMSRMarketMakerGasCostsTests {
131131
function setUp() public override {
132132
super.setUp();
133133
numConditions = 2;
134134
outcomesPerCondition = 3;
135135
}
136136
}
137137

138-
contract LMSRGasCostsTests_2_4 is LMSRGasCostsTests {
138+
contract LMSRMarketMakerGasCosts_2_4 is LMSRMarketMakerGasCostsTests {
139139
function setUp() public override {
140140
super.setUp();
141141
numConditions = 2;
142142
outcomesPerCondition = 4;
143143
}
144144
}
145145

146-
contract LMSRGasCostsTests_3_2 is LMSRGasCostsTests {
146+
contract LMSRMarketMakerGasCosts_3_2 is LMSRMarketMakerGasCostsTests {
147147
function setUp() public override {
148148
super.setUp();
149149
numConditions = 3;
150150
outcomesPerCondition = 2;
151151
}
152152
}
153153

154-
contract LMSRGasCostsTests_3_3 is LMSRGasCostsTests {
154+
contract LMSRMarketMakerGasCosts_3_3 is LMSRMarketMakerGasCostsTests {
155155
function setUp() public override {
156156
super.setUp();
157157
numConditions = 3;
158158
outcomesPerCondition = 3;
159159
}
160160
}
161161

162-
contract LMSRGasCostsTests_4_2 is LMSRGasCostsTests {
162+
contract LMSRMarketMakerGasCosts_4_2 is LMSRMarketMakerGasCostsTests {
163163
function setUp() public override {
164164
super.setUp();
165165
numConditions = 4;
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
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(ORACLE1, questionId1, 2);
55+
conditionId2 = conditionalTokens.getConditionId(ORACLE2, questionId2, 2);
56+
57+
collateralToken.mint(TRADER, FUNDING);
58+
vm.prank(TRADER);
59+
collateralToken.approve(address(lmsrMarketMakerFactory), FUNDING);
60+
61+
bytes32[] memory conditionIds = new bytes32[](2);
62+
conditionIds[0] = conditionId1;
63+
conditionIds[1] = conditionId2;
64+
65+
vm.prank(TRADER);
66+
lmsrMarketMaker = lmsrMarketMakerFactory.createLMSRMarketMaker(
67+
conditionalTokens, IERC20(address(collateralToken)), conditionIds, 0, whitelist, FUNDING
68+
);
69+
70+
bytes32 c1o1CollectionId = conditionalTokens.getCollectionId(NULL_BYTES32, conditionId1, 1);
71+
bytes32 c1o2CollectionId = conditionalTokens.getCollectionId(NULL_BYTES32, conditionId1, 2);
72+
73+
positionId1 = conditionalTokens.getPositionId(
74+
IERC20(address(collateralToken)), conditionalTokens.getCollectionId(c1o1CollectionId, conditionId2, 1)
75+
);
76+
positionId2 = conditionalTokens.getPositionId(
77+
IERC20(address(collateralToken)), conditionalTokens.getCollectionId(c1o2CollectionId, conditionId2, 1)
78+
);
79+
positionId3 = conditionalTokens.getPositionId(
80+
IERC20(address(collateralToken)), conditionalTokens.getCollectionId(c1o1CollectionId, conditionId2, 2)
81+
);
82+
positionId4 = conditionalTokens.getPositionId(
83+
IERC20(address(collateralToken)), conditionalTokens.getCollectionId(c1o2CollectionId, conditionId2, 2)
84+
);
85+
}
86+
87+
function testHappyPath() public {
88+
// should have conditions in the system with the listed IDs
89+
assertEq(conditionalTokens.payoutNumerators(conditionId1, 0), 0);
90+
assertEq(conditionalTokens.payoutNumerators(conditionId2, 0), 0);
91+
92+
// should have an LMSR deployed with the correct funding
93+
assertEq(lmsrMarketMaker.funding(), FUNDING);
94+
assertEq(lmsrMarketMaker.atomicOutcomeSlotCount(), 4);
95+
96+
// LMSR should have the correct amount of tokens at the specified positions
97+
assertEq(conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId1), FUNDING);
98+
assertEq(conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId2), FUNDING);
99+
assertEq(conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId3), FUNDING);
100+
assertEq(conditionalTokens.balanceOf(address(lmsrMarketMaker), positionId4), FUNDING);
101+
102+
// users should be able to buy a position
103+
uint256 amount = 1e18;
104+
collateralToken.mint(TRADER, amount);
105+
vm.prank(TRADER);
106+
collateralToken.approve(address(lmsrMarketMaker), amount);
107+
int256[] memory buyAmounts = new int256[](4);
108+
buyAmounts[0] = 1e9;
109+
buyAmounts[1] = 0;
110+
buyAmounts[2] = 1e9;
111+
buyAmounts[3] = 0;
112+
vm.prank(TRADER);
113+
lmsrMarketMaker.trade(buyAmounts, 0);
114+
115+
// should have the correct amount of tokens at the specified positions
116+
assertEq(conditionalTokens.balanceOf(TRADER, positionId1), 1e9);
117+
assertEq(conditionalTokens.balanceOf(TRADER, positionId2), 0);
118+
assertEq(conditionalTokens.balanceOf(TRADER, positionId3), 1e9);
119+
assertEq(conditionalTokens.balanceOf(TRADER, positionId4), 0);
120+
121+
// users should be able to make complex buy/sell orders
122+
vm.prank(TRADER);
123+
conditionalTokens.setApprovalForAll(address(lmsrMarketMaker), true);
124+
buyAmounts[0] = -1e9;
125+
buyAmounts[1] = 0;
126+
buyAmounts[2] = -1e9;
127+
buyAmounts[3] = 0;
128+
vm.prank(TRADER);
129+
lmsrMarketMaker.trade(buyAmounts, 1e18);
130+
131+
// should have the correct amount of tokens at the specified positions
132+
assertEq(conditionalTokens.balanceOf(TRADER, positionId1), 0);
133+
assertEq(conditionalTokens.balanceOf(TRADER, positionId2), 0);
134+
assertEq(conditionalTokens.balanceOf(TRADER, positionId3), 0);
135+
assertEq(conditionalTokens.balanceOf(TRADER, positionId4), 0);
136+
}
137+
}

test/test_multi_condition.js

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

0 commit comments

Comments
 (0)