@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,167 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "./NotifyHelperStateful.sol";
|
5
|
+
import "./NotifyHelperGeneric.sol";
|
6
|
+
import "../inheritance/Controllable.sol";
|
7
|
+
|
8
|
+
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
|
9
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
|
10
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
|
11
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
|
12
|
+
|
13
|
+
|
14
|
+
contract GlobalIncentivesHelper is Controllable {
|
15
|
+
|
16
|
+
using SafeMathUpgradeable for uint256;
|
17
|
+
using SafeERC20Upgradeable for IERC20Upgradeable;
|
18
|
+
|
19
|
+
address public helperControlStorage;
|
20
|
+
address public notifyHelperGeneric;
|
21
|
+
address public escrow;
|
22
|
+
address public reserve;
|
23
|
+
address public farm;
|
24
|
+
|
25
|
+
event ChangerSet(address indexed account, bool value);
|
26
|
+
event NotifierSet(address indexed account, bool value);
|
27
|
+
event Vesting(address pool, uint256 amount);
|
28
|
+
event PoolChanged(address indexed pool, uint256 percentage, uint256 notificationType, bool vests);
|
29
|
+
|
30
|
+
enum NotificationType {
|
31
|
+
VOID, AMPLIFARM, FARM, TRANSFER, PROFIT_SHARE, TOKEN
|
32
|
+
}
|
33
|
+
|
34
|
+
mapping (address => address) public tokenToHelper;
|
35
|
+
mapping (address => bool) public changer;
|
36
|
+
mapping (address => bool) public notifier;
|
37
|
+
|
38
|
+
modifier onlyChanger {
|
39
|
+
require(changer[msg.sender] || msg.sender == governance(), "Only changer");
|
40
|
+
_;
|
41
|
+
}
|
42
|
+
|
43
|
+
modifier onlyNotifier {
|
44
|
+
require(notifier[msg.sender] || msg.sender == governance(), "Only notifier");
|
45
|
+
_;
|
46
|
+
}
|
47
|
+
|
48
|
+
constructor(address _storage, address _farm, address _farmHelper, address _notifyHelperGeneric, address _escrow, address _reserve) public Controllable(_storage) {
|
49
|
+
tokenToHelper[_farm] = _farmHelper;
|
50
|
+
farm = _farm;
|
51
|
+
notifyHelperGeneric = _notifyHelperGeneric;
|
52
|
+
helperControlStorage = address(new Storage());
|
53
|
+
escrow = _escrow;
|
54
|
+
reserve = _reserve;
|
55
|
+
}
|
56
|
+
|
57
|
+
function notifyPools(address[] calldata tokens, uint256[] calldata totals, uint256 timestamp) external onlyNotifier {
|
58
|
+
for (uint256 i = 0; i < tokens.length; i++) {
|
59
|
+
// IERC20Upgradeable(tokens[i]).safeTransferFrom(msg.sender, address(this), totals[i]);
|
60
|
+
IERC20Upgradeable(tokens[i]).approve(tokenToHelper[tokens[i]], totals[i]);
|
61
|
+
NotifyHelperStateful(tokenToHelper[tokens[i]]).notifyPools(totals[i], timestamp);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
// uses generic helper
|
66
|
+
function newToken(address token) external onlyChanger {
|
67
|
+
newTokenWithHelper(token, notifyHelperGeneric);
|
68
|
+
}
|
69
|
+
|
70
|
+
// uses a specific notify helper
|
71
|
+
function newTokenWithHelper(address token, address notifyHelper) public onlyChanger {
|
72
|
+
require(tokenToHelper[token] == address(0), "Token already initialized");
|
73
|
+
tokenToHelper[token] = address(new NotifyHelperStateful(
|
74
|
+
helperControlStorage,
|
75
|
+
notifyHelper, // the universal helper should be sufficient in all cases
|
76
|
+
token,
|
77
|
+
address(0), // no iFARM/ampliFARM notify helper is needed
|
78
|
+
escrow,
|
79
|
+
reserve
|
80
|
+
));
|
81
|
+
if (notifyHelper == notifyHelperGeneric) {
|
82
|
+
NotifyHelperGeneric(notifyHelper).setWhitelist(tokenToHelper[token], true);
|
83
|
+
}
|
84
|
+
NotifyHelperStateful(tokenToHelper[token]).setNotifier(address(this), true);
|
85
|
+
NotifyHelperStateful(tokenToHelper[token]).setNotifier(governance(), true);
|
86
|
+
NotifyHelperStateful(tokenToHelper[token]).setChanger(address(this), true);
|
87
|
+
NotifyHelperStateful(tokenToHelper[token]).setChanger(governance(), true);
|
88
|
+
}
|
89
|
+
|
90
|
+
function resetToken(address token) public onlyChanger {
|
91
|
+
tokenToHelper[token] = address(0);
|
92
|
+
}
|
93
|
+
|
94
|
+
/// Whitelisted entity makes changes to the notifications
|
95
|
+
function setPoolBatch(
|
96
|
+
address[] calldata tokens,
|
97
|
+
address[] calldata poolAddress,
|
98
|
+
uint256[] calldata poolPercentage,
|
99
|
+
NotificationType[] calldata notificationType,
|
100
|
+
bool[] calldata vests) external onlyChanger {
|
101
|
+
for (uint256 i = 0; i < poolAddress.length; i++) {
|
102
|
+
setPool(tokens[i], poolAddress[i], poolPercentage[i], notificationType[i], vests[i]);
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
/// Pool management, adds, updates or removes a transfer/notification
|
107
|
+
function setPool(
|
108
|
+
address token,
|
109
|
+
address poolAddress,
|
110
|
+
uint256 poolPercentage,
|
111
|
+
NotificationType notificationType,
|
112
|
+
bool vests
|
113
|
+
) public onlyChanger {
|
114
|
+
if (token == farm) {
|
115
|
+
require(notificationType != NotificationType.TOKEN, "With FARM, use FARM, AMPLIFARM, or TRANSFER");
|
116
|
+
}
|
117
|
+
if (notificationType == NotificationType.TOKEN) {
|
118
|
+
// we use type translation so that we can use the same contract
|
119
|
+
NotifyHelperStateful(tokenToHelper[token]).setPool(poolAddress, poolPercentage,
|
120
|
+
NotifyHelperStateful.NotificationType(uint256(NotificationType.FARM)), vests);
|
121
|
+
} else {
|
122
|
+
NotifyHelperStateful(tokenToHelper[token]).setPool(poolAddress, poolPercentage,
|
123
|
+
NotifyHelperStateful.NotificationType(uint256(notificationType)), vests);
|
124
|
+
}
|
125
|
+
emit PoolChanged(poolAddress, poolPercentage, uint256(notificationType), vests);
|
126
|
+
}
|
127
|
+
|
128
|
+
/// emergency draining of tokens and ETH as there should be none staying here
|
129
|
+
function emergencyDrain(address token, uint256 amount) public onlyGovernance {
|
130
|
+
if (token == address(0)) {
|
131
|
+
msg.sender.transfer(amount);
|
132
|
+
} else {
|
133
|
+
IERC20Upgradeable(token).safeTransfer(msg.sender, amount);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
/// Configuration method for vesting for governance
|
138
|
+
function setVestingEscrow(address token, address _escrow) external onlyGovernance {
|
139
|
+
NotifyHelperStateful(tokenToHelper[token]).setVestingEscrow(_escrow);
|
140
|
+
}
|
141
|
+
|
142
|
+
/// Configuration method for vesting for governance
|
143
|
+
function setVesting(address token, uint256 _numerator, uint256 _denominator) external onlyGovernance {
|
144
|
+
NotifyHelperStateful(tokenToHelper[token]).setVesting(_numerator, _denominator);
|
145
|
+
}
|
146
|
+
|
147
|
+
function notificationExists(address token, address poolAddress) public view returns(bool) {
|
148
|
+
return NotifyHelperStateful(tokenToHelper[token]).notificationExists(poolAddress);
|
149
|
+
}
|
150
|
+
|
151
|
+
/// Returning the governance
|
152
|
+
function transferGovernance(address target, address newStorage) external onlyGovernance {
|
153
|
+
Governable(target).setStorage(newStorage);
|
154
|
+
}
|
155
|
+
|
156
|
+
/// The governance configures whitelists
|
157
|
+
function setChanger(address who, bool value) external onlyGovernance {
|
158
|
+
changer[who] = value;
|
159
|
+
emit ChangerSet(who, value);
|
160
|
+
}
|
161
|
+
|
162
|
+
/// The governance configures whitelists
|
163
|
+
function setNotifier(address who, bool value) external onlyGovernance {
|
164
|
+
notifier[who] = value;
|
165
|
+
emit NotifierSet(who, value);
|
166
|
+
}
|
167
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
|
5
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
|
6
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
|
7
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
|
8
|
+
|
9
|
+
import "../inheritance/Controllable.sol";
|
10
|
+
import "../PotPool.sol";
|
11
|
+
|
12
|
+
contract NotifyHelperGeneric is Controllable {
|
13
|
+
|
14
|
+
using SafeMathUpgradeable for uint256;
|
15
|
+
using SafeERC20Upgradeable for IERC20Upgradeable;
|
16
|
+
|
17
|
+
event WhitelistSet(address who, bool value);
|
18
|
+
|
19
|
+
mapping (address => bool) public alreadyNotified;
|
20
|
+
mapping (address => bool) public whitelist;
|
21
|
+
|
22
|
+
modifier onlyWhitelisted {
|
23
|
+
require(whitelist[msg.sender] || msg.sender == governance(), "Only whitelisted");
|
24
|
+
_;
|
25
|
+
}
|
26
|
+
|
27
|
+
constructor(address _storage)
|
28
|
+
Controllable(_storage) public {
|
29
|
+
setWhitelist(governance(), true);
|
30
|
+
}
|
31
|
+
|
32
|
+
function setWhitelist(address who, bool value) public onlyWhitelisted {
|
33
|
+
whitelist[who] = value;
|
34
|
+
emit WhitelistSet(who, value);
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Notifies all the pools, safe guarding the notification amount.
|
39
|
+
*/
|
40
|
+
function notifyPools(uint256[] memory amounts,
|
41
|
+
address[] memory pools,
|
42
|
+
uint256 sum, address _token
|
43
|
+
) public onlyWhitelisted {
|
44
|
+
require(amounts.length == pools.length, "Amounts and pools lengths mismatch");
|
45
|
+
for (uint i = 0; i < pools.length; i++) {
|
46
|
+
alreadyNotified[pools[i]] = false;
|
47
|
+
}
|
48
|
+
|
49
|
+
uint256 check = 0;
|
50
|
+
for (uint i = 0; i < pools.length; i++) {
|
51
|
+
require(amounts[i] > 0, "Notify zero");
|
52
|
+
require(!alreadyNotified[pools[i]], "Duplicate pool");
|
53
|
+
IERC20Upgradeable token = IERC20Upgradeable(_token);
|
54
|
+
token.safeTransferFrom(msg.sender, pools[i], amounts[i]);
|
55
|
+
PotPool(pools[i]).notifyTargetRewardAmount(_token, amounts[i]);
|
56
|
+
check = check.add(amounts[i]);
|
57
|
+
alreadyNotified[pools[i]] = true;
|
58
|
+
}
|
59
|
+
require(sum == check, "Wrong check sum");
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1,290 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
|
5
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
|
6
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
|
7
|
+
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
|
8
|
+
import "../inheritance/Controllable.sol";
|
9
|
+
import "../PotPool.sol";
|
10
|
+
|
11
|
+
interface INotifyHelperGeneric {
|
12
|
+
function feeRewardForwarder() external view returns (address);
|
13
|
+
|
14
|
+
function notifyPools(uint256[] calldata amounts,
|
15
|
+
address[] calldata pools,
|
16
|
+
uint256 sum, address token
|
17
|
+
) external;
|
18
|
+
}
|
19
|
+
|
20
|
+
interface INotifyHelperAmpliFARM {
|
21
|
+
function notifyPools(uint256[] calldata amounts,
|
22
|
+
address[] calldata pools,
|
23
|
+
uint256 sum
|
24
|
+
) external;
|
25
|
+
}
|
26
|
+
|
27
|
+
contract NotifyHelperStateful is Controllable {
|
28
|
+
|
29
|
+
using SafeMathUpgradeable for uint256;
|
30
|
+
using SafeERC20Upgradeable for IERC20Upgradeable;
|
31
|
+
|
32
|
+
event ChangerSet(address indexed account, bool value);
|
33
|
+
event NotifierSet(address indexed account, bool value);
|
34
|
+
event Vesting(address pool, uint256 amount);
|
35
|
+
event PoolChanged(address indexed pool, uint256 percentage, uint256 notificationType, bool vests);
|
36
|
+
|
37
|
+
enum NotificationType {
|
38
|
+
VOID, AMPLIFARM, FARM, TRANSFER, PROFIT_SHARE, TOKEN
|
39
|
+
}
|
40
|
+
|
41
|
+
struct Notification {
|
42
|
+
address poolAddress;
|
43
|
+
NotificationType notificationType;
|
44
|
+
uint256 percentage;
|
45
|
+
bool vests;
|
46
|
+
}
|
47
|
+
|
48
|
+
struct WorkingNotification {
|
49
|
+
address[] pools;
|
50
|
+
uint256[] amounts;
|
51
|
+
uint256 checksum;
|
52
|
+
uint256 counter;
|
53
|
+
}
|
54
|
+
|
55
|
+
uint256 public VESTING_DENOMINATOR = 3;
|
56
|
+
uint256 public VESTING_NUMERATOR = 2;
|
57
|
+
|
58
|
+
mapping (address => bool) changer;
|
59
|
+
mapping (address => bool) notifier;
|
60
|
+
|
61
|
+
address public notifyHelperRegular;
|
62
|
+
address public notifyHelperAmpliFARM;
|
63
|
+
address public rewardToken;
|
64
|
+
|
65
|
+
Notification[] public notifications;
|
66
|
+
mapping (address => uint256) public poolToIndex;
|
67
|
+
mapping (uint256 => uint256) public numbers; // NotificationType to the number of pools
|
68
|
+
|
69
|
+
address public reserve;
|
70
|
+
address public vestingEscrow;
|
71
|
+
uint256 public totalPercentage; // maintain state to not have to calculate during emissions
|
72
|
+
|
73
|
+
modifier onlyChanger {
|
74
|
+
require(changer[msg.sender] || msg.sender == governance(), "Only changer");
|
75
|
+
_;
|
76
|
+
}
|
77
|
+
|
78
|
+
modifier onlyNotifier {
|
79
|
+
require(notifier[msg.sender], "Only notifier");
|
80
|
+
_;
|
81
|
+
}
|
82
|
+
|
83
|
+
constructor(address _storage,
|
84
|
+
address _notifyHelperRegular,
|
85
|
+
address _rewardToken,
|
86
|
+
address _notifyHelperAmpliFARM,
|
87
|
+
address _escrow,
|
88
|
+
address _reserve)
|
89
|
+
Controllable(_storage) public {
|
90
|
+
// used for getting a reference to FeeRewardForwarder
|
91
|
+
notifyHelperRegular = _notifyHelperRegular;
|
92
|
+
rewardToken = _rewardToken;
|
93
|
+
notifyHelperAmpliFARM = _notifyHelperAmpliFARM;
|
94
|
+
vestingEscrow = _escrow;
|
95
|
+
reserve = _reserve;
|
96
|
+
require(_reserve != address(0), "invalid reserve");
|
97
|
+
require(_escrow != address(0), "invalid escrow");
|
98
|
+
}
|
99
|
+
|
100
|
+
/// Whitelisted entities can notify pools based on the state, both for FARM and iFARM
|
101
|
+
/// The only whitelisted entity here would be the minter helper
|
102
|
+
function notifyPools(uint256 total, uint256 timestamp) public onlyNotifier {
|
103
|
+
// transfer the tokens from the msg.sender to here
|
104
|
+
IERC20Upgradeable(rewardToken).safeTransferFrom(msg.sender, address(this), total);
|
105
|
+
|
106
|
+
// prepare the notification data
|
107
|
+
WorkingNotification memory ampliFARM = WorkingNotification(
|
108
|
+
new address[](numbers[uint256(NotificationType.AMPLIFARM)]),
|
109
|
+
new uint256[](numbers[uint256(NotificationType.AMPLIFARM)]),
|
110
|
+
0,
|
111
|
+
0
|
112
|
+
);
|
113
|
+
WorkingNotification memory regular = WorkingNotification(
|
114
|
+
new address[](numbers[uint256(NotificationType.FARM)]),
|
115
|
+
new uint256[](numbers[uint256(NotificationType.FARM)]),
|
116
|
+
0,
|
117
|
+
0
|
118
|
+
);
|
119
|
+
uint256 vestingAmount = 0;
|
120
|
+
for (uint256 i = 0; i < notifications.length; i++) {
|
121
|
+
Notification storage notification = notifications[i];
|
122
|
+
if (notification.notificationType == NotificationType.TRANSFER) {
|
123
|
+
// simple transfer
|
124
|
+
IERC20Upgradeable(rewardToken).safeTransfer(
|
125
|
+
notification.poolAddress,
|
126
|
+
total.mul(notification.percentage).div(totalPercentage)
|
127
|
+
);
|
128
|
+
} else {
|
129
|
+
// FARM or ampliFARM notification
|
130
|
+
WorkingNotification memory toUse = notification.notificationType == NotificationType.FARM ? regular : ampliFARM;
|
131
|
+
toUse.amounts[toUse.counter] = total.mul(notification.percentage).div(totalPercentage);
|
132
|
+
if (notification.vests) {
|
133
|
+
uint256 toVest = toUse.amounts[toUse.counter].mul(VESTING_NUMERATOR).div(VESTING_DENOMINATOR);
|
134
|
+
toUse.amounts[toUse.counter] = toUse.amounts[toUse.counter].sub(toVest);
|
135
|
+
vestingAmount = vestingAmount.add(toVest);
|
136
|
+
emit Vesting(notification.poolAddress, toVest);
|
137
|
+
}
|
138
|
+
toUse.pools[toUse.counter] = notification.poolAddress;
|
139
|
+
toUse.checksum = toUse.checksum.add(toUse.amounts[toUse.counter]);
|
140
|
+
toUse.counter = toUse.counter.add(1);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
// handle vesting
|
145
|
+
if (vestingAmount > 0) {
|
146
|
+
IERC20Upgradeable(rewardToken).safeTransfer(vestingEscrow, vestingAmount);
|
147
|
+
}
|
148
|
+
|
149
|
+
// ampliFARM notifications
|
150
|
+
if (ampliFARM.checksum > 0) {
|
151
|
+
IERC20Upgradeable(rewardToken).approve(notifyHelperAmpliFARM, ampliFARM.checksum);
|
152
|
+
INotifyHelperAmpliFARM(notifyHelperAmpliFARM).notifyPools(ampliFARM.amounts, ampliFARM.pools, ampliFARM.checksum);
|
153
|
+
}
|
154
|
+
|
155
|
+
// regular notifications
|
156
|
+
if (regular.checksum > 0) {
|
157
|
+
IERC20Upgradeable(rewardToken).approve(notifyHelperRegular, regular.checksum);
|
158
|
+
INotifyHelperGeneric(notifyHelperRegular).notifyPools(
|
159
|
+
regular.amounts, regular.pools, regular.checksum, rewardToken
|
160
|
+
);
|
161
|
+
}
|
162
|
+
|
163
|
+
// send rest to the reserve
|
164
|
+
uint256 remainingBalance = IERC20Upgradeable(rewardToken).balanceOf(address(this));
|
165
|
+
if (remainingBalance > 0) {
|
166
|
+
IERC20Upgradeable(rewardToken).safeTransfer(reserve, remainingBalance);
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
170
|
+
/// Returning the governance
|
171
|
+
function transferGovernance(address target, address newStorage) external onlyGovernance {
|
172
|
+
Governable(target).setStorage(newStorage);
|
173
|
+
}
|
174
|
+
|
175
|
+
/// The governance configures whitelists
|
176
|
+
function setChanger(address who, bool value) external onlyGovernance {
|
177
|
+
changer[who] = value;
|
178
|
+
emit ChangerSet(who, value);
|
179
|
+
}
|
180
|
+
|
181
|
+
/// The governance configures whitelists
|
182
|
+
function setNotifier(address who, bool value) external onlyGovernance {
|
183
|
+
notifier[who] = value;
|
184
|
+
emit NotifierSet(who, value);
|
185
|
+
}
|
186
|
+
|
187
|
+
/// Whitelisted entity makes changes to the notifications
|
188
|
+
function setPoolBatch(address[] calldata poolAddress, uint256[] calldata poolPercentage, NotificationType[] calldata notificationType, bool[] calldata vests) external onlyChanger {
|
189
|
+
for (uint256 i = 0; i < poolAddress.length; i++) {
|
190
|
+
setPool(poolAddress[i], poolPercentage[i], notificationType[i], vests[i]);
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
/// Pool management, adds, updates or removes a transfer/notification
|
195
|
+
function setPool(address poolAddress, uint256 poolPercentage, NotificationType notificationType, bool vests) public onlyChanger {
|
196
|
+
require(notificationType != NotificationType.VOID, "Use valid indication");
|
197
|
+
require(notificationType != NotificationType.TOKEN, "We do not use TOKEN here");
|
198
|
+
if (notificationExists(poolAddress) && poolPercentage == 0) {
|
199
|
+
// remove
|
200
|
+
removeNotification(poolAddress);
|
201
|
+
} else if (notificationExists(poolAddress)) {
|
202
|
+
// update
|
203
|
+
updateNotification(poolAddress, notificationType, poolPercentage, vests);
|
204
|
+
} else if (poolPercentage > 0) {
|
205
|
+
// add because it does not exist
|
206
|
+
addNotification(poolAddress, poolPercentage, notificationType, vests);
|
207
|
+
}
|
208
|
+
emit PoolChanged(poolAddress, poolPercentage, uint256(notificationType), vests);
|
209
|
+
}
|
210
|
+
|
211
|
+
/// Configuration method for vesting for governance
|
212
|
+
function setVestingEscrow(address _escrow) external onlyGovernance {
|
213
|
+
vestingEscrow = _escrow;
|
214
|
+
}
|
215
|
+
|
216
|
+
/// Configuration method for vesting for governance
|
217
|
+
function setVesting(uint256 _numerator, uint256 _denominator) external onlyGovernance {
|
218
|
+
VESTING_DENOMINATOR = _numerator;
|
219
|
+
VESTING_NUMERATOR = _denominator;
|
220
|
+
}
|
221
|
+
|
222
|
+
function notificationExists(address poolAddress) public view returns(bool) {
|
223
|
+
if (notifications.length == 0) return false;
|
224
|
+
if (poolToIndex[poolAddress] != 0) return true;
|
225
|
+
return (notifications[0].poolAddress == poolAddress);
|
226
|
+
}
|
227
|
+
|
228
|
+
function removeNotification(address poolAddress) internal {
|
229
|
+
require(notificationExists(poolAddress), "notification does not exist");
|
230
|
+
uint256 index = poolToIndex[poolAddress];
|
231
|
+
Notification storage notification = notifications[index];
|
232
|
+
|
233
|
+
totalPercentage = totalPercentage.sub(notification.percentage);
|
234
|
+
numbers[uint256(notification.notificationType)] = numbers[uint256(notification.notificationType)].sub(1);
|
235
|
+
|
236
|
+
// move the last element here and pop from the array
|
237
|
+
notifications[index] = notifications[notifications.length.sub(1)];
|
238
|
+
poolToIndex[notifications[index].poolAddress] = index;
|
239
|
+
poolToIndex[poolAddress] = 0;
|
240
|
+
notifications.pop();
|
241
|
+
}
|
242
|
+
|
243
|
+
function updateNotification(address poolAddress, NotificationType notificationType, uint256 percentage, bool vesting) internal {
|
244
|
+
require(notificationExists(poolAddress), "notification does not exist");
|
245
|
+
require(percentage > 0, "notification is 0");
|
246
|
+
uint256 index = poolToIndex[poolAddress];
|
247
|
+
totalPercentage = totalPercentage.sub(notifications[index].percentage).add(percentage);
|
248
|
+
notifications[index].percentage = percentage;
|
249
|
+
notifications[index].vests = vesting;
|
250
|
+
if (notifications[index].notificationType != notificationType) {
|
251
|
+
numbers[uint256(notifications[index].notificationType)] = numbers[uint256(notifications[index].notificationType)].sub(1);
|
252
|
+
notifications[index].notificationType = notificationType;
|
253
|
+
numbers[uint256(notifications[index].notificationType)] = numbers[uint256(notifications[index].notificationType)].add(1);
|
254
|
+
}
|
255
|
+
}
|
256
|
+
|
257
|
+
function addNotification(address poolAddress, uint256 percentage, NotificationType notificationType, bool vesting) internal {
|
258
|
+
require(!notificationExists(poolAddress), "notification exists");
|
259
|
+
require(percentage > 0, "notification is 0");
|
260
|
+
require(PotPool(poolAddress).getRewardTokenIndex(rewardToken) != uint256(-1), "Token not configured on pot pool");
|
261
|
+
Notification memory notification = Notification(poolAddress, notificationType, percentage, vesting);
|
262
|
+
notifications.push(notification);
|
263
|
+
totalPercentage = totalPercentage.add(notification.percentage);
|
264
|
+
numbers[uint256(notification.notificationType)] = numbers[uint256(notification.notificationType)].add(1);
|
265
|
+
poolToIndex[notification.poolAddress] = notifications.length.sub(1);
|
266
|
+
require(notificationExists(poolAddress), "notification was not added");
|
267
|
+
}
|
268
|
+
|
269
|
+
/// emergency draining of tokens and ETH as there should be none staying here
|
270
|
+
function emergencyDrain(address token, uint256 amount) public onlyGovernance {
|
271
|
+
if (token == address(0)) {
|
272
|
+
msg.sender.transfer(amount);
|
273
|
+
} else {
|
274
|
+
IERC20Upgradeable(token).safeTransfer(msg.sender, amount);
|
275
|
+
}
|
276
|
+
}
|
277
|
+
|
278
|
+
function getConfig(uint256 totalAmount) external view returns(address[] memory, uint256[] memory, uint256[] memory) {
|
279
|
+
address[] memory pools = new address[](notifications.length);
|
280
|
+
uint256[] memory percentages = new uint256[](notifications.length);
|
281
|
+
uint256[] memory amounts = new uint256[](notifications.length);
|
282
|
+
for (uint256 i = 0; i < notifications.length; i++) {
|
283
|
+
Notification storage notification = notifications[i];
|
284
|
+
pools[i] = notification.poolAddress;
|
285
|
+
percentages[i] = notification.percentage.mul(1000000).div(totalPercentage);
|
286
|
+
amounts[i] = notification.percentage.mul(totalAmount).div(totalPercentage);
|
287
|
+
}
|
288
|
+
return (pools, percentages, amounts);
|
289
|
+
}
|
290
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
|
3
|
+
pragma solidity 0.6.12;
|
4
|
+
|
5
|
+
import "./Governable.sol";
|
6
|
+
|
7
|
+
contract Controllable is Governable {
|
8
|
+
|
9
|
+
constructor(address _storage) Governable(_storage) public {
|
10
|
+
}
|
11
|
+
|
12
|
+
modifier onlyController() {
|
13
|
+
require(store.isController(msg.sender), "Not a controller");
|
14
|
+
_;
|
15
|
+
}
|
16
|
+
|
17
|
+
modifier onlyControllerOrGovernance(){
|
18
|
+
require((store.isController(msg.sender) || store.isGovernance(msg.sender)),
|
19
|
+
"The caller must be controller or governance");
|
20
|
+
_;
|
21
|
+
}
|
22
|
+
|
23
|
+
function controller() public view returns (address) {
|
24
|
+
return store.controller();
|
25
|
+
}
|
26
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
|
3
|
+
pragma solidity 0.6.12;
|
4
|
+
|
5
|
+
import "./GovernableInit.sol";
|
6
|
+
|
7
|
+
// A clone of Governable supporting the Initializable interface and pattern
|
8
|
+
contract ControllableInit is GovernableInit {
|
9
|
+
|
10
|
+
constructor() public {
|
11
|
+
}
|
12
|
+
|
13
|
+
function initialize(address _storage) public override initializer {
|
14
|
+
GovernableInit.initialize(_storage);
|
15
|
+
}
|
16
|
+
|
17
|
+
modifier onlyController() {
|
18
|
+
require(Storage(_storage()).isController(msg.sender), "Not a controller");
|
19
|
+
_;
|
20
|
+
}
|
21
|
+
|
22
|
+
modifier onlyControllerOrGovernance(){
|
23
|
+
require((Storage(_storage()).isController(msg.sender) || Storage(_storage()).isGovernance(msg.sender)),
|
24
|
+
"The caller must be controller or governance");
|
25
|
+
_;
|
26
|
+
}
|
27
|
+
|
28
|
+
function controller() public view returns (address) {
|
29
|
+
return Storage(_storage()).controller();
|
30
|
+
}
|
31
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
|
3
|
+
pragma solidity 0.6.12;
|
4
|
+
|
5
|
+
import "./Storage.sol";
|
6
|
+
|
7
|
+
contract Governable {
|
8
|
+
|
9
|
+
Storage public store;
|
10
|
+
|
11
|
+
constructor(address _store) public {
|
12
|
+
require(_store != address(0), "new storage shouldn't be empty");
|
13
|
+
store = Storage(_store);
|
14
|
+
}
|
15
|
+
|
16
|
+
modifier onlyGovernance() {
|
17
|
+
require(store.isGovernance(msg.sender), "Not governance");
|
18
|
+
_;
|
19
|
+
}
|
20
|
+
|
21
|
+
function setStorage(address _store) public onlyGovernance {
|
22
|
+
require(_store != address(0), "new storage shouldn't be empty");
|
23
|
+
store = Storage(_store);
|
24
|
+
}
|
25
|
+
|
26
|
+
function governance() public view returns (address) {
|
27
|
+
return store.governance();
|
28
|
+
}
|
29
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
|
3
|
+
pragma solidity 0.6.12;
|
4
|
+
|
5
|
+
import "../upgradability/ReentrancyGuardUpgradeable.sol";
|
6
|
+
import "./Storage.sol";
|
7
|
+
|
8
|
+
// A clone of Governable supporting the Initializable interface and pattern
|
9
|
+
contract GovernableInit is ReentrancyGuardUpgradeable {
|
10
|
+
|
11
|
+
bytes32 internal constant _STORAGE_SLOT = 0xa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc;
|
12
|
+
|
13
|
+
modifier onlyGovernance() {
|
14
|
+
require(Storage(_storage()).isGovernance(msg.sender), "Not governance");
|
15
|
+
_;
|
16
|
+
}
|
17
|
+
|
18
|
+
constructor() public {
|
19
|
+
assert(_STORAGE_SLOT == bytes32(uint256(keccak256("eip1967.governableInit.storage")) - 1));
|
20
|
+
}
|
21
|
+
|
22
|
+
function initialize(address _store) public virtual initializer {
|
23
|
+
_setStorage(_store);
|
24
|
+
ReentrancyGuardUpgradeable.initialize();
|
25
|
+
}
|
26
|
+
|
27
|
+
function _setStorage(address newStorage) private {
|
28
|
+
bytes32 slot = _STORAGE_SLOT;
|
29
|
+
// solhint-disable-next-line no-inline-assembly
|
30
|
+
assembly {
|
31
|
+
sstore(slot, newStorage)
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
function setStorage(address _store) public onlyGovernance {
|
36
|
+
require(_store != address(0), "new storage shouldn't be empty");
|
37
|
+
_setStorage(_store);
|
38
|
+
}
|
39
|
+
|
40
|
+
function _storage() internal view returns (address str) {
|
41
|
+
bytes32 slot = _STORAGE_SLOT;
|
42
|
+
// solhint-disable-next-line no-inline-assembly
|
43
|
+
assembly {
|
44
|
+
str := sload(slot)
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
function governance() public view returns (address) {
|
49
|
+
return Storage(_storage()).governance();
|
50
|
+
}
|
51
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "@openzeppelin/contracts/access/Ownable.sol";
|
5
|
+
|
6
|
+
contract OwnableWhitelist is Ownable {
|
7
|
+
mapping (address => bool) public whitelist;
|
8
|
+
|
9
|
+
modifier onlyWhitelisted() {
|
10
|
+
require(whitelist[msg.sender] || msg.sender == owner(), "not allowed");
|
11
|
+
_;
|
12
|
+
}
|
13
|
+
|
14
|
+
function setWhitelist(address target, bool isWhitelisted) public onlyOwner {
|
15
|
+
whitelist[target] = isWhitelisted;
|
16
|
+
}
|
17
|
+
}
|