From 105c9f79e4984705b51a6ac221183bb21b44139a Mon Sep 17 00:00:00 2001 From: magic990619 Date: Tue, 29 Mar 2022 08:49:01 +1100 Subject: [PATCH] Update Unit Tests for withdraw with calculating minimum amounts --- test/deposit_withdraw.test.ts | 85 +++++++++++++++++++++++++++++++---- typechain/hardhat.d.ts | 27 +++++++++++ typechain/index.ts | 6 +++ 3 files changed, 110 insertions(+), 8 deletions(-) diff --git a/test/deposit_withdraw.test.ts b/test/deposit_withdraw.test.ts index 5251ca5..c2eb5ef 100644 --- a/test/deposit_withdraw.test.ts +++ b/test/deposit_withdraw.test.ts @@ -222,6 +222,14 @@ describe('Hypervisor', () => { // only a single asset after carol's big swap expect(basePosition[0]).to.be.gt(0) expect(limitPosition[0]).to.equal(0) + + alice_liq_balance = await hypervisor.balanceOf(alice.address) + let totalSupply = await hypervisor.totalSupply() + let baseMin0 = basePosition[1].mul(alice_liq_balance).div(totalSupply) + let baseMin1 = basePosition[2].mul(alice_liq_balance).div(totalSupply) + let limitMin0 = limitPosition[1].mul(alice_liq_balance).div(totalSupply) + let limitMin1 = limitPosition[2].mul(alice_liq_balance).div(totalSupply) + await hypervisor.connect(alice).withdraw(alice_liq_balance, alice.address, alice.address, [baseMin0, baseMin1, limitMin0, limitMin1]) }) it('deposit/withdrawal with many users', async () => { @@ -308,11 +316,50 @@ describe('Hypervisor', () => { const user3_liq_balance = await hypervisor.balanceOf(user3.address) const user4_liq_balance = await hypervisor.balanceOf(user4.address) - await hypervisor.connect(user0).withdraw(user0_liq_balance, user0.address, user0.address, [0,0,0,0]) - await hypervisor.connect(user1).withdraw(user1_liq_balance, user1.address, user1.address, [0,0,0,0]) - await hypervisor.connect(user2).withdraw(user2_liq_balance, user2.address, user2.address, [0,0,0,0]) - await hypervisor.connect(user3).withdraw(user3_liq_balance, user3.address, user3.address, [0,0,0,0]) - await hypervisor.connect(user4).withdraw(user4_liq_balance, user4.address, user4.address, [0,0,0,0]) + let totalSupply = await hypervisor.totalSupply() + let basePosition = await hypervisor.getBasePosition() + let limitPosition = await hypervisor.getLimitPosition() + let baseMin0 = basePosition[1].mul(user0_liq_balance).div(totalSupply) + let baseMin1 = basePosition[2].mul(user0_liq_balance).div(totalSupply) + let limitMin0 = limitPosition[1].mul(user0_liq_balance).div(totalSupply) + let limitMin1 = limitPosition[2].mul(user0_liq_balance).div(totalSupply) + await hypervisor.connect(user0).withdraw(user0_liq_balance, user0.address, user0.address, [baseMin0, baseMin1, limitMin0, limitMin1]) + + totalSupply = await hypervisor.totalSupply() + basePosition = await hypervisor.getBasePosition() + limitPosition = await hypervisor.getLimitPosition() + baseMin0 = basePosition[1].mul(user0_liq_balance).div(totalSupply) + baseMin1 = basePosition[2].mul(user0_liq_balance).div(totalSupply) + limitMin0 = limitPosition[1].mul(user0_liq_balance).div(totalSupply) + limitMin1 = limitPosition[2].mul(user0_liq_balance).div(totalSupply) + await hypervisor.connect(user1).withdraw(user1_liq_balance, user1.address, user1.address, [baseMin0, baseMin1, limitMin0, limitMin1]) + + totalSupply = await hypervisor.totalSupply() + basePosition = await hypervisor.getBasePosition() + limitPosition = await hypervisor.getLimitPosition() + baseMin0 = basePosition[1].mul(user0_liq_balance).div(totalSupply) + baseMin1 = basePosition[2].mul(user0_liq_balance).div(totalSupply) + limitMin0 = limitPosition[1].mul(user0_liq_balance).div(totalSupply) + limitMin1 = limitPosition[2].mul(user0_liq_balance).div(totalSupply) + await hypervisor.connect(user2).withdraw(user2_liq_balance, user2.address, user2.address, [baseMin0, baseMin1, limitMin0, limitMin1]) + + totalSupply = await hypervisor.totalSupply() + basePosition = await hypervisor.getBasePosition() + limitPosition = await hypervisor.getLimitPosition() + baseMin0 = basePosition[1].mul(user0_liq_balance).div(totalSupply) + baseMin1 = basePosition[2].mul(user0_liq_balance).div(totalSupply) + limitMin0 = limitPosition[1].mul(user0_liq_balance).div(totalSupply) + limitMin1 = limitPosition[2].mul(user0_liq_balance).div(totalSupply) + await hypervisor.connect(user3).withdraw(user3_liq_balance, user3.address, user3.address, [baseMin0, baseMin1, limitMin0, limitMin1]) + + totalSupply = await hypervisor.totalSupply() + basePosition = await hypervisor.getBasePosition() + limitPosition = await hypervisor.getLimitPosition() + baseMin0 = basePosition[1].mul(user0_liq_balance).div(totalSupply) + baseMin1 = basePosition[2].mul(user0_liq_balance).div(totalSupply) + limitMin0 = limitPosition[1].mul(user0_liq_balance).div(totalSupply) + limitMin1 = limitPosition[2].mul(user0_liq_balance).div(totalSupply) + await hypervisor.connect(user4).withdraw(user4_liq_balance, user4.address, user4.address, [baseMin0, baseMin1, limitMin0, limitMin1]) user0token0Amount = await token0.balanceOf(user0.address) user0token1Amount = await token1.balanceOf(user0.address) @@ -354,7 +401,16 @@ describe('Hypervisor', () => { await hypervisor.connect(alice).deposit(ethers.utils.parseEther('1000'), ethers.utils.parseEther('1000'), alice.address, alice.address, [0,0,0,0]) alice_liq_balance = await hypervisor.balanceOf(alice.address) expect(alice_liq_balance).to.equal(ethers.utils.parseEther('2000')) - await hypervisor.connect(alice).withdraw(alice_liq_balance, alice.address, alice.address, [0,0,0,0]) + + let totalSupply = await hypervisor.totalSupply() + let basePosition = await hypervisor.getBasePosition() + let limitPosition = await hypervisor.getLimitPosition() + let baseMin0 = basePosition[1].mul(alice_liq_balance).div(totalSupply) + let baseMin1 = basePosition[2].mul(alice_liq_balance).div(totalSupply) + let limitMin0 = limitPosition[1].mul(alice_liq_balance).div(totalSupply) + let limitMin1 = limitPosition[2].mul(alice_liq_balance).div(totalSupply) + await hypervisor.connect(alice).withdraw(alice_liq_balance, alice.address, alice.address, [baseMin0, baseMin1, limitMin0, limitMin1]) + let tokenAmounts = await hypervisor.getTotalAmounts() // verify that all liquidity has been removed from the pool expect(tokenAmounts[0]).to.equal(0) @@ -386,7 +442,15 @@ describe('Hypervisor', () => { expect(tokenAmounts[0]).to.be.lt(ethers.utils.parseEther('2001')) expect(tokenAmounts[1]).to.be.lt(ethers.utils.parseEther('2001')) - await hypervisor.connect(user0).withdraw(user0_liq_balance, user0.address, user0.address, [0,0,0,0]) + totalSupply = await hypervisor.totalSupply() + basePosition = await hypervisor.getBasePosition() + limitPosition = await hypervisor.getLimitPosition() + baseMin0 = basePosition[1].mul(user0_liq_balance).div(totalSupply) + baseMin1 = basePosition[2].mul(user0_liq_balance).div(totalSupply) + limitMin0 = limitPosition[1].mul(user0_liq_balance).div(totalSupply) + limitMin1 = limitPosition[2].mul(user0_liq_balance).div(totalSupply) + await hypervisor.connect(user0).withdraw(user0_liq_balance, user0.address, user0.address, [baseMin0, baseMin1, limitMin0, limitMin1]) + token0Balance = await token0.balanceOf(user0.address) token1Balance = await token1.balanceOf(user0.address) expect(token0Balance).to.equal(ethers.utils.parseEther('1000')) @@ -424,7 +488,12 @@ describe('Hypervisor', () => { expect(limitPosition[0]).to.equal(0) // withdraw alice's all liq balance - await hypervisor.connect(alice).withdraw(alice_liq_balance, alice.address, alice.address,[0,0,0,0]) + let totalSupply = await hypervisor.totalSupply() + let baseMin0 = basePosition[1].mul(alice_liq_balance).div(totalSupply) + let baseMin1 = basePosition[2].mul(alice_liq_balance).div(totalSupply) + let limitMin0 = limitPosition[1].mul(alice_liq_balance).div(totalSupply) + let limitMin1 = limitPosition[2].mul(alice_liq_balance).div(totalSupply) + await hypervisor.connect(alice).withdraw(alice_liq_balance, alice.address, alice.address,[baseMin0, baseMin1, limitMin0, limitMin1]) alice_liq_balance = await hypervisor.balanceOf(alice.address) // expect alice liq balance to be 0 diff --git a/typechain/hardhat.d.ts b/typechain/hardhat.d.ts index b6c9fa9..4060ce2 100644 --- a/typechain/hardhat.d.ts +++ b/typechain/hardhat.d.ts @@ -12,6 +12,10 @@ import * as Contracts from "."; declare module "hardhat/types/runtime" { interface HardhatEthersHelpers extends HardhatEthersHelpersBase { + getContractFactory( + name: "AccessControl", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; getContractFactory( name: "Ownable", signerOrOptions?: ethers.Signer | FactoryOptions @@ -32,6 +36,14 @@ declare module "hardhat/types/runtime" { name: "IERC20", signerOrOptions?: ethers.Signer | FactoryOptions ): Promise; + getContractFactory( + name: "IUniswapV2Factory", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IUniswapV2Pair", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; getContractFactory( name: "IUniswapV3FlashCallback", signerOrOptions?: ethers.Signer | FactoryOptions @@ -257,6 +269,11 @@ declare module "hardhat/types/runtime" { signerOrOptions?: ethers.Signer | FactoryOptions ): Promise; + getContractAt( + name: "AccessControl", + address: string, + signer?: ethers.Signer + ): Promise; getContractAt( name: "Ownable", address: string, @@ -282,6 +299,16 @@ declare module "hardhat/types/runtime" { address: string, signer?: ethers.Signer ): Promise; + getContractAt( + name: "IUniswapV2Factory", + address: string, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IUniswapV2Pair", + address: string, + signer?: ethers.Signer + ): Promise; getContractAt( name: "IUniswapV3FlashCallback", address: string, diff --git a/typechain/index.ts b/typechain/index.ts index f71ead8..4952fc4 100644 --- a/typechain/index.ts +++ b/typechain/index.ts @@ -1,11 +1,14 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export type { AccessControl } from "./AccessControl"; export type { Ownable } from "./Ownable"; export type { ERC20Permit } from "./ERC20Permit"; export type { IERC20Permit } from "./IERC20Permit"; export type { ERC20 } from "./ERC20"; export type { IERC20 } from "./IERC20"; +export type { IUniswapV2Factory } from "./IUniswapV2Factory"; +export type { IUniswapV2Pair } from "./IUniswapV2Pair"; export type { IUniswapV3FlashCallback } from "./IUniswapV3FlashCallback"; export type { IUniswapV3MintCallback } from "./IUniswapV3MintCallback"; export type { IUniswapV3SwapCallback } from "./IUniswapV3SwapCallback"; @@ -63,11 +66,14 @@ export type { MockToken } from "./MockToken"; export type { TestRouter } from "./TestRouter"; export type { UniProxy } from "./UniProxy"; +export { AccessControl__factory } from "./factories/AccessControl__factory"; export { Ownable__factory } from "./factories/Ownable__factory"; export { ERC20Permit__factory } from "./factories/ERC20Permit__factory"; export { IERC20Permit__factory } from "./factories/IERC20Permit__factory"; export { ERC20__factory } from "./factories/ERC20__factory"; export { IERC20__factory } from "./factories/IERC20__factory"; +export { IUniswapV2Factory__factory } from "./factories/IUniswapV2Factory__factory"; +export { IUniswapV2Pair__factory } from "./factories/IUniswapV2Pair__factory"; export { IUniswapV3FlashCallback__factory } from "./factories/IUniswapV3FlashCallback__factory"; export { IUniswapV3MintCallback__factory } from "./factories/IUniswapV3MintCallback__factory"; export { IUniswapV3SwapCallback__factory } from "./factories/IUniswapV3SwapCallback__factory";