-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcurveFraxBpVault.ts
193 lines (168 loc) · 8.14 KB
/
curveFraxBpVault.ts
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import { subtask, task, types } from "hardhat/config"
import { AssetProxy__factory, CurveFraxBpBasicMetaVault__factory, CurveFraxBpCalculatorLibrary__factory, IERC20Metadata__factory } from "types"
import { config } from "./deployment/convexFraxBpVaults-config"
import { deployContract } from "./utils/deploy-utils"
import { verifyEtherscan } from "./utils/etherscan"
import { getChain, resolveAddress, resolveAssetToken } from "./utils/networkAddressFactory"
import { getSigner } from "./utils/signerFactory"
import type { BN } from "@utils/math"
import type { Signer } from "ethers"
import type { HardhatRuntimeEnvironment } from "hardhat/types"
import type { AssetProxy, CurveFraxBpBasicMetaVault, CurveFraxBpCalculatorLibrary, CurveFraxBpPool } from "types"
// deployCurveFraxBpMetaVault
type SlippageData = {
redeem: number
deposit: number
withdraw: number
mint: number
}
interface CurveFraxBpBasicMetaVaultParams {
calculatorLibrary: string
nexus: string
asset: string
metaVault: string
slippageData: SlippageData
name: string
symbol: string
vaultManager: string
proxyAdmin: string
assetToBurn: BN
}
interface CurveFraxBpMetaVaultDeployed {
proxy: AssetProxy
impl: CurveFraxBpBasicMetaVault
}
export interface CurveFraxBpMetaVaultsDeployed {
[key: string]: { proxy: AssetProxy; impl: CurveFraxBpBasicMetaVault }
}
export async function deployCurveFraxBpCalculatorLibrary(hre: HardhatRuntimeEnvironment, signer: Signer) {
const calculatorLibrary = await deployContract<CurveFraxBpCalculatorLibrary>(
new CurveFraxBpCalculatorLibrary__factory(signer),
`CurveFraxBpCalculatorLibrary`,
[],
)
await verifyEtherscan(hre, {
address: calculatorLibrary.address,
contract: "contracts/peripheral/Curve/CurveFraxBpCalculatorLibrary.sol:CurveFraxBpCalculatorLibrary",
constructorArguments: [],
})
return calculatorLibrary
}
export const deployCurveFraxBpMetaVault = async (
hre: HardhatRuntimeEnvironment,
signer: Signer,
deployerAddress: string,
params: CurveFraxBpBasicMetaVaultParams,
) => {
const { calculatorLibrary, nexus, asset, metaVault, slippageData, name, symbol, vaultManager, proxyAdmin, assetToBurn } = params
const libraryAddresses = {
"contracts/peripheral/Curve/CurveFraxBpCalculatorLibrary.sol:CurveFraxBpCalculatorLibrary": calculatorLibrary,
}
const constructorArguments = [nexus, asset, metaVault]
const vaultImpl = await deployContract<CurveFraxBpBasicMetaVault>(
new CurveFraxBpBasicMetaVault__factory(libraryAddresses, signer),
"CurveFraxBpBasicMetaVault",
constructorArguments,
)
await verifyEtherscan(hre, {
address: vaultImpl.address,
contract: "contracts/vault/liquidity/curve/CurveFraxBpBasicMetaVault.sol:CurveFraxBpBasicMetaVault",
constructorArguments: constructorArguments,
})
// Pre-calculate proxyAddress for approval
const nonce = await hre.ethers.provider.getTransactionCount(deployerAddress)
const proxyAddress = hre.ethers.utils.getContractAddress({
from: deployerAddress,
nonce: nonce + 1, // Increment 1 to account for approval tx
});
// Approve allowance for assetToBurn
const assetContract = IERC20Metadata__factory.connect(asset, signer)
await assetContract.approve(proxyAddress, assetToBurn)
// Proxy
const data = vaultImpl.interface.encodeFunctionData("initialize", [name, symbol, vaultManager, slippageData, assetToBurn])
const proxyConstructorArguments = [vaultImpl.address, proxyAdmin, data]
const proxy = await deployContract<AssetProxy>(new AssetProxy__factory(signer), "AssetProxy", proxyConstructorArguments)
return { proxy, impl: vaultImpl }
}
export async function deployCurveFraxBpMetaVaults(
hre: HardhatRuntimeEnvironment,
signer: Signer,
nexus: string,
vaultManager: string,
proxyAdmin: string,
metaVault: string,
deployerAddress: string
) {
const curveFraxBpMetaVaults: CurveFraxBpMetaVaultsDeployed = {}
const { curveFraxBpMetaVault } = config
const pools: string[] = Object.keys(curveFraxBpMetaVault)
const curveFraxBpCalculatorLibrary: CurveFraxBpCalculatorLibrary = await deployCurveFraxBpCalculatorLibrary(hre, signer)
for (let i = 0; i < pools.length; i++) {
const pool = pools[i]
const curveFraxBpPool: CurveFraxBpPool = curveFraxBpMetaVault[pool]
const curveFraxBpMetaVaultDeployed: CurveFraxBpMetaVaultDeployed = await deployCurveFraxBpMetaVault(hre, signer, deployerAddress, {
calculatorLibrary: curveFraxBpCalculatorLibrary.address,
nexus,
asset: curveFraxBpPool.asset,
metaVault,
// metaVault: curveFraxBpPool.metaVault,
slippageData: curveFraxBpPool.slippageData,
name: curveFraxBpPool.name,
symbol: curveFraxBpPool.symbol,
vaultManager,
proxyAdmin,
assetToBurn: curveFraxBpPool.assetToBurn
})
curveFraxBpMetaVaults[pool] = curveFraxBpMetaVaultDeployed
}
return { curveFraxBpMetaVaults, curveFraxBpCalculatorLibrary }
}
subtask("curve-FraxBp-lib-deploy", "Deploys a Curve FraxBp calculator library")
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.setAction(async (taskArgs, hre) => {
const { speed } = taskArgs
const signer = await getSigner(hre, speed)
return deployCurveFraxBpCalculatorLibrary(hre, signer)
})
task("curve-FraxBp-lib-deploy").setAction(async (_, __, runSuper) => {
return runSuper()
})
subtask("curve-FraxBp-meta-vault-deploy", "Deploys Curve FraxBp Meta Vault")
.addParam("name", "Meta Vault name", undefined, types.string)
.addParam("symbol", "Meta Vault symbol", undefined, types.string)
.addParam("assetToBurn", "Amount of assets to deposit and corresponding shares locked", undefined , types.int)
.addParam("asset", "Token address or symbol of the vault's asset. eg FRAX or USDC", undefined, types.string)
.addOptionalParam("metaVault", "Underlying Meta Vault override", "mvFraxBp-CVX", types.string)
.addOptionalParam("admin", "Instant or delayed proxy admin: InstantProxyAdmin | DelayedProxyAdmin", "InstantProxyAdmin", types.string)
.addOptionalParam("calculatorLibrary", "Name or address of the Curve calculator library.", "CurveFraxBpCalculatorLibrary", types.string)
.addOptionalParam("slippage", "Max slippage in basis points. default 1% = 100", 100, types.int)
.addOptionalParam("vaultManager", "Name or address to override the Vault Manager", "VaultManager", types.string)
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.setAction(async (taskArgs, hre) => {
const { metaVault, name, symbol, asset, calculatorLibrary, slippage, admin, vaultManager, speed, assetToBurn } = taskArgs
const signer = await getSigner(hre, speed)
const chain = getChain(hre)
const nexusAddress = resolveAddress("Nexus", chain)
const assetToken = await resolveAssetToken(signer, chain, asset)
const proxyAdminAddress = resolveAddress(admin, chain)
const vaultManagerAddress = resolveAddress(vaultManager, chain)
const metaVaultAddress = resolveAddress(metaVault, chain)
const calculatorLibraryAddress = resolveAddress(calculatorLibrary, chain)
const deployerAddress = resolveAddress("OperationsSigner", chain)
const { proxy, impl } = await deployCurveFraxBpMetaVault(hre, signer, deployerAddress, {
nexus: nexusAddress,
asset: assetToken.address,
name,
symbol,
metaVault: metaVaultAddress,
vaultManager: vaultManagerAddress,
proxyAdmin: proxyAdminAddress,
slippageData: { mint: slippage, deposit: slippage, redeem: slippage, withdraw: slippage },
calculatorLibrary: calculatorLibraryAddress,
assetToBurn
})
return { proxy, impl }
})
task("curve-FraxBp-meta-vault-deploy").setAction(async (_, __, runSuper) => {
return runSuper()
})