@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,163 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
|
3
|
+
pragma solidity 0.6.12;
|
4
|
+
|
5
|
+
import "./inheritance/Governable.sol";
|
6
|
+
import "./interface/IRewardPool.sol";
|
7
|
+
|
8
|
+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
9
|
+
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
10
|
+
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
11
|
+
import "@openzeppelin/contracts/math/SafeMath.sol";
|
12
|
+
import "@openzeppelin/contracts/math/Math.sol";
|
13
|
+
import "@openzeppelin/contracts/utils/Address.sol";
|
14
|
+
import "@openzeppelin/contracts/GSN/Context.sol";
|
15
|
+
import "@openzeppelin/contracts/access/Ownable.sol";
|
16
|
+
|
17
|
+
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
|
18
|
+
|
19
|
+
contract FeeRewardForwarder is Governable {
|
20
|
+
using SafeERC20 for IERC20;
|
21
|
+
using SafeMath for uint256;
|
22
|
+
|
23
|
+
address constant public weth = address(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619);
|
24
|
+
address constant public wmatic = address(0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270);
|
25
|
+
address constant public quick = address(0x831753DD7087CaC61aB5644b308642cc1c33Dc13);
|
26
|
+
|
27
|
+
address constant public ifarm = address(0xab0b2ddB9C7e440fAc8E140A89c0dbCBf2d7Bbff);
|
28
|
+
address constant public sushi = address(0x0b3F868E0BE5597D5DB7fEB59E1CADBb0fdDa50a);
|
29
|
+
address constant public usdc = address(0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174);
|
30
|
+
address constant public aave = address(0xD6DF932A45C0f255f85145f286eA0b292B21C90B);
|
31
|
+
|
32
|
+
|
33
|
+
mapping (address => mapping (address => address[])) public routes;
|
34
|
+
mapping (address => mapping (address => address[])) public routers;
|
35
|
+
|
36
|
+
address constant public quickswapRouter = address(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
|
37
|
+
address constant public sushiswapRouter = address(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506);
|
38
|
+
|
39
|
+
// the targeted reward token to convert everything to
|
40
|
+
address public targetToken = weth;
|
41
|
+
address public profitSharingPool;
|
42
|
+
|
43
|
+
event TokenPoolSet(address token, address pool);
|
44
|
+
|
45
|
+
constructor(address _storage) public Governable(_storage) {
|
46
|
+
profitSharingPool = governance();
|
47
|
+
|
48
|
+
routes[quick][weth] = [quick, weth];
|
49
|
+
routers[quick][weth] = [quickswapRouter];
|
50
|
+
|
51
|
+
routes[sushi][weth] = [sushi, weth];
|
52
|
+
routers[sushi][weth] = [sushiswapRouter];
|
53
|
+
|
54
|
+
routes[wmatic][weth] = [wmatic, weth];
|
55
|
+
routers[wmatic][weth] = [quickswapRouter];
|
56
|
+
}
|
57
|
+
|
58
|
+
/*
|
59
|
+
* Set the pool that will receive the reward token
|
60
|
+
* based on the address of the reward Token
|
61
|
+
*/
|
62
|
+
function setEOA(address _eoa) public onlyGovernance {
|
63
|
+
profitSharingPool = _eoa;
|
64
|
+
targetToken = weth;
|
65
|
+
emit TokenPoolSet(targetToken, _eoa);
|
66
|
+
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Sets the path for swapping tokens to the to address
|
70
|
+
* The to address is not validated to match the targetToken,
|
71
|
+
* so that we could first update the paths, and then,
|
72
|
+
* set the new target
|
73
|
+
*/
|
74
|
+
function setConversionPath(address[] memory _route, address[] memory _routers)
|
75
|
+
public
|
76
|
+
onlyGovernance
|
77
|
+
{
|
78
|
+
require(
|
79
|
+
_routers.length == 1 || _routers.length == _route.length-1,
|
80
|
+
"Provide either 1 router in total, or 1 router per intermediate pair"
|
81
|
+
);
|
82
|
+
address from = _route[0];
|
83
|
+
address to = _route[_route.length-1];
|
84
|
+
routes[from][to] = _route;
|
85
|
+
routers[from][to] = _routers;
|
86
|
+
}
|
87
|
+
|
88
|
+
// Transfers the funds from the msg.sender to the pool
|
89
|
+
// under normal circumstances, msg.sender is the strategy
|
90
|
+
function poolNotifyFixedTarget(address _token, uint256 _amount) external {
|
91
|
+
uint256 remainingAmount = _amount;
|
92
|
+
|
93
|
+
if (_token == weth) {
|
94
|
+
// this is already the right token
|
95
|
+
IERC20(_token).safeTransferFrom(msg.sender, profitSharingPool, _amount);
|
96
|
+
} else {
|
97
|
+
|
98
|
+
// we need to convert _token to WETH
|
99
|
+
if (routes[_token][targetToken].length > 1) {
|
100
|
+
IERC20(_token).safeTransferFrom(msg.sender, address(this), remainingAmount);
|
101
|
+
uint256 balanceToSwap = IERC20(_token).balanceOf(address(this));
|
102
|
+
if (routers[_token][targetToken].length == 1) {
|
103
|
+
liquidate(_token, targetToken, balanceToSwap);
|
104
|
+
} else if (routers[_token][targetToken].length > 1) {
|
105
|
+
liquidateMultiRouter(_token, targetToken, balanceToSwap);
|
106
|
+
} else {
|
107
|
+
revert("FeeRewardForwarder: liquidation routers not set");
|
108
|
+
}
|
109
|
+
|
110
|
+
// now we can send this token forward
|
111
|
+
uint256 convertedRewardAmount = IERC20(targetToken).balanceOf(address(this));
|
112
|
+
|
113
|
+
IERC20(targetToken).safeTransfer(profitSharingPool, convertedRewardAmount);
|
114
|
+
} else {
|
115
|
+
// else the route does not exist for this token
|
116
|
+
// do not take any fees and revert.
|
117
|
+
// It's better to set the liquidation path then perform it again,
|
118
|
+
// rather then leaving the funds in controller
|
119
|
+
revert("FeeRewardForwarder: liquidation path doesn't exist");
|
120
|
+
}
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
function liquidate(address _from, address _to, uint256 balanceToSwap) internal {
|
125
|
+
if(balanceToSwap > 0){
|
126
|
+
address router = routers[_from][_to][0];
|
127
|
+
IERC20(_from).safeApprove(router, 0);
|
128
|
+
IERC20(_from).safeApprove(router, balanceToSwap);
|
129
|
+
|
130
|
+
IUniswapV2Router02(router).swapExactTokensForTokens(
|
131
|
+
balanceToSwap,
|
132
|
+
0,
|
133
|
+
routes[_from][_to],
|
134
|
+
address(this),
|
135
|
+
block.timestamp
|
136
|
+
);
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
function liquidateMultiRouter(address _from, address _to, uint256 balanceToSwap) internal {
|
141
|
+
if(balanceToSwap > 0){
|
142
|
+
address[] memory _routers = routers[_from][_to];
|
143
|
+
address[] memory _route = routes[_from][_to];
|
144
|
+
for (uint256 i; i < _routers.length; i++ ) {
|
145
|
+
address router = _routers[i];
|
146
|
+
address[] memory route = new address[](2);
|
147
|
+
route[0] = _route[i];
|
148
|
+
route[1] = _route[i+1];
|
149
|
+
uint256 amount = IERC20(route[0]).balanceOf(address(this));
|
150
|
+
IERC20(route[0]).safeApprove(router, 0);
|
151
|
+
IERC20(route[0]).safeApprove(router, amount);
|
152
|
+
|
153
|
+
IUniswapV2Router02(router).swapExactTokensForTokens(
|
154
|
+
amount,
|
155
|
+
0,
|
156
|
+
route,
|
157
|
+
address(this),
|
158
|
+
block.timestamp
|
159
|
+
);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
}
|
163
|
+
}
|
@@ -0,0 +1,360 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "./inheritance/Controllable.sol";
|
5
|
+
import "./interface/IController.sol";
|
6
|
+
|
7
|
+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
8
|
+
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
9
|
+
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
10
|
+
import "@openzeppelin/contracts/math/SafeMath.sol";
|
11
|
+
import "@openzeppelin/contracts/math/Math.sol";
|
12
|
+
import "@openzeppelin/contracts/utils/Address.sol";
|
13
|
+
import "@openzeppelin/contracts/GSN/Context.sol";
|
14
|
+
import "@openzeppelin/contracts/access/Ownable.sol";
|
15
|
+
|
16
|
+
abstract contract IRewardDistributionRecipient is Ownable {
|
17
|
+
|
18
|
+
mapping (address => bool) public rewardDistribution;
|
19
|
+
|
20
|
+
constructor(address[] memory _rewardDistributions) public {
|
21
|
+
// multisig on Matic
|
22
|
+
rewardDistribution[0x39cC360806b385C96969ce9ff26c23476017F652] = true;
|
23
|
+
// NotifyHelper
|
24
|
+
rewardDistribution[0xF71042C88458ff1702c3870f62F4c764712Cc9F0] = true;
|
25
|
+
|
26
|
+
for(uint256 i = 0; i < _rewardDistributions.length; i++) {
|
27
|
+
rewardDistribution[_rewardDistributions[i]] = true;
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
function notifyTargetRewardAmount(address rewardToken, uint256 reward) external virtual;
|
32
|
+
function notifyRewardAmount(uint256 reward) external virtual;
|
33
|
+
|
34
|
+
modifier onlyRewardDistribution() {
|
35
|
+
require(rewardDistribution[_msgSender()], "Caller is not reward distribution");
|
36
|
+
_;
|
37
|
+
}
|
38
|
+
|
39
|
+
function setRewardDistribution(address[] calldata _newRewardDistribution, bool _flag)
|
40
|
+
external
|
41
|
+
onlyOwner
|
42
|
+
{
|
43
|
+
for(uint256 i = 0; i < _newRewardDistribution.length; i++){
|
44
|
+
rewardDistribution[_newRewardDistribution[i]] = _flag;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
contract PotPool is IRewardDistributionRecipient, Controllable, ERC20 {
|
50
|
+
|
51
|
+
using Address for address;
|
52
|
+
using SafeERC20 for IERC20;
|
53
|
+
using SafeMath for uint256;
|
54
|
+
|
55
|
+
address public lpToken;
|
56
|
+
uint256 public duration; // making it not a constant is less gas efficient, but portable
|
57
|
+
|
58
|
+
mapping(address => uint256) public stakedBalanceOf;
|
59
|
+
|
60
|
+
mapping (address => bool) smartContractStakers;
|
61
|
+
address[] public rewardTokens;
|
62
|
+
mapping(address => uint256) public periodFinishForToken;
|
63
|
+
mapping(address => uint256) public rewardRateForToken;
|
64
|
+
mapping(address => uint256) public lastUpdateTimeForToken;
|
65
|
+
mapping(address => uint256) public rewardPerTokenStoredForToken;
|
66
|
+
mapping(address => mapping(address => uint256)) public userRewardPerTokenPaidForToken;
|
67
|
+
mapping(address => mapping(address => uint256)) public rewardsForToken;
|
68
|
+
|
69
|
+
event RewardAdded(address rewardToken, uint256 reward);
|
70
|
+
event Staked(address indexed user, uint256 amount);
|
71
|
+
event Withdrawn(address indexed user, uint256 amount);
|
72
|
+
event RewardPaid(address indexed user, address rewardToken, uint256 reward);
|
73
|
+
event RewardDenied(address indexed user, address rewardToken, uint256 reward);
|
74
|
+
event SmartContractRecorded(address indexed smartContractAddress, address indexed smartContractInitiator);
|
75
|
+
|
76
|
+
modifier onlyGovernanceOrRewardDistribution() {
|
77
|
+
require(msg.sender == governance() || rewardDistribution[msg.sender], "Not governance nor reward distribution");
|
78
|
+
_;
|
79
|
+
}
|
80
|
+
|
81
|
+
modifier updateRewards(address account) {
|
82
|
+
for(uint256 i = 0; i < rewardTokens.length; i++ ){
|
83
|
+
address rt = rewardTokens[i];
|
84
|
+
rewardPerTokenStoredForToken[rt] = rewardPerToken(rt);
|
85
|
+
lastUpdateTimeForToken[rt] = lastTimeRewardApplicable(rt);
|
86
|
+
if (account != address(0)) {
|
87
|
+
rewardsForToken[rt][account] = earned(rt, account);
|
88
|
+
userRewardPerTokenPaidForToken[rt][account] = rewardPerTokenStoredForToken[rt];
|
89
|
+
}
|
90
|
+
}
|
91
|
+
_;
|
92
|
+
}
|
93
|
+
|
94
|
+
modifier updateReward(address account, address rt){
|
95
|
+
rewardPerTokenStoredForToken[rt] = rewardPerToken(rt);
|
96
|
+
lastUpdateTimeForToken[rt] = lastTimeRewardApplicable(rt);
|
97
|
+
if (account != address(0)) {
|
98
|
+
rewardsForToken[rt][account] = earned(rt, account);
|
99
|
+
userRewardPerTokenPaidForToken[rt][account] = rewardPerTokenStoredForToken[rt];
|
100
|
+
}
|
101
|
+
_;
|
102
|
+
}
|
103
|
+
|
104
|
+
/** View functions to respect old interface */
|
105
|
+
function rewardToken() public view returns(address) {
|
106
|
+
return rewardTokens[0];
|
107
|
+
}
|
108
|
+
|
109
|
+
function rewardPerToken() public view returns(uint256) {
|
110
|
+
return rewardPerToken(rewardTokens[0]);
|
111
|
+
}
|
112
|
+
|
113
|
+
function periodFinish() public view returns(uint256) {
|
114
|
+
return periodFinishForToken[rewardTokens[0]];
|
115
|
+
}
|
116
|
+
|
117
|
+
function rewardRate() public view returns(uint256) {
|
118
|
+
return rewardRateForToken[rewardTokens[0]];
|
119
|
+
}
|
120
|
+
|
121
|
+
function lastUpdateTime() public view returns(uint256) {
|
122
|
+
return lastUpdateTimeForToken[rewardTokens[0]];
|
123
|
+
}
|
124
|
+
|
125
|
+
function rewardPerTokenStored() public view returns(uint256) {
|
126
|
+
return rewardPerTokenStoredForToken[rewardTokens[0]];
|
127
|
+
}
|
128
|
+
|
129
|
+
function userRewardPerTokenPaid(address user) public view returns(uint256) {
|
130
|
+
return userRewardPerTokenPaidForToken[rewardTokens[0]][user];
|
131
|
+
}
|
132
|
+
|
133
|
+
function rewards(address user) public view returns(uint256) {
|
134
|
+
return rewardsForToken[rewardTokens[0]][user];
|
135
|
+
}
|
136
|
+
|
137
|
+
// [Hardwork] setting the reward, lpToken, duration, and rewardDistribution for each pool
|
138
|
+
constructor(
|
139
|
+
address[] memory _rewardTokens,
|
140
|
+
address _lpToken,
|
141
|
+
uint256 _duration,
|
142
|
+
address[] memory _rewardDistribution,
|
143
|
+
address _storage,
|
144
|
+
string memory _name,
|
145
|
+
string memory _symbol,
|
146
|
+
uint8 _decimals
|
147
|
+
) public
|
148
|
+
ERC20(_name, _symbol)
|
149
|
+
IRewardDistributionRecipient(_rewardDistribution)
|
150
|
+
Controllable(_storage) // only used for referencing the grey list
|
151
|
+
{
|
152
|
+
require(_decimals == ERC20(_lpToken).decimals(), "decimals has to be aligned with the lpToken");
|
153
|
+
require(_rewardTokens.length != 0, "should initialize with at least 1 rewardToken");
|
154
|
+
rewardTokens = _rewardTokens;
|
155
|
+
lpToken = _lpToken;
|
156
|
+
duration = _duration;
|
157
|
+
}
|
158
|
+
|
159
|
+
function lastTimeRewardApplicable(uint256 i) public view returns (uint256) {
|
160
|
+
return lastTimeRewardApplicable(rewardTokens[i]);
|
161
|
+
}
|
162
|
+
|
163
|
+
function lastTimeRewardApplicable(address rt) public view returns (uint256) {
|
164
|
+
return Math.min(block.timestamp, periodFinishForToken[rt]);
|
165
|
+
}
|
166
|
+
|
167
|
+
function lastTimeRewardApplicable() public view returns (uint256) {
|
168
|
+
return lastTimeRewardApplicable(rewardTokens[0]);
|
169
|
+
}
|
170
|
+
|
171
|
+
function rewardPerToken(uint256 i) public view returns (uint256) {
|
172
|
+
return rewardPerToken(rewardTokens[i]);
|
173
|
+
}
|
174
|
+
|
175
|
+
function rewardPerToken(address rt) public view returns (uint256) {
|
176
|
+
if (totalSupply() == 0) {
|
177
|
+
return rewardPerTokenStoredForToken[rt];
|
178
|
+
}
|
179
|
+
return
|
180
|
+
rewardPerTokenStoredForToken[rt].add(
|
181
|
+
lastTimeRewardApplicable(rt)
|
182
|
+
.sub(lastUpdateTimeForToken[rt])
|
183
|
+
.mul(rewardRateForToken[rt])
|
184
|
+
.mul(1e18)
|
185
|
+
.div(totalSupply())
|
186
|
+
);
|
187
|
+
}
|
188
|
+
|
189
|
+
function earned(uint256 i, address account) public view returns (uint256) {
|
190
|
+
return earned(rewardTokens[i], account);
|
191
|
+
}
|
192
|
+
|
193
|
+
function earned(address account) public view returns (uint256) {
|
194
|
+
return earned(rewardTokens[0], account);
|
195
|
+
}
|
196
|
+
|
197
|
+
function earned(address rt, address account) public view returns (uint256) {
|
198
|
+
return
|
199
|
+
stakedBalanceOf[account]
|
200
|
+
.mul(rewardPerToken(rt).sub(userRewardPerTokenPaidForToken[rt][account]))
|
201
|
+
.div(1e18)
|
202
|
+
.add(rewardsForToken[rt][account]);
|
203
|
+
}
|
204
|
+
|
205
|
+
function stake(uint256 amount) public updateRewards(msg.sender) {
|
206
|
+
require(amount > 0, "Cannot stake 0");
|
207
|
+
recordSmartContract();
|
208
|
+
super._mint(msg.sender, amount); // ERC20 is used as a staking receipt
|
209
|
+
stakedBalanceOf[msg.sender] = stakedBalanceOf[msg.sender].add(amount);
|
210
|
+
IERC20(lpToken).safeTransferFrom(msg.sender, address(this), amount);
|
211
|
+
emit Staked(msg.sender, amount);
|
212
|
+
}
|
213
|
+
|
214
|
+
function withdraw(uint256 amount) public updateRewards(msg.sender) {
|
215
|
+
require(amount > 0, "Cannot withdraw 0");
|
216
|
+
super._burn(msg.sender, amount);
|
217
|
+
stakedBalanceOf[msg.sender] = stakedBalanceOf[msg.sender].sub(amount);
|
218
|
+
IERC20(lpToken).safeTransfer(msg.sender, amount);
|
219
|
+
emit Withdrawn(msg.sender, amount);
|
220
|
+
}
|
221
|
+
|
222
|
+
function exit() external {
|
223
|
+
withdraw(Math.min(stakedBalanceOf[msg.sender], balanceOf(msg.sender)));
|
224
|
+
getAllRewards();
|
225
|
+
}
|
226
|
+
|
227
|
+
/// A push mechanism for accounts that have not claimed their rewards for a long time.
|
228
|
+
/// The implementation is semantically analogous to getReward(), but uses a push pattern
|
229
|
+
/// instead of pull pattern.
|
230
|
+
function pushAllRewards(address recipient) public updateRewards(recipient) onlyGovernance {
|
231
|
+
bool rewardPayout = (!smartContractStakers[recipient] || !IController(controller()).greyList(recipient));
|
232
|
+
for(uint256 i = 0 ; i < rewardTokens.length; i++ ){
|
233
|
+
uint256 reward = earned(rewardTokens[i], recipient);
|
234
|
+
if (reward > 0) {
|
235
|
+
rewardsForToken[rewardTokens[i]][recipient] = 0;
|
236
|
+
// If it is a normal user and not smart contract,
|
237
|
+
// then the requirement will pass
|
238
|
+
// If it is a smart contract, then
|
239
|
+
// make sure that it is not on our greyList.
|
240
|
+
if (rewardPayout) {
|
241
|
+
IERC20(rewardTokens[i]).safeTransfer(recipient, reward);
|
242
|
+
emit RewardPaid(recipient, rewardTokens[i], reward);
|
243
|
+
} else {
|
244
|
+
emit RewardDenied(recipient, rewardTokens[i], reward);
|
245
|
+
}
|
246
|
+
}
|
247
|
+
}
|
248
|
+
}
|
249
|
+
|
250
|
+
function getAllRewards() public updateRewards(msg.sender) {
|
251
|
+
recordSmartContract();
|
252
|
+
bool rewardPayout = (!smartContractStakers[msg.sender] || !IController(controller()).greyList(msg.sender));
|
253
|
+
for(uint256 i = 0 ; i < rewardTokens.length; i++ ){
|
254
|
+
_getRewardAction(rewardTokens[i], rewardPayout);
|
255
|
+
}
|
256
|
+
}
|
257
|
+
|
258
|
+
function getReward(address rt) public updateReward(msg.sender, rt) {
|
259
|
+
recordSmartContract();
|
260
|
+
_getRewardAction(
|
261
|
+
rt,
|
262
|
+
// don't payout if it is a grey listed smart contract
|
263
|
+
(!smartContractStakers[msg.sender] || !IController(controller()).greyList(msg.sender))
|
264
|
+
);
|
265
|
+
}
|
266
|
+
|
267
|
+
function getReward() public {
|
268
|
+
getReward(rewardTokens[0]);
|
269
|
+
}
|
270
|
+
|
271
|
+
function _getRewardAction(address rt, bool rewardPayout) internal {
|
272
|
+
uint256 reward = earned(rt, msg.sender);
|
273
|
+
if (reward > 0 && IERC20(rt).balanceOf(address(this)) >= reward ) {
|
274
|
+
rewardsForToken[rt][msg.sender] = 0;
|
275
|
+
// If it is a normal user and not smart contract,
|
276
|
+
// then the requirement will pass
|
277
|
+
// If it is a smart contract, then
|
278
|
+
// make sure that it is not on our greyList.
|
279
|
+
if (rewardPayout) {
|
280
|
+
IERC20(rt).safeTransfer(msg.sender, reward);
|
281
|
+
emit RewardPaid(msg.sender, rt, reward);
|
282
|
+
} else {
|
283
|
+
emit RewardDenied(msg.sender, rt, reward);
|
284
|
+
}
|
285
|
+
}
|
286
|
+
}
|
287
|
+
|
288
|
+
function addRewardToken(address rt) public onlyGovernanceOrRewardDistribution {
|
289
|
+
require(getRewardTokenIndex(rt) == uint256(-1), "Reward token already exists");
|
290
|
+
rewardTokens.push(rt);
|
291
|
+
}
|
292
|
+
|
293
|
+
function removeRewardToken(address rt) public onlyGovernanceOrRewardDistribution {
|
294
|
+
uint256 i = getRewardTokenIndex(rt);
|
295
|
+
require(i != uint256(-1), "Reward token does not exists");
|
296
|
+
require(periodFinishForToken[rewardTokens[i]] < block.timestamp, "Can only remove when the reward period has passed");
|
297
|
+
require(rewardTokens.length > 1, "Cannot remove the last reward token");
|
298
|
+
uint256 lastIndex = rewardTokens.length - 1;
|
299
|
+
|
300
|
+
// swap
|
301
|
+
rewardTokens[i] = rewardTokens[lastIndex];
|
302
|
+
|
303
|
+
// delete last element
|
304
|
+
rewardTokens.pop();
|
305
|
+
}
|
306
|
+
|
307
|
+
// If the return value is MAX_UINT256, it means that
|
308
|
+
// the specified reward token is not in the list
|
309
|
+
function getRewardTokenIndex(address rt) public view returns(uint256) {
|
310
|
+
for(uint i = 0 ; i < rewardTokens.length ; i++){
|
311
|
+
if(rewardTokens[i] == rt)
|
312
|
+
return i;
|
313
|
+
}
|
314
|
+
return uint256(-1);
|
315
|
+
}
|
316
|
+
|
317
|
+
function notifyTargetRewardAmount(address _rewardToken, uint256 reward)
|
318
|
+
public override
|
319
|
+
onlyRewardDistribution
|
320
|
+
updateRewards(address(0))
|
321
|
+
{
|
322
|
+
// overflow fix according to https://sips.synthetix.io/sips/sip-77
|
323
|
+
require(reward < uint(-1) / 1e18, "the notified reward cannot invoke multiplication overflow");
|
324
|
+
|
325
|
+
uint256 i = getRewardTokenIndex(_rewardToken);
|
326
|
+
require(i != uint256(-1), "rewardTokenIndex not found");
|
327
|
+
|
328
|
+
if (block.timestamp >= periodFinishForToken[_rewardToken]) {
|
329
|
+
rewardRateForToken[_rewardToken] = reward.div(duration);
|
330
|
+
} else {
|
331
|
+
uint256 remaining = periodFinishForToken[_rewardToken].sub(block.timestamp);
|
332
|
+
uint256 leftover = remaining.mul(rewardRateForToken[_rewardToken]);
|
333
|
+
rewardRateForToken[_rewardToken] = reward.add(leftover).div(duration);
|
334
|
+
}
|
335
|
+
lastUpdateTimeForToken[_rewardToken] = block.timestamp;
|
336
|
+
periodFinishForToken[_rewardToken] = block.timestamp.add(duration);
|
337
|
+
emit RewardAdded(_rewardToken, reward);
|
338
|
+
}
|
339
|
+
|
340
|
+
function notifyRewardAmount(uint256 reward)
|
341
|
+
external override
|
342
|
+
onlyRewardDistribution
|
343
|
+
updateRewards(address(0))
|
344
|
+
{
|
345
|
+
notifyTargetRewardAmount(rewardTokens[0], reward);
|
346
|
+
}
|
347
|
+
|
348
|
+
function rewardTokensLength() public view returns(uint256){
|
349
|
+
return rewardTokens.length;
|
350
|
+
}
|
351
|
+
|
352
|
+
// Harvest Smart Contract recording
|
353
|
+
function recordSmartContract() internal {
|
354
|
+
if( tx.origin != msg.sender ) {
|
355
|
+
smartContractStakers[msg.sender] = true;
|
356
|
+
emit SmartContractRecorded(msg.sender, tx.origin);
|
357
|
+
}
|
358
|
+
}
|
359
|
+
|
360
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "@openzeppelin/contracts/utils/Address.sol";
|
5
|
+
import "@openzeppelin/contracts/math/SafeMath.sol";
|
6
|
+
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
7
|
+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
8
|
+
|
9
|
+
import "./inheritance/Governable.sol";
|
10
|
+
import "./interface/IProfitSharingReceiver.sol";
|
11
|
+
|
12
|
+
|
13
|
+
/**
|
14
|
+
* A simple contract for receiving tokens for profit sharing. This contract is designed to pool rewards that will be
|
15
|
+
* sent by governance to Ethereum mainnet for FARM buybacks
|
16
|
+
*/
|
17
|
+
contract ProfitSharingReceiver is Governable {
|
18
|
+
using SafeERC20 for IERC20;
|
19
|
+
|
20
|
+
event WithdrawToken(address indexed token, address indexed receiver, uint amount);
|
21
|
+
|
22
|
+
constructor(
|
23
|
+
address _store
|
24
|
+
)
|
25
|
+
public
|
26
|
+
Governable(_store) {}
|
27
|
+
|
28
|
+
function withdrawTokens(address[] calldata _tokens) external onlyGovernance {
|
29
|
+
address _governance = governance();
|
30
|
+
for (uint i = 0; i < _tokens.length; ++i) {
|
31
|
+
uint amount = IERC20(_tokens[i]).balanceOf(address(this));
|
32
|
+
if (amount > 0) {
|
33
|
+
IERC20(_tokens[i]).safeTransfer(_governance, amount);
|
34
|
+
emit WithdrawToken(_tokens[i], _governance, amount);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
}
|
@@ -0,0 +1,109 @@
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
import "@openzeppelin/contracts/math/SafeMath.sol";
|
5
|
+
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
6
|
+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
7
|
+
|
8
|
+
import "./inheritance/Governable.sol";
|
9
|
+
import "./interface/IControllerV2.sol";
|
10
|
+
import "./interface/IRewardForwarder.sol";
|
11
|
+
import "./interface/IProfitSharingReceiver.sol";
|
12
|
+
import "./interface/IStrategy.sol";
|
13
|
+
import "./interface/IUniversalLiquidator.sol";
|
14
|
+
import "./inheritance/Controllable.sol";
|
15
|
+
|
16
|
+
/**
|
17
|
+
* @dev This contract receives rewards from strategies and is responsible for routing the reward's liquidation into
|
18
|
+
* specific buyback tokens and profit tokens for the DAO.
|
19
|
+
*/
|
20
|
+
contract RewardForwarderV2 is Controllable {
|
21
|
+
using SafeERC20 for IERC20;
|
22
|
+
using SafeMath for uint256;
|
23
|
+
|
24
|
+
address public constant iFARM = address(0xab0b2ddB9C7e440fAc8E140A89c0dbCBf2d7Bbff);
|
25
|
+
|
26
|
+
constructor(
|
27
|
+
address _storage
|
28
|
+
) public Controllable(_storage) {}
|
29
|
+
|
30
|
+
function notifyFee(
|
31
|
+
address _token,
|
32
|
+
uint256 _profitSharingFee,
|
33
|
+
uint256 _strategistFee,
|
34
|
+
uint256 _platformFee
|
35
|
+
) external {
|
36
|
+
_notifyFee(
|
37
|
+
_token,
|
38
|
+
_profitSharingFee,
|
39
|
+
_strategistFee,
|
40
|
+
_platformFee
|
41
|
+
);
|
42
|
+
}
|
43
|
+
|
44
|
+
function _notifyFee(
|
45
|
+
address _token,
|
46
|
+
uint256 _profitSharingFee,
|
47
|
+
uint256 _strategistFee,
|
48
|
+
uint256 _platformFee
|
49
|
+
) internal {
|
50
|
+
address _controller = controller();
|
51
|
+
address liquidator = IControllerV2(_controller).universalLiquidator();
|
52
|
+
|
53
|
+
uint totalTransferAmount = _profitSharingFee.add(_strategistFee).add(_platformFee);
|
54
|
+
require(totalTransferAmount > 0, "totalTransferAmount should not be 0");
|
55
|
+
IERC20(_token).safeTransferFrom(msg.sender, address(this), totalTransferAmount);
|
56
|
+
|
57
|
+
address _targetToken = IControllerV2(_controller).targetToken();
|
58
|
+
|
59
|
+
if (_token != _targetToken) {
|
60
|
+
IERC20(_token).safeApprove(liquidator, 0);
|
61
|
+
IERC20(_token).safeApprove(liquidator, _platformFee);
|
62
|
+
|
63
|
+
uint amountOutMin = 1;
|
64
|
+
|
65
|
+
if (_platformFee > 0) {
|
66
|
+
IUniversalLiquidator(liquidator).swap(
|
67
|
+
_token,
|
68
|
+
_targetToken,
|
69
|
+
_platformFee,
|
70
|
+
amountOutMin,
|
71
|
+
IControllerV2(_controller).protocolFeeReceiver()
|
72
|
+
);
|
73
|
+
}
|
74
|
+
} else {
|
75
|
+
IERC20(_targetToken).safeTransfer(IControllerV2(_controller).protocolFeeReceiver(), _platformFee);
|
76
|
+
}
|
77
|
+
|
78
|
+
if (_token != iFARM) {
|
79
|
+
IERC20(_token).safeApprove(liquidator, 0);
|
80
|
+
IERC20(_token).safeApprove(liquidator, _profitSharingFee.add(_strategistFee));
|
81
|
+
|
82
|
+
uint amountOutMin = 1;
|
83
|
+
|
84
|
+
if (_profitSharingFee > 0) {
|
85
|
+
IUniversalLiquidator(liquidator).swap(
|
86
|
+
_token,
|
87
|
+
iFARM,
|
88
|
+
_profitSharingFee,
|
89
|
+
amountOutMin,
|
90
|
+
IControllerV2(_controller).profitSharingReceiver()
|
91
|
+
);
|
92
|
+
}
|
93
|
+
if (_strategistFee > 0) {
|
94
|
+
IUniversalLiquidator(liquidator).swap(
|
95
|
+
_token,
|
96
|
+
iFARM,
|
97
|
+
_strategistFee,
|
98
|
+
amountOutMin,
|
99
|
+
IStrategy(msg.sender).strategist()
|
100
|
+
);
|
101
|
+
}
|
102
|
+
} else {
|
103
|
+
if (_strategistFee > 0) {
|
104
|
+
IERC20(iFARM).safeTransfer(IStrategy(msg.sender).strategist(), _strategistFee);
|
105
|
+
}
|
106
|
+
IERC20(iFARM).safeTransfer(IControllerV2(_controller).profitSharingReceiver(), _profitSharingFee);
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|