@indigo-labs/dexter
Version:
Customizable Typescript SDK for interacting with Cardano DEXs
53 lines (52 loc) • 3.28 kB
JavaScript
import { BaseApi } from './base-api';
import { Asset } from '../models/asset';
import { LiquidityPool } from '../models/liquidity-pool';
import axios from 'axios';
import { appendSlash } from '../../utils';
import { SundaeSwapV3 } from '../sundaeswap-v3';
export class SundaeSwapV3Api extends BaseApi {
constructor(dex, requestConfig) {
super();
this.dex = dex;
this.api = axios.create({
timeout: requestConfig.timeout,
baseURL: `${appendSlash(requestConfig.proxyUrl)}https://api.sundae.fi/graphql`,
headers: {
'Content-Type': 'application/json',
}
});
}
async liquidityPools(assetA, assetB) {
const assetAId = (assetA === 'lovelace')
? 'ada.lovelace'
: assetA.identifier('.');
const assetBId = (assetB && assetB !== 'lovelace')
? assetB.identifier('.')
: 'ada.lovelace';
const assets = [assetAId, assetBId];
return await this.api.post('', {
operationName: 'fetchPoolsByPair',
query: `query fetchPoolsByPair($assetA: ID!, $assetB: ID!) {\n pools {\n byPair(assetA: $assetA, assetB: $assetB) {\n ...PoolBrambleFragment\n }\n }\n}\n\nfragment PoolBrambleFragment on Pool {\n id\n assetA {\n ...AssetBrambleFragment\n }\n assetB {\n ...AssetBrambleFragment\n }\n assetLP {\n ...AssetBrambleFragment\n }\n feesFinalized {\n slot\n }\n marketOpen {\n slot\n }\n askFee\n bidFee\n feeManagerId\n current {\n quantityA {\n quantity\n }\n quantityB {\n quantity\n }\n quantityLP {\n quantity\n }\n tvl {\n quantity\n }\n }\n version\n}\n\nfragment AssetBrambleFragment on Asset {\n id\n policyId\n description\n dateListed {\n format\n }\n decimals\n ticker\n name\n logo\n assetName\n metadata {\n ... on OnChainLabel20 {\n __typename\n }\n ... on OnChainLabel721 {\n __typename\n }\n ... on CardanoTokenRegistry {\n __typename\n }\n }\n}`,
variables: {
assetA: assets[0],
assetB: assets[1],
},
}).then((response) => {
const pools = response.data.data.pools.byPair;
return pools
.filter((pool) => pool.version === 'V3')
.map((pool) => {
let liquidityPool = new LiquidityPool(SundaeSwapV3.identifier, pool.assetA.id === 'ada.lovelace'
? 'lovelace'
: Asset.fromIdentifier(pool.assetA.id, pool.assetA.decimals), pool.assetB.id === 'ada.lovelace'
? 'lovelace'
: Asset.fromIdentifier(pool.assetB.id, pool.assetB.decimals), BigInt(pool.current.quantityA.quantity), BigInt(pool.current.quantityB.quantity), this.dex.poolAddress, '', '');
liquidityPool.identifier = pool.id;
liquidityPool.lpToken = Asset.fromIdentifier(pool.assetLP.id);
liquidityPool.poolFeePercent = Number((pool.bidFee[0] / pool.bidFee[1]) * 100);
liquidityPool.totalLpTokens = BigInt(pool.current.quantityLP.quantity);
return liquidityPool;
});
});
}
}