diff --git a/deploy/cndlMainnet/cndlMainnet_bni.js b/deploy/cndlMainnet/cndlMainnet_bni.js new file mode 100755 index 0000000..b4aa8c6 --- /dev/null +++ b/deploy/cndlMainnet/cndlMainnet_bni.js @@ -0,0 +1,10 @@ +module.exports = async () => { +}; +module.exports.tags = ["cndlMainnet_bni"]; +module.exports.dependencies = [ + "cndlMainnet_bni_PriceOracle", + "cndlMainnet_l2_Aave3Factory", + "cndlMainnet_l2_Aave3Vaults", + "cndlMainnet_bni_BNIStrategy", + "cndlMainnet_bni_BNIVault", +]; diff --git a/deploy/cndlMainnet/cndlMainnet_bni2.js b/deploy/cndlMainnet/cndlMainnet_bni2.js new file mode 100755 index 0000000..4315168 --- /dev/null +++ b/deploy/cndlMainnet/cndlMainnet_bni2.js @@ -0,0 +1,8 @@ +module.exports = async () => { +}; +module.exports.tags = ["cndlMainnet_bni2"]; +module.exports.dependencies = [ + "cndlMainnet_l2_Aave3Factory", + "cndlMainnet_l2_Aave3Vaults", + "cndlMainnet_bni_BNIStrategy", // Upgrade BNIStrategy +]; diff --git a/deploy/maticMainnet/maticMainnet_bni_BNIStrategy.js b/deploy/cndlMainnet/cndlMainnet_bni_BNIStrategy.js similarity index 91% rename from deploy/maticMainnet/maticMainnet_bni_BNIStrategy.js rename to deploy/cndlMainnet/cndlMainnet_bni_BNIStrategy.js index 5c0badf..9456890 100755 --- a/deploy/maticMainnet/maticMainnet_bni_BNIStrategy.js +++ b/deploy/cndlMainnet/cndlMainnet_bni_BNIStrategy.js @@ -1,5 +1,5 @@ const { ethers } = require("hardhat"); -const { common, maticMainnet: network_ } = require("../../parameters"); +const { common, cndlMainnet: network_ } = require("../../parameters"); const AddressZero = ethers.constants.AddressZero; module.exports = async ({ deployments }) => { @@ -55,4 +55,4 @@ module.exports = async ({ deployments }) => { } catch (e) { } }; -module.exports.tags = ["maticMainnet_bni_BNIStrategy"]; +module.exports.tags = ["cndlMainnet_bni_BNIStrategy"]; diff --git a/deploy/maticMainnet/maticMainnet_bni_BNIVault.js b/deploy/cndlMainnet/cndlMainnet_bni_BNIVault.js similarity index 90% rename from deploy/maticMainnet/maticMainnet_bni_BNIVault.js rename to deploy/cndlMainnet/cndlMainnet_bni_BNIVault.js index bf5a881..85b6699 100755 --- a/deploy/maticMainnet/maticMainnet_bni_BNIVault.js +++ b/deploy/cndlMainnet/cndlMainnet_bni_BNIVault.js @@ -1,5 +1,5 @@ const { ethers } = require("hardhat"); -const { common, maticMainnet: network_ } = require("../../parameters"); +const { common, cndlMainnet: network_ } = require("../../parameters"); module.exports = async ({ deployments }) => { const { deploy } = deployments; @@ -49,4 +49,4 @@ module.exports = async ({ deployments }) => { } catch (e) { } }; -module.exports.tags = ["maticMainnet_bni_BNIVault"]; +module.exports.tags = ["cndlMainnet_bni_BNIVault"]; diff --git a/deploy/maticMainnet/maticMainnet_bni_PriceOracle.js b/deploy/cndlMainnet/cndlMainnet_bni_PriceOracle.js similarity index 92% rename from deploy/maticMainnet/maticMainnet_bni_PriceOracle.js rename to deploy/cndlMainnet/cndlMainnet_bni_PriceOracle.js index ae7b671..87646dd 100755 --- a/deploy/maticMainnet/maticMainnet_bni_PriceOracle.js +++ b/deploy/cndlMainnet/cndlMainnet_bni_PriceOracle.js @@ -33,4 +33,4 @@ module.exports = async ({ deployments }) => { } catch (e) { } }; -module.exports.tags = ["maticMainnet_bni_PriceOracle"]; +module.exports.tags = ["cndlMainnet_bni_PriceOracle"]; diff --git a/deploy/maticMainnet/maticMainnet_l2_Aave3Factory.js b/deploy/cndlMainnet/cndlMainnet_l2_Aave3Factory.js similarity index 92% rename from deploy/maticMainnet/maticMainnet_l2_Aave3Factory.js rename to deploy/cndlMainnet/cndlMainnet_l2_Aave3Factory.js index e16d478..30b1122 100755 --- a/deploy/maticMainnet/maticMainnet_l2_Aave3Factory.js +++ b/deploy/cndlMainnet/cndlMainnet_l2_Aave3Factory.js @@ -37,4 +37,4 @@ module.exports = async ({ deployments }) => { } }; -module.exports.tags = ["maticMainnet_l2_Aave3Factory"]; +module.exports.tags = ["cndlMainnet_l2_Aave3Factory"]; diff --git a/deploy/maticMainnet/maticMainnet_l2_Aave3Vaults.js b/deploy/cndlMainnet/cndlMainnet_l2_Aave3Vaults.js similarity index 86% rename from deploy/maticMainnet/maticMainnet_l2_Aave3Vaults.js rename to deploy/cndlMainnet/cndlMainnet_l2_Aave3Vaults.js index 21536e4..eaf8083 100755 --- a/deploy/maticMainnet/maticMainnet_l2_Aave3Vaults.js +++ b/deploy/cndlMainnet/cndlMainnet_l2_Aave3Vaults.js @@ -1,5 +1,5 @@ const { ethers } = require("hardhat"); -const { common, maticMainnet: network_ } = require("../../parameters"); +const { common, cndlMainnet: network_ } = require("../../parameters"); const AddressZero = ethers.constants.AddressZero; module.exports = async ({ deployments }) => { @@ -11,7 +11,7 @@ module.exports = async ({ deployments }) => { const vaultFactory = await ethers.getContract("Aave3VaultFactory"); const dataWMATIC = vaultIface.encodeFunctionData("initialize", [ - "BNI L2 WMATIC", "bniL2WMATIC", + "BNI L2 WCNDL", "bniL2WCNDL", common.treasury, common.admin, priceOracleProxy.address, network_.Aave3.aPolWMATIC, @@ -39,4 +39,4 @@ module.exports = async ({ deployments }) => { } }; -module.exports.tags = ["maticMainnet_l2_Aave3Vaults"]; +module.exports.tags = ["cndlMainnet_l2_Aave3Vaults"]; diff --git a/deploy/maticMainnet/maticMainnet_l2_upgrade_Aave3Vaults.js b/deploy/cndlMainnet/cndlMainnet_l2_upgrade_Aave3Vaults.js similarity index 91% rename from deploy/maticMainnet/maticMainnet_l2_upgrade_Aave3Vaults.js rename to deploy/cndlMainnet/cndlMainnet_l2_upgrade_Aave3Vaults.js index 98fb5f4..8272848 100755 --- a/deploy/maticMainnet/maticMainnet_l2_upgrade_Aave3Vaults.js +++ b/deploy/cndlMainnet/cndlMainnet_l2_upgrade_Aave3Vaults.js @@ -28,4 +28,4 @@ module.exports = async ({ deployments }) => { } }; -module.exports.tags = ["maticMainnet_l2_upgrade_Aave3Vaults"]; +module.exports.tags = ["cndlMainnet_l2_upgrade_Aave3Vaults"]; diff --git a/deploy/cndlMainnet/cndlMainnet_upgrade.js b/deploy/cndlMainnet/cndlMainnet_upgrade.js new file mode 100755 index 0000000..b685460 --- /dev/null +++ b/deploy/cndlMainnet/cndlMainnet_upgrade.js @@ -0,0 +1,7 @@ +module.exports = async () => { +}; +module.exports.tags = ["cndlMainnet_upgrade"]; +module.exports.dependencies = [ + "cndlMainnet_l2_upgrade_Aave3Vaults", // BasicAave3Vault + "cndlMainnet_bni_BNIStrategy", // MaticBNIStrategy +]; diff --git a/deploy/hardhat_cndl/hardhat_cndl_bni.js b/deploy/hardhat_cndl/hardhat_cndl_bni.js new file mode 100644 index 0000000..3838f2e --- /dev/null +++ b/deploy/hardhat_cndl/hardhat_cndl_bni.js @@ -0,0 +1,23 @@ +const { network } = require("hardhat"); + +const ERC20_ABI = require("@openzeppelin/contracts-upgradeable/build/contracts/ERC20Upgradeable").abi; + +const { common } = require("../../parameters"); + +module.exports = async () => { + + await network.provider.request({method: "hardhat_impersonateAccount", params: [common.admin]}); + + await network.provider.request({method: "hardhat_impersonateAccount", params: ['0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245']}); + const usdtHolder = await ethers.getSigner('0xe7804c37c13166fF0b37F5aE0BB07A3aEbb6e245'); + const usdt = new ethers.Contract('0xc2132D05D31c914a87C6611C10748AEb04B58e8F', ERC20_ABI, usdtHolder); + await usdt.transfer(deployer.address, await usdt.balanceOf(usdtHolder.address)); +}; + +module.exports.tags = ["hardhat_matic_bni"]; +module.exports.dependencies = [ + "hardhat_matic_reset", + "maticMainnet_bni_PriceOracle", + "maticMainnet_bni2", + "maticMainnet_bni_BNIVault", +]; diff --git a/deploy/hardhat_cndl/hardhat_cndl_reset.js b/deploy/hardhat_cndl/hardhat_cndl_reset.js new file mode 100644 index 0000000..3ea466a --- /dev/null +++ b/deploy/hardhat_cndl/hardhat_cndl_reset.js @@ -0,0 +1,20 @@ +const { network } = require("hardhat"); +require("dotenv").config(); + +const mainnetUrl = `https://polygon-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_POLYGON_MAINNET_API_KEY}`; +const mainnetBlockNumber = 29697590; + +module.exports = async () => { + await network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + jsonRpcUrl: mainnetUrl, + blockNumber: mainnetBlockNumber, + }, + }, + ], + }); +}; +module.exports.tags = ["hardhat_matic_reset"]; diff --git a/deploy/maticMainnet/maticMainnet_bni.js b/deploy/maticMainnet/maticMainnet_bni.js deleted file mode 100755 index 758dc40..0000000 --- a/deploy/maticMainnet/maticMainnet_bni.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = async () => { -}; -module.exports.tags = ["maticMainnet_bni"]; -module.exports.dependencies = [ - "maticMainnet_bni_PriceOracle", - "maticMainnet_l2_Aave3Factory", - "maticMainnet_l2_Aave3Vaults", - "maticMainnet_bni_BNIStrategy", - "maticMainnet_bni_BNIVault", -]; diff --git a/deploy/maticMainnet/maticMainnet_bni2.js b/deploy/maticMainnet/maticMainnet_bni2.js deleted file mode 100755 index daa0dcc..0000000 --- a/deploy/maticMainnet/maticMainnet_bni2.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = async () => { -}; -module.exports.tags = ["maticMainnet_bni2"]; -module.exports.dependencies = [ - "maticMainnet_l2_Aave3Factory", - "maticMainnet_l2_Aave3Vaults", - "maticMainnet_bni_BNIStrategy", // Upgrade BNIStrategy -]; diff --git a/deploy/maticMainnet/maticMainnet_upgrade.js b/deploy/maticMainnet/maticMainnet_upgrade.js deleted file mode 100755 index da22e9f..0000000 --- a/deploy/maticMainnet/maticMainnet_upgrade.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async () => { -}; -module.exports.tags = ["maticMainnet_upgrade"]; -module.exports.dependencies = [ - "maticMainnet_l2_upgrade_Aave3Vaults", // BasicAave3Vault - "maticMainnet_bni_BNIStrategy", // MaticBNIStrategy -]; diff --git a/hardhat.config.js b/hardhat.config.js index 2b003b8..1fb1986 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -45,6 +45,10 @@ module.exports = { url: `https://testnet.aurora.dev`, accounts: [process.env.PRIVATE_KEY] }, + cndlMainnet: { + url: `https://rpc.cndlchain.com`, + accounts: [process.env.PRIVATE_KEY] + }, avaxMainnet: { url: `https://api.avax.network/ext/bc/C/rpc`, accounts: [process.env.PRIVATE_KEY] diff --git a/parameters/index.js b/parameters/index.js index fdafb42..4217a26 100755 --- a/parameters/index.js +++ b/parameters/index.js @@ -68,6 +68,18 @@ module.exports = { } }, + cndlMainnet: { + Aave3: { + aPolWMATIC: "0x6d80113e533a2C0fe82EaBD35f1875DcEA89Ea97", + }, + Swap: { + router: "0x1a45c9f823F64c9360b0c3df269F824cf404f82b", // CarthageDEX + SWAP_BASE_TOKEN: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", // WCNDL + USDC: "0x95A0A7953F9292838C0614D690005D5c716E718E", + WCNDL: "0x85FA00f55492B0437b3925381fAaf0E024747627", + } + }, + maticMainnet: { Aave3: { aPolWMATIC: "0x6d80113e533a2C0fe82EaBD35f1875DcEA89Ea97", diff --git a/test/bni/cndl_bni.js b/test/bni/cndl_bni.js new file mode 100644 index 0000000..409d56d --- /dev/null +++ b/test/bni/cndl_bni.js @@ -0,0 +1,217 @@ +const { expect } = require("chai"); +const { assert, ethers, deployments } = require("hardhat"); +const { expectRevert } = require('@openzeppelin/test-helpers'); +const { BigNumber } = ethers; +const parseEther = ethers.utils.parseEther; +const { increaseTime } = require("../../scripts/utils/ethereum"); + +const ERC20_ABI = require("@openzeppelin/contracts-upgradeable/build/contracts/ERC20Upgradeable.json").abi; + +const { common, cndlMainnet: network_ } = require("../../parameters"); + +const DAY = 24 * 3600; + +function getUsdtAmount(amount) { + return BigNumber.from(amount).mul(BigNumber.from(10).pow(6)) +} + +describe("BNI on Candle", async () => { + + let vault, strategy, priceOracle, usdt; + let vaultArtifact, strategyArtifact, l2VaultArtifact; + let admin; + + before(async () => { + [deployer, a1, a2, ...accounts] = await ethers.getSigners(); + + vaultArtifact = await deployments.getArtifact("BNIVault"); + strategyArtifact = await deployments.getArtifact("CndlBNIStrategy"); + priceOracleArtifact = await deployments.getArtifact("CndlPriceOracle"); + l2VaultArtifact = await deployments.getArtifact("CndlAave3Vault"); + }); + + beforeEach(async () => { + await deployments.fixture(["hardhat_cndl_bni"]) + + const vaultProxy = await ethers.getContract("BNIVault_Proxy"); + vault = new ethers.Contract(vaultProxy.address, vaultArtifact.abi, a1); + const strategyProxy = await ethers.getContract("CndlBNIStrategy_Proxy"); + strategy = new ethers.Contract(strategyProxy.address, strategyArtifact.abi, a1); + const priceOracleProxy = await ethers.getContract("CndlPriceOracle_Proxy"); + priceOracle = new ethers.Contract(priceOracleProxy.address, priceOracleArtifact.abi, a1); + + admin = await ethers.getSigner(common.admin); + + usdt = new ethers.Contract(network_.Swap.USDT, ERC20_ABI, deployer); + }); + + describe('Basic', () => { + it("Should be set with correct initial vaule", async () => { + expect(await priceOracle.owner()).equal(deployer.address); + + expect(await vault.owner()).equal(deployer.address); + expect(await vault.admin()).equal(common.admin); + expect(await vault.strategy()).equal(strategy.address); + expect(await vault.priceOracle()).equal(priceOracle.address); + expect(await vault.USDT()).equal(network_.Swap.USDT); + + expect(await strategy.owner()).equal(deployer.address); + expect(await strategy.treasuryWallet()).equal(common.treasury); + expect(await strategy.admin()).equal(common.admin); + expect(await strategy.vault()).equal(vault.address); + expect(await strategy.priceOracle()).equal(priceOracle.address); + expect(await strategy.router()).equal(network_.Swap.router); + expect(await strategy.SWAP_BASE_TOKEN()).equal(network_.Swap.SWAP_BASE_TOKEN); + expect(await strategy.USDT()).equal(network_.Swap.USDT); + expect(await strategy.tokens(0)).equal(network_.Swap.WCNDL); + expect(await strategy.pid(network_.Swap.WCNDL)).equal(0); + const WCNDLVaultAddr = await strategy.WCNDLVault(); + + const WCNDLVault = new ethers.Contract(WCNDLVaultAddr, l2VaultArtifact.abi, a1); + expect(await WCNDLVault.name()).equal('BNI L2 WCNDL'); + expect(await WCNDLVault.symbol()).equal('bniL2WCNDL'); + expect(await WCNDLVault.aToken()).equal(network_.Aave3.aPolWCNDL); + expect(await WCNDLVault.admin()).equal(common.admin); + expect(await WCNDLVault.treasuryWallet()).equal(common.treasury); + expect(await WCNDLVault.yieldFee()).equal(2000); + }); + + it("Should be set by only owner", async () => { + await expectRevert(priceOracle.setAssetSources([a2.address],[a1.address]), "Ownable: caller is not the owner"); + + await expectRevert(vault.setAdmin(a2.address), "Ownable: caller is not the owner"); + await expectRevert(vault.deposit(a1.address, [a2.address], [getUsdtAmount('100')]), "Only owner or admin"); + await expectRevert(vault.withdrawPerc(a1.address, parseEther('0.1')), "Only owner or admin"); + await expectRevert(vault.rebalance(0, parseEther('0.1'), a2.address), "Only owner or admin"); + await expectRevert(vault.emergencyWithdraw(), "Only owner or admin"); + await expectRevert(vault.reinvest([a2.address], [10000]), "Only owner or admin"); + + await expectRevert(strategy.addToken(a1.address), "Ownable: caller is not the owner"); + await expectRevert(strategy.removeToken(1), "Ownable: caller is not the owner"); + await expectRevert(strategy.setTreasuryWallet(a2.address), "Ownable: caller is not the owner"); + await expectRevert(strategy.setAdmin(a2.address), "Ownable: caller is not the owner"); + await expectRevert(strategy.setVault(a2.address), "Ownable: caller is not the owner"); + + const WCNDLVault = new ethers.Contract(await strategy.WCNDLVault(), l2VaultArtifact.abi, a1); + + await expectRevert(WCNDLVault.setAdmin(a2.address), "Ownable: caller is not the owner"); + await WCNDLVault.connect(deployer).setAdmin(a2.address); + expect(await WCNDLVault.admin()).equal(a2.address); + await WCNDLVault.connect(deployer).setAdmin(admin.address); + + await expectRevert(WCNDLVault.setTreasuryWallet(a2.address), "Ownable: caller is not the owner"); + await WCNDLVault.connect(deployer).setTreasuryWallet(a2.address); + expect(await WCNDLVault.treasuryWallet()).equal(a2.address); + await WCNDLVault.connect(deployer).setTreasuryWallet(common.treasury); + + await expectRevert(WCNDLVault.setFee(1000), "Ownable: caller is not the owner"); + await WCNDLVault.connect(deployer).setFee(1000); + expect(await WCNDLVault.yieldFee()).equal(1000); + + await expectRevert(WCNDLVault.yield(), "Only owner or admin"); + await WCNDLVault.connect(admin).yield(); + + await expectRevert(WCNDLVault.emergencyWithdraw(), "Only owner or admin"); + await WCNDLVault.connect(admin).emergencyWithdraw(); + await expectRevert(WCNDLVault.connect(deployer).emergencyWithdraw(), "Pausable: paused"); + + await expectRevert(WCNDLVault.reinvest(), "Only owner or admin"); + await WCNDLVault.connect(admin).reinvest(); + await expectRevert(WCNDLVault.connect(deployer).reinvest(), "Pausable: not paused"); + }); + + it("Should be returned with correct default vaule", async () => { + expect(await vault.getAPR()).gt(0); + expect(await vault.getAllPoolInUSD()).equal(0); + + var ret = await vault.getEachPoolInUSD(); + chainIDs = ret[0]; + tokens = ret[1]; + pools = ret[2]; + expect(chainIDs.length).equal(1); + // expect(chainIDs[0]).equal(137); + expect(tokens[0]).equal('0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270'); + expect(pools[0]).equal(0); + }); + }); + + describe('Basic function', () => { + it("Basic Deposit/withdraw", async () => { + await usdt.transfer(a1.address, getUsdtAmount('50000')); + await usdt.connect(a1).approve(vault.address, getUsdtAmount('50000')); + + const WCNDLVault = new ethers.Contract(await strategy.WCNDLVault(), l2VaultArtifact.abi, a1); + expect(await WCNDLVault.getAPR()).gt(0); + + var ret = await vault.getEachPoolInUSD(); + var tokens = ret[1]; + await vault.connect(admin).deposit(a1.address, tokens, [getUsdtAmount('50000')]); + expect(await usdt.balanceOf(a1.address)).equal(0); + expect(await vault.getAllPoolInUSD()).closeTo(parseEther('50000'), parseEther('50000').div(10)); + + await increaseTime(DAY); + expect(await WCNDLVault.getPendingRewards()).equal(0); + await WCNDLVault.connect(admin).yield(); + + await vault.connect(admin).withdrawPerc(a1.address, parseEther('1')); + expect(await usdt.balanceOf(a1.address)).closeTo(getUsdtAmount('50000'), getUsdtAmount('50000').div(10)); + expect(await vault.getAllPoolInUSD()).equal(0); + }); + + it("emergencyWithdraw", async () => { + await usdt.transfer(a1.address, getUsdtAmount('50000')); + await usdt.connect(a1).approve(vault.address, getUsdtAmount('50000')); + + var ret = await vault.getEachPoolInUSD(); + var tokens = ret[1]; + await vault.connect(admin).deposit(a1.address, tokens, [getUsdtAmount('50000')]); + + await vault.connect(admin).emergencyWithdraw(); + expect(await usdt.balanceOf(vault.address)).closeTo(getUsdtAmount('50000'), getUsdtAmount('50000').div(20)); + + ret = await vault.getCurrentCompositionPerc(); + await vault.connect(admin).reinvest(ret[0], ret[1]); + expect(await usdt.balanceOf(vault.address)).equal(0); + expect(await vault.getAllPoolInUSD()).closeTo(parseEther('50000'), parseEther('50000').div(10)); + + await vault.connect(admin).emergencyWithdraw(); + + await vault.connect(admin).withdrawPerc(a1.address, parseEther('1')); + expect(await usdt.balanceOf(a1.address)).closeTo(getUsdtAmount('50000'), getUsdtAmount('50000').div(10)); + expect(await vault.getAllPoolInUSD()).equal(0); + }); + + it("Rebalance", async () => { + await usdt.transfer(a1.address, getUsdtAmount('10000')); + await usdt.connect(a1).approve(vault.address, getUsdtAmount('10000')); + + await strategy.connect(deployer).addToken(network_.Swap.USDT); + var ret = await vault.getEachPoolInUSD(); + var tokens = ret[1]; + await vault.connect(admin).deposit(a1.address, tokens, [getUsdtAmount('6000'),getUsdtAmount('4000')]); + expect(await usdt.balanceOf(a1.address)).equal(0); + expect(await vault.getAllPoolInUSD()).closeTo(parseEther('10000'), parseEther('10000').div(50)); + + var tokenPerc = await vault.getCurrentCompositionPerc(); + expect(tokenPerc[0][0]).equal(network_.Swap.WCNDL); + expect(tokenPerc[0][1]).equal(network_.Swap.USDT); + expect(tokenPerc[1][0].toNumber()).closeTo(6000, 6000/50); + expect(tokenPerc[1][1].toNumber()).closeTo(4000, 4000/50); + + await expectRevert(strategy.connect(deployer).removeToken(2), "Invalid pid") + await expectRevert(strategy.connect(deployer).removeToken(1), "Pool is not empty") + + await vault.connect(admin).rebalance(1, parseEther('1'), network_.Swap.WCNDL); + tokenPerc = await vault.getCurrentCompositionPerc(); + expect(tokenPerc[0][0]).equal(network_.Swap.WMATIC); + expect(tokenPerc[0][1]).equal(network_.Swap.USDT); + expect(tokenPerc[1][0].toNumber()).equal(10000); + expect(tokenPerc[1][1].toNumber()).equal(0); + + await strategy.connect(deployer).removeToken(1); + await vault.connect(admin).withdrawPerc(a1.address, parseEther('1')); + expect(await usdt.balanceOf(a1.address)).closeTo(getUsdtAmount('10000'), getUsdtAmount('10000').div(10)); + expect(await vault.getAllPoolInUSD()).equal(0); + }); + }); +});