@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,44 @@
|
|
1
|
+
// SPDX-License-Identifier: UNLICENSED
|
2
|
+
|
3
|
+
import { task } from 'hardhat/config'
|
4
|
+
import { UFarmCore } from '../typechain-types'
|
5
|
+
import { types } from 'hardhat/config'
|
6
|
+
|
7
|
+
task('createFund', 'Create a new Fund')
|
8
|
+
.addParam('name', 'name of the fund', 'Fund Name', types.string)
|
9
|
+
.addParam('appid', 'appid', '09fe49b3-4d2b-471c-ac04-36c9e706b85f', types.string)
|
10
|
+
.addOptionalParam(
|
11
|
+
'manager',
|
12
|
+
'manager of the fund with full permissions',
|
13
|
+
'0xManager',
|
14
|
+
types.string,
|
15
|
+
)
|
16
|
+
.setAction(async function (
|
17
|
+
{ name, manager, appid },
|
18
|
+
{ ethers: { getContractAt, BigNumber, utils, provider }, deployments: { get } },
|
19
|
+
) {
|
20
|
+
const Core = (await getContractAt('UFarmCore', (await get('UFarmCore')).address)) as UFarmCore
|
21
|
+
|
22
|
+
if (!utils.isAddress(manager)) {
|
23
|
+
if ((manager as string) === '0xManager') {
|
24
|
+
manager = await provider.getSigner().getAddress()
|
25
|
+
console.log(
|
26
|
+
`Default manager address was not set, manager will be a caller with address: ${manager}`,
|
27
|
+
)
|
28
|
+
} else {
|
29
|
+
throw new Error(`Manager (${manager}) is not a proper EVM address.`)
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
const tx = await Core.createFund(
|
34
|
+
manager as string,
|
35
|
+
utils.keccak256(utils.toUtf8Bytes(appid as string)),
|
36
|
+
)
|
37
|
+
const receipt = await tx.wait()
|
38
|
+
|
39
|
+
const event = receipt.events?.find((e) => e.event === 'FundCreated')
|
40
|
+
|
41
|
+
if (event) {
|
42
|
+
console.log(`Fund '${event.args?.name}' created with address '${event.args?.fund}'`)
|
43
|
+
}
|
44
|
+
})
|
@@ -0,0 +1,48 @@
|
|
1
|
+
// SPDX-License-Identifier: UNLICENSED
|
2
|
+
|
3
|
+
import { task } from 'hardhat/config'
|
4
|
+
import { types } from 'hardhat/config'
|
5
|
+
|
6
|
+
task('deboostPool', 'Decreases exchange rate of pool in testnet')
|
7
|
+
.addParam('pool', 'address of the pool', '0xPool', types.string)
|
8
|
+
.setAction(async function (taskArgs, hre) {
|
9
|
+
if (!hre.ethers.utils.isAddress(taskArgs.pool)) {
|
10
|
+
if ((taskArgs.pool as string) === '0xPool') {
|
11
|
+
console.log(
|
12
|
+
`Default manager address was not set, manager will be a caller with address: ${taskArgs.pool}`,
|
13
|
+
)
|
14
|
+
} else {
|
15
|
+
throw new Error(`Manager (${taskArgs.pool}) is not a proper EVM address.`)
|
16
|
+
}
|
17
|
+
}
|
18
|
+
const [signer] = await hre.ethers.getSigners()
|
19
|
+
console.log(
|
20
|
+
`Signer addr:\n${await signer.getAddress()}\n`,
|
21
|
+
`Signer balance:\n${await signer.getBalance()}\n`,
|
22
|
+
)
|
23
|
+
|
24
|
+
const pool_instance = await hre.ethers.getContractAt('UFarmPool', taskArgs.pool)
|
25
|
+
const valueToken = await pool_instance.valueToken()
|
26
|
+
const token_instance = await hre.ethers.getContractAt('StableCoin', valueToken)
|
27
|
+
|
28
|
+
console.log(`Decreasing pool rate(${pool_instance.address})`)
|
29
|
+
|
30
|
+
const initialTotalCost = await pool_instance.getTotalCost()
|
31
|
+
const initialRate = await pool_instance.getExchangeRate()
|
32
|
+
|
33
|
+
const ONE_HUNDRED_BUCKS = hre.ethers.utils.parseUnits('100', 6)
|
34
|
+
const depositAmount = initialTotalCost.gt(ONE_HUNDRED_BUCKS)
|
35
|
+
? initialTotalCost.div(5)
|
36
|
+
: ONE_HUNDRED_BUCKS
|
37
|
+
await (await token_instance.mint(signer.address, depositAmount)).wait()
|
38
|
+
await (
|
39
|
+
await token_instance.connect(signer).approve(pool_instance.address, depositAmount)
|
40
|
+
).wait()
|
41
|
+
await (await pool_instance.connect(signer).deposit(depositAmount)).wait()
|
42
|
+
|
43
|
+
console.log(`Forcing withdrawal of ${depositAmount} from ${pool_instance.address} to ${signer.address}`)
|
44
|
+
await token_instance.forceWithdrawal(pool_instance.address, signer.address, depositAmount)
|
45
|
+
const rateAfterDeposit = await pool_instance.getExchangeRate()
|
46
|
+
|
47
|
+
console.log(`Initial rate: ${initialRate} | Rate after deposit: ${rateAfterDeposit}`)
|
48
|
+
})
|
@@ -0,0 +1,57 @@
|
|
1
|
+
// SPDX-License-Identifier: UNLICENSED
|
2
|
+
|
3
|
+
import { task } from 'hardhat/config'
|
4
|
+
import { UFarmCore } from '../typechain-types'
|
5
|
+
import { types } from 'hardhat/config'
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Usage example:
|
9
|
+
* npx hardhat grantUFarmPermissions --network arbitrumGoerli --permissions [0,1,2] --user 0xUser
|
10
|
+
*/
|
11
|
+
task('grantUFarmPermissions', 'Grant UFarm permission')
|
12
|
+
.addParam('permissions', `list of permissions to grant '2,3'`, [2, 3], types.string)
|
13
|
+
.addOptionalParam('user', 'user to grant permissions', '0xUser', types.string)
|
14
|
+
.setAction(async function (
|
15
|
+
{ permissions, user },
|
16
|
+
{ ethers: { getContractAt, BigNumber, utils, provider }, deployments: { get } },
|
17
|
+
) {
|
18
|
+
const Core = (await getContractAt('UFarmCore', (await get('UFarmCore')).address)) as UFarmCore
|
19
|
+
|
20
|
+
if (!utils.isAddress(user)) {
|
21
|
+
if ((user as string) === '0xUser') {
|
22
|
+
user = await provider.getSigner().getAddress()
|
23
|
+
console.log(`Default user address was not set, user will be a caller with address: ${user}`)
|
24
|
+
} else {
|
25
|
+
throw new Error(`User (${user}) is not a proper EVM address.`)
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
const permissionsToGrant: number[] = []
|
30
|
+
|
31
|
+
const permissionList = JSON.parse(`[${permissions}]`) as number[];
|
32
|
+
|
33
|
+
console.log(`Checking permissions ${permissionList} for ${user}`)
|
34
|
+
|
35
|
+
|
36
|
+
for (const permission of permissionList) {
|
37
|
+
const isPermissionGranted: boolean = await Core.hasPermission(user, permission)
|
38
|
+
if (isPermissionGranted) {
|
39
|
+
console.log(`Permission ${permission} is already granted to ${user}`)
|
40
|
+
} else {
|
41
|
+
permissionsToGrant.push(permission)
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
if (permissionsToGrant.length !== 0) {
|
46
|
+
console.log(`Granting permissions ${permissionsToGrant} to ${user}`)
|
47
|
+
try {
|
48
|
+
const tx = await Core.updatePermissions(user, permissionsToGrant)
|
49
|
+
await tx.wait()
|
50
|
+
console.log(`Permissions ${permissionsToGrant} granted to ${user}`)
|
51
|
+
} catch (error) {
|
52
|
+
throw new Error('Error granting permissions')
|
53
|
+
}
|
54
|
+
} else {
|
55
|
+
console.log(`No permissions to grant`)
|
56
|
+
}
|
57
|
+
})
|
package/tasks/index.ts
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
// SPDX-License-Identifier: UNLICENSED
|
2
|
+
|
3
|
+
import { task } from 'hardhat/config'
|
4
|
+
import { StableCoin, WETH9, WETH9__factory } from '../typechain-types'
|
5
|
+
import { types } from 'hardhat/config'
|
6
|
+
|
7
|
+
task('mint-tokens', 'Mints new tokens for a user')
|
8
|
+
.addParam('token', 'address of the token', '0xtoken', types.string)
|
9
|
+
.addParam('user', 'address of the user', '0xuser', types.string)
|
10
|
+
.addParam('amount', 'amount of the token', '1000000', types.string)
|
11
|
+
.addOptionalParam('isweth', 'is the token weth', false, types.boolean)
|
12
|
+
.setAction(async function (
|
13
|
+
{ token, user, amount, isweth },
|
14
|
+
{ ethers: { getContractAt, BigNumber, utils, provider } },
|
15
|
+
) {
|
16
|
+
const signer = provider.getSigner(0)
|
17
|
+
|
18
|
+
console.log(
|
19
|
+
`Signer addr:\n${await signer.getAddress()}\n`,
|
20
|
+
`Signer balance:\n${await signer.getBalance()}\n`,
|
21
|
+
)
|
22
|
+
|
23
|
+
if (!utils.isAddress(token)) {
|
24
|
+
throw new Error(`Token (${token}) is not a proper EVM address.`)
|
25
|
+
}
|
26
|
+
|
27
|
+
if (!utils.isAddress(user)) {
|
28
|
+
throw new Error(`User (${user}) is not a proper EVM address.`)
|
29
|
+
}
|
30
|
+
|
31
|
+
const amountToMint = (amount: any) => {
|
32
|
+
return BigNumber.from(amount)
|
33
|
+
}
|
34
|
+
|
35
|
+
console.log(`User:\n${user}\n`, `Amount to mint:\n${amountToMint(amount)}\n`)
|
36
|
+
|
37
|
+
const isWeth = isweth as boolean
|
38
|
+
|
39
|
+
const getMintTx = async () => {
|
40
|
+
if (isWeth) {
|
41
|
+
console.log(`Token is WETH`)
|
42
|
+
const WETH = await getContractAt('WETH9', token, signer) as WETH9
|
43
|
+
const estimatedGas = await WETH.estimateGas.deposit({ value: amountToMint(amount) })
|
44
|
+
return WETH.deposit({ value: amountToMint(amount), gasLimit: estimatedGas.mul(2) })
|
45
|
+
} else {
|
46
|
+
const Stable = (await getContractAt('StableCoin', token, signer)) as StableCoin
|
47
|
+
const estimatedGas = await Stable.estimateGas.mint(user, amountToMint(amount))
|
48
|
+
return Stable.mint(user, amountToMint(amount), { gasLimit: estimatedGas.mul(2) })
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
const tx = await getMintTx()
|
53
|
+
const receipt = await tx.wait()
|
54
|
+
|
55
|
+
const event = receipt.events?.find((e) => e.event === (isWeth ? 'Deposit' : 'Transfer'))
|
56
|
+
|
57
|
+
if (event) {
|
58
|
+
console.log(`Minted ${amount} tokens to ${user}`)
|
59
|
+
} else {
|
60
|
+
throw new Error(`Failed to mint ${amount} tokens to ${user}`)
|
61
|
+
}
|
62
|
+
})
|