@atomiqlabs/sdk-lib
Version:
Basic SDK functionality library for atomiq
112 lines (96 loc) • 3.42 kB
text/typescript
import {ChainIds, MultiChain} from "../../swaps/Swapper";
export type CoinType = {
coinId: string;
decimals: number;
};
export type CtorCoinTypes<T extends MultiChain> = {
coinId: string,
chains: {
[chainId in keyof T]?: {
address: string,
decimals: number,
}
}
}[]
export type CoinTypes<T extends MultiChain> = {
[chainId in keyof T]?: {
[address: string]: CoinType
}
}
export abstract class IPriceProvider<T extends MultiChain> {
coinsMap: CoinTypes<T> = {};
protected constructor(coins: CtorCoinTypes<T>) {
for(let coinData of coins) {
if(coinData.coinId==null) continue;
for(let chainId in coinData.chains) {
const {address, decimals} = coinData.chains[chainId];
this.coinsMap[chainId] ??= {};
(this.coinsMap[chainId] as any)[address.toString()] = {
coinId: coinData.coinId,
decimals
};
}
}
}
/**
* Fetches the price for a given token against BTC
*
* @param token
* @param abortSignal
* @protected
* @returns Price per token in uSats (micro sats)
*/
protected abstract fetchPrice(token: CoinType, abortSignal?: AbortSignal): Promise<bigint>;
/**
* Fetches the USD price of BTC
*
* @param abortSignal
* @protected
*/
protected abstract fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
/**
* Returns coin price in uSat (microSat)
*
* @param chainIdentifier
* @param token
* @param abortSignal
* @throws {Error} if token is not found
*/
getPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint> {
let tokenAddress: string = token.toString();
const chainTokens = this.coinsMap[chainIdentifier];
if(chainTokens==null) throw new Error("Chain not found");
const coin = chainTokens[tokenAddress];
if(coin==null) throw new Error("Token not found");
if(coin.coinId.startsWith("$fixed-")) {
const amt: number = parseFloat(coin.coinId.substring(7));
return Promise.resolve(BigInt(Math.floor(amt*1000000).toString(10)));
}
return this.fetchPrice(coin, abortSignal);
}
/**
* Returns coin price in uSat (microSat)
*
* @param abortSignal
* @throws {Error} if token is not found
*/
getUsdPrice(abortSignal?: AbortSignal): Promise<number> {
return this.fetchUsdPrice(abortSignal);
}
/**
* Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
* token is not found
*
* @param chainIdentifier
* @param token
* @protected
* @throws {Error} If token is not found
*/
getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number {
const chainTokens = this.coinsMap[chainIdentifier];
if(chainTokens==null) throw new Error("Chain not found");
const coin = chainTokens[token.toString()];
if(coin==null) throw new Error("Token not found");
return coin.coinId==="$ignore" ? -1 : coin.decimals;
}
}