Skip to content

Commit

Permalink
tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fourlen committed Jun 3, 2024
1 parent 66687ba commit 4df0b72
Show file tree
Hide file tree
Showing 14 changed files with 214 additions and 83 deletions.
62 changes: 42 additions & 20 deletions src/farming/test/unit/FarmingCenter.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ethers } from 'hardhat';
import { Wallet } from 'ethers';
import { loadFixture, impersonateAccount, stopImpersonatingAccount, setBalance } from '@nomicfoundation/hardhat-network-helpers';
import { TestERC20, AlgebraEternalFarming, NftPosManagerMock, FarmingCenter } from '../../typechain';
import { TestERC20, AlgebraEternalFarming, NftPosManagerMock, FarmingCenter, IFarmingPlugin } from '../../typechain';
import { algebraFixture, AlgebraFixtureType, mintPosition } from '../shared/fixtures';
import {
expect,
Expand Down Expand Up @@ -82,7 +82,8 @@ describe('unit/FarmingCenter', () => {
await impersonateAccount(eternalFarmingAddress);
await setBalance(eternalFarmingAddress, 10 ** 18);
const fakeSigner = await ethers.getSigner(eternalFarmingAddress);
await context.farmingCenter.connect(fakeSigner).connectVirtualPoolToPlugin(context.pool01, context.pluginObj, { from: eternalFarmingAddress });
const farmingModuleAddress = await context.farmingModuleFactory.poolToPlugin(context.poolObj);
await context.farmingCenter.connect(fakeSigner).connectVirtualPoolToPlugin(context.pool01, farmingModuleAddress, { from: eternalFarmingAddress });
await setBalance(eternalFarmingAddress, 0);
await stopImpersonatingAccount(eternalFarmingAddress);
expect(await context.farmingCenter.virtualPoolAddresses(context.pool01)).to.not.be.eq(ZERO_ADDRESS);
Expand All @@ -93,11 +94,15 @@ describe('unit/FarmingCenter', () => {
await impersonateAccount(eternalFarmingAddress);
await setBalance(eternalFarmingAddress, 10 ** 18);
const fakeSigner = await ethers.getSigner(eternalFarmingAddress);
await context.pluginFactory.setFarmingAddress(incentiveCreator);
await context.pluginObj.connect(incentiveCreator).setIncentive(eternalFarmingAddress);
await context.pluginFactory.setFarmingAddress(context.farmingCenter);

const farmingModuleAddress = await context.farmingModuleFactory.poolToPlugin(context.pool01);
const farmingModule = await ethers.getContractAt('FarmingModule', farmingModuleAddress) as any as IFarmingPlugin;

await context.farmingModuleFactory.setFarmingAddress(incentiveCreator);
await farmingModule.connect(incentiveCreator).setIncentive(eternalFarmingAddress);
await context.farmingModuleFactory.setFarmingAddress(context.farmingCenter);
await expect(
context.farmingCenter.connect(fakeSigner).connectVirtualPoolToPlugin(context.pool01, context.pluginObj, { from: eternalFarmingAddress })
context.farmingCenter.connect(fakeSigner).connectVirtualPoolToPlugin(context.pool01, farmingModule, { from: eternalFarmingAddress })
).to.be.revertedWith('Another incentive is connected');
await setBalance(eternalFarmingAddress, 0);
await stopImpersonatingAccount(eternalFarmingAddress);
Expand Down Expand Up @@ -143,10 +148,11 @@ describe('unit/FarmingCenter', () => {
await impersonateAccount(eternalFarmingAddress);
await setBalance(eternalFarmingAddress, 10 ** 18);
const fakeSigner = await ethers.getSigner(eternalFarmingAddress);
await context.farmingCenter.connect(fakeSigner).connectVirtualPoolToPlugin(context.pool01, context.pluginObj, { from: eternalFarmingAddress });
const farmingModuleAddress = await context.farmingModuleFactory.poolToPlugin(context.pool01);
await context.farmingCenter.connect(fakeSigner).connectVirtualPoolToPlugin(context.pool01, farmingModuleAddress, { from: eternalFarmingAddress });
await context.farmingCenter
.connect(fakeSigner)
.disconnectVirtualPoolFromPlugin(context.pool01, context.pluginObj, { from: eternalFarmingAddress });
.disconnectVirtualPoolFromPlugin(context.pool01, farmingModuleAddress, { from: eternalFarmingAddress });
await setBalance(eternalFarmingAddress, 0);
await stopImpersonatingAccount(eternalFarmingAddress);
expect(await context.farmingCenter.virtualPoolAddresses(context.pool01)).to.be.eq(ZERO_ADDRESS);
Expand All @@ -157,12 +163,16 @@ describe('unit/FarmingCenter', () => {
await impersonateAccount(eternalFarmingAddress);
await setBalance(eternalFarmingAddress, 10 ** 18);
const fakeSigner = await ethers.getSigner(eternalFarmingAddress);
await context.pluginFactory.setFarmingAddress(incentiveCreator);
await context.pluginObj.connect(incentiveCreator).setIncentive(eternalFarmingAddress);
await context.pluginFactory.setFarmingAddress(context.farmingCenter);

const farmingModuleAddress = await context.farmingModuleFactory.poolToPlugin(context.pool01);
const farmingModule = await ethers.getContractAt('FarmingModule', farmingModuleAddress) as any as IFarmingPlugin;

await context.farmingModuleFactory.setFarmingAddress(incentiveCreator);
await farmingModule.connect(incentiveCreator).setIncentive(eternalFarmingAddress);
await context.farmingModuleFactory.setFarmingAddress(context.farmingCenter);
await context.farmingCenter
.connect(fakeSigner)
.disconnectVirtualPoolFromPlugin(context.pool01, context.pluginObj, { from: eternalFarmingAddress });
.disconnectVirtualPoolFromPlugin(context.pool01, farmingModule, { from: eternalFarmingAddress });
await setBalance(eternalFarmingAddress, 0);
await stopImpersonatingAccount(eternalFarmingAddress);
expect(await context.farmingCenter.virtualPoolAddresses(context.pool01)).to.be.eq(ZERO_ADDRESS);
Expand All @@ -185,6 +195,7 @@ describe('unit/FarmingCenter', () => {
totalReward,
bonusReward,
poolAddress: await context.poolObj.getAddress(),
farmingModuleFactory: context.farmingModuleFactory,
nonce,
rewardRate: 100n,
bonusRewardRate: 50n,
Expand All @@ -198,6 +209,7 @@ describe('unit/FarmingCenter', () => {
ticks: [getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM])],
amountsToFarm: [amountDesired, amountDesired],
createIncentiveResult: createIncentiveResultEternal,
farmingModuleFactory: context.farmingModuleFactory
});
tokenIdEternal = mintResultEternal.tokenId;
});
Expand Down Expand Up @@ -258,9 +270,12 @@ describe('unit/FarmingCenter', () => {
});

it('works if liquidity decreased and incentive deactivated automatically', async () => {
await context.pluginFactory.setFarmingAddress(actors.algebraRootUser().address);
await context.farmingModuleFactory.setFarmingAddress(actors.algebraRootUser().address);

const incentiveAddress = await context.pluginObj.connect(actors.algebraRootUser()).incentive();
const farmingModuleAddress = await context.farmingModuleFactory.poolToPlugin(context.pool01);
const farmingModule = await ethers.getContractAt('FarmingModule', farmingModuleAddress) as any as IFarmingPlugin;

const incentiveAddress = await farmingModule.incentive();

await erc20Helper.ensureBalancesAndApprovals(lpUser0, [context.token0, context.token1], amountDesired, await context.nft.getAddress());

Expand Down Expand Up @@ -289,11 +304,11 @@ describe('unit/FarmingCenter', () => {
_tokenId
);

await context.pluginObj.connect(actors.algebraRootUser()).setIncentive(ZERO_ADDRESS);
await farmingModule.connect(actors.algebraRootUser()).setIncentive(ZERO_ADDRESS);

await helpers.moveTickTo({ direction: 'down', desiredValue: -160, trader: actors.farmingDeployer() });

await context.pluginObj.connect(actors.algebraRootUser()).setIncentive(incentiveAddress);
await farmingModule.connect(actors.algebraRootUser()).setIncentive(incentiveAddress);

await helpers.moveTickTo({ direction: 'up', desiredValue: -140, trader: actors.farmingDeployer() });

Expand All @@ -311,9 +326,12 @@ describe('unit/FarmingCenter', () => {
});

it('works if liquidity decreased and incentive detached indirectly', async () => {
await context.pluginFactory.setFarmingAddress(actors.algebraRootUser().address);
await context.farmingModuleFactory.setFarmingAddress(actors.algebraRootUser().address);

const farmingModuleAddress = await context.farmingModuleFactory.poolToPlugin(context.pool01);
const farmingModule = await ethers.getContractAt('FarmingModule', farmingModuleAddress) as any as IFarmingPlugin;

const incentiveAddress = await context.pluginObj.connect(actors.algebraRootUser()).incentive();
const incentiveAddress = await farmingModule.incentive();

await erc20Helper.ensureBalancesAndApprovals(lpUser0, [context.token0, context.token1], amountDesired, await context.nft.getAddress());

Expand Down Expand Up @@ -342,11 +360,11 @@ describe('unit/FarmingCenter', () => {
_tokenId
);

await context.pluginObj.connect(actors.algebraRootUser()).setIncentive(ZERO_ADDRESS);
await farmingModule.connect(actors.algebraRootUser()).setIncentive(ZERO_ADDRESS);

await helpers.moveTickTo({ direction: 'down', desiredValue: -160, trader: actors.farmingDeployer() });

await context.pluginObj.connect(actors.algebraRootUser()).setIncentive(incentiveAddress);
await farmingModule.connect(actors.algebraRootUser()).setIncentive(incentiveAddress);

await expect(
context.nft.connect(lpUser0).decreaseLiquidity({
Expand Down Expand Up @@ -432,6 +450,7 @@ describe('unit/FarmingCenter', () => {
totalReward,
bonusReward,
poolAddress: await context.poolObj.getAddress(),
farmingModuleFactory: context.farmingModuleFactory,
nonce,
rewardRate: 100n,
bonusRewardRate: 50n,
Expand All @@ -443,6 +462,7 @@ describe('unit/FarmingCenter', () => {
ticks: [getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM])],
amountsToFarm: [amountDesired, amountDesired],
createIncentiveResult: createIncentiveResultEternal,
farmingModuleFactory: context.farmingModuleFactory
});
tokenIdEternal = mintResultEternal.tokenId;
});
Expand Down Expand Up @@ -484,6 +504,7 @@ describe('unit/FarmingCenter', () => {
totalReward,
bonusReward,
poolAddress: await context.poolObj.getAddress(),
farmingModuleFactory: context.farmingModuleFactory,
nonce,
rewardRate: 100n,
bonusRewardRate: 50n,
Expand All @@ -497,6 +518,7 @@ describe('unit/FarmingCenter', () => {
ticks: [getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM])],
amountsToFarm: [amountDesired, amountDesired],
createIncentiveResult: createIncentiveResultEternal,
farmingModuleFactory: context.farmingModuleFactory
});
tokenIdEternal = mintResultEternal.tokenId;

Expand Down
1 change: 1 addition & 0 deletions src/farming/test/unit/Multicall.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ describe('unit/Multicall', () => {
totalReward,
bonusReward,
poolAddress: await context.poolObj.getAddress(),
farmingModuleFactory: context.farmingModuleFactory,
nonce: 0n,
rewardRate: 10n,
bonusRewardRate: 50n,
Expand Down
7 changes: 7 additions & 0 deletions src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`unit/EternalFarms #claimReward when requesting the full amount has gas cost [ @skip-on-coverage ] 1`] = `60801`;

exports[`unit/EternalFarms #enterFarming works and has gas cost [ @skip-on-coverage ] 1`] = `494839`;

exports[`unit/EternalFarms #exitFarming after end time works and has gas cost [ @skip-on-coverage ] 1`] = `169695`;
5 changes: 0 additions & 5 deletions src/plugin/contracts/modules/DynamicFeeModule.sol
Original file line number Diff line number Diff line change
Expand Up @@ -105,16 +105,11 @@ contract DynamicFeeModule is AlgebraModule, IDynamicFeeManager, Timestamp {
bytes memory /* params */,
uint16 /* poolFeeCache */
) internal view override {
console.log('dynamicFeeModule beforeswap called');
uint16 newFee = _getNewFee();
console.log('dynamicFeeModule after newFee');
ModuleUtils.returnDynamicFeeResult(newFee, false);
console.log('dynamicFeeModule beforeswap end');
}

function _getNewFee() internal view returns (uint16 newFee) {
console.log('getNewfee entered');
console.log('oracleModule address: ', oracleModule);
uint16 lastTimepointIndex = IVolatilityOracle(oracleModule).timepointIndex();

uint16 lastTimepointIndexOutsideCurrentBlock;
Expand Down
3 changes: 0 additions & 3 deletions src/plugin/contracts/modules/FarmingModule.sol
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,9 @@ contract FarmingModule is AlgebraModule, IFarmingPlugin, Timestamp {
bytes memory params ,
uint16 /* poolFeeCache */
) internal override {
console.log("Farming afterInitialize");

AfterSwapParams memory decodedParams = abi.decode(params, (AfterSwapParams));

address _incentive = incentive;
console.log('incentive: ', _incentive);
if (_incentive != address(0)) {
(, int24 tick, , ) = _getPoolState();
IAlgebraVirtualPool(_incentive).crossTo(tick, decodedParams.zeroToOne);
Expand Down
2 changes: 2 additions & 0 deletions src/plugin/contracts/modules/OracleModule.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import '../libraries/VolatilityOracle.sol';
import '../interfaces/plugins/IVolatilityOracle.sol';
import '../interfaces/plugins/IDynamicFeeManager.sol';

import 'hardhat/console.sol';

contract OracleModule is AlgebraModule, IVolatilityOracle, Timestamp {
using Plugins for uint8;

Expand Down
2 changes: 2 additions & 0 deletions src/plugin/contracts/test/MockPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ contract MockPool is IAlgebraPoolActions, IAlgebraPoolPermissionedActions, IAlge
globalState.price = initialPrice;
globalState.tick = tick;

console.log('plugin config: ', pluginConfig);
if (pluginConfig & Plugins.AFTER_INIT_FLAG != 0) {
IAlgebraPlugin(plugin).afterInitialize(msg.sender, initialPrice, tick);
}
Expand Down Expand Up @@ -231,6 +232,7 @@ contract MockPool is IAlgebraPoolActions, IAlgebraPoolPermissionedActions, IAlge
/// @inheritdoc IAlgebraPoolPermissionedActions
function setPluginConfig(uint8 newConfig) external override {
// require(msg.sender == owner || msg.sender == plugin || msg.sender == pluginFactory);
console.log('newConfig: ', newConfig);
globalState.pluginConfig = newConfig;
}

Expand Down
9 changes: 5 additions & 4 deletions src/plugin/contracts/test/MockTimeDSFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ contract MockTimeDSFactory is IBasePluginV1Factory {
}

function afterCreatePoolHook(address modularHub, address pool, address) external override {
_insertModules(modularHub);
MockPool(pool).setPluginConfig(uint8(Plugins.DYNAMIC_FEE));
_insertModules(modularHub);
}

function createPluginForExistingPool(address token0, address token1) external override returns (address) {
Expand Down Expand Up @@ -77,10 +77,11 @@ contract MockTimeDSFactory is IBasePluginV1Factory {
}

function _insertModules(address modularHub) internal {
for (uint256 i = 0; i < factoriesCounter; ++i) {
address moduleFactoryAddress = factoryByIndex[i];
for (uint256 i = factoriesCounter; i > 0; --i) {
address moduleFactoryAddress = factoryByIndex[i - 1];
InsertModuleParams[] memory insertModuleParams = IAlgebraModuleFactory(moduleFactoryAddress).getInsertModuleParams(i);
IAlgebraModularHub(modularHub).insertModulesToHookLists(
IAlgebraModuleFactory(moduleFactoryAddress).getInsertModuleParams(i + 1)
insertModuleParams
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ contract MockTimeDynamicFeeModuleFactory is AlgebraModuleFactory {
function getInsertModuleParams(uint256 moduleGlobalIndex) external override pure returns (InsertModuleParams[] memory) {
InsertModuleParams[] memory insertModuleParams = new InsertModuleParams[](2);

// dynamic fee hooks shoule be called after oracle, so indexInHookList = 1
insertModuleParams[0] = InsertModuleParams({
selector: IAlgebraPlugin.afterInitialize.selector,
indexInHookList: 0,
Expand Down
1 change: 1 addition & 0 deletions src/plugin/contracts/test/MockTimeOracleModuleFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ contract MockTimeOracleModuleFactory is AlgebraModuleFactory {
}

function getInsertModuleParams(uint256 moduleGlobalIndex) external override pure returns (InsertModuleParams[] memory) {
console.log('getInsertModuleParams in oracle module has called');
InsertModuleParams[] memory insertModuleParams = new InsertModuleParams[](2);

insertModuleParams[0] = InsertModuleParams({
Expand Down
1 change: 1 addition & 0 deletions src/plugin/test/AlgebraPool.gas.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ describe('AlgebraPool gas tests [ @skip-on-coverage ]', () => {

await mockPluginFactory.beforeCreatePoolHook(pool, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, '0x');
const pluginAddress = await mockPluginFactory.pluginByPool(pool);
await mockPluginFactory.afterCreatePoolHook(pluginAddress, pool, ZERO_ADDRESS);

const mockDSOperatorFactory = await ethers.getContractFactory('AlgebraModularHub');
const plugin = mockDSOperatorFactory.attach(pluginAddress) as any as AlgebraModularHub;
Expand Down
Loading

0 comments on commit 4df0b72

Please sign in to comment.