Skip to content

Commit 80b54f7

Browse files
authored
Merge pull request #510 from AugurProject/universe_validation
Store valid universes and use to validate trading contracts and logs. Genesis universe creation from `Augur`
2 parents 6c4941b + 60e0998 commit 80b54f7

16 files changed

+192
-37
lines changed

source/contracts/Augur.sol

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pragma solidity 0.4.18;
22

33
import 'Controlled.sol';
44
import 'libraries/token/ERC20.sol';
5+
import 'factories/UniverseFactory.sol';
56
import 'reporting/IUniverse.sol';
67
import 'reporting/IMarket.sol';
78
import 'reporting/IFeeWindow.sol';
@@ -34,6 +35,33 @@ contract Augur is Controlled, Extractable {
3435
event TokensBurned(address indexed universe, address indexed token, address indexed target, uint256 amount);
3536
event FeeWindowCreated(address indexed universe, address feeWindow, uint256 startTime, uint256 endTime, uint256 id);
3637

38+
mapping(address => bool) private universes;
39+
40+
//
41+
// Universe
42+
//
43+
44+
function createGenesisUniverse() public returns (IUniverse) {
45+
return createUniverse(IUniverse(0), bytes32(0));
46+
}
47+
48+
function createChildUniverse(bytes32 _parentPayoutDistributionHash) public returns (IUniverse) {
49+
IUniverse _parentUniverse = IUniverse(msg.sender);
50+
require(isKnownUniverse(_parentUniverse));
51+
return createUniverse(_parentUniverse, _parentPayoutDistributionHash);
52+
}
53+
54+
function createUniverse(IUniverse _parentUniverse, bytes32 _parentPayoutDistributionHash) private returns (IUniverse) {
55+
UniverseFactory _universeFactory = UniverseFactory(controller.lookup("UniverseFactory"));
56+
IUniverse _newUniverse = _universeFactory.createUniverse(controller, _parentUniverse, _parentPayoutDistributionHash);
57+
universes[_newUniverse] = true;
58+
return _newUniverse;
59+
}
60+
61+
function isKnownUniverse(IUniverse _universe) public view returns (bool) {
62+
return universes[_universe];
63+
}
64+
3765
//
3866
// Transfer
3967
//
@@ -50,49 +78,57 @@ contract Augur is Controlled, Extractable {
5078

5179
// This signature is intended for the categorical market creation. We use two signatures for the same event because of stack depth issues which can be circumvented by maintaining order of paramaters
5280
function logMarketCreated(bytes32 _topic, string _description, string _extraInfo, IUniverse _universe, address _market, address _marketCreator, bytes32[] _outcomes, int256 _minPrice, int256 _maxPrice, IMarket.MarketType _marketType) public returns (bool) {
81+
require(isKnownUniverse(_universe));
5382
require(_universe == IUniverse(msg.sender));
5483
MarketCreated(_topic, _description, _extraInfo, _universe, _market, _marketCreator, _outcomes, _universe.getOrCacheMarketCreationCost(), _minPrice, _maxPrice, _marketType);
5584
return true;
5685
}
5786

5887
// This signature is intended for binary and scalar market creation. See function comment above for explanation.
5988
function logMarketCreated(bytes32 _topic, string _description, string _extraInfo, IUniverse _universe, address _market, address _marketCreator, int256 _minPrice, int256 _maxPrice, IMarket.MarketType _marketType) public returns (bool) {
89+
require(isKnownUniverse(_universe));
6090
require(_universe == IUniverse(msg.sender));
6191
MarketCreated(_topic, _description, _extraInfo, _universe, _market, _marketCreator, new bytes32[](0), _universe.getOrCacheMarketCreationCost(), _minPrice, _maxPrice, _marketType);
6292
return true;
6393
}
6494

6595
function logInitialReportSubmitted(IUniverse _universe, address _reporter, address _market, uint256 _amountStaked, bool _isDesignatedReporter, uint256[] _payoutNumerators) public returns (bool) {
96+
require(isKnownUniverse(_universe));
6697
require(_universe.isContainerForMarket(IMarket(msg.sender)));
6798
InitialReportSubmitted(_universe, _reporter, _market, _amountStaked, _isDesignatedReporter, _payoutNumerators);
6899
return true;
69100
}
70101

71102
function logDisputeCrowdsourcerCreated(IUniverse _universe, address _market, address _disputeCrowdsourcer, uint256[] _payoutNumerators, uint256 _size) public returns (bool) {
103+
require(isKnownUniverse(_universe));
72104
require(_universe.isContainerForMarket(IMarket(msg.sender)));
73105
DisputeCrowdsourcerCreated(_universe, _market, _disputeCrowdsourcer, _payoutNumerators, _size);
74106
return true;
75107
}
76108

77109
function logDisputeCrowdsourcerContribution(IUniverse _universe, address _reporter, address _market, address _disputeCrowdsourcer, uint256 _amountStaked) public returns (bool) {
110+
require(isKnownUniverse(_universe));
78111
require(_universe.isContainerForMarket(IMarket(msg.sender)));
79112
DisputeCrowdsourcerContribution(_universe, _reporter, _market, _disputeCrowdsourcer, _amountStaked);
80113
return true;
81114
}
82115

83116
function logDisputeCrowdsourcerCompleted(IUniverse _universe, address _market, address _disputeCrowdsourcer) public returns (bool) {
117+
require(isKnownUniverse(_universe));
84118
require(_universe.isContainerForMarket(IMarket(msg.sender)));
85119
DisputeCrowdsourcerCompleted(_universe, _market, _disputeCrowdsourcer);
86120
return true;
87121
}
88122

89123
function logWinningTokensRedeemed(IUniverse _universe, address _reporter, address _market, address _reportingParticipant, uint256 _amountRedeemed, uint256 _reportingFeesReceived, uint256[] _payoutNumerators) public returns (bool) {
124+
require(isKnownUniverse(_universe));
90125
require(_universe.isContainerForReportingParticipant(IReportingParticipant(msg.sender)));
91126
WinningsRedeemed(_universe, _reporter, _market, _reportingParticipant, _amountRedeemed, _reportingFeesReceived, _payoutNumerators);
92127
return true;
93128
}
94129

95130
function logMarketFinalized(IUniverse _universe, address _market) public returns (bool) {
131+
require(isKnownUniverse(_universe));
96132
require(_universe.isContainerForMarket(IMarket(msg.sender)));
97133
MarketFinalized(_universe, _market);
98134
return true;
@@ -119,107 +155,125 @@ contract Augur is Controlled, Extractable {
119155
}
120156

121157
function logUniverseForked() public returns (bool) {
158+
require(universes[msg.sender]);
122159
UniverseForked(msg.sender);
123160
return true;
124161
}
125162

126163
function logUniverseCreated(IUniverse _childUniverse) public returns (bool) {
164+
require(universes[msg.sender]);
127165
IUniverse _parentUniverse = IUniverse(msg.sender);
128166
require(_parentUniverse.isParentOf(_childUniverse));
129167
UniverseCreated(_parentUniverse, _childUniverse);
130168
return true;
131169
}
132170

133171
function logFeeWindowTransferred(IUniverse _universe, address _from, address _to, uint256 _value) public returns (bool) {
172+
require(isKnownUniverse(_universe));
134173
require(_universe.isContainerForFeeWindow(IFeeWindow(msg.sender)));
135174
TokensTransferred(_universe, msg.sender, _from, _to, _value);
136175
return true;
137176
}
138177

139178
function logReputationTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value) public returns (bool) {
179+
require(isKnownUniverse(_universe));
140180
require(_universe.getReputationToken() == IReputationToken(msg.sender));
141181
TokensTransferred(_universe, msg.sender, _from, _to, _value);
142182
return true;
143183
}
144184

145185
function logDisputeCrowdsourcerTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value) public returns (bool) {
186+
require(isKnownUniverse(_universe));
146187
require(_universe.isContainerForReportingParticipant(IReportingParticipant(msg.sender)));
147188
TokensTransferred(_universe, msg.sender, _from, _to, _value);
148189
return true;
149190
}
150191

151192
function logShareTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value) public returns (bool) {
193+
require(isKnownUniverse(_universe));
152194
require(_universe.isContainerForShareToken(IShareToken(msg.sender)));
153195
TokensTransferred(_universe, msg.sender, _from, _to, _value);
154196
return true;
155197
}
156198

