Skip to content

Commit 2eaa3d0

Browse files
authored
Merge pull request #24 from SetProtocol/pranav/add-delegated-manager-system-optimism-deploy-script
Add optimism delegated manager system deploy script [SIM-64]
2 parents d5f8858 + 791268b commit 2eaa3d0

File tree

4 files changed

+402
-0
lines changed

4 files changed

+402
-0
lines changed
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
import "module-alias/register";
2+
3+
import { HardhatRuntimeEnvironment as HRE } from "hardhat/types";
4+
import { DeployFunction } from "hardhat-deploy/types";
5+
6+
import {
7+
prepareDeployment,
8+
findDependency,
9+
getContractAddress,
10+
getCurrentStage,
11+
saveContractDeployment,
12+
stageAlreadyFinished,
13+
trackFinishedStage,
14+
writeTransactionToOutputs,
15+
getAccounts,
16+
} from "@utils/index";
17+
18+
import { Account } from "@utils/types";
19+
import { InstanceGetter } from "@utils/instanceGetter";
20+
21+
import { DEPENDENCY } from "../deployments/utils/dependencies";
22+
import { CONTRACT_NAMES } from "../deployments/constants/003_delegated_manager_system";
23+
24+
const {
25+
MULTI_SIG_OWNER,
26+
CONTROLLER,
27+
SET_TOKEN_CREATOR,
28+
ISSUANCE_MODULE,
29+
STREAMING_FEE_MODULE,
30+
TRADE_MODULE,
31+
} = DEPENDENCY;
32+
33+
let owner: Account;
34+
let instanceGetter: InstanceGetter;
35+
36+
const CURRENT_STAGE = getCurrentStage(__filename);
37+
38+
const func: DeployFunction = trackFinishedStage(CURRENT_STAGE, async function (bre: HRE) {
39+
const {
40+
deploy,
41+
deployer,
42+
rawTx,
43+
networkConstant
44+
} = await prepareDeployment(bre);
45+
46+
[owner] = await getAccounts();
47+
instanceGetter = new InstanceGetter(owner.wallet);
48+
49+
await deployManagerCore();
50+
const managerCoreAddress = await getContractAddress(CONTRACT_NAMES.MANAGER_CORE);
51+
52+
const controllerAddress = await findDependency(CONTROLLER);
53+
const setTokenCreatorAddress = await findDependency(SET_TOKEN_CREATOR);
54+
await deployDelegatedManagerFactory();
55+
const delegatedManagerFactoryAddress = await getContractAddress(CONTRACT_NAMES.DELEGATED_MANAGER_FACTORY);
56+
57+
const issuanceModuleAddress = await findDependency(ISSUANCE_MODULE);
58+
await deployIssuanceExtension();
59+
const issuanceExtensionAddress = await getContractAddress(CONTRACT_NAMES.ISSUANCE_EXTENSION);
60+
61+
const streamingFeeModuleAddress = await findDependency(STREAMING_FEE_MODULE);
62+
await deployStreamingFeeSplitExtension();
63+
const streamingFeeSplitExtensionAddress = await getContractAddress(CONTRACT_NAMES.STREAMING_FEE_SPLIT_EXTENSION);
64+
65+
const tradeModuleAddress = await findDependency(TRADE_MODULE);
66+
await deployTradeExtension();
67+
const tradeExtensionAddress = await getContractAddress(CONTRACT_NAMES.TRADE_EXTENSION);
68+
69+
await initializeManagerCore();
70+
71+
await transferManagerCoreOwnershipToMultisig();
72+
73+
//
74+
// Helper Functions
75+
//
76+
77+
async function deployManagerCore(): Promise<void> {
78+
const checkManagerCoreAddress = await getContractAddress(CONTRACT_NAMES.MANAGER_CORE);
79+
if (checkManagerCoreAddress === "") {
80+
const managerCoreDeploy = await deploy(
81+
CONTRACT_NAMES.MANAGER_CORE,
82+
{ from: deployer, log: true }
83+
);
84+
managerCoreDeploy.receipt && await saveContractDeployment({
85+
name: CONTRACT_NAMES.MANAGER_CORE,
86+
contractAddress: managerCoreDeploy.address,
87+
id: managerCoreDeploy.receipt.transactionHash,
88+
description: `Deployed ${CONTRACT_NAMES.MANAGER_CORE}`
89+
});
90+
}
91+
}
92+
93+
async function deployDelegatedManagerFactory(): Promise<void> {
94+
const checkDelegatedManagerFactoryAddress = await getContractAddress(CONTRACT_NAMES.DELEGATED_MANAGER_FACTORY);
95+
if (checkDelegatedManagerFactoryAddress === "") {
96+
const constructorArgs = [managerCoreAddress, controllerAddress, setTokenCreatorAddress];
97+
const delegatedManagerFactoryDeploy = await deploy(
98+
CONTRACT_NAMES.DELEGATED_MANAGER_FACTORY,
99+
{ from: deployer, args: constructorArgs, log: true }
100+
);
101+
delegatedManagerFactoryDeploy.receipt && await saveContractDeployment({
102+
name: CONTRACT_NAMES.DELEGATED_MANAGER_FACTORY,
103+
contractAddress: delegatedManagerFactoryDeploy.address,
104+
id: delegatedManagerFactoryDeploy.receipt.transactionHash,
105+
description: `Deployed ${CONTRACT_NAMES.DELEGATED_MANAGER_FACTORY}`,
106+
constructorArgs,
107+
});
108+
}
109+
}
110+
111+
async function deployIssuanceExtension(): Promise<void> {
112+
const checkIssuanceExtensionAddress = await getContractAddress(CONTRACT_NAMES.ISSUANCE_EXTENSION);
113+
if (checkIssuanceExtensionAddress === "") {
114+
const constructorArgs = [managerCoreAddress, issuanceModuleAddress];
115+
const issuanceExtensionDeploy = await deploy(
116+
CONTRACT_NAMES.ISSUANCE_EXTENSION,
117+
{ from: deployer, args: constructorArgs, log: true }
118+
);
119+
issuanceExtensionDeploy.receipt && await saveContractDeployment({
120+
name: CONTRACT_NAMES.ISSUANCE_EXTENSION,
121+
contractAddress: issuanceExtensionDeploy.address,
122+
id: issuanceExtensionDeploy.receipt.transactionHash,
123+
description: `Deployed ${CONTRACT_NAMES.ISSUANCE_EXTENSION}`,
124+
constructorArgs,
125+
});
126+
}
127+
}
128+
129+
async function deployStreamingFeeSplitExtension(): Promise<void> {
130+
const checkStreamingFeeSplitExtensionAddress = await getContractAddress(CONTRACT_NAMES.STREAMING_FEE_SPLIT_EXTENSION);
131+
if (checkStreamingFeeSplitExtensionAddress === "") {
132+
const constructorArgs = [managerCoreAddress, streamingFeeModuleAddress];
133+
const streamingFeeSplitExtensionDeploy = await deploy(
134+
CONTRACT_NAMES.STREAMING_FEE_SPLIT_EXTENSION,
135+
{ from: deployer, args: constructorArgs, log: true }
136+
);
137+
streamingFeeSplitExtensionDeploy.receipt && await saveContractDeployment({
138+
name: CONTRACT_NAMES.STREAMING_FEE_SPLIT_EXTENSION,
139+
contractAddress: streamingFeeSplitExtensionDeploy.address,
140+
id: streamingFeeSplitExtensionDeploy.receipt.transactionHash,
141+
description: `Deployed ${CONTRACT_NAMES.STREAMING_FEE_SPLIT_EXTENSION}`,
142+
constructorArgs,
143+
});
144+
}
145+
}
146+
147+
async function deployTradeExtension(): Promise<void> {
148+
const checkTradeExtensionAddress = await getContractAddress(CONTRACT_NAMES.TRADE_EXTENSION);
149+
if (checkTradeExtensionAddress === "") {
150+
const constructorArgs = [managerCoreAddress, tradeModuleAddress];
151+
const tradeExtensionDeploy = await deploy(
152+
CONTRACT_NAMES.TRADE_EXTENSION,
153+
{ from: deployer, args: constructorArgs, log: true }
154+
);
155+
tradeExtensionDeploy.receipt && await saveContractDeployment({
156+
name: CONTRACT_NAMES.TRADE_EXTENSION,
157+
contractAddress: tradeExtensionDeploy.address,
158+
id: tradeExtensionDeploy.receipt.transactionHash,
159+
description: `Deployed ${CONTRACT_NAMES.TRADE_EXTENSION}`,
160+
constructorArgs,
161+
});
162+
}
163+
}
164+
165+
async function initializeManagerCore(): Promise<void> {
166+
const managerCoreInstance = await instanceGetter.getManagerCore(managerCoreAddress);
167+
if (!await managerCoreInstance.isInitialized()) {
168+
const initializeData = managerCoreInstance.interface.encodeFunctionData(
169+
"initialize",
170+
[[issuanceExtensionAddress, streamingFeeSplitExtensionAddress, tradeExtensionAddress], [delegatedManagerFactoryAddress]]
171+
);
172+
const description = "Initialized ManagerCore with DelegatedManagerFactory, IssuanceExtension, StreamingFeeSplitExtension, and TradeExtension";
173+
174+
const initializeTransaction: any = await rawTx({
175+
from: deployer,
176+
to: managerCoreAddress,
177+
data: initializeData,
178+
log: true,
179+
});
180+
await writeTransactionToOutputs(initializeTransaction.transactionHash, description);
181+
}
182+
}
183+
184+
async function transferManagerCoreOwnershipToMultisig(): Promise<void> {
185+
if (networkConstant === "production") {
186+
const multisig = await findDependency(MULTI_SIG_OWNER);
187+
const managerCoreInstance = await instanceGetter.getManagerCore(managerCoreAddress);
188+
189+
const managerCoreOwner = await managerCoreInstance.owner();
190+
if (multisig !== "" && managerCoreOwner === deployer) {
191+
const transferOwnershipData = managerCoreInstance.interface.encodeFunctionData(
192+
"transferOwnership",
193+
[multisig]
194+
);
195+
196+
const transferOwnershipTransaction: any = await rawTx({
197+
from: deployer,
198+
to: managerCoreAddress,
199+
data: transferOwnershipData,
200+
log: true,
201+
});
202+
203+
await writeTransactionToOutputs(
204+
transferOwnershipTransaction.transactionHash,
205+
"Transfer ManagerCore ownership to Multisig"
206+
);
207+
}
208+
}
209+
}
210+
});
211+
212+
func.skip = stageAlreadyFinished(CURRENT_STAGE);
213+
214+
export default func;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const CONTRACT_NAMES = {
2+
MANAGER_CORE: "ManagerCore",
3+
DELEGATED_MANAGER_FACTORY:"DelegatedManagerFactory",
4+
ISSUANCE_EXTENSION:"IssuanceExtension",
5+
STREAMING_FEE_SPLIT_EXTENSION:"StreamingFeeSplitExtension",
6+
TRADE_EXTENSION:"TradeExtension",
7+
};

