@harvest-finance/harvest-strategy-polygon 0.0.1-security → 1.0.0
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.
Potentially problematic release.
This version of @harvest-finance/harvest-strategy-polygon might be problematic. Click here for more details.
- package/README.md +110 -5
- package/contracts/base/Controller.sol +125 -0
- package/contracts/base/ControllerV2.sol +363 -0
- package/contracts/base/FeeRewardForwarder.sol +163 -0
- package/contracts/base/PotPool.sol +360 -0
- package/contracts/base/ProfitSharingReceiver.sol +39 -0
- package/contracts/base/RewardForwarderV2.sol +109 -0
- package/contracts/base/Vault.sol +344 -0
- package/contracts/base/VaultERC4626.sol +113 -0
- package/contracts/base/VaultProxy.sol +35 -0
- package/contracts/base/VaultStorage.sol +199 -0
- package/contracts/base/VaultStorageV2.sol +196 -0
- package/contracts/base/VaultV2.sol +369 -0
- package/contracts/base/ape-base/MiniApeV2Strategy.sol +322 -0
- package/contracts/base/ape-base/interface/IMiniChefV2.sol +31 -0
- package/contracts/base/ape-base/interface/IRewarder.sol +10 -0
- package/contracts/base/factory/MegaFactory.sol +120 -0
- package/contracts/base/factory/interface/IPoolFactory.sol +6 -0
- package/contracts/base/factory/interface/IStrategyFactory.sol +6 -0
- package/contracts/base/factory/interface/IVaultFactory.sol +7 -0
- package/contracts/base/factory/pool/PotPoolFactory.sol +43 -0
- package/contracts/base/factory/strategy/UpgradableStrategyFactory.sol +19 -0
- package/contracts/base/factory/vault/RegularVaultFactory.sol +34 -0
- package/contracts/base/incentives/GlobalIncentivesHelper.sol +167 -0
- package/contracts/base/incentives/NotifyHelperGeneric.sol +61 -0
- package/contracts/base/incentives/NotifyHelperStateful.sol +290 -0
- package/contracts/base/inheritance/Controllable.sol +26 -0
- package/contracts/base/inheritance/ControllableInit.sol +31 -0
- package/contracts/base/inheritance/Governable.sol +29 -0
- package/contracts/base/inheritance/GovernableInit.sol +51 -0
- package/contracts/base/inheritance/IUpgradeSource.sol +8 -0
- package/contracts/base/inheritance/OwnableWhitelist.sol +17 -0
- package/contracts/base/inheritance/RewardTokenProfitNotifier.sol +48 -0
- package/contracts/base/inheritance/Storage.sol +36 -0
- package/contracts/base/interface/IController.sol +30 -0
- package/contracts/base/interface/IControllerV2.sol +135 -0
- package/contracts/base/interface/IERC4626.sol +263 -0
- package/contracts/base/interface/IFeeRewardForwarder.sol +9 -0
- package/contracts/base/interface/IProfitSharingReceiver.sol +10 -0
- package/contracts/base/interface/IRewardForwarder.sol +58 -0
- package/contracts/base/interface/IRewardPool.sol +34 -0
- package/contracts/base/interface/IStrategy.sol +25 -0
- package/contracts/base/interface/IUniversalLiquidator.sol +21 -0
- package/contracts/base/interface/IUniversalLiquidatorRegistry.sol +20 -0
- package/contracts/base/interface/IUpgradeSource.sol +8 -0
- package/contracts/base/interface/IVault.sol +35 -0
- package/contracts/base/interface/aave/DataTypes.sol +266 -0
- package/contracts/base/interface/aave/IAToken.sol +37 -0
- package/contracts/base/interface/aave/IPool.sol +13 -0
- package/contracts/base/interface/balancer/Gauge.sol +22 -0
- package/contracts/base/interface/balancer/IBVault.sol +557 -0
- package/contracts/base/interface/balancer/IBalancerMinter.sol +114 -0
- package/contracts/base/interface/balancer/linearPool/ILinearPool.sol +185 -0
- package/contracts/base/interface/balancer/linearPool/ILinearPoolFactory.sol +16 -0
- package/contracts/base/interface/balancer/linearPool/ILinearPoolRebalancer.sol +8 -0
- package/contracts/base/interface/balancer/linearPool/IPoolSwapStructs.sol +57 -0
- package/contracts/base/interface/caviar/ICaviarChef.sol +16 -0
- package/contracts/base/interface/compound/IComet.sol +114 -0
- package/contracts/base/interface/compound/ICometRewards.sol +17 -0
- package/contracts/base/interface/curve/Gauge.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_2token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_2token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_3token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_3token_meta.sol +20 -0
- package/contracts/base/interface/curve/ICurveDeposit_3token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_4token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_4token_meta.sol +20 -0
- package/contracts/base/interface/curve/ICurveDeposit_4token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_5token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_5token_meta.sol +20 -0
- package/contracts/base/interface/curve/ICurveDeposit_5token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_6token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_6token_meta.sol +20 -0
- package/contracts/base/interface/gamma/IClearing.sol +8 -0
- package/contracts/base/interface/gamma/IHypervisor.sol +17 -0
- package/contracts/base/interface/gamma/IStakingRewards.sol +35 -0
- package/contracts/base/interface/gamma/IUniProxy.sol +15 -0
- package/contracts/base/interface/kyber/IDMMExchangeRouter.sol +69 -0
- package/contracts/base/interface/kyber/IDMMFactory.sol +35 -0
- package/contracts/base/interface/kyber/IDMMLiquidityRouter.sol +204 -0
- package/contracts/base/interface/kyber/IDMMPool.sol +42 -0
- package/contracts/base/interface/kyber/IDMMRouter01.sol +12 -0
- package/contracts/base/interface/kyber/IDMMRouter02.sol +55 -0
- package/contracts/base/interface/kyber/IKyberZap.sol +7 -0
- package/contracts/base/interface/merkl/IDistributor.sol +6 -0
- package/contracts/base/interface/morpho/IMetaMorpho.sol +7 -0
- package/contracts/base/interface/pearl/IGauge.sol +13 -0
- package/contracts/base/interface/pearl/IPair.sol +44 -0
- package/contracts/base/interface/pearl/IRouter.sol +305 -0
- package/contracts/base/interface/quickswap/IDragonLair.sol +25 -0
- package/contracts/base/interface/quickswap/IMasterChef.sol +13 -0
- package/contracts/base/interface/uniswap/IUniswapV2Factory.sol +15 -0
- package/contracts/base/interface/uniswap/IUniswapV2Migrator.sol +6 -0
- package/contracts/base/interface/uniswap/IUniswapV2Pair.sol +59 -0
- package/contracts/base/interface/uniswap/IUniswapV2Router01.sol +96 -0
- package/contracts/base/interface/uniswap/IUniswapV2Router02.sol +137 -0
- package/contracts/base/interface/uniswap/IUniswapV3Pool.sol +24 -0
- package/contracts/base/interface/uniswap/IUniswapV3Router.sol +64 -0
- package/contracts/base/interface/uniswap/IWETH.sol +8 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolActions.sol +103 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolDerivedState.sol +40 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolEvents.sol +121 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolImmutables.sol +35 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolOwnerActions.sol +23 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolState.sol +116 -0
- package/contracts/base/masterchef-base/MasterChefHodlStrategy.sol +240 -0
- package/contracts/base/masterchef-base/MasterChefStrategy.sol +364 -0
- package/contracts/base/masterchef-base/interfaces/IMasterChef.sol +12 -0
- package/contracts/base/migration/vaultMigratable_2JPYv2.sol +87 -0
- package/contracts/base/migration/vaultMigratable_bal2EUR_PAR.sol +121 -0
- package/contracts/base/migration/vaultMigratable_bal2EUR_agEUR.sol +121 -0
- package/contracts/base/migration/vaultMigratable_balMaticX.sol +153 -0
- package/contracts/base/migration/vaultMigratable_balStMatic.sol +153 -0
- package/contracts/base/noop/NoopStrategy.sol +89 -0
- package/contracts/base/noop/NoopStrategyUpgradeable.sol +92 -0
- package/contracts/base/sushi-base/MiniChefV2Strategy.sol +380 -0
- package/contracts/base/sushi-base/interface/IMiniChefV2.sol +31 -0
- package/contracts/base/sushi-base/interface/IRewarder.sol +9 -0
- package/contracts/base/sushi-base/lib/BoringERC20.sol +30 -0
- package/contracts/base/upgradability/Address.sol +33 -0
- package/contracts/base/upgradability/BaseUpgradeabilityProxy.sol +61 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategy.sol +111 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategyStorage.sol +176 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategyStorageV2.sol +290 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategyV2.sol +145 -0
- package/contracts/base/upgradability/IUpgradable.sol +7 -0
- package/contracts/base/upgradability/Proxy.sol +71 -0
- package/contracts/base/upgradability/ReentrancyGuard.sol +57 -0
- package/contracts/base/upgradability/ReentrancyGuardUpgradeable.sol +51 -0
- package/contracts/base/upgradability/StrategyProxy.sol +35 -0
- package/contracts/base/wmatic/WMATIC.sol +8 -0
- package/contracts/strategies/aave/AaveSupplyStrategy.sol +213 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_DAI.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_EURS.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDC.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDCe.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDT.sol +23 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_BANANA_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_BNB_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_BTC_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_DAI_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_DAI_USDC.sol +37 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_ETH_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_USDT_MATIC.sol +36 -0
- package/contracts/strategies/aura/AuraStrategy.sol +347 -0
- package/contracts/strategies/aura/AuraStrategyMainnet_jEUR_PAR.sol +30 -0
- package/contracts/strategies/aura/interface/IAuraBaseRewardPool.sol +25 -0
- package/contracts/strategies/aura/interface/IAuraBooster.sol +17 -0
- package/contracts/strategies/aura/interface/IAuraDepositor.sol +7 -0
- package/contracts/strategies/balancer/BalancerStrategyV3.sol +509 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2BRL.sol +39 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2BRLUSD.sol +38 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_PAR.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_PARv2.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_agEUR.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MATIC_USDC_ETH_BAL.sol +32 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MaticX.sol +37 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MaticX_amMatic.sol +38 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_SPHERE_MATIC.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_TNGBL_USDC.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_WBTC_ETH_USDC.sol +32 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_bbamusd.sol +36 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_frxETH.sol +32 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_frxETH_amWETH.sol +35 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stETH.sol +35 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stMatic.sol +36 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stMatic_amMatic.sol +39 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_tetuBal.sol +36 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_wUSDR_USDC.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_wstETH_amWETH.sol +37 -0
- package/contracts/strategies/balancer/interface/Gauge.sol +26 -0
- package/contracts/strategies/balancer/interface/IBVault.sol +557 -0
- package/contracts/strategies/balancer/interface/IBalanceMinter.sol +114 -0
- package/contracts/strategies/complifi/ComplifiDerivStrategy.sol +381 -0
- package/contracts/strategies/complifi/ComplifiDerivStrategyMainnet_ETH5x.sol +35 -0
- package/contracts/strategies/complifi/ComplifiStrategy.sol +362 -0
- package/contracts/strategies/complifi/ComplifiStrategyMainnet_COMFI_WETH.sol +34 -0
- package/contracts/strategies/complifi/interfaces/ILiquidityMining.sol +13 -0
- package/contracts/strategies/complifi/interfaces/ILiquidityPool.sol +63 -0
- package/contracts/strategies/complifi/interfaces/IProxyActions.sol +10 -0
- package/contracts/strategies/complifi/interfaces/IUSDCVault.sol +55 -0
- package/contracts/strategies/compound/CompoundStrategy.sol +296 -0
- package/contracts/strategies/compound/CompoundStrategyMainnet_USDC.sol +28 -0
- package/contracts/strategies/compound/CompoundStrategyMainnet_USDT.sol +28 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategy.sol +292 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_ETH.sol +27 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_USDC.sol +27 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_USDT.sol +27 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_3CRV.sol +40 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_3CRYPTO.sol +37 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_CRV_3CRYPTO copy.sol +37 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_MATIC_3CRYPTO.sol +37 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_USDR.sol +40 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_aCRV.sol +38 -0
- package/contracts/strategies/convex/base/ConvexStrategy.sol +480 -0
- package/contracts/strategies/convex/interface/IBaseRewardPool.sol +13 -0
- package/contracts/strategies/convex/interface/IBooster.sol +10 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategy.sol +272 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_ETH_USDC.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_ETH_USDT.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_MATIC_USDT.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_TBTC_ETH.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_WBTC_ETH_w.sol +25 -0
- package/contracts/strategies/genomes/NoopStrategy_GENE_ETH.sol +23 -0
- package/contracts/strategies/genomes/NoopStrategy_GNOME_ETH.sol +23 -0
- package/contracts/strategies/idle/IdleFinanceStrategy.sol +240 -0
- package/contracts/strategies/idle/IdleStrategyDAIMainnet.sol +33 -0
- package/contracts/strategies/idle/IdleStrategyUSDCMainnet.sol +33 -0
- package/contracts/strategies/idle/IdleStrategyWETHMainnet.sol +30 -0
- package/contracts/strategies/idle/interface/IdleToken.sol +58 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3.sol +351 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2CAD.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_EURT.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_EURe.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_PAR.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2JPY.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2JPYv2.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2NZD.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2SGD.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jCHF_USDC.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jCHF_WETH.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jEUR_USDC.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jEUR_WETH.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jGBP_USDC.sol +35 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3.sol +281 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_AUR3_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_AURJUL22_WETH.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN2_4EUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN3_4EUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN4_4EUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTANGLENOV22_2EURagEUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTANGLE_2EURagEUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTJUL22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMAY22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMIMONOV22_2EURPAR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMIMO_2EURPAR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTNOV22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTSEP22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_QUI_2CAD.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_SES_2JPY.sol +28 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_agDEN_2EUR.sol +27 -0
- package/contracts/strategies/jarvis/interface/IElysianFields.sol +11 -0
- package/contracts/strategies/jarvis/interface/IKyberFairLaunch.sol +13 -0
- package/contracts/strategies/jarvis/interface/IKyberRewardLocker.sol +9 -0
- package/contracts/strategies/meshswap/MeshswapStrategy.sol +304 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_MESH_oMOOI.sol +30 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_MESH_oZEMIT.sol +30 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_USDC_oUSDC.sol +31 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_USDT_oUSDT.sol +31 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_MESH.sol +27 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_USDC.sol +28 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_USDT.sol +28 -0
- package/contracts/strategies/meshswap/interface/IExchange.sol +9 -0
- package/contracts/strategies/meshswap/interface/IRouter.sol +68 -0
- package/contracts/strategies/pearl/CaviarStrategy.sol +244 -0
- package/contracts/strategies/pearl/CaviarStrategyMainnet_CVR.sol +26 -0
- package/contracts/strategies/pearl/PearlHodlStrategy.sol +254 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_CVR_PEARL.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_DAI_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_ETH_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_MATIC_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_PEARL_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_STAR_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_TNGBL_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_USDC_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_USDT_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_WBTC_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_wUSDR_USDR.sol +27 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategy.sol +400 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_ETH_narrow.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_ETH_wide.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_USDC_narrow.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_USDC_wide.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_USDC_ETH_narrow.sol +34 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_USDC_ETH_wide.sol +34 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2.sol +348 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_USDC_DAI.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_USDC_USDT.sol +29 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_WBTC_ETH_narrow.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_WBTC_USDC_narrow.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_cbETH_ETH.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_wstETH_ETH.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategy.sol +312 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_DAI.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_USDT.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_WETH.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_WMATIC_USDC.sol +28 -0
- package/contracts/strategies/yel/YelStrategy.sol +350 -0
- package/contracts/strategies/yel/YelStrategyMainnet_YEL_WETH.sol +29 -0
- package/hardhat.config.js +58 -0
- package/index.js +42 -0
- package/package.json +56 -6
- package/scripts/01-deploy-vault-regular-with-upgradable-strategy.js +41 -0
- package/scripts/02-deploy-vault-regular.js +35 -0
- package/scripts/03-deploy-upgradable-strategy.js +34 -0
- package/scripts/04-deploy-new-implementation.js +24 -0
- package/scripts/README.md +55 -0
- package/scripts/utils.js +42 -0
- package/test/aave/dai.js +207 -0
- package/test/aave/eurs.js +207 -0
- package/test/aave/usdc.js +206 -0
- package/test/aave/usdce.js +206 -0
- package/test/aave/usdt.js +206 -0
- package/test/ape/banana-matic.js +157 -0
- package/test/ape/bnb-matic.js +159 -0
- package/test/ape/btc-matic.js +159 -0
- package/test/ape/dai-matic.js +159 -0
- package/test/ape/dai-usdc.js +163 -0
- package/test/ape/eth-matic.js +158 -0
- package/test/ape/usdt-matic.js +159 -0
- package/test/aura/jeur-par.js +135 -0
- package/test/balancer/2brl_v3.js +123 -0
- package/test/balancer/2brlusd_v3.js +123 -0
- package/test/balancer/2eur_ageur.js +141 -0
- package/test/balancer/2eur_par.js +141 -0
- package/test/balancer/2eur_par_v2.js +123 -0
- package/test/balancer/bbamusd_v3.js +124 -0
- package/test/balancer/btc.js +131 -0
- package/test/balancer/frxETH.js +123 -0
- package/test/balancer/frxeth_amweth.js +123 -0
- package/test/balancer/matic_usdc_eth_bal.js +123 -0
- package/test/balancer/maticx_ammatic.js +123 -0
- package/test/balancer/maticx_v2.js +120 -0
- package/test/balancer/maticx_v3.js +141 -0
- package/test/balancer/polybase.js +131 -0
- package/test/balancer/polybase_v2.js +121 -0
- package/test/balancer/polydefi.js +131 -0
- package/test/balancer/polydefi2.js +131 -0
- package/test/balancer/qipool.js +136 -0
- package/test/balancer/sphere_matic.js +123 -0
- package/test/balancer/stETH.js +123 -0
- package/test/balancer/stable.js +131 -0
- package/test/balancer/stable_v2.js +121 -0
- package/test/balancer/stmatic_ammatic.js +123 -0
- package/test/balancer/stmatic_v2.js +120 -0
- package/test/balancer/stmatic_v3.js +141 -0
- package/test/balancer/tetubal_v3.js +123 -0
- package/test/balancer/tngbl_usdc.js +123 -0
- package/test/balancer/tricrypto.js +131 -0
- package/test/balancer/tusd_stable.js +142 -0
- package/test/balancer/usdc_weth.js +136 -0
- package/test/balancer/usdc_weth_v2.js +123 -0
- package/test/balancer/wbtc_eth_usdc.js +123 -0
- package/test/balancer/wbtc_weth.js +136 -0
- package/test/balancer/wsteth_amweth.js +123 -0
- package/test/balancer/wusdr_usdc.js +123 -0
- package/test/compound/usdc.js +127 -0
- package/test/compound/usdt.js +129 -0
- package/test/compound-blue/eth.js +136 -0
- package/test/compound-blue/usdc.js +136 -0
- package/test/compound-blue/usdt.js +136 -0
- package/test/convex/3crv.js +123 -0
- package/test/convex/3crypto.js +123 -0
- package/test/convex/acrv.js +123 -0
- package/test/convex/crv_3crypto.js +123 -0
- package/test/convex/matic_3crypto.js +123 -0
- package/test/convex/usdr.js +123 -0
- package/test/core/emission-fork.js +197 -0
- package/test/core/emission.js +209 -0
- package/test/core/vault_upgrade.js +129 -0
- package/test/curve/aave.js +132 -0
- package/test/curve/atricrypto3.js +135 -0
- package/test/curve/eurtusd.js +135 -0
- package/test/gamma-merkl/qs-eth-usdc.js +212 -0
- package/test/gamma-merkl/qs-eth-usdt.js +213 -0
- package/test/gamma-merkl/qs-matic-usdt.js +213 -0
- package/test/gamma-merkl/qs-tbtc-eth.js +213 -0
- package/test/gamma-merkl/qs-wbtc-eth-w.js +213 -0
- package/test/genomes/gene-eth.js +115 -0
- package/test/genomes/gnome-eth.js +115 -0
- package/test/idle/dai.js +129 -0
- package/test/idle/usdc.js +128 -0
- package/test/idle/weth.js +128 -0
- package/test/jarvis/2cad-hodl.js +183 -0
- package/test/jarvis/2cad-update-nov22.js +182 -0
- package/test/jarvis/2cad-update.js +177 -0
- package/test/jarvis/2cad-update2.js +182 -0
- package/test/jarvis/2cad-update3.js +182 -0
- package/test/jarvis/2eur-ageur-update-nov22.js +182 -0
- package/test/jarvis/2eur-ageur-update.js +182 -0
- package/test/jarvis/2eur-eure-hodl.js +176 -0
- package/test/jarvis/2eur-eurt-hodl.js +176 -0
- package/test/jarvis/2eur-eurt-update-nov22.js +182 -0
- package/test/jarvis/2eur-hodl.js +176 -0
- package/test/jarvis/2eur-par-hodl.js +176 -0
- package/test/jarvis/2eur-par-update-nov22.js +182 -0
- package/test/jarvis/2jpy-hodl.js +244 -0
- package/test/jarvis/2jpy-update-nov22.js +182 -0
- package/test/jarvis/2jpy-update.js +177 -0
- package/test/jarvis/2jpy-update2.js +182 -0
- package/test/jarvis/2jpyv2-upgrade.js +184 -0
- package/test/jarvis/2nzd-hodl.js +176 -0
- package/test/jarvis/2nzd-update.js +182 -0
- package/test/jarvis/2sgd-hodl.js +176 -0
- package/test/jarvis/2sgd-update-nov22.js +182 -0
- package/test/jarvis/2sgd-update.js +182 -0
- package/test/jarvis/2sgd-update2.js +182 -0
- package/test/jarvis/4eur-hodl-upgrade.js +177 -0
- package/test/jarvis/4eur-hodl.js +183 -0
- package/test/jarvis/4eur-update.js +181 -0
- package/test/jarvis/4eur-update2.js +181 -0
- package/test/jarvis/agden-2eur.js +222 -0
- package/test/jarvis/aur-usdc-v2.js +115 -0
- package/test/jarvis/aur-usdc.js +127 -0
- package/test/jarvis/aur3-usdc.js +115 -0
- package/test/jarvis/aurjul22-weth.js +222 -0
- package/test/jarvis/den-4eur.js +115 -0
- package/test/jarvis/den2-4eur.js +220 -0
- package/test/jarvis/den3-4eur.js +220 -0
- package/test/jarvis/den4-4eur.js +220 -0
- package/test/jarvis/jchf-usdc-hodl-v2.js +184 -0
- package/test/jarvis/jchf-usdc-hodl-v3.js +178 -0
- package/test/jarvis/jchf-usdc-hodl.js +193 -0
- package/test/jarvis/jchf-weth-hodl.js +176 -0
- package/test/jarvis/jeur-usdc-hodl-v2.js +184 -0
- package/test/jarvis/jeur-usdc-hodl-v3.js +178 -0
- package/test/jarvis/jeur-usdc-hodl.js +193 -0
- package/test/jarvis/jeur-weth-hodl.js +176 -0
- package/test/jarvis/jgbp-usdc-hodl-v2.js +184 -0
- package/test/jarvis/jgbp-usdc-hodl-v3.js +178 -0
- package/test/jarvis/jgbp-usdc-hodl.js +193 -0
- package/test/jarvis/jrtangle-2eurageur.js +220 -0
- package/test/jarvis/jrtanglenov22-2eurageur.js +220 -0
- package/test/jarvis/jrtjul22-usdc.js +115 -0
- package/test/jarvis/jrtmay22-usdc.js +115 -0
- package/test/jarvis/jrtmimo-2eurpar.js +220 -0
- package/test/jarvis/jrtmimonov22-2eurpar.js +220 -0
- package/test/jarvis/jrtnov22-usdc.js +220 -0
- package/test/jarvis/jrtsep22-usdc.js +220 -0
- package/test/jarvis/qui-2cad.js +218 -0
- package/test/jarvis/ses-2jpy.js +222 -0
- package/test/meshswap/mesh-omooi.js +197 -0
- package/test/meshswap/mesh-ozemit.js +197 -0
- package/test/meshswap/usdc-ousdc.js +197 -0
- package/test/meshswap/usdt-ousdt.js +197 -0
- package/test/meshswap/wmatic-mesh.js +197 -0
- package/test/meshswap/wmatic-usdc.js +197 -0
- package/test/meshswap/wmatic-usdt.js +197 -0
- package/test/mstable/musd.js +123 -0
- package/test/pearl/cvr-pearl.js +198 -0
- package/test/pearl/cvr.js +133 -0
- package/test/pearl/dai-usdr.js +198 -0
- package/test/pearl/eth-usdr.js +198 -0
- package/test/pearl/matic-usdr.js +198 -0
- package/test/pearl/pearl-usdr.js +198 -0
- package/test/pearl/star-usdr.js +186 -0
- package/test/pearl/tngbl-usdr.js +198 -0
- package/test/pearl/usdc-usdr.js +198 -0
- package/test/pearl/usdt-usdr.js +198 -0
- package/test/pearl/wbtc-usdr.js +198 -0
- package/test/pearl/wusdr-usdr.js +198 -0
- package/test/popsicle/ice-weth.js +128 -0
- package/test/quick/eth-matic.js +132 -0
- package/test/quick/eth-usdt.js +140 -0
- package/test/quick/ifarm-quick.js +147 -0
- package/test/quick/matic-usdc.js +145 -0
- package/test/quick/psp-matic.js +124 -0
- package/test/quick/wbtc-eth.js +145 -0
- package/test/quick-gamma/cbeth-eth.js +207 -0
- package/test/quick-gamma/matic-eth-narrow.js +201 -0
- package/test/quick-gamma/matic-eth-wide.js +197 -0
- package/test/quick-gamma/matic-usdc-narrow.js +197 -0
- package/test/quick-gamma/matic-usdc-wide.js +197 -0
- package/test/quick-gamma/upgrade/matic-eth-narrow.js +204 -0
- package/test/quick-gamma/upgrade/matic-usdc-narrow.js +199 -0
- package/test/quick-gamma/usdc-dai.js +209 -0
- package/test/quick-gamma/usdc-eth-narrow.js +197 -0
- package/test/quick-gamma/usdc-eth-wide.js +197 -0
- package/test/quick-gamma/usdc-usdt.js +209 -0
- package/test/quick-gamma/wbtc-eth-narrow.js +207 -0
- package/test/quick-gamma/wbtc-usdc-narrow.js +209 -0
- package/test/quick-gamma/wsteth-eth.js +207 -0
- package/test/sushi/eth-usdt.js +153 -0
- package/test/sushi/matic-eth.js +138 -0
- package/test/sushi/usdc-eth.js +153 -0
- package/test/test-config.js +24 -0
- package/test/uniswap-gamma/usdc-dai.js +212 -0
- package/test/uniswap-gamma/usdc-usdt.js +212 -0
- package/test/uniswap-gamma/usdc-weth.js +212 -0
- package/test/uniswap-gamma/wmatic-usdc.js +210 -0
- package/test/utilities/Utils.js +96 -0
- package/test/utilities/hh-utils.js +242 -0
- package/test/utilities/make-vault.js +10 -0
- package/test/yel/yel-wmatic.js +129 -0
@@ -0,0 +1,344 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
|
3
|
+
pragma solidity 0.6.12;
|
4
|
+
|
5
|
+
import "@openzeppelin/contracts-upgradeable/math/MathUpgradeable.sol";
|
6
|
+
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
|
7
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
|
8
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
|
9
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
|
10
|
+
import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
|
11
|
+
|
12
|
+
import "./interface/IStrategy.sol";
|
13
|
+
import "./interface/IVault.sol";
|
14
|
+
import "./interface/IController.sol";
|
15
|
+
import "./interface/IUpgradeSource.sol";
|
16
|
+
import "./inheritance/ControllableInit.sol";
|
17
|
+
import "./VaultStorage.sol";
|
18
|
+
|
19
|
+
contract Vault is ERC20Upgradeable, IVault, IUpgradeSource, ControllableInit, VaultStorage {
|
20
|
+
using SafeERC20Upgradeable for IERC20Upgradeable;
|
21
|
+
using AddressUpgradeable for address;
|
22
|
+
using SafeMathUpgradeable for uint256;
|
23
|
+
|
24
|
+
event Withdraw(address indexed beneficiary, uint256 amount);
|
25
|
+
event Deposit(address indexed beneficiary, uint256 amount);
|
26
|
+
event Invest(uint256 amount);
|
27
|
+
event StrategyAnnounced(address newStrategy, uint256 time);
|
28
|
+
event StrategyChanged(address newStrategy, address oldStrategy);
|
29
|
+
|
30
|
+
|
31
|
+
constructor() public {
|
32
|
+
}
|
33
|
+
|
34
|
+
// the function is name differently to not cause inheritance clash in truffle and allows tests
|
35
|
+
function initializeVault(
|
36
|
+
address _storage,
|
37
|
+
address _underlying,
|
38
|
+
uint256 _toInvestNumerator,
|
39
|
+
uint256 _toInvestDenominator
|
40
|
+
) public override initializer {
|
41
|
+
require(_toInvestNumerator <= _toInvestDenominator, "cannot invest more than 100%");
|
42
|
+
require(_toInvestDenominator != 0, "cannot divide by 0");
|
43
|
+
|
44
|
+
__ERC20_init(
|
45
|
+
string(abi.encodePacked("miFARM_", ERC20Upgradeable(_underlying).symbol())),
|
46
|
+
string(abi.encodePacked("bf", ERC20Upgradeable(_underlying).symbol()))
|
47
|
+
);
|
48
|
+
_setupDecimals(ERC20Upgradeable(_underlying).decimals());
|
49
|
+
|
50
|
+
ControllableInit.initialize(
|
51
|
+
_storage
|
52
|
+
);
|
53
|
+
|
54
|
+
uint256 underlyingUnit = 10 ** uint256(ERC20Upgradeable(address(_underlying)).decimals());
|
55
|
+
uint256 implementationDelay = 12 hours;
|
56
|
+
uint256 strategyChangeDelay = 12 hours;
|
57
|
+
VaultStorage.initialize(
|
58
|
+
_underlying,
|
59
|
+
_toInvestNumerator,
|
60
|
+
_toInvestDenominator,
|
61
|
+
underlyingUnit,
|
62
|
+
implementationDelay,
|
63
|
+
strategyChangeDelay
|
64
|
+
);
|
65
|
+
}
|
66
|
+
|
67
|
+
function strategy() public view override returns(address) {
|
68
|
+
return _strategy();
|
69
|
+
}
|
70
|
+
|
71
|
+
function underlying() public view override returns(address) {
|
72
|
+
return _underlying();
|
73
|
+
}
|
74
|
+
|
75
|
+
function underlyingUnit() public view returns(uint256) {
|
76
|
+
return _underlyingUnit();
|
77
|
+
}
|
78
|
+
|
79
|
+
function vaultFractionToInvestNumerator() public view returns(uint256) {
|
80
|
+
return _vaultFractionToInvestNumerator();
|
81
|
+
}
|
82
|
+
|
83
|
+
function vaultFractionToInvestDenominator() public view returns(uint256) {
|
84
|
+
return _vaultFractionToInvestDenominator();
|
85
|
+
}
|
86
|
+
|
87
|
+
function nextImplementation() public view returns(address) {
|
88
|
+
return _nextImplementation();
|
89
|
+
}
|
90
|
+
|
91
|
+
function nextImplementationTimestamp() public view returns(uint256) {
|
92
|
+
return _nextImplementationTimestamp();
|
93
|
+
}
|
94
|
+
|
95
|
+
function nextImplementationDelay() public view returns(uint256) {
|
96
|
+
return _nextImplementationDelay();
|
97
|
+
}
|
98
|
+
|
99
|
+
modifier whenStrategyDefined() {
|
100
|
+
require(address(strategy()) != address(0), "Strategy must be defined");
|
101
|
+
_;
|
102
|
+
}
|
103
|
+
|
104
|
+
// Only smart contracts will be affected by this modifier
|
105
|
+
modifier defense() {
|
106
|
+
require(
|
107
|
+
(msg.sender == tx.origin) || // If it is a normal user and not smart contract,
|
108
|
+
// then the requirement will pass
|
109
|
+
!IController(controller()).greyList(msg.sender), // If it is a smart contract, then
|
110
|
+
"This smart contract has been grey listed" // make sure that it is not on our greyList.
|
111
|
+
);
|
112
|
+
_;
|
113
|
+
}
|
114
|
+
|
115
|
+
/**
|
116
|
+
* Chooses the best strategy and re-invests. If the strategy did not change, it just calls
|
117
|
+
* doHardWork on the current strategy. Call this through controller to claim hard rewards.
|
118
|
+
*/
|
119
|
+
function doHardWork() whenStrategyDefined onlyControllerOrGovernance external override {
|
120
|
+
// ensure that new funds are invested too
|
121
|
+
invest();
|
122
|
+
IStrategy(strategy()).doHardWork();
|
123
|
+
}
|
124
|
+
|
125
|
+
/*
|
126
|
+
* Returns the cash balance across all users in this contract.
|
127
|
+
*/
|
128
|
+
function underlyingBalanceInVault() view public override returns (uint256) {
|
129
|
+
return IERC20Upgradeable(underlying()).balanceOf(address(this));
|
130
|
+
}
|
131
|
+
|
132
|
+
/* Returns the current underlying (e.g., DAI's) balance together with
|
133
|
+
* the invested amount (if DAI is invested elsewhere by the strategy).
|
134
|
+
*/
|
135
|
+
function underlyingBalanceWithInvestment() view public override returns (uint256) {
|
136
|
+
if (address(strategy()) == address(0)) {
|
137
|
+
// initial state, when not set
|
138
|
+
return underlyingBalanceInVault();
|
139
|
+
}
|
140
|
+
return underlyingBalanceInVault().add(IStrategy(strategy()).investedUnderlyingBalance());
|
141
|
+
}
|
142
|
+
|
143
|
+
function getPricePerFullShare() public view override returns (uint256) {
|
144
|
+
return totalSupply() == 0
|
145
|
+
? underlyingUnit()
|
146
|
+
: underlyingUnit().mul(underlyingBalanceWithInvestment()).div(totalSupply());
|
147
|
+
}
|
148
|
+
|
149
|
+
/* get the user's share (in underlying)
|
150
|
+
*/
|
151
|
+
function underlyingBalanceWithInvestmentForHolder(address holder) view external override returns (uint256) {
|
152
|
+
if (totalSupply() == 0) {
|
153
|
+
return 0;
|
154
|
+
}
|
155
|
+
return underlyingBalanceWithInvestment()
|
156
|
+
.mul(balanceOf(holder))
|
157
|
+
.div(totalSupply());
|
158
|
+
}
|
159
|
+
|
160
|
+
function futureStrategy() public view returns (address) {
|
161
|
+
return _futureStrategy();
|
162
|
+
}
|
163
|
+
|
164
|
+
function strategyUpdateTime() public view returns (uint256) {
|
165
|
+
return _strategyUpdateTime();
|
166
|
+
}
|
167
|
+
|
168
|
+
function strategyTimeLock() public view returns (uint256) {
|
169
|
+
return _strategyTimeLock();
|
170
|
+
}
|
171
|
+
|
172
|
+
function canUpdateStrategy(address _strategy) public view returns(bool) {
|
173
|
+
return strategy() == address(0) // no strategy was set yet
|
174
|
+
|| (_strategy == futureStrategy()
|
175
|
+
&& block.timestamp > strategyUpdateTime()
|
176
|
+
&& strategyUpdateTime() > 0); // or the timelock has passed
|
177
|
+
}
|
178
|
+
|
179
|
+
/**
|
180
|
+
* Indicates that the strategy update will happen in the future
|
181
|
+
*/
|
182
|
+
function announceStrategyUpdate(address _strategy) public override onlyControllerOrGovernance {
|
183
|
+
// records a new timestamp
|
184
|
+
uint256 when = block.timestamp.add(strategyTimeLock());
|
185
|
+
_setStrategyUpdateTime(when);
|
186
|
+
_setFutureStrategy(_strategy);
|
187
|
+
emit StrategyAnnounced(_strategy, when);
|
188
|
+
}
|
189
|
+
|
190
|
+
/**
|
191
|
+
* Finalizes (or cancels) the strategy update by resetting the data
|
192
|
+
*/
|
193
|
+
function finalizeStrategyUpdate() public onlyControllerOrGovernance {
|
194
|
+
_setStrategyUpdateTime(0);
|
195
|
+
_setFutureStrategy(address(0));
|
196
|
+
}
|
197
|
+
|
198
|
+
function setStrategy(address _strategy) public override onlyControllerOrGovernance {
|
199
|
+
require(canUpdateStrategy(_strategy),
|
200
|
+
"The strategy exists and switch timelock did not elapse yet");
|
201
|
+
require(_strategy != address(0), "new _strategy cannot be empty");
|
202
|
+
require(IStrategy(_strategy).underlying() == address(underlying()), "Vault underlying must match Strategy underlying");
|
203
|
+
require(IStrategy(_strategy).vault() == address(this), "the strategy does not belong to this vault");
|
204
|
+
|
205
|
+
emit StrategyChanged(_strategy, strategy());
|
206
|
+
if (address(_strategy) != address(strategy())) {
|
207
|
+
if (address(strategy()) != address(0)) { // if the original strategy (no underscore) is defined
|
208
|
+
IERC20Upgradeable(underlying()).safeApprove(address(strategy()), 0);
|
209
|
+
IStrategy(strategy()).withdrawAllToVault();
|
210
|
+
}
|
211
|
+
_setStrategy(_strategy);
|
212
|
+
IERC20Upgradeable(underlying()).safeApprove(address(strategy()), 0);
|
213
|
+
IERC20Upgradeable(underlying()).safeApprove(address(strategy()), uint256(~0));
|
214
|
+
}
|
215
|
+
finalizeStrategyUpdate();
|
216
|
+
}
|
217
|
+
|
218
|
+
function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external override onlyGovernance {
|
219
|
+
require(denominator > 0, "denominator must be greater than 0");
|
220
|
+
require(numerator <= denominator, "denominator must be greater than or equal to the numerator");
|
221
|
+
_setVaultFractionToInvestNumerator(numerator);
|
222
|
+
_setVaultFractionToInvestDenominator(denominator);
|
223
|
+
}
|
224
|
+
|
225
|
+
function rebalance() external onlyControllerOrGovernance {
|
226
|
+
withdrawAll();
|
227
|
+
invest();
|
228
|
+
}
|
229
|
+
|
230
|
+
function availableToInvestOut() public view returns (uint256) {
|
231
|
+
uint256 wantInvestInTotal = underlyingBalanceWithInvestment()
|
232
|
+
.mul(vaultFractionToInvestNumerator())
|
233
|
+
.div(vaultFractionToInvestDenominator());
|
234
|
+
uint256 alreadyInvested = IStrategy(strategy()).investedUnderlyingBalance();
|
235
|
+
if (alreadyInvested >= wantInvestInTotal) {
|
236
|
+
return 0;
|
237
|
+
} else {
|
238
|
+
uint256 remainingToInvest = wantInvestInTotal.sub(alreadyInvested);
|
239
|
+
return remainingToInvest <= underlyingBalanceInVault()
|
240
|
+
// TODO: we think that the "else" branch of the ternary operation is not
|
241
|
+
// going to get hit
|
242
|
+
? remainingToInvest : underlyingBalanceInVault();
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
function invest() internal whenStrategyDefined {
|
247
|
+
uint256 availableAmount = availableToInvestOut();
|
248
|
+
if (availableAmount > 0) {
|
249
|
+
IERC20Upgradeable(underlying()).safeTransfer(address(strategy()), availableAmount);
|
250
|
+
emit Invest(availableAmount);
|
251
|
+
}
|
252
|
+
}
|
253
|
+
|
254
|
+
/*
|
255
|
+
* Allows for depositing the underlying asset in exchange for shares.
|
256
|
+
* Approval is assumed.
|
257
|
+
*/
|
258
|
+
function deposit(uint256 amount) external override defense {
|
259
|
+
_deposit(amount, msg.sender, msg.sender);
|
260
|
+
}
|
261
|
+
|
262
|
+
/*
|
263
|
+
* Allows for depositing the underlying asset in exchange for shares
|
264
|
+
* assigned to the holder.
|
265
|
+
* This facilitates depositing for someone else (using DepositHelper)
|
266
|
+
*/
|
267
|
+
function depositFor(uint256 amount, address holder) public override defense {
|
268
|
+
_deposit(amount, msg.sender, holder);
|
269
|
+
}
|
270
|
+
|
271
|
+
function withdrawAll() public onlyControllerOrGovernance override whenStrategyDefined {
|
272
|
+
IStrategy(strategy()).withdrawAllToVault();
|
273
|
+
}
|
274
|
+
|
275
|
+
function withdraw(uint256 numberOfShares) override external {
|
276
|
+
require(totalSupply() > 0, "Vault has no shares");
|
277
|
+
require(numberOfShares > 0, "numberOfShares must be greater than 0");
|
278
|
+
uint256 totalSupply = totalSupply();
|
279
|
+
_burn(msg.sender, numberOfShares);
|
280
|
+
|
281
|
+
uint256 underlyingAmountToWithdraw = underlyingBalanceWithInvestment()
|
282
|
+
.mul(numberOfShares)
|
283
|
+
.div(totalSupply);
|
284
|
+
if (underlyingAmountToWithdraw > underlyingBalanceInVault()) {
|
285
|
+
// withdraw everything from the strategy to accurately check the share value
|
286
|
+
if (numberOfShares == totalSupply) {
|
287
|
+
IStrategy(strategy()).withdrawAllToVault();
|
288
|
+
} else {
|
289
|
+
uint256 missing = underlyingAmountToWithdraw.sub(underlyingBalanceInVault());
|
290
|
+
IStrategy(strategy()).withdrawToVault(missing);
|
291
|
+
}
|
292
|
+
// recalculate to improve accuracy
|
293
|
+
underlyingAmountToWithdraw = MathUpgradeable.min(underlyingBalanceWithInvestment()
|
294
|
+
.mul(numberOfShares)
|
295
|
+
.div(totalSupply), underlyingBalanceInVault());
|
296
|
+
}
|
297
|
+
|
298
|
+
IERC20Upgradeable(underlying()).safeTransfer(msg.sender, underlyingAmountToWithdraw);
|
299
|
+
|
300
|
+
// update the withdrawal amount for the holder
|
301
|
+
emit Withdraw(msg.sender, underlyingAmountToWithdraw);
|
302
|
+
}
|
303
|
+
|
304
|
+
function _deposit(uint256 amount, address sender, address beneficiary) internal {
|
305
|
+
require(amount > 0, "Cannot deposit 0");
|
306
|
+
require(beneficiary != address(0), "holder must be defined");
|
307
|
+
|
308
|
+
if (address(strategy()) != address(0)) {
|
309
|
+
require(IStrategy(strategy()).depositArbCheck(), "Too much arb");
|
310
|
+
}
|
311
|
+
|
312
|
+
uint256 toMint = totalSupply() == 0
|
313
|
+
? amount
|
314
|
+
: amount.mul(totalSupply()).div(underlyingBalanceWithInvestment());
|
315
|
+
_mint(beneficiary, toMint);
|
316
|
+
|
317
|
+
IERC20Upgradeable(underlying()).safeTransferFrom(sender, address(this), amount);
|
318
|
+
|
319
|
+
// update the contribution amount for the beneficiary
|
320
|
+
emit Deposit(beneficiary, amount);
|
321
|
+
}
|
322
|
+
|
323
|
+
/**
|
324
|
+
* Schedules an upgrade for this vault's proxy.
|
325
|
+
*/
|
326
|
+
function scheduleUpgrade(address impl) public onlyGovernance {
|
327
|
+
_setNextImplementation(impl);
|
328
|
+
_setNextImplementationTimestamp(block.timestamp.add(nextImplementationDelay()));
|
329
|
+
}
|
330
|
+
|
331
|
+
function shouldUpgrade() external view override returns (bool, address) {
|
332
|
+
return (
|
333
|
+
nextImplementationTimestamp() != 0
|
334
|
+
&& block.timestamp > nextImplementationTimestamp()
|
335
|
+
&& nextImplementation() != address(0),
|
336
|
+
nextImplementation()
|
337
|
+
);
|
338
|
+
}
|
339
|
+
|
340
|
+
function finalizeUpgrade() external override onlyGovernance {
|
341
|
+
_setNextImplementation(address(0));
|
342
|
+
_setNextImplementationTimestamp(0);
|
343
|
+
}
|
344
|
+
}
|
@@ -0,0 +1,113 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "./interface/IERC4626.sol";
|
5
|
+
import "./VaultV2.sol";
|
6
|
+
|
7
|
+
contract VaultERC4626 is IERC4626, VaultV2 {
|
8
|
+
|
9
|
+
/// By default, the constant `10` is a uint8. This implicitly converts it to `uint256`
|
10
|
+
uint256 public constant TEN = 10;
|
11
|
+
|
12
|
+
function asset() public view override returns (address) {
|
13
|
+
return underlying();
|
14
|
+
}
|
15
|
+
|
16
|
+
function totalAssets() public view override returns (uint256) {
|
17
|
+
return underlyingBalanceWithInvestment();
|
18
|
+
}
|
19
|
+
|
20
|
+
function assetsPerShare() public view override returns (uint256) {
|
21
|
+
return convertToAssets(TEN ** decimals());
|
22
|
+
}
|
23
|
+
|
24
|
+
function assetsOf(address _depositor) public view override returns (uint256) {
|
25
|
+
return totalAssets() * balanceOf(_depositor) / totalSupply();
|
26
|
+
}
|
27
|
+
|
28
|
+
function maxDeposit(address /*caller*/) public view override returns (uint256) {
|
29
|
+
return uint(-1);
|
30
|
+
}
|
31
|
+
|
32
|
+
function previewDeposit(uint256 _assets) public view override returns (uint256) {
|
33
|
+
return convertToShares(_assets);
|
34
|
+
}
|
35
|
+
|
36
|
+
function deposit(uint256 _assets, address _receiver) public override nonReentrant defense returns (uint256) {
|
37
|
+
uint shares = convertToShares(_assets);
|
38
|
+
_deposit(_assets, msg.sender, _receiver);
|
39
|
+
return shares;
|
40
|
+
}
|
41
|
+
|
42
|
+
function maxMint(address /*caller*/) public view override returns (uint256) {
|
43
|
+
return uint(-1);
|
44
|
+
}
|
45
|
+
|
46
|
+
function previewMint(uint256 _shares) public view override returns (uint256) {
|
47
|
+
return convertToAssets(_shares);
|
48
|
+
}
|
49
|
+
|
50
|
+
function mint(uint256 _shares, address _receiver) public override nonReentrant defense returns (uint256) {
|
51
|
+
uint assets = convertToAssets(_shares);
|
52
|
+
_deposit(assets, msg.sender, _receiver);
|
53
|
+
return assets;
|
54
|
+
}
|
55
|
+
|
56
|
+
function maxWithdraw(address _caller) public view override returns (uint256) {
|
57
|
+
return assetsOf(_caller);
|
58
|
+
}
|
59
|
+
|
60
|
+
function previewWithdraw(uint256 _assets) public view override returns (uint256) {
|
61
|
+
return convertToShares(_assets);
|
62
|
+
}
|
63
|
+
|
64
|
+
function withdraw(
|
65
|
+
uint256 _assets,
|
66
|
+
address _receiver,
|
67
|
+
address _owner
|
68
|
+
)
|
69
|
+
public override
|
70
|
+
nonReentrant
|
71
|
+
defense
|
72
|
+
returns (uint256) {
|
73
|
+
uint256 shares = convertToShares(_assets);
|
74
|
+
_withdraw(shares, _receiver, _owner);
|
75
|
+
return shares;
|
76
|
+
}
|
77
|
+
|
78
|
+
function maxRedeem(address _caller) public view override returns (uint256) {
|
79
|
+
return balanceOf(_caller);
|
80
|
+
}
|
81
|
+
|
82
|
+
function previewRedeem(uint256 _shares) public view override returns (uint256) {
|
83
|
+
return convertToAssets(_shares);
|
84
|
+
}
|
85
|
+
|
86
|
+
function redeem(
|
87
|
+
uint256 _shares,
|
88
|
+
address _receiver,
|
89
|
+
address _owner
|
90
|
+
)
|
91
|
+
public override
|
92
|
+
nonReentrant
|
93
|
+
defense
|
94
|
+
returns (uint256) {
|
95
|
+
uint256 assets = convertToAssets(_shares);
|
96
|
+
_withdraw(_shares, _receiver, _owner);
|
97
|
+
return assets;
|
98
|
+
}
|
99
|
+
|
100
|
+
// ========================= Conversion Functions =========================
|
101
|
+
|
102
|
+
function convertToAssets(uint256 _shares) public view returns (uint256) {
|
103
|
+
return totalAssets() == 0 || totalSupply() == 0
|
104
|
+
? _shares * (TEN ** ERC20Upgradeable(underlying()).decimals()) / (TEN ** decimals())
|
105
|
+
: _shares * totalAssets() / totalSupply();
|
106
|
+
}
|
107
|
+
|
108
|
+
function convertToShares(uint256 _assets) public view returns (uint256) {
|
109
|
+
return totalAssets() == 0 || totalSupply() == 0
|
110
|
+
? _assets * (TEN ** decimals()) / (TEN ** ERC20Upgradeable(underlying()).decimals())
|
111
|
+
: _assets * totalSupply() / totalAssets();
|
112
|
+
}
|
113
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
|
3
|
+
pragma solidity 0.6.12;
|
4
|
+
|
5
|
+
import "./interface/IUpgradeSource.sol";
|
6
|
+
import "./upgradability/BaseUpgradeabilityProxy.sol";
|
7
|
+
|
8
|
+
contract VaultProxy is BaseUpgradeabilityProxy {
|
9
|
+
|
10
|
+
constructor(address _implementation) public {
|
11
|
+
_setImplementation(_implementation);
|
12
|
+
}
|
13
|
+
|
14
|
+
/**
|
15
|
+
* The main logic. If the timer has elapsed and there is a schedule upgrade,
|
16
|
+
* the governance can upgrade the vault
|
17
|
+
*/
|
18
|
+
function upgrade() external {
|
19
|
+
(bool should, address newImplementation) = IUpgradeSource(address(this)).shouldUpgrade();
|
20
|
+
require(should, "Upgrade not scheduled");
|
21
|
+
_upgradeTo(newImplementation);
|
22
|
+
|
23
|
+
// the finalization needs to be executed on itself to update the storage of this proxy
|
24
|
+
// it also needs to be invoked by the governance, not by address(this), so delegatecall is needed
|
25
|
+
(bool success,) = address(this).delegatecall(
|
26
|
+
abi.encodeWithSignature("finalizeUpgrade()")
|
27
|
+
);
|
28
|
+
|
29
|
+
require(success, "Issue when finalizing the upgrade");
|
30
|
+
}
|
31
|
+
|
32
|
+
function implementation() external view returns (address) {
|
33
|
+
return _implementation();
|
34
|
+
}
|
35
|
+
}
|
@@ -0,0 +1,199 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
|
5
|
+
|
6
|
+
contract VaultStorage is Initializable {
|
7
|
+
|
8
|
+
bytes32 internal constant _STRATEGY_SLOT = 0xf1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea;
|
9
|
+
bytes32 internal constant _UNDERLYING_SLOT = 0x1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371;
|
10
|
+
bytes32 internal constant _UNDERLYING_UNIT_SLOT = 0xa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff;
|
11
|
+
bytes32 internal constant _VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT = 0x39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a;
|
12
|
+
bytes32 internal constant _VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT = 0x469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed32308;
|
13
|
+
bytes32 internal constant _NEXT_IMPLEMENTATION_SLOT = 0xb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df;
|
14
|
+
bytes32 internal constant _NEXT_IMPLEMENTATION_TIMESTAMP_SLOT = 0x3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9;
|
15
|
+
bytes32 internal constant _NEXT_IMPLEMENTATION_DELAY_SLOT = 0x82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0;
|
16
|
+
bytes32 internal constant _STRATEGY_TIME_LOCK_SLOT = 0x6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b;
|
17
|
+
bytes32 internal constant _FUTURE_STRATEGY_SLOT = 0xb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610;
|
18
|
+
bytes32 internal constant _STRATEGY_UPDATE_TIME_SLOT = 0x56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72;
|
19
|
+
bytes32 internal constant _ALLOW_SHARE_PRICE_DECREASE_SLOT = 0x22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed;
|
20
|
+
bytes32 internal constant _WITHDRAW_BEFORE_REINVESTING_SLOT = 0x4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a79;
|
21
|
+
|
22
|
+
constructor() public {
|
23
|
+
assert(_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategy")) - 1));
|
24
|
+
assert(_UNDERLYING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlying")) - 1));
|
25
|
+
assert(_UNDERLYING_UNIT_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlyingUnit")) - 1));
|
26
|
+
assert(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestNumerator")) - 1));
|
27
|
+
assert(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestDenominator")) - 1));
|
28
|
+
assert(_NEXT_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementation")) - 1));
|
29
|
+
assert(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementationTimestamp")) - 1));
|
30
|
+
assert(_NEXT_IMPLEMENTATION_DELAY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementationDelay")) - 1));
|
31
|
+
assert(_STRATEGY_TIME_LOCK_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategyTimeLock")) - 1));
|
32
|
+
assert(_FUTURE_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.futureStrategy")) - 1));
|
33
|
+
assert(_STRATEGY_UPDATE_TIME_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategyUpdateTime")) - 1));
|
34
|
+
assert(_ALLOW_SHARE_PRICE_DECREASE_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.allowSharePriceDecrease")) - 1));
|
35
|
+
assert(_WITHDRAW_BEFORE_REINVESTING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.withdrawBeforeReinvesting")) - 1));
|
36
|
+
}
|
37
|
+
|
38
|
+
function initialize(
|
39
|
+
address _underlying,
|
40
|
+
uint256 _toInvestNumerator,
|
41
|
+
uint256 _toInvestDenominator,
|
42
|
+
uint256 _underlyingUnit,
|
43
|
+
uint256 _implementationChangeDelay,
|
44
|
+
uint256 _strategyChangeDelay
|
45
|
+
) public initializer {
|
46
|
+
_setUnderlying(_underlying);
|
47
|
+
_setVaultFractionToInvestNumerator(_toInvestNumerator);
|
48
|
+
_setVaultFractionToInvestDenominator(_toInvestDenominator);
|
49
|
+
_setUnderlyingUnit(_underlyingUnit);
|
50
|
+
_setNextImplementationDelay(_implementationChangeDelay);
|
51
|
+
_setStrategyTimeLock(_strategyChangeDelay);
|
52
|
+
_setStrategyUpdateTime(0);
|
53
|
+
_setFutureStrategy(address(0));
|
54
|
+
_setAllowSharePriceDecrease(false);
|
55
|
+
_setWithdrawBeforeReinvesting(false);
|
56
|
+
}
|
57
|
+
|
58
|
+
function _setStrategy(address _address) internal {
|
59
|
+
setAddress(_STRATEGY_SLOT, _address);
|
60
|
+
}
|
61
|
+
|
62
|
+
function _strategy() internal view returns (address) {
|
63
|
+
return getAddress(_STRATEGY_SLOT);
|
64
|
+
}
|
65
|
+
|
66
|
+
function _setUnderlying(address _address) internal {
|
67
|
+
setAddress(_UNDERLYING_SLOT, _address);
|
68
|
+
}
|
69
|
+
|
70
|
+
function _underlying() internal view returns (address) {
|
71
|
+
return getAddress(_UNDERLYING_SLOT);
|
72
|
+
}
|
73
|
+
|
74
|
+
function _setUnderlyingUnit(uint256 _value) internal {
|
75
|
+
setUint256(_UNDERLYING_UNIT_SLOT, _value);
|
76
|
+
}
|
77
|
+
|
78
|
+
function _underlyingUnit() internal view returns (uint256) {
|
79
|
+
return getUint256(_UNDERLYING_UNIT_SLOT);
|
80
|
+
}
|
81
|
+
|
82
|
+
function _setVaultFractionToInvestNumerator(uint256 _value) internal {
|
83
|
+
setUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT, _value);
|
84
|
+
}
|
85
|
+
|
86
|
+
function _vaultFractionToInvestNumerator() internal view returns (uint256) {
|
87
|
+
return getUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT);
|
88
|
+
}
|
89
|
+
|
90
|
+
function _setVaultFractionToInvestDenominator(uint256 _value) internal {
|
91
|
+
setUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT, _value);
|
92
|
+
}
|
93
|
+
|
94
|
+
function _vaultFractionToInvestDenominator() internal view returns (uint256) {
|
95
|
+
return getUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT);
|
96
|
+
}
|
97
|
+
|
98
|
+
function _setAllowSharePriceDecrease(bool _value) internal {
|
99
|
+
setBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT, _value);
|
100
|
+
}
|
101
|
+
|
102
|
+
function _allowSharePriceDecrease() internal view returns (bool) {
|
103
|
+
return getBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT);
|
104
|
+
}
|
105
|
+
|
106
|
+
function _setWithdrawBeforeReinvesting(bool _value) internal {
|
107
|
+
setBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT, _value);
|
108
|
+
}
|
109
|
+
|
110
|
+
function _withdrawBeforeReinvesting() internal view returns (bool) {
|
111
|
+
return getBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT);
|
112
|
+
}
|
113
|
+
|
114
|
+
function _setNextImplementation(address _address) internal {
|
115
|
+
setAddress(_NEXT_IMPLEMENTATION_SLOT, _address);
|
116
|
+
}
|
117
|
+
|
118
|
+
function _nextImplementation() internal view returns (address) {
|
119
|
+
return getAddress(_NEXT_IMPLEMENTATION_SLOT);
|
120
|
+
}
|
121
|
+
|
122
|
+
function _setNextImplementationTimestamp(uint256 _value) internal {
|
123
|
+
setUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT, _value);
|
124
|
+
}
|
125
|
+
|
126
|
+
function _nextImplementationTimestamp() internal view returns (uint256) {
|
127
|
+
return getUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT);
|
128
|
+
}
|
129
|
+
|
130
|
+
function _setNextImplementationDelay(uint256 _value) internal {
|
131
|
+
setUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT, _value);
|
132
|
+
}
|
133
|
+
|
134
|
+
function _nextImplementationDelay() internal view returns (uint256) {
|
135
|
+
return getUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT);
|
136
|
+
}
|
137
|
+
|
138
|
+
function _setStrategyTimeLock(uint256 _value) internal {
|
139
|
+
setUint256(_STRATEGY_TIME_LOCK_SLOT, _value);
|
140
|
+
}
|
141
|
+
|
142
|
+
function _strategyTimeLock() internal view returns (uint256) {
|
143
|
+
return getUint256(_STRATEGY_TIME_LOCK_SLOT);
|
144
|
+
}
|
145
|
+
|
146
|
+
function _setFutureStrategy(address _value) internal {
|
147
|
+
setAddress(_FUTURE_STRATEGY_SLOT, _value);
|
148
|
+
}
|
149
|
+
|
150
|
+
function _futureStrategy() internal view returns (address) {
|
151
|
+
return getAddress(_FUTURE_STRATEGY_SLOT);
|
152
|
+
}
|
153
|
+
|
154
|
+
function _setStrategyUpdateTime(uint256 _value) internal {
|
155
|
+
setUint256(_STRATEGY_UPDATE_TIME_SLOT, _value);
|
156
|
+
}
|
157
|
+
|
158
|
+
function _strategyUpdateTime() internal view returns (uint256) {
|
159
|
+
return getUint256(_STRATEGY_UPDATE_TIME_SLOT);
|
160
|
+
}
|
161
|
+
|
162
|
+
function setBoolean(bytes32 slot, bool _value) internal {
|
163
|
+
setUint256(slot, _value ? 1 : 0);
|
164
|
+
}
|
165
|
+
|
166
|
+
function getBoolean(bytes32 slot) internal view returns (bool) {
|
167
|
+
return (getUint256(slot) == 1);
|
168
|
+
}
|
169
|
+
|
170
|
+
function setAddress(bytes32 slot, address _address) private {
|
171
|
+
// solhint-disable-next-line no-inline-assembly
|
172
|
+
assembly {
|
173
|
+
sstore(slot, _address)
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
function setUint256(bytes32 slot, uint256 _value) private {
|
178
|
+
// solhint-disable-next-line no-inline-assembly
|
179
|
+
assembly {
|
180
|
+
sstore(slot, _value)
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
function getAddress(bytes32 slot) private view returns (address str) {
|
185
|
+
// solhint-disable-next-line no-inline-assembly
|
186
|
+
assembly {
|
187
|
+
str := sload(slot)
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
function getUint256(bytes32 slot) private view returns (uint256 str) {
|
192
|
+
// solhint-disable-next-line no-inline-assembly
|
193
|
+
assembly {
|
194
|
+
str := sload(slot)
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
uint256[50] private ______gap;
|
199
|
+
}
|