@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.
Files changed (127) hide show
  1. package/.docker/Dockerfile +17 -0
  2. package/.dockerignore +7 -0
  3. package/.env.sample +24 -0
  4. package/.gitlab-ci.yml +51 -0
  5. package/.gitmodules +15 -0
  6. package/.prettierrc +10 -0
  7. package/.solcover.js +4 -0
  8. package/.vscode/settings.json +23 -0
  9. package/LICENSE.MD +51 -0
  10. package/README.md +135 -0
  11. package/contracts/arbitrum/contracts/controllers/UniswapV2ControllerArbitrum.sol +37 -0
  12. package/contracts/arbitrum/contracts/controllers/UniswapV3ControllerArbitrum.sol +46 -0
  13. package/contracts/arbitrum/contracts/oracle/PriceOracleArbitrum.sol +51 -0
  14. package/contracts/main/contracts/controllers/Controller.sol +61 -0
  15. package/contracts/main/contracts/controllers/IController.sol +81 -0
  16. package/contracts/main/contracts/controllers/OneInchV5Controller.sol +332 -0
  17. package/contracts/main/contracts/controllers/UnoswapV2Controller.sol +789 -0
  18. package/contracts/main/contracts/controllers/UnoswapV3Controller.sol +1018 -0
  19. package/contracts/main/contracts/core/CoreWhitelist.sol +192 -0
  20. package/contracts/main/contracts/core/ICoreWhitelist.sol +92 -0
  21. package/contracts/main/contracts/core/IUFarmCore.sol +95 -0
  22. package/contracts/main/contracts/core/UFarmCore.sol +402 -0
  23. package/contracts/main/contracts/fund/FundFactory.sol +59 -0
  24. package/contracts/main/contracts/fund/IUFarmFund.sol +68 -0
  25. package/contracts/main/contracts/fund/UFarmFund.sol +504 -0
  26. package/contracts/main/contracts/oracle/ChainlinkedOracle.sol +71 -0
  27. package/contracts/main/contracts/oracle/IChainlinkAggregator.sol +18 -0
  28. package/contracts/main/contracts/oracle/IPriceOracle.sol +55 -0
  29. package/contracts/main/contracts/oracle/PriceOracle.sol +20 -0
  30. package/contracts/main/contracts/oracle/PriceOracleCore.sol +212 -0
  31. package/contracts/main/contracts/oracle/WstETHOracle.sol +64 -0
  32. package/contracts/main/contracts/permissions/Permissions.sol +54 -0
  33. package/contracts/main/contracts/permissions/UFarmPermissionsModel.sol +136 -0
  34. package/contracts/main/contracts/pool/IPoolAdmin.sol +57 -0
  35. package/contracts/main/contracts/pool/IUFarmPool.sol +304 -0
  36. package/contracts/main/contracts/pool/PerformanceFeeLib.sol +81 -0
  37. package/contracts/main/contracts/pool/PoolAdmin.sol +437 -0
  38. package/contracts/main/contracts/pool/PoolFactory.sol +74 -0
  39. package/contracts/main/contracts/pool/PoolWhitelist.sol +70 -0
  40. package/contracts/main/contracts/pool/UFarmPool.sol +959 -0
  41. package/contracts/main/shared/AssetController.sol +194 -0
  42. package/contracts/main/shared/ECDSARecover.sol +91 -0
  43. package/contracts/main/shared/NZGuard.sol +99 -0
  44. package/contracts/main/shared/SafeOPS.sol +128 -0
  45. package/contracts/main/shared/UFarmCoreLink.sol +83 -0
  46. package/contracts/main/shared/UFarmErrors.sol +16 -0
  47. package/contracts/main/shared/UFarmMathLib.sol +80 -0
  48. package/contracts/main/shared/UFarmOwnableUUPS.sol +59 -0
  49. package/contracts/main/shared/UFarmOwnableUUPSBeacon.sol +34 -0
  50. package/contracts/test/Block.sol +15 -0
  51. package/contracts/test/InchSwapTestProxy.sol +292 -0
  52. package/contracts/test/MockPoolAdmin.sol +8 -0
  53. package/contracts/test/MockUFarmPool.sol +8 -0
  54. package/contracts/test/MockV3wstETHstETHAgg.sol +128 -0
  55. package/contracts/test/MockedWETH9.sol +72 -0
  56. package/contracts/test/OneInchToUFarmTestEnv.sol +466 -0
  57. package/contracts/test/StableCoin.sol +25 -0
  58. package/contracts/test/UFarmMockSequencerUptimeFeed.sol +44 -0
  59. package/contracts/test/UFarmMockV3Aggregator.sol +145 -0
  60. package/contracts/test/UUPSBlock.sol +19 -0
  61. package/contracts/test/ufarmLocal/MulticallV3.sol +220 -0
  62. package/contracts/test/ufarmLocal/controllers/UniswapV2ControllerUFarm.sol +27 -0
  63. package/contracts/test/ufarmLocal/controllers/UniswapV3ControllerUFarm.sol +43 -0
  64. package/deploy/100_test_env_setup.ts +483 -0
  65. package/deploy/20_deploy_uniV2.ts +48 -0
  66. package/deploy/21_create_pairs_uniV2.ts +149 -0
  67. package/deploy/22_deploy_mocked_aggregators.ts +123 -0
  68. package/deploy/22_deploy_wsteth_oracle.ts +65 -0
  69. package/deploy/23_deploy_uniV3.ts +80 -0
  70. package/deploy/24_create_pairs_uniV3.ts +140 -0
  71. package/deploy/25_deploy_oneInch.ts +38 -0
  72. package/deploy/2_deploy_multicall.ts +34 -0
  73. package/deploy/30_deploy_price_oracle.ts +33 -0
  74. package/deploy/3_deploy_lido.ts +114 -0
  75. package/deploy/40_deploy_pool_beacon.ts +19 -0
  76. package/deploy/41_deploy_poolAdmin_beacon.ts +19 -0
  77. package/deploy/42_deploy_ufarmcore.ts +29 -0
  78. package/deploy/43_deploy_fund_beacon.ts +19 -0
  79. package/deploy/4_deploy_tokens.ts +76 -0
  80. package/deploy/50_deploy_poolFactory.ts +35 -0
  81. package/deploy/51_deploy_fundFactory.ts +29 -0
  82. package/deploy/60_init_contracts.ts +101 -0
  83. package/deploy/61_whitelist_tokens.ts +18 -0
  84. package/deploy/70_deploy_uniV2Controller.ts +70 -0
  85. package/deploy/71_deploy_uniV3Controller.ts +67 -0
  86. package/deploy/72_deploy_oneInchController.ts +25 -0
  87. package/deploy/79_whitelist_controllers.ts +125 -0
  88. package/deploy/ufarm/arbitrum/1_prepare_env.ts +82 -0
  89. package/deploy/ufarm/arbitrum/2_deploy_ufarm.ts +178 -0
  90. package/deploy/ufarm/arbitrum-sepolia/1000_prepare_arb_sepolia_env.ts +308 -0
  91. package/deploy-config.json +112 -0
  92. package/deploy-data/oracles.csv +32 -0
  93. package/deploy-data/protocols.csv +10 -0
  94. package/deploy-data/tokens.csv +32 -0
  95. package/docker-compose.yml +67 -0
  96. package/hardhat.config.ts +449 -0
  97. package/index.js +93 -0
  98. package/package.json +82 -0
  99. package/scripts/_deploy_helpers.ts +992 -0
  100. package/scripts/_deploy_network_options.ts +49 -0
  101. package/scripts/activatePool.ts +51 -0
  102. package/scripts/createPool.ts +62 -0
  103. package/scripts/deploy_1inch_proxy.ts +98 -0
  104. package/scripts/pool-data.ts +420 -0
  105. package/scripts/post-deploy.sh +24 -0
  106. package/scripts/setUniV2Rate.ts +252 -0
  107. package/scripts/swapOneInchV5.ts +94 -0
  108. package/scripts/swapUniswapV2.ts +65 -0
  109. package/scripts/swapUniswapV3.ts +71 -0
  110. package/scripts/test.ts +61 -0
  111. package/scripts/typings-copy-artifacts.ts +83 -0
  112. package/tasks/boostPool.ts +39 -0
  113. package/tasks/createFund.ts +44 -0
  114. package/tasks/deboostPool.ts +48 -0
  115. package/tasks/grantUFarmPermissions.ts +57 -0
  116. package/tasks/index.ts +7 -0
  117. package/tasks/mintUSDT.ts +62 -0
  118. package/test/Periphery.test.ts +640 -0
  119. package/test/PriceOracle.test.ts +82 -0
  120. package/test/TestCases.MD +109 -0
  121. package/test/UFarmCore.test.ts +331 -0
  122. package/test/UFarmFund.test.ts +406 -0
  123. package/test/UFarmPool.test.ts +4736 -0
  124. package/test/_fixtures.ts +783 -0
  125. package/test/_helpers.ts +2195 -0
  126. package/test/_oneInchTestData.ts +632 -0
  127. 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,7 @@
1
+ // SPDX-License-Identifier: UNLICENSED
2
+
3
+ import './createFund'
4
+ import './grantUFarmPermissions'
5
+ import './mintUSDT'
6
+ import './boostPool'
7
+ import './deboostPool'
@@ -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
+ })