@hyperionxyz/sdk
Version:
This SDK allows you to interact with the Hyperion API. You can use it to request data, create pools/positions and more.
136 lines (122 loc) • 3.52 kB
text/typescript
import BigNumber from "bignumber.js";
import Long from "long";
BigNumber.config({ EXPONENTIAL_AT: 1e9 });
export const tickComplement = (tick: number | string) => {
const signed = Long.fromInt(BigNumber(tick).dp(0).toNumber());
return signed.toUnsigned().toInt();
};
export const BASE = 1.0001;
export const logBase = (number: number | string | BigNumber): number => {
return Math.log(new BigNumber(number).toNumber()) / Math.log(BASE);
};
// seconds after 100 years
export const poolDeadline = () => {
return Math.floor(100 * 365 * 24 * 60 * 60 + Date.now() / 1e3);
};
export const LOWEST_TICK = "-443636";
export const HIGHEST_TICK = "443636";
export enum FeeTierIndex {
"PER_0.01_SPACING_1" = 0,
"PER_0.05_SPACING_5" = 1,
"PER_0.3_SPACING_60" = 2,
"PER_1_SPACING_200" = 3,
"PER_0.1_SPACING_20" = 4,
"PER_0.25_SPACING_50" = 5,
}
export const FeeTierItems = ["1", "5", "30", "100", "10", "25"];
export const FeeTierStep = [1, 10, 60, 200, 20, 50];
export const LowestTickByStep = [
-443636, -443630, -443580, -443600, -443620, -443600,
];
export const HighestTickByStep = [
443636, 443630, 443580, 443600, 443620, 443600,
];
export const u64Max = 184467440737095516;
export const roundTickBySpacing = (
tick: number | string,
feeTierIndex: number
) => {
const currentStep = FeeTierStep[feeTierIndex];
// always towards zero
return new BigNumber(tick)
.div(currentStep)
.dp(0, BigNumber.ROUND_HALF_UP)
.times(currentStep)
.toString();
};
/**
*
* @param price
* @param feeTierIndex
* @param decimalsRatio Math.pow(10, currencyADecimals - currencyBDecimals)
*
* @returns
*/
export const priceToTick = ({
price,
feeTierIndex,
decimalsRatio,
}: {
price: string | number | BigNumber;
feeTierIndex: FeeTierIndex;
decimalsRatio: number;
}) => {
const ret = logBase(new BigNumber(price).div(decimalsRatio));
if (isNaN(ret)) return null;
return BigNumber(ret).lt(0)
? BigNumber.max(
roundTickBySpacing(ret, feeTierIndex),
roundTickBySpacing(LOWEST_TICK, feeTierIndex)
)
: BigNumber.min(
roundTickBySpacing(ret, feeTierIndex),
roundTickBySpacing(HIGHEST_TICK, feeTierIndex)
);
};
export const tickToPrice = ({
tick,
decimalsRatio,
}: {
tick: number | string | BigNumber;
decimalsRatio: number;
}) => {
return new BigNumber(Math.pow(BASE, new BigNumber(tick).dp(0).toNumber()))
.times(decimalsRatio)
.toString();
};
export const POOL_STABLE_TYPE = false;
export const currencyCheck = (args: {
currencyA: string;
currencyB: string;
}) => {
if (!args.currencyA || !args.currencyB) {
throw new Error(
"currencyA and currencyB are required and can not be empty"
);
}
if (!args.currencyA.startsWith("0x") || !args.currencyB.startsWith("0x")) {
throw new Error(
"currencyA and currencyB must be valid aptos account/token address"
);
}
};
export const slippageCheck = (args: { slippage: number | string }) => {
// slippage check
if (!args.slippage || BigNumber(args.slippage).isNaN()) {
args.slippage = 0.5;
}
if (BigNumber(args.slippage).lt(0)) {
throw new Error("slippage must be greater than 0");
} else if (BigNumber(args.slippage).gt(20)) {
throw new Error("slippage must be less than 20");
}
};
export const slippageCalculator = (
amount: number | string,
slippage: number | string
) => {
return new BigNumber(amount)
.minus(BigNumber(amount).times(slippage).div(100))
.dp(0)
.toNumber();
};