optimism/deployments/utils/dependencies.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,20 @@ export default {
171171
},
172172
69: "0xf620837d57ed0231194eB7F6776e21c6145c7cC1",
173173
},
174+
ISSUANCE_MODULE: {
175+
10: {
176+
staging: "0xeCdCc6181f17418efE422D5218D4cc63ad8c5c73",
177+
production: "0x9BBfCA4D9ECdc53F56290442d85c8e55131dAf00"
178+
},
179+
69: "0x7853dD7De469638CA26bC9b6f343820be97E5faE",
180+
},
181+
TRADE_MODULE: {
182+
10: {
183+
staging: "0x4F70287526ea9Ba7e799D616ea86635CdAf0de4F",
184+
production: "0x7215f38011C3e4058Ca3cF7d2b99033016EeFBD8"
185+
},
186+
69: "0x0a18Ad43a9dc991dB9401ee7aC5AAD0A3b219159",
187+
},
174188
STREAMING_FEE_MODULE: {
175189
10: {
176190
staging: "0x2f8FF0546a478DF380f975cA035B95DF82377721",
@@ -273,6 +287,8 @@ export const DEPENDENCY = {
273287
CONTROLLER: "CONTROLLER",
274288
STREAMING_FEE_MODULE: "STREAMING_FEE_MODULE",
275289
SET_TOKEN_CREATOR: "SET_TOKEN_CREATOR",
290+
ISSUANCE_MODULE: "ISSUANCE_MODULE",
291+
TRADE_MODULE: "TRADE_MODULE",
276292
INTEGRATION_REGISTRY: "INTEGRATION_REGISTRY",
277293
SLIPPAGE_ISSUANCE_MODULE: "SLIPPAGE_ISSUANCE_MODULE",
278294
PERPV2_LIBRARY: "PERPV2_LIBRARY",

0 commit comments

Comments
 (0)