UNPKG

@quantara/sdk

Version:

JavaScript/TypeScript SDK for interacting with Quantara Protocol on Neura Testnet

114 lines (113 loc) 5.12 kB
import { describe, expect, it } from "vitest"; import { NEURA_TESTNET } from "../../configs/chains"; import { TOKENS } from "../../configs/tokens"; import { expandDecimals, PRECISION } from "../numbers"; import { parseContractPrice, convertToContractPrice, convertToContractTokenPrices, convertToTokenAmount, convertToUsd, getMidPrice, getIsEquivalentTokens, getTokenData, getTokensRatioByAmounts, getTokensRatioByMinOutputAmountAndTriggerPrice, } from "../tokens"; function getToken(symbol) { return TOKENS[NEURA_TESTNET].find((token) => token.symbol === symbol); } describe("parseContractPrice", () => { it("multiplies price by 10^decimals", () => { expect(parseContractPrice(100n, 2)).toBe(100n * expandDecimals(1, 2)); }); }); describe("convertToContractPrice", () => { it("divides price by 10^decimals", () => { expect(convertToContractPrice(10000n, 2)).toBe(10000n / expandDecimals(1, 2)); }); }); describe("convertToContractTokenPrices", () => { it("returns min and max contract prices", () => { const result = convertToContractTokenPrices({ minPrice: 1000n, maxPrice: 2000n }, 2); expect(result.min).toBe(1000n / expandDecimals(1, 2)); expect(result.max).toBe(2000n / expandDecimals(1, 2)); }); }); describe("convertToTokenAmount", () => { it("returns undefined if inputs are invalid", () => { expect(convertToTokenAmount(undefined, 18, 100n)).toBeUndefined(); expect(convertToTokenAmount(1000n, undefined, 100n)).toBeUndefined(); expect(convertToTokenAmount(1000n, 18, 0n)).toBeUndefined(); }); it("converts usd to token amount", () => { expect(convertToTokenAmount(1000n, 2, 100n)).toBe((1000n * expandDecimals(1, 2)) / 100n); }); }); describe("convertToUsd", () => { it("returns undefined if inputs are invalid", () => { expect(convertToUsd(undefined, 18, 100n)).toBeUndefined(); expect(convertToUsd(1000n, undefined, 100n)).toBeUndefined(); }); it("converts token amount to usd", () => { expect(convertToUsd(1000n, 2, 100n)).toBe((1000n * 100n) / expandDecimals(1, 2)); }); }); describe("getMidPrice", () => { it("returns the average of min and max price", () => { expect(getMidPrice({ minPrice: 10n, maxPrice: 20n })).toBe(15n); }); }); describe("getIsEquivalentTokens", () => { it("checks address, wrappedAddress, synthetic, and symbol", () => { expect(getIsEquivalentTokens(getToken("ETH"), getToken("WETH"))).toBe(true); expect(getIsEquivalentTokens(getToken("ETH"), getToken("ETH"))).toBe(true); expect(getIsEquivalentTokens({ address: "0xA", isSynthetic: true, symbol: "SYN" }, { address: "0xB", isSynthetic: true, symbol: "SYN" })).toBe(true); expect(getIsEquivalentTokens(getToken("ETH"), getToken("BTC"))).toBe(false); }); }); describe("getTokenData", () => { it("returns undefined if no token data", () => { expect(getTokenData()).toBeUndefined(); }); it("returns wrapped if convertTo=wrapped and token isNative", () => { const tokensData = { "0xnative": { address: "0xnative", isNative: true, wrappedAddress: "0xwrap" }, "0xwrap": { address: "0xwrap", isWrapped: true }, }; expect(getTokenData(tokensData, "0xnative", "wrapped")).toEqual(tokensData["0xwrap"]); }); }); describe("getTokensRatioByAmounts", () => { it("returns ratio of two token amounts", () => { const fromToken = { decimals: 2 }; const toToken = { decimals: 2 }; const result = getTokensRatioByAmounts({ fromToken, toToken, fromTokenAmount: 1000n, toTokenAmount: 500n, }); expect(result.largestToken).toEqual(fromToken); expect(result.ratio).toBe((((1000n * PRECISION) / expandDecimals(1, 2)) * PRECISION) / ((500n * PRECISION) / expandDecimals(1, 2))); }); }); describe("getTokensRatioByMinOutputAmountAndTriggerPrice", () => { it("returns ratio of two token amounts in case if triggerPrice is 0n", () => { const fromToken = { decimals: 2 }; const toToken = { decimals: 2 }; const result = getTokensRatioByMinOutputAmountAndTriggerPrice({ fromToken, toToken, fromTokenAmount: 1000n, toTokenAmount: 500n, triggerPrice: 0n, minOutputAmount: 100n, }); expect(result.ratio).toBe(10000000000000000000000000000000n); expect(result.allowedSwapSlippageBps).toBe(100n); }); it("returns ratio of two token amounts in case if triggerPrice is not 0n", () => { const fromToken = { decimals: 2 }; const toToken = { decimals: 2 }; const result = getTokensRatioByMinOutputAmountAndTriggerPrice({ fromToken, toToken, fromTokenAmount: 1000n, toTokenAmount: 500n, triggerPrice: 100n, minOutputAmount: 100n, }); expect(result.ratio).toBe(100n); expect(result.allowedSwapSlippageBps).toBe(9999n); }); });