/
Deployer.sol
173 lines (152 loc) · 5.45 KB
/
Deployer.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// SPDX-License-Identifier: BlueOak-1.0.0
pragma solidity 0.8.19;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "../plugins/assets/Asset.sol";
import "../plugins/assets/RTokenAsset.sol";
import "../plugins/trading/DutchTrade.sol";
import "../plugins/trading/GnosisTrade.sol";
import "./AssetRegistry.sol";
import "./BackingManager.sol";
import "./BasketHandler.sol";
import "./Broker.sol";
import "./Distributor.sol";
import "./Furnace.sol";
import "./Main.sol";
import "./RevenueTrader.sol";
import "./RToken.sol";
import "./StRSR.sol";
import "../interfaces/IAsset.sol";
import "../interfaces/IDeployer.sol";
import "../interfaces/IMain.sol";
import "../libraries/String.sol";
import "../mixins/Versioned.sol";
/**
* @title DeployerP0
* @notice The factory contract that deploys the entire P0 system.
*/
contract DeployerP0 is IDeployer, Versioned {
string public constant ENS = "reserveprotocol.eth";
IERC20Metadata public immutable rsr;
IGnosis public immutable gnosis;
IAsset public immutable rsrAsset;
constructor(
IERC20Metadata rsr_,
IGnosis gnosis_,
IAsset rsrAsset_
) {
require(
address(rsr_) != address(0) &&
address(gnosis_) != address(0) &&
address(rsrAsset_) != address(0),
"invalid address"
);
rsr = rsr_;
gnosis = gnosis_;
rsrAsset = rsrAsset_;
}
/// Deploys an instance of the entire system
/// @param name The name of the RToken to deploy
/// @param symbol The symbol of the RToken to deploy
/// @param mandate An IPFS link or direct string; describes what the RToken _should be_
/// @param owner The address that should own the entire system, hopefully a governance contract
/// @param params Deployment params
/// @return The address of the newly deployed RToken.
function deploy(
string memory name,
string memory symbol,
string calldata mandate,
address owner,
DeploymentParams memory params
) external returns (address) {
require(owner != address(0) && owner != address(this), "invalid owner");
MainP0 main = new MainP0();
// Components
IRToken rToken = new RTokenP0();
Components memory components = Components({
stRSR: new StRSRP0(),
rToken: rToken,
assetRegistry: new AssetRegistryP0(),
basketHandler: new BasketHandlerP0(),
backingManager: new BackingManagerP0(),
distributor: new DistributorP0(),
rsrTrader: new RevenueTraderP0(),
rTokenTrader: new RevenueTraderP0(),
furnace: new FurnaceP0(),
broker: new BrokerP0()
});
// Init Main
main.init(components, rsr, params.shortFreeze, params.longFreeze);
// Init Backing Manager
main.backingManager().init(
main,
params.tradingDelay,
params.backingBuffer,
params.maxTradeSlippage,
params.minTradeVolume
);
// Init Basket Handler
main.basketHandler().init(main, params.warmupPeriod, params.reweightable);
// Init Revenue Traders
main.rsrTrader().init(main, rsr, params.maxTradeSlippage, params.minTradeVolume);
main.rTokenTrader().init(
main,
IERC20(address(rToken)),
params.maxTradeSlippage,
params.minTradeVolume
);
// Init Distributor
main.distributor().init(main, params.dist);
// Init Furnace
main.furnace().init(main, params.rewardRatio);
main.broker().init(
main,
gnosis,
ITrade(address(new GnosisTrade())),
params.batchAuctionLength,
ITrade(address(new DutchTrade())),
params.dutchAuctionLength
);
// Init StRSR
{
string memory stRSRSymbol = string(abi.encodePacked(StringLib.toLower(symbol), "RSR"));
string memory stRSRName = string(abi.encodePacked(stRSRSymbol, " Token"));
main.stRSR().init(
main,
stRSRName,
stRSRSymbol,
params.unstakingDelay,
params.rewardRatio,
params.withdrawalLeak
);
}
// Init RToken
main.rToken().init(
main,
name,
symbol,
mandate,
params.issuanceThrottle,
params.redemptionThrottle
);
// Deploy RToken/RSR Assets
IAsset[] memory assets = new IAsset[](2);
assets[0] = new RTokenAsset(components.rToken, params.rTokenMaxTradeVolume);
assets[1] = rsrAsset;
// Init Asset Registry
main.assetRegistry().init(main, assets);
// Transfer Ownership
main.grantRole(OWNER, owner);
main.renounceRole(OWNER, address(this));
emit RTokenCreated(main, components.rToken, components.stRSR, owner, version());
return (address(components.rToken));
}
/// @param maxTradeVolume {UoA} The maximum trade volume for the RTokenAsset
/// @return rTokenAsset The address of the newly deployed RTokenAsset
function deployRTokenAsset(IRToken rToken, uint192 maxTradeVolume)
external
returns (IAsset rTokenAsset)
{
rTokenAsset = new RTokenAsset(rToken, maxTradeVolume);
emit RTokenAssetCreated(rToken, rTokenAsset);
}
}