|
| 1 | +import { Contract, providers } from "ethers" |
| 2 | +import BigNumber from "bignumber.js" |
| 3 | + |
| 4 | +import { |
| 5 | + LiquidityRewards, |
| 6 | + LiquidityRewardsFactory, |
| 7 | + LiquidityRewardsUniswap, |
| 8 | +} from "../liquidity-rewards" |
| 9 | +import { Token } from "../utils" |
| 10 | +import LPRewardsKEEPETH from "../abis/LPRewardsKEEPETH.json" |
| 11 | +import { UniswapExchangeService } from "../exchange-service" |
| 12 | + |
| 13 | +jest.mock("ethers") |
| 14 | + |
| 15 | +jest.mock("../abis/LPRewardsKEEPETH.json", () => ({ |
| 16 | + abi: [], |
| 17 | + networks: { |
| 18 | + 1: { |
| 19 | + address: "0x0", |
| 20 | + }, |
| 21 | + }, |
| 22 | +})) |
| 23 | + |
| 24 | +describe("Test LiquidityRewards", () => { |
| 25 | + describe("Test base LiquidityRewards", () => { |
| 26 | + const liquidityRewards = new LiquidityRewards( |
| 27 | + {}, |
| 28 | + { getKeepTokenPriceInUSD: () => {} } |
| 29 | + ) |
| 30 | + const mockedTotalSupply = Token.fromTokenUnit(100000) |
| 31 | + const mockedRewarPoolPerWeek = "30000" |
| 32 | + const mockedTotalSupplyInUSD = "50000" |
| 33 | + const mockedKeepTokenPriceInUSD = new BigNumber("0.55") |
| 34 | + liquidityRewards._totalSupply = jest |
| 35 | + .fn() |
| 36 | + .mockResolvedValue(mockedTotalSupply) |
| 37 | + liquidityRewards._rewardPoolPerWeek = jest |
| 38 | + .fn() |
| 39 | + .mockResolvedValue(mockedRewarPoolPerWeek) |
| 40 | + liquidityRewards._totalSupplyInUSD = jest |
| 41 | + .fn() |
| 42 | + .mockResolvedValue(mockedTotalSupplyInUSD) |
| 43 | + |
| 44 | + const exchangeSpy = jest |
| 45 | + .spyOn(liquidityRewards.exchangeSercvice, "getKeepTokenPriceInUSD") |
| 46 | + .mockResolvedValue(mockedKeepTokenPriceInUSD) |
| 47 | + const calculateRSpy = jest.spyOn(liquidityRewards, "_calculateR") |
| 48 | + const calculateAPYSpy = jest.spyOn(liquidityRewards, "_calculateAPY") |
| 49 | + |
| 50 | + test("should correctly calculate APY", async () => { |
| 51 | + const result = await liquidityRewards.calculateAPY() |
| 52 | + |
| 53 | + expect(liquidityRewards._totalSupply).toHaveBeenCalled() |
| 54 | + expect(liquidityRewards._rewardPoolPerWeek).toHaveBeenCalled() |
| 55 | + expect(liquidityRewards._totalSupplyInUSD).toHaveBeenCalledWith( |
| 56 | + mockedTotalSupply.toString() |
| 57 | + ) |
| 58 | + expect(exchangeSpy).toHaveBeenCalled() |
| 59 | + expect(calculateRSpy).toHaveBeenCalledWith( |
| 60 | + mockedKeepTokenPriceInUSD, |
| 61 | + mockedRewarPoolPerWeek, |
| 62 | + mockedTotalSupplyInUSD |
| 63 | + ) |
| 64 | + |
| 65 | + const expectedR = new BigNumber(mockedKeepTokenPriceInUSD) |
| 66 | + .multipliedBy(mockedRewarPoolPerWeek) |
| 67 | + .div(mockedTotalSupplyInUSD) |
| 68 | + |
| 69 | + expect(calculateAPYSpy).toHaveBeenCalledWith(expectedR, 52) |
| 70 | + |
| 71 | + const expectedAPY = expectedR |
| 72 | + .plus(1) |
| 73 | + .pow(52) |
| 74 | + .minus(1) |
| 75 | + .multipliedBy(100) |
| 76 | + .decimalPlaces(2, BigNumber.ROUND_DOWN) |
| 77 | + .toString() |
| 78 | + |
| 79 | + expect(result).toEqual(expectedAPY) |
| 80 | + }) |
| 81 | + }) |
| 82 | + |
| 83 | + describe("Test LiquidityRewards factory", () => { |
| 84 | + test("should create the liquidity rewards pool wrapper correctly", () => { |
| 85 | + const liquidityRewards = LiquidityRewardsFactory.create("KEEP_ETH") |
| 86 | + const mockContractCalls = Contract.mock.calls |
| 87 | + expect(Contract).toHaveBeenCalled() |
| 88 | + expect(mockContractCalls[0][0]).toEqual( |
| 89 | + LPRewardsKEEPETH.networks[1].address |
| 90 | + ) |
| 91 | + expect(mockContractCalls[0][1]).toEqual(LPRewardsKEEPETH.abi) |
| 92 | + |
| 93 | + expect(liquidityRewards).toBeInstanceOf(LiquidityRewardsUniswap) |
| 94 | + expect(liquidityRewards.exchangeSercvice).toBeInstanceOf( |
| 95 | + UniswapExchangeService |
| 96 | + ) |
| 97 | + expect(liquidityRewards.contract).toBeInstanceOf(Contract) |
| 98 | + }) |
| 99 | + }) |
| 100 | +}) |
0 commit comments