157199
function logReputationTokenBurned(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
200+
require(isKnownUniverse(_universe));
158201
require(_universe.getReputationToken() == IReputationToken(msg.sender));
159202
TokensBurned(_universe, msg.sender, _target, _amount);
160203
return true;
161204
}
162205

163206
function logReputationTokenMinted(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
207+
require(isKnownUniverse(_universe));
164208
require(_universe.getReputationToken() == IReputationToken(msg.sender));
165209
TokensMinted(_universe, msg.sender, _target, _amount);
166210
return true;
167211
}
168212

169213
function logShareTokenBurned(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
214+
require(isKnownUniverse(_universe));
170215
require(_universe.isContainerForShareToken(IShareToken(msg.sender)));
171216
TokensBurned(_universe, msg.sender, _target, _amount);
172217
return true;
173218
}
174219

175220
function logShareTokenMinted(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
221+
require(isKnownUniverse(_universe));
176222
require(_universe.isContainerForShareToken(IShareToken(msg.sender)));
177223
TokensMinted(_universe, msg.sender, _target, _amount);
178224
return true;
179225
}
180226

181227
function logFeeWindowBurned(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
228+
require(isKnownUniverse(_universe));
182229
require(_universe.isContainerForFeeWindow(IFeeWindow(msg.sender)));
183230
TokensBurned(_universe, msg.sender, _target, _amount);
184231
return true;
185232
}
186233

