@oldzeppelin/contract 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.docker/Dockerfile +17 -0
- package/.dockerignore +7 -0
- package/.env.sample +24 -0
- package/.gitlab-ci.yml +51 -0
- package/.gitmodules +15 -0
- package/.prettierrc +10 -0
- package/.solcover.js +4 -0
- package/.vscode/settings.json +23 -0
- package/LICENSE.MD +51 -0
- package/README.md +135 -0
- package/contracts/arbitrum/contracts/controllers/UniswapV2ControllerArbitrum.sol +37 -0
- package/contracts/arbitrum/contracts/controllers/UniswapV3ControllerArbitrum.sol +46 -0
- package/contracts/arbitrum/contracts/oracle/PriceOracleArbitrum.sol +51 -0
- package/contracts/main/contracts/controllers/Controller.sol +61 -0
- package/contracts/main/contracts/controllers/IController.sol +81 -0
- package/contracts/main/contracts/controllers/OneInchV5Controller.sol +332 -0
- package/contracts/main/contracts/controllers/UnoswapV2Controller.sol +789 -0
- package/contracts/main/contracts/controllers/UnoswapV3Controller.sol +1018 -0
- package/contracts/main/contracts/core/CoreWhitelist.sol +192 -0
- package/contracts/main/contracts/core/ICoreWhitelist.sol +92 -0
- package/contracts/main/contracts/core/IUFarmCore.sol +95 -0
- package/contracts/main/contracts/core/UFarmCore.sol +402 -0
- package/contracts/main/contracts/fund/FundFactory.sol +59 -0
- package/contracts/main/contracts/fund/IUFarmFund.sol +68 -0
- package/contracts/main/contracts/fund/UFarmFund.sol +504 -0
- package/contracts/main/contracts/oracle/ChainlinkedOracle.sol +71 -0
- package/contracts/main/contracts/oracle/IChainlinkAggregator.sol +18 -0
- package/contracts/main/contracts/oracle/IPriceOracle.sol +55 -0
- package/contracts/main/contracts/oracle/PriceOracle.sol +20 -0
- package/contracts/main/contracts/oracle/PriceOracleCore.sol +212 -0
- package/contracts/main/contracts/oracle/WstETHOracle.sol +64 -0
- package/contracts/main/contracts/permissions/Permissions.sol +54 -0
- package/contracts/main/contracts/permissions/UFarmPermissionsModel.sol +136 -0
- package/contracts/main/contracts/pool/IPoolAdmin.sol +57 -0
- package/contracts/main/contracts/pool/IUFarmPool.sol +304 -0
- package/contracts/main/contracts/pool/PerformanceFeeLib.sol +81 -0
- package/contracts/main/contracts/pool/PoolAdmin.sol +437 -0
- package/contracts/main/contracts/pool/PoolFactory.sol +74 -0
- package/contracts/main/contracts/pool/PoolWhitelist.sol +70 -0
- package/contracts/main/contracts/pool/UFarmPool.sol +959 -0
- package/contracts/main/shared/AssetController.sol +194 -0
- package/contracts/main/shared/ECDSARecover.sol +91 -0
- package/contracts/main/shared/NZGuard.sol +99 -0
- package/contracts/main/shared/SafeOPS.sol +128 -0
- package/contracts/main/shared/UFarmCoreLink.sol +83 -0
- package/contracts/main/shared/UFarmErrors.sol +16 -0
- package/contracts/main/shared/UFarmMathLib.sol +80 -0
- package/contracts/main/shared/UFarmOwnableUUPS.sol +59 -0
- package/contracts/main/shared/UFarmOwnableUUPSBeacon.sol +34 -0
- package/contracts/test/Block.sol +15 -0
- package/contracts/test/InchSwapTestProxy.sol +292 -0
- package/contracts/test/MockPoolAdmin.sol +8 -0
- package/contracts/test/MockUFarmPool.sol +8 -0
- package/contracts/test/MockV3wstETHstETHAgg.sol +128 -0
- package/contracts/test/MockedWETH9.sol +72 -0
- package/contracts/test/OneInchToUFarmTestEnv.sol +466 -0
- package/contracts/test/StableCoin.sol +25 -0
- package/contracts/test/UFarmMockSequencerUptimeFeed.sol +44 -0
- package/contracts/test/UFarmMockV3Aggregator.sol +145 -0
- package/contracts/test/UUPSBlock.sol +19 -0
- package/contracts/test/ufarmLocal/MulticallV3.sol +220 -0
- package/contracts/test/ufarmLocal/controllers/UniswapV2ControllerUFarm.sol +27 -0
- package/contracts/test/ufarmLocal/controllers/UniswapV3ControllerUFarm.sol +43 -0
- package/deploy/100_test_env_setup.ts +483 -0
- package/deploy/20_deploy_uniV2.ts +48 -0
- package/deploy/21_create_pairs_uniV2.ts +149 -0
- package/deploy/22_deploy_mocked_aggregators.ts +123 -0
- package/deploy/22_deploy_wsteth_oracle.ts +65 -0
- package/deploy/23_deploy_uniV3.ts +80 -0
- package/deploy/24_create_pairs_uniV3.ts +140 -0
- package/deploy/25_deploy_oneInch.ts +38 -0
- package/deploy/2_deploy_multicall.ts +34 -0
- package/deploy/30_deploy_price_oracle.ts +33 -0
- package/deploy/3_deploy_lido.ts +114 -0
- package/deploy/40_deploy_pool_beacon.ts +19 -0
- package/deploy/41_deploy_poolAdmin_beacon.ts +19 -0
- package/deploy/42_deploy_ufarmcore.ts +29 -0
- package/deploy/43_deploy_fund_beacon.ts +19 -0
- package/deploy/4_deploy_tokens.ts +76 -0
- package/deploy/50_deploy_poolFactory.ts +35 -0
- package/deploy/51_deploy_fundFactory.ts +29 -0
- package/deploy/60_init_contracts.ts +101 -0
- package/deploy/61_whitelist_tokens.ts +18 -0
- package/deploy/70_deploy_uniV2Controller.ts +70 -0
- package/deploy/71_deploy_uniV3Controller.ts +67 -0
- package/deploy/72_deploy_oneInchController.ts +25 -0
- package/deploy/79_whitelist_controllers.ts +125 -0
- package/deploy/ufarm/arbitrum/1_prepare_env.ts +82 -0
- package/deploy/ufarm/arbitrum/2_deploy_ufarm.ts +178 -0
- package/deploy/ufarm/arbitrum-sepolia/1000_prepare_arb_sepolia_env.ts +308 -0
- package/deploy-config.json +112 -0
- package/deploy-data/oracles.csv +32 -0
- package/deploy-data/protocols.csv +10 -0
- package/deploy-data/tokens.csv +32 -0
- package/docker-compose.yml +67 -0
- package/hardhat.config.ts +449 -0
- package/index.js +93 -0
- package/package.json +82 -0
- package/scripts/_deploy_helpers.ts +992 -0
- package/scripts/_deploy_network_options.ts +49 -0
- package/scripts/activatePool.ts +51 -0
- package/scripts/createPool.ts +62 -0
- package/scripts/deploy_1inch_proxy.ts +98 -0
- package/scripts/pool-data.ts +420 -0
- package/scripts/post-deploy.sh +24 -0
- package/scripts/setUniV2Rate.ts +252 -0
- package/scripts/swapOneInchV5.ts +94 -0
- package/scripts/swapUniswapV2.ts +65 -0
- package/scripts/swapUniswapV3.ts +71 -0
- package/scripts/test.ts +61 -0
- package/scripts/typings-copy-artifacts.ts +83 -0
- package/tasks/boostPool.ts +39 -0
- package/tasks/createFund.ts +44 -0
- package/tasks/deboostPool.ts +48 -0
- package/tasks/grantUFarmPermissions.ts +57 -0
- package/tasks/index.ts +7 -0
- package/tasks/mintUSDT.ts +62 -0
- package/test/Periphery.test.ts +640 -0
- package/test/PriceOracle.test.ts +82 -0
- package/test/TestCases.MD +109 -0
- package/test/UFarmCore.test.ts +331 -0
- package/test/UFarmFund.test.ts +406 -0
- package/test/UFarmPool.test.ts +4736 -0
- package/test/_fixtures.ts +783 -0
- package/test/_helpers.ts +2195 -0
- package/test/_oneInchTestData.ts +632 -0
- package/tsconfig.json +12 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import { getDeployerSigner, deployBeaconContract, _deployTags } from '../scripts/_deploy_helpers'
|
6
|
+
|
7
|
+
const deployFund: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
8
|
+
const deployerSigner = await getDeployerSigner(hre)
|
9
|
+
|
10
|
+
console.log('\nDeploying UFarmFund...')
|
11
|
+
|
12
|
+
await deployBeaconContract(hre, 'UFarmFund', deployerSigner)
|
13
|
+
|
14
|
+
console.log('\n UFarmFund deployed!')
|
15
|
+
}
|
16
|
+
|
17
|
+
export default deployFund
|
18
|
+
deployFund.dependencies = []
|
19
|
+
deployFund.tags = _deployTags(['UFarmFund'])
|
@@ -0,0 +1,76 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { ArtifactData, DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import {
|
6
|
+
getPrefixedTokens,
|
7
|
+
deployContract,
|
8
|
+
isTestnet,
|
9
|
+
isPublicTestnet,
|
10
|
+
getDeployerSigner,
|
11
|
+
_deployTags,
|
12
|
+
} from '../scripts/_deploy_helpers'
|
13
|
+
|
14
|
+
const deployTokens: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
15
|
+
if (!isTestnet(hre.network)) {
|
16
|
+
console.log(`Skipping tokens deployment`)
|
17
|
+
return
|
18
|
+
}
|
19
|
+
const prefixedTokens = await getPrefixedTokens(hre)
|
20
|
+
|
21
|
+
console.log('Deploying tokens...')
|
22
|
+
|
23
|
+
const deployerSigner = await getDeployerSigner(hre)
|
24
|
+
const deployer = deployerSigner.address
|
25
|
+
|
26
|
+
for (const token of prefixedTokens) {
|
27
|
+
let args: any[] | undefined = undefined
|
28
|
+
let contract: string | ArtifactData | undefined = undefined
|
29
|
+
|
30
|
+
switch (token.rawName) {
|
31
|
+
case 'WETH':
|
32
|
+
contract = 'MockedWETH9'
|
33
|
+
break
|
34
|
+
case 'STETH':
|
35
|
+
if (isPublicTestnet(hre.network)) {
|
36
|
+
contract = 'StableCoin'
|
37
|
+
args = [token.name, token.symbol, token.decimals]
|
38
|
+
} else {
|
39
|
+
const steth_deployment = await hre.deployments.getOrNull('STETH')
|
40
|
+
if (!steth_deployment) throw new Error(`STETH deployment not found`)
|
41
|
+
}
|
42
|
+
break
|
43
|
+
case 'WSTETH':
|
44
|
+
if (isPublicTestnet(hre.network)) {
|
45
|
+
contract = 'StableCoin'
|
46
|
+
args = [token.name, token.symbol, token.decimals]
|
47
|
+
} else {
|
48
|
+
const wsteth_deployment = await hre.deployments.getOrNull('WSTETH')
|
49
|
+
if (!wsteth_deployment) throw new Error(`WSTETH deployment not found`)
|
50
|
+
}
|
51
|
+
break
|
52
|
+
default:
|
53
|
+
contract = 'StableCoin'
|
54
|
+
args = [token.name, token.symbol, token.decimals]
|
55
|
+
break
|
56
|
+
}
|
57
|
+
|
58
|
+
if (contract)
|
59
|
+
await deployContract(hre, {
|
60
|
+
deploymentName: token.rawName,
|
61
|
+
from: deployer,
|
62
|
+
args: args,
|
63
|
+
log: true,
|
64
|
+
contract: contract,
|
65
|
+
skipIfAlreadyDeployed: true,
|
66
|
+
})
|
67
|
+
}
|
68
|
+
|
69
|
+
console.log('Tokens deployed!')
|
70
|
+
}
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
export default deployTokens
|
75
|
+
deployTokens.dependencies = _deployTags(['Lido'])
|
76
|
+
deployTokens.tags = _deployTags(['Tokens'])
|
@@ -0,0 +1,35 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import {
|
6
|
+
getDeployerSigner,
|
7
|
+
deployContract,
|
8
|
+
_deployTags,
|
9
|
+
} from '../scripts/_deploy_helpers'
|
10
|
+
|
11
|
+
const deployPoolFactory: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
12
|
+
|
13
|
+
const deployerSigner = await getDeployerSigner(hre)
|
14
|
+
|
15
|
+
const ufarmCore_deployment = await hre.deployments.get('UFarmCore')
|
16
|
+
const pool_beacon_deployment = await hre.deployments.get('UFarmPool')
|
17
|
+
const poolAdmin_beacon_deployment = await hre.deployments.get('PoolAdmin')
|
18
|
+
|
19
|
+
console.log('\nDeploying PoolFactory...')
|
20
|
+
|
21
|
+
await deployContract(hre, {
|
22
|
+
deploymentName: 'PoolFactory',
|
23
|
+
from: deployerSigner.address,
|
24
|
+
args: [ufarmCore_deployment.address, pool_beacon_deployment.address, poolAdmin_beacon_deployment.address],
|
25
|
+
log: true,
|
26
|
+
skipIfAlreadyDeployed: true,
|
27
|
+
contract: 'PoolFactory',
|
28
|
+
})
|
29
|
+
|
30
|
+
console.log('\n PoolFactory deployed!')
|
31
|
+
}
|
32
|
+
|
33
|
+
export default deployPoolFactory
|
34
|
+
deployPoolFactory.dependencies = _deployTags(['UFarmCore', 'UFarmPool', 'PoolAdmin'])
|
35
|
+
deployPoolFactory.tags = _deployTags(['PoolFactory'])
|
@@ -0,0 +1,29 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import { isTestnet, getDeployerSigner, deployContract, _deployTags } from '../scripts/_deploy_helpers'
|
6
|
+
|
7
|
+
const deployFundFactory: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
8
|
+
const deployerSigner = await getDeployerSigner(hre)
|
9
|
+
|
10
|
+
const ufarmCore_deployment = await hre.deployments.get('UFarmCore')
|
11
|
+
const ufarmFund_deployments = await hre.deployments.get('UFarmFund')
|
12
|
+
|
13
|
+
console.log('\nDeploying FundFactory...')
|
14
|
+
|
15
|
+
await deployContract(hre, {
|
16
|
+
deploymentName: 'FundFactory',
|
17
|
+
from: deployerSigner.address,
|
18
|
+
args: [ufarmCore_deployment.address, ufarmFund_deployments.address],
|
19
|
+
log: true,
|
20
|
+
skipIfAlreadyDeployed: true,
|
21
|
+
contract: 'FundFactory',
|
22
|
+
})
|
23
|
+
|
24
|
+
console.log('\n FundFactory deployed!')
|
25
|
+
}
|
26
|
+
|
27
|
+
export default deployFundFactory
|
28
|
+
deployFundFactory.dependencies = _deployTags(['UFarmCore', 'UFarmPool', 'PoolAdmin','UFarmFund'])
|
29
|
+
deployFundFactory.tags = _deployTags(['FundFactory'])
|
@@ -0,0 +1,101 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import {
|
6
|
+
isTestnet,
|
7
|
+
getDeployerSigner,
|
8
|
+
getInstanceFromDeployment,
|
9
|
+
retryOperation,
|
10
|
+
getPriceOracleContract,
|
11
|
+
_deployTags,
|
12
|
+
getNetworkType,
|
13
|
+
} from '../scripts/_deploy_helpers'
|
14
|
+
import { FundFactory, PoolFactory, PriceOracle, UFarmCore } from '../typechain-types'
|
15
|
+
|
16
|
+
const initContracts: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
17
|
+
const deployerSigner = await getDeployerSigner(hre)
|
18
|
+
|
19
|
+
const priceOracle_instance = (
|
20
|
+
getInstanceFromDeployment<PriceOracle>(hre, await hre.deployments.get('PriceOracle'))
|
21
|
+
).connect(deployerSigner)
|
22
|
+
|
23
|
+
const ufarmCore_instance = (
|
24
|
+
getInstanceFromDeployment<UFarmCore>(hre, await hre.deployments.get('UFarmCore'))
|
25
|
+
).connect(deployerSigner)
|
26
|
+
|
27
|
+
const fundFactory_instance = (
|
28
|
+
getInstanceFromDeployment<FundFactory>(hre, await hre.deployments.get('FundFactory'))
|
29
|
+
).connect(deployerSigner)
|
30
|
+
|
31
|
+
const poolFactory_instance = (
|
32
|
+
getInstanceFromDeployment<PoolFactory>(hre, await hre.deployments.get('PoolFactory'))
|
33
|
+
).connect(deployerSigner)
|
34
|
+
|
35
|
+
console.log('\nInitializing contracts...')
|
36
|
+
|
37
|
+
if ((await ufarmCore_instance.priceOracle()) !== priceOracle_instance.address) {
|
38
|
+
console.log('Initializing PriceOracle...')
|
39
|
+
|
40
|
+
const thisNetworkPriceOracle = getPriceOracleContract(hre.network)
|
41
|
+
|
42
|
+
const args = [ufarmCore_instance.address].concat(
|
43
|
+
thisNetworkPriceOracle.args.map((arg) => Object.values(arg)[0]),
|
44
|
+
)
|
45
|
+
console.log('args:', args)
|
46
|
+
|
47
|
+
await retryOperation(async () => {
|
48
|
+
await hre.deployments.execute(
|
49
|
+
'PriceOracle',
|
50
|
+
{
|
51
|
+
from: deployerSigner.address,
|
52
|
+
log: true,
|
53
|
+
},
|
54
|
+
thisNetworkPriceOracle.initFunc,
|
55
|
+
...args,
|
56
|
+
)
|
57
|
+
}, 3)
|
58
|
+
|
59
|
+
console.log('PriceOracle initialized!')
|
60
|
+
} else {
|
61
|
+
console.log('PriceOracle already initialized!')
|
62
|
+
}
|
63
|
+
|
64
|
+
const [fundAddr, poolAddr, priceOracleAddr] = await Promise.all([
|
65
|
+
ufarmCore_instance.fundFactory(),
|
66
|
+
ufarmCore_instance.poolFactory(),
|
67
|
+
ufarmCore_instance.priceOracle(),
|
68
|
+
])
|
69
|
+
|
70
|
+
const AddressZero = hre.ethers.constants.AddressZero
|
71
|
+
|
72
|
+
// if any of that addresses is not set, we need to initialize UFarmCore
|
73
|
+
if (fundAddr === AddressZero || poolAddr === AddressZero || priceOracleAddr === AddressZero) {
|
74
|
+
console.log('Initializing UFarmCore...')
|
75
|
+
|
76
|
+
await retryOperation(async () => {
|
77
|
+
await hre.deployments.execute(
|
78
|
+
'UFarmCore',
|
79
|
+
{
|
80
|
+
from: deployerSigner.address,
|
81
|
+
log: true,
|
82
|
+
},
|
83
|
+
'__init__UFarmCore',
|
84
|
+
deployerSigner.address,
|
85
|
+
fundFactory_instance.address,
|
86
|
+
poolFactory_instance.address,
|
87
|
+
priceOracle_instance.address,
|
88
|
+
)
|
89
|
+
}, 3)
|
90
|
+
|
91
|
+
console.log('UFarmCore initialized!')
|
92
|
+
} else {
|
93
|
+
console.log('UFarmCore already initialized!')
|
94
|
+
}
|
95
|
+
|
96
|
+
console.log('\nAll contracts initialized!')
|
97
|
+
}
|
98
|
+
|
99
|
+
export default initContracts
|
100
|
+
initContracts.dependencies = ['PriceOracle', 'UFarmCore', 'FundFactory', 'PoolFactory']
|
101
|
+
initContracts.tags = _deployTags(['InitializeUFarm'])
|
@@ -0,0 +1,18 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import { _deployTags, whitelistTokensWithAggregator, isMainnet } from '../scripts/_deploy_helpers'
|
6
|
+
import { AggregatorV2V3Interface, UFarmMockV3Aggregator } from '../typechain-types'
|
7
|
+
|
8
|
+
const whitelistTokens: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
9
|
+
if (isMainnet(hre.network)) {
|
10
|
+
await whitelistTokensWithAggregator<AggregatorV2V3Interface>(hre)
|
11
|
+
} else {
|
12
|
+
await whitelistTokensWithAggregator<UFarmMockV3Aggregator>(hre)
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
export default whitelistTokens
|
17
|
+
whitelistTokens.dependencies = _deployTags(['InitializeUFarm', 'MockedAggregators', 'WstETHOracle'])
|
18
|
+
whitelistTokens.tags = _deployTags(['WhiteListTokens'])
|
@@ -0,0 +1,70 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import {
|
6
|
+
isTestnet,
|
7
|
+
getDeployerSigner,
|
8
|
+
getInstanceFromDeployment,
|
9
|
+
deployContract,
|
10
|
+
_deployTags,
|
11
|
+
} from '../scripts/_deploy_helpers'
|
12
|
+
import { UniswapV2Pair__factory } from '../typechain-types'
|
13
|
+
import { getInitCodeHash } from '../test/_helpers'
|
14
|
+
import { getInitCodeUniV2 } from '../scripts/_deploy_network_options'
|
15
|
+
|
16
|
+
const deployUniV2Controller: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
17
|
+
const deployerSigner = await getDeployerSigner(hre)
|
18
|
+
|
19
|
+
const uniV2Router_deployment = await hre.deployments.get('UniswapV2Router02')
|
20
|
+
const uniV2Factory_deployment = await hre.deployments.get('UniswapV2Factory')
|
21
|
+
const priceOracle_deployment = await hre.deployments.get('PriceOracle')
|
22
|
+
|
23
|
+
if (isTestnet(hre.network)) {
|
24
|
+
const init_code_hash = await getInitCodeHash(UniswapV2Pair__factory.bytecode)
|
25
|
+
|
26
|
+
console.log('\nDeploying UnoswapV2Controller...')
|
27
|
+
|
28
|
+
await deployContract(hre, {
|
29
|
+
deploymentName: 'UniV2Controller',
|
30
|
+
from: deployerSigner.address,
|
31
|
+
args: [
|
32
|
+
uniV2Factory_deployment.address,
|
33
|
+
uniV2Router_deployment.address,
|
34
|
+
priceOracle_deployment.address,
|
35
|
+
init_code_hash,
|
36
|
+
],
|
37
|
+
log: true,
|
38
|
+
skipIfAlreadyDeployed: true,
|
39
|
+
contract: 'UniswapV2ControllerUFarm', // only for testnet
|
40
|
+
})
|
41
|
+
|
42
|
+
console.log('UnoswapV2Controller deployed!')
|
43
|
+
} else {
|
44
|
+
console.log('\nDeploying UniswapV2Controller...')
|
45
|
+
|
46
|
+
const thisInitOptionV2 = getInitCodeUniV2(hre.network)
|
47
|
+
|
48
|
+
if (!thisInitOptionV2) {
|
49
|
+
throw new Error(`Init code not found for network: ${hre.network.name}`)
|
50
|
+
}
|
51
|
+
|
52
|
+
await deployContract(hre, {
|
53
|
+
deploymentName: 'UniV2Controller',
|
54
|
+
from: deployerSigner.address,
|
55
|
+
args: [
|
56
|
+
uniV2Factory_deployment.address,
|
57
|
+
uniV2Router_deployment.address,
|
58
|
+
priceOracle_deployment.address,
|
59
|
+
thisInitOptionV2.codeHash,
|
60
|
+
],
|
61
|
+
log: true,
|
62
|
+
skipIfAlreadyDeployed: true,
|
63
|
+
contract: thisInitOptionV2.controller,
|
64
|
+
})
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
export default deployUniV2Controller
|
69
|
+
deployUniV2Controller.dependencies = _deployTags(['PrepareEnvARB', 'UniV2', 'PriceOracle', 'Tokens'])
|
70
|
+
deployUniV2Controller.tags = _deployTags(['UniV2Controller'])
|
@@ -0,0 +1,67 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import { isTestnet, getDeployerSigner, deployUpgradedContract, _deployTags } from '../scripts/_deploy_helpers'
|
6
|
+
import { getInitCodeHash } from '../test/_helpers'
|
7
|
+
import { UniswapV3Pool__factory } from '../typechain-types'
|
8
|
+
import { getInitCodeUniV3 } from '../scripts/_deploy_network_options'
|
9
|
+
|
10
|
+
const deployUniV3Controller: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
11
|
+
const deployerSigner = await getDeployerSigner(hre)
|
12
|
+
|
13
|
+
const priceOracle_deployment = await hre.deployments.get('PriceOracle')
|
14
|
+
const uniV3Factory_deployment = await hre.deployments.get('UniswapV3Factory')
|
15
|
+
const swapRouter_deployment = await hre.deployments.get('SwapRouter')
|
16
|
+
const nfpm_deployment = await hre.deployments.get('NonfungiblePositionManager')
|
17
|
+
|
18
|
+
if (isTestnet(hre.network)) {
|
19
|
+
console.log('\nDeploying UnoswapV3Controller...')
|
20
|
+
|
21
|
+
await deployUpgradedContract(hre, {
|
22
|
+
deploymentName: 'UniV3Controller',
|
23
|
+
from: deployerSigner.address,
|
24
|
+
args: [
|
25
|
+
swapRouter_deployment.address,
|
26
|
+
uniV3Factory_deployment.address,
|
27
|
+
nfpm_deployment.address,
|
28
|
+
priceOracle_deployment.address,
|
29
|
+
await getInitCodeHash(UniswapV3Pool__factory.bytecode)
|
30
|
+
],
|
31
|
+
log: true,
|
32
|
+
skipIfAlreadyDeployed: true,
|
33
|
+
contract: 'UniswapV3ControllerUFarm', // only for testnet
|
34
|
+
})
|
35
|
+
console.log('UnoswapV3Controller deployed!')
|
36
|
+
} else {
|
37
|
+
console.log('\nDeploying UniswapV3Controller...')
|
38
|
+
|
39
|
+
|
40
|
+
const thisInitOptionV3 = getInitCodeUniV3(hre.network)
|
41
|
+
|
42
|
+
if (!thisInitOptionV3) {
|
43
|
+
throw new Error(`UniswapV3Controller deployment not supported on ${hre.network.name}`)
|
44
|
+
}
|
45
|
+
|
46
|
+
await deployUpgradedContract(hre, {
|
47
|
+
deploymentName: 'UniV3Controller',
|
48
|
+
from: deployerSigner.address,
|
49
|
+
args: [
|
50
|
+
swapRouter_deployment.address,
|
51
|
+
uniV3Factory_deployment.address,
|
52
|
+
nfpm_deployment.address,
|
53
|
+
priceOracle_deployment.address,
|
54
|
+
thisInitOptionV3.codeHash,
|
55
|
+
],
|
56
|
+
log: true,
|
57
|
+
skipIfAlreadyDeployed: true,
|
58
|
+
contract: thisInitOptionV3.controller,
|
59
|
+
})
|
60
|
+
|
61
|
+
console.log(`${thisInitOptionV3.controller} deployed!`)
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
export default deployUniV3Controller
|
66
|
+
deployUniV3Controller.dependencies = _deployTags(['UniV3', 'PriceOracle'])
|
67
|
+
deployUniV3Controller.tags = _deployTags(['UniV3Controller'])
|
@@ -0,0 +1,25 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import { getDeployerSigner, _deployTags, deployUpgradedContract } from '../scripts/_deploy_helpers'
|
6
|
+
|
7
|
+
const deployOneInchController: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
8
|
+
const deployerSigner = await getDeployerSigner(hre)
|
9
|
+
|
10
|
+
const oneInchDeployment = await hre.deployments.get('AggregationRouterV5')
|
11
|
+
|
12
|
+
await deployUpgradedContract(hre, {
|
13
|
+
deploymentName: 'OneInchV5Controller',
|
14
|
+
from: deployerSigner.address,
|
15
|
+
args: [oneInchDeployment.address],
|
16
|
+
log: true,
|
17
|
+
skipIfAlreadyDeployed: true,
|
18
|
+
contract: 'OneInchV5Controller',
|
19
|
+
estimateGasExtra: 100000,
|
20
|
+
})
|
21
|
+
}
|
22
|
+
|
23
|
+
export default deployOneInchController
|
24
|
+
deployOneInchController.dependencies = _deployTags(['OneInch'])
|
25
|
+
deployOneInchController.tags = _deployTags(['OneInchV5Controller'])
|
@@ -0,0 +1,125 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import {
|
6
|
+
_deployTags,
|
7
|
+
getDeployerSigner,
|
8
|
+
getInstanceFromDeployment,
|
9
|
+
getNewContractName,
|
10
|
+
retryOperation,
|
11
|
+
} from '../scripts/_deploy_helpers'
|
12
|
+
import { IController, UFarmCore } from '../typechain-types'
|
13
|
+
|
14
|
+
const whitelistControllers: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
15
|
+
const deployerSigner = await getDeployerSigner(hre)
|
16
|
+
|
17
|
+
const uniV2Controller_deployment = await hre.deployments.get('UniV2Controller')
|
18
|
+
const uniV3Controller_deployment = await hre.deployments.get('UniV3Controller')
|
19
|
+
const oneInchController_deployment = await hre.deployments.get('OneInchV5Controller')
|
20
|
+
|
21
|
+
const ufarmCore_deployment = await hre.deployments.get('UFarmCore')
|
22
|
+
const ufarmCore_instance = getInstanceFromDeployment<UFarmCore>(hre, ufarmCore_deployment)
|
23
|
+
|
24
|
+
console.log('\nWhitelisting controllers...')
|
25
|
+
|
26
|
+
const controllersToWhitelist: Record<string, { address: string; controllerName: string }> = {}
|
27
|
+
const controllersToUpdate: Record<string, { address: string; oldControllerName: string }> = {}
|
28
|
+
|
29
|
+
const whitelistedProtocols = await ufarmCore_instance.getWhitelistedProtocols()
|
30
|
+
|
31
|
+
for (const [controller, deployment] of Object.entries({
|
32
|
+
UniV2Controller: uniV2Controller_deployment,
|
33
|
+
UniV3Controller: uniV3Controller_deployment,
|
34
|
+
OneInchV5Controller: oneInchController_deployment,
|
35
|
+
})) {
|
36
|
+
const controllerInstance = getInstanceFromDeployment<IController>(hre, deployment)
|
37
|
+
const protocolName = await controllerInstance.PROTOCOL()
|
38
|
+
|
39
|
+
if (!whitelistedProtocols.includes(protocolName)) {
|
40
|
+
console.log(`Whitelisting ${controller} of protocol ${protocolName} ...`)
|
41
|
+
controllersToWhitelist[protocolName] = {
|
42
|
+
address: deployment.address,
|
43
|
+
controllerName: controller,
|
44
|
+
}
|
45
|
+
} else {
|
46
|
+
const newlyDeployedController = await hre.deployments.getOrNull(
|
47
|
+
getNewContractName(controller),
|
48
|
+
)
|
49
|
+
if (newlyDeployedController) {
|
50
|
+
console.log(
|
51
|
+
`Updating controller ${controller} of protocol ${protocolName} to newly deployed ${newlyDeployedController.address} ...`,
|
52
|
+
)
|
53
|
+
controllersToUpdate[protocolName] = {
|
54
|
+
address: newlyDeployedController.address,
|
55
|
+
oldControllerName: controller,
|
56
|
+
}
|
57
|
+
} else
|
58
|
+
console.log(
|
59
|
+
`Controller ${controller} of protocol ${protocolName} already whitelisted, no need to update`,
|
60
|
+
)
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
if (Object.keys(controllersToWhitelist).length === 0) {
|
65
|
+
console.log(`All controllers already whitelisted!`)
|
66
|
+
} else {
|
67
|
+
console.log(`Whitelisting controllers ...`)
|
68
|
+
await retryOperation(async () => {
|
69
|
+
await hre.deployments.execute(
|
70
|
+
'UFarmCore',
|
71
|
+
{
|
72
|
+
from: deployerSigner.address,
|
73
|
+
log: true,
|
74
|
+
},
|
75
|
+
'whitelistProtocolsWithControllers',
|
76
|
+
|
77
|
+
Array.from(Object.keys(controllersToWhitelist)),
|
78
|
+
Array.from(Object.values(controllersToWhitelist)).map((controller) => controller.address),
|
79
|
+
)
|
80
|
+
}, 3)
|
81
|
+
}
|
82
|
+
|
83
|
+
if (Object.keys(controllersToUpdate).length === 0) {
|
84
|
+
console.log(`All controllers already updated!`)
|
85
|
+
} else {
|
86
|
+
console.log(`Updating controllers ...`)
|
87
|
+
await retryOperation(async () => {
|
88
|
+
await hre.deployments.execute(
|
89
|
+
'UFarmCore',
|
90
|
+
{
|
91
|
+
from: deployerSigner.address,
|
92
|
+
log: true,
|
93
|
+
},
|
94
|
+
'updateProtocolsControllers',
|
95
|
+
|
96
|
+
Array.from(Object.keys(controllersToUpdate)),
|
97
|
+
Array.from(Object.values(controllersToUpdate)).map((controller) => controller.address),
|
98
|
+
)
|
99
|
+
}, 3)
|
100
|
+
|
101
|
+
// update new controller names
|
102
|
+
for (const [protocolName, controller] of Object.entries(controllersToUpdate)) {
|
103
|
+
const newControllerName = getNewContractName(controller.oldControllerName)
|
104
|
+
const newControllerDeployment = await hre.deployments.get(newControllerName)
|
105
|
+
await hre.deployments.delete(controller.oldControllerName)
|
106
|
+
await hre.deployments.save(controller.oldControllerName, newControllerDeployment)
|
107
|
+
await hre.deployments.delete(newControllerName)
|
108
|
+
|
109
|
+
console.log(
|
110
|
+
`Replaced controller deployment of ${controller.oldControllerName} for protocol ${protocolName} to newly deployed ${newControllerDeployment.address} ...`,
|
111
|
+
)
|
112
|
+
}
|
113
|
+
|
114
|
+
console.log('Controllers updated!')
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
export default whitelistControllers
|
119
|
+
whitelistControllers.dependencies = _deployTags([
|
120
|
+
'InitializeUFarm',
|
121
|
+
'UniV2Controller',
|
122
|
+
'UniV3Controller',
|
123
|
+
'OneInchV5Controller',
|
124
|
+
])
|
125
|
+
whitelistControllers.tags = _deployTags(['WhitelistControllers'])
|
@@ -0,0 +1,82 @@
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
2
|
+
|
3
|
+
import { ArtifactData, DeployFunction } from 'hardhat-deploy/types'
|
4
|
+
import { HardhatRuntimeEnvironment } from 'hardhat/types'
|
5
|
+
import {
|
6
|
+
isTestnet,
|
7
|
+
getDeployerSigner,
|
8
|
+
getStaticConfig,
|
9
|
+
trySaveDeployment,
|
10
|
+
mockedAggregatorName,
|
11
|
+
_deployTags,
|
12
|
+
} from '../../../scripts/_deploy_helpers'
|
13
|
+
|
14
|
+
const prepareEnv: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
15
|
+
if (isTestnet(hre.network)) {
|
16
|
+
console.log('Skipping tokens parsing on testnet')
|
17
|
+
return
|
18
|
+
}
|
19
|
+
const deployerSigner = await getDeployerSigner(hre)
|
20
|
+
|
21
|
+
// prepare tokens
|
22
|
+
|
23
|
+
const staticConfig = await getStaticConfig()
|
24
|
+
|
25
|
+
const pendingTokens = staticConfig.tokens
|
26
|
+
|
27
|
+
for (const token of pendingTokens) {
|
28
|
+
const tokenRawName = token.ticker.toUpperCase()
|
29
|
+
|
30
|
+
await trySaveDeployment(
|
31
|
+
tokenRawName,
|
32
|
+
{
|
33
|
+
from: deployerSigner.address,
|
34
|
+
address: token.address_chain_42161,
|
35
|
+
contract: '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol:IERC20Metadata',
|
36
|
+
deploymentName: tokenRawName,
|
37
|
+
},
|
38
|
+
hre,
|
39
|
+
)
|
40
|
+
}
|
41
|
+
|
42
|
+
const pendingAggregators = staticConfig.oracles
|
43
|
+
|
44
|
+
for (const oracle of pendingAggregators) {
|
45
|
+
const oracleRawName = mockedAggregatorName(oracle.ticker, hre.network)
|
46
|
+
|
47
|
+
await trySaveDeployment(
|
48
|
+
oracleRawName,
|
49
|
+
{
|
50
|
+
from: deployerSigner.address,
|
51
|
+
address: oracle.address_chain_42161,
|
52
|
+
contract: 'AggregatorV2V3Interface',
|
53
|
+
deploymentName: oracleRawName,
|
54
|
+
},
|
55
|
+
hre,
|
56
|
+
)
|
57
|
+
}
|
58
|
+
|
59
|
+
const pendingProtocols = staticConfig.protocols
|
60
|
+
|
61
|
+
for (const protocol of pendingProtocols) {
|
62
|
+
const protocolRawName = protocol.name
|
63
|
+
|
64
|
+
await trySaveDeployment(
|
65
|
+
protocolRawName,
|
66
|
+
{
|
67
|
+
from: deployerSigner.address,
|
68
|
+
address: protocol.address_chain_42161,
|
69
|
+
contract: protocol.abi,
|
70
|
+
deploymentName: protocolRawName,
|
71
|
+
},
|
72
|
+
hre,
|
73
|
+
)
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
// export default prepareEnv
|
78
|
+
prepareEnv.dependencies = _deployTags([])
|
79
|
+
prepareEnv.tags = _deployTags(['PrepareEnvARB'])
|
80
|
+
export default prepareEnv
|
81
|
+
|
82
|
+
|