Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 77 additions & 8 deletions test/deposit_withdraw.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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'))
Expand Down Expand Up @@ -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
Expand Down
27 changes: 27 additions & 0 deletions typechain/hardhat.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Contracts.AccessControl__factory>;
getContractFactory(
name: "Ownable",
signerOrOptions?: ethers.Signer | FactoryOptions
Expand All @@ -32,6 +36,14 @@ declare module "hardhat/types/runtime" {
name: "IERC20",
signerOrOptions?: ethers.Signer | FactoryOptions
): Promise<Contracts.IERC20__factory>;
getContractFactory(
name: "IUniswapV2Factory",
signerOrOptions?: ethers.Signer | FactoryOptions
): Promise<Contracts.IUniswapV2Factory__factory>;
getContractFactory(
name: "IUniswapV2Pair",
signerOrOptions?: ethers.Signer | FactoryOptions
): Promise<Contracts.IUniswapV2Pair__factory>;
getContractFactory(
name: "IUniswapV3FlashCallback",
signerOrOptions?: ethers.Signer | FactoryOptions
Expand Down Expand Up @@ -257,6 +269,11 @@ declare module "hardhat/types/runtime" {
signerOrOptions?: ethers.Signer | FactoryOptions
): Promise<Contracts.UniProxy__factory>;

getContractAt(
name: "AccessControl",
address: string,
signer?: ethers.Signer
): Promise<Contracts.AccessControl>;
getContractAt(
name: "Ownable",
address: string,
Expand All @@ -282,6 +299,16 @@ declare module "hardhat/types/runtime" {
address: string,
signer?: ethers.Signer
): Promise<Contracts.IERC20>;
getContractAt(
name: "IUniswapV2Factory",
address: string,
signer?: ethers.Signer
): Promise<Contracts.IUniswapV2Factory>;
getContractAt(
name: "IUniswapV2Pair",
address: string,
signer?: ethers.Signer
): Promise<Contracts.IUniswapV2Pair>;
getContractAt(
name: "IUniswapV3FlashCallback",
address: string,
Expand Down
6 changes: 6 additions & 0 deletions typechain/index.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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";
Expand Down