187234
function logFeeWindowMinted(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
235+
require(isKnownUniverse(_universe));
188236
require(_universe.isContainerForFeeWindow(IFeeWindow(msg.sender)));
189237
TokensMinted(_universe, msg.sender, _target, _amount);
190238
return true;
191239
}
192240

193241
function logDisputeCrowdsourcerTokensBurned(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
242+
require(isKnownUniverse(_universe));
194243
require(_universe.isContainerForReportingParticipant(IReportingParticipant(msg.sender)));
195244
TokensBurned(_universe, msg.sender, _target, _amount);
196245
return true;
197246
}
198247

199248
function logDisputeCrowdsourcerTokensMinted(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
249+
require(isKnownUniverse(_universe));
200250
require(_universe.isContainerForReportingParticipant(IReportingParticipant(msg.sender)));
201251
TokensMinted(_universe, msg.sender, _target, _amount);
202252
return true;
203253
}
204254

205255
function logFeeWindowCreated(IFeeWindow _feeWindow, uint256 _id) public returns (bool) {
256+
require(universes[msg.sender]);
206257
FeeWindowCreated(msg.sender, _feeWindow, _feeWindow.getStartTime(), _feeWindow.getEndTime(), _id);
207258
return true;
208259
}
209260

210261
function logFeeTokenTransferred(IUniverse _universe, address _from, address _to, uint256 _value) public returns (bool) {
262+
require(isKnownUniverse(_universe));
211263
require(_universe.isContainerForFeeToken(IFeeToken(msg.sender)));
212264
TokensTransferred(_universe, msg.sender, _from, _to, _value);
213265
return true;
214266
}
215267

216268
function logFeeTokenBurned(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
269+
require(isKnownUniverse(_universe));
217270
require(_universe.isContainerForFeeToken(IFeeToken(msg.sender)));
218271
TokensBurned(_universe, msg.sender, _target, _amount);
219272
return true;
220273
}
221274

222275
function logFeeTokenMinted(IUniverse _universe, address _target, uint256 _amount) public returns (bool) {
276+
require(isKnownUniverse(_universe));
223277
require(_universe.isContainerForFeeToken(IFeeToken(msg.sender)));
224278
TokensMinted(_universe, msg.sender, _target, _amount);
225279
return true;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
pragma solidity 0.4.18;
2+
3+
import 'reporting/IMarket.sol';
4+
import 'Controlled.sol';
5+
6+
7+
contract MarketValidator is Controlled {
8+
modifier marketIsLegit(IMarket _market) {
9+
IUniverse _universe = _market.getUniverse();
10+
require(controller.getAugur().isKnownUniverse(_universe));
11+
require(_universe.isContainerForMarket(_market));
12+
_;
13+
}
14+
}

source/contracts/reporting/Universe.sol

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'libraries/Initializable.sol';
88
import 'factories/ReputationTokenFactory.sol';
99
import 'factories/FeeWindowFactory.sol';
1010
import 'factories/MarketFactory.sol';
11-
import 'factories/UniverseFactory.sol';
1211
import 'reporting/IMarket.sol';
1312
import 'reporting/IReputationToken.sol';
1413
import 'reporting/IFeeWindow.sol';
@@ -171,7 +170,7 @@ contract Universe is DelegationTarget, Extractable, ITyped, Initializable, IUniv
171170
require(_reportingParticipant.getMarket() == forkingMarket);
172171
IUniverse _childUniverse = getChildUniverse(_parentPayoutDistributionHash);
173172
if (_childUniverse == IUniverse(0)) {
174-
_childUniverse = UniverseFactory(controller.lookup("UniverseFactory")).createUniverse(controller, this, _parentPayoutDistributionHash);
173+
_childUniverse = controller.getAugur().createChildUniverse(_parentPayoutDistributionHash);
175174
childUniverses.push(_childUniverse);
176175
controller.getAugur().logUniverseCreated(_childUniverse);
177176
}

source/contracts/trading/CancelOrder.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'trading/ICancelOrder.sol';
99
import 'Controlled.sol';
1010
import 'libraries/ReentrancyGuard.sol';
1111
import 'libraries/CashAutoConverter.sol';
12+
import 'libraries/MarketValidator.sol';
1213
import 'trading/Order.sol';
1314
import 'reporting/IMarket.sol';
1415
import 'trading/ICash.sol';
@@ -21,7 +22,7 @@ import 'libraries/Extractable.sol';
2122
* @title CancelOrder
2223
* @dev This allows you to cancel orders on the book.
2324
*/
24-
contract CancelOrder is CashAutoConverter, Extractable, ReentrancyGuard, ICancelOrder {
25+
contract CancelOrder is CashAutoConverter, Extractable, ReentrancyGuard, MarketValidator, ICancelOrder {
2526
/**
2627
* @dev Cancellation: cancels an order, if a bid refunds money, if an ask returns shares
2728
* @return true if successful; throw on failure

source/contracts/trading/ClaimTradingProceeds.sol

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'trading/IClaimTradingProceeds.sol';
55
import 'Controlled.sol';
66
import 'libraries/ReentrancyGuard.sol';
77
import 'libraries/CashAutoConverter.sol';
8+
import 'libraries/MarketValidator.sol';
89
import 'reporting/IMarket.sol';
910
import 'trading/ICash.sol';
1011
import 'libraries/math/SafeMathUint256.sol';
@@ -18,10 +19,10 @@ import 'libraries/Extractable.sol';
1819
* @title ClaimTradingProceeds
1920
* @dev This allows users to claim their money from a market by exchanging their shares
2021
*/
21-
contract ClaimTradingProceeds is CashAutoConverter, Extractable, ReentrancyGuard, IClaimTradingProceeds {
22+
contract ClaimTradingProceeds is CashAutoConverter, Extractable, ReentrancyGuard, MarketValidator, IClaimTradingProceeds {
2223
using SafeMathUint256 for uint256;
2324

24-
function claimTradingProceeds(IMarket _market) convertToAndFromCash onlyInGoodTimes nonReentrant external returns(bool) {
25+
function claimTradingProceeds(IMarket _market) marketIsLegit(_market) convertToAndFromCash onlyInGoodTimes nonReentrant external returns(bool) {
2526
if (!_market.isFinalized()) {
2627
_market.finalize();
2728
}

source/contracts/trading/CompleteSets.sol

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'Augur.sol';
66
import 'Controlled.sol';
77
import 'libraries/ReentrancyGuard.sol';
88
import 'libraries/math/SafeMathUint256.sol';
9+
import 'libraries/MarketValidator.sol';
910
import 'trading/ICash.sol';
1011
import 'reporting/IMarket.sol';
1112
import 'reporting/IFeeWindow.sol';
@@ -14,13 +15,13 @@ import 'libraries/CashAutoConverter.sol';
1415
import 'libraries/Extractable.sol';
1516

1617

17-
contract CompleteSets is Controlled, Extractable, CashAutoConverter, ReentrancyGuard, ICompleteSets {
18+
contract CompleteSets is Controlled, Extractable, CashAutoConverter, ReentrancyGuard, MarketValidator, ICompleteSets {
1819
using SafeMathUint256 for uint256;
1920

2021
/**
2122
* Buys `_amount` shares of every outcome in the specified market.
2223
**/
23-
function publicBuyCompleteSets(IMarket _market, uint256 _amount) external payable convertToAndFromCash onlyInGoodTimes nonReentrant returns (bool) {
24+
function publicBuyCompleteSets(IMarket _market, uint256 _amount) external marketIsLegit(_market) payable convertToAndFromCash onlyInGoodTimes nonReentrant returns (bool) {
2425
return this.buyCompleteSets(msg.sender, _market, _amount);
2526
}
2627

@@ -42,7 +43,7 @@ contract CompleteSets is Controlled, Extractable, CashAutoConverter, ReentrancyG
4243
return true;
4344
}
4445

45-
function publicSellCompleteSets(IMarket _market, uint256 _amount) external convertToAndFromCash onlyInGoodTimes nonReentrant returns (bool) {
46+
function publicSellCompleteSets(IMarket _market, uint256 _amount) external marketIsLegit(_market) convertToAndFromCash onlyInGoodTimes nonReentrant returns (bool) {
4647
this.sellCompleteSets(msg.sender, _market, _amount);
4748
return true;
4849
}

source/contracts/trading/CreateOrder.sol

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@ pragma solidity 0.4.18;
55

66
import 'Controlled.sol';
77
import 'libraries/ReentrancyGuard.sol';
8+
import 'libraries/MarketValidator.sol';
89
import 'trading/Order.sol';
910
import 'trading/ICreateOrder.sol';
1011
import 'libraries/CashAutoConverter.sol';
1112
import 'libraries/Extractable.sol';
1213

1314

14-
contract CreateOrder is CashAutoConverter, Extractable, ReentrancyGuard {
15+
contract CreateOrder is CashAutoConverter, Extractable, ReentrancyGuard, MarketValidator {
1516
using Order for Order.Data;
1617

1718
// CONSIDER: Do we want the API to be in terms of shares as it is now, or would the desired amount of ETH to place be preferable? Would both be useful?
18-
function publicCreateOrder(Order.Types _type, uint256 _attoshares, uint256 _displayPrice, IMarket _market, uint8 _outcome, bytes32 _betterOrderId, bytes32 _worseOrderId, bytes32 _tradeGroupId) external payable convertToAndFromCash onlyInGoodTimes nonReentrant returns (bytes32) {
19+
function publicCreateOrder(Order.Types _type, uint256 _attoshares, uint256 _displayPrice, IMarket _market, uint8 _outcome, bytes32 _betterOrderId, bytes32 _worseOrderId, bytes32 _tradeGroupId) external payable marketIsLegit(_market) convertToAndFromCash onlyInGoodTimes nonReentrant returns (bytes32) {
1920
return this.createOrder(msg.sender, _type, _attoshares, _displayPrice, _market, _outcome, _betterOrderId, _worseOrderId, _tradeGroupId);
2021
}
2122

source/contracts/trading/Order.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ library Order {
5353
// Constructor
5454
//
5555

56+
// No validation is needed here as it is simply a librarty function for organizing data
5657
function create(IController _controller, address _creator, uint8 _outcome, Order.Types _type, uint256 _attoshares, uint256 _price, IMarket _market, bytes32 _betterOrderId, bytes32 _worseOrderId) internal view returns (Data) {
5758
require(_outcome < _market.getNumberOfOutcomes());
5859
require(_price < _market.getNumTicks());

0 commit comments

Comments
 (0)