UNPKG

@syncswap/sdk

Version:

SyncSwap TypeScript SDK for building DeFi applications

253 lines 9.68 kB
import { reviveFromJSON } from "./utils.js"; import { BigNumber } from "ethers"; import { DECIMALS_3, ZERO, ZERO_ADDRESS } from "../utils/constants.js"; const ZERO_FEE_DATA = { gamma: ZERO, minFee: 0, maxFee: 0, }; const API_BASE_URL = "https://api.syncswap.xyz"; const R2_BASE_URL = "https://dl.syncswap.xyz"; function parsePoolData(data) { let swapFee01; // parse fee data 0->1 if (data.f0 === 0) { swapFee01 = ZERO_FEE_DATA; } else if (Array.isArray(data.f0) && data.f0.length === 3) { swapFee01 = { gamma: toBigNumber(data.f0[0]), minFee: toNumber(data.f0[1]), maxFee: toNumber(data.f0[2]), }; } else { const fee = toNumber(data.f0); swapFee01 = { gamma: ZERO, minFee: fee, maxFee: fee, }; } // parse fee data 1->0 let swapFee10; if (data.f1 === 0) { swapFee10 = ZERO_FEE_DATA; } else if (Array.isArray(data.f1) && data.f1.length === 3) { swapFee10 = { gamma: toBigNumber(data.f1[0]), minFee: toNumber(data.f1[1]), maxFee: toNumber(data.f1[2]), }; } else { const fee = toNumber(data.f1); swapFee10 = { gamma: ZERO, minFee: fee, maxFee: fee, }; } const isV2 = data.a !== undefined; const cryptoData = data.c && Array.isArray(data.c) ? data.c[0] : undefined; const v3d = data.t === 4 && data.u && Array.isArray(data.u) ? data.u[0] : undefined; const ud = data.t === 4 && data.ud && Array.isArray(data.ud) ? data.ud[0] : undefined; const uniswapV3Data = v3d && v3d.length > 0 ? { pool: v3d[0], token0: v3d[1], token1: v3d[2], poolType: v3d[3], swapFee01: v3d[4], swapFee10: v3d[5], protocolFee: v3d[6], liquidity: toBigNumber(v3d[7]), tick: v3d[8], reserve0: toBigNumber(v3d[9]), reserve1: toBigNumber(v3d[10]), sqrtPriceX96: toBigNumber(v3d[11]), feeGrowthGlobal0X128: toBigNumber(v3d[12]), feeGrowthGlobal1X128: toBigNumber(v3d[13]), rewardRate: toBigNumber(v3d[14]), periodFinish: toBigNumber(v3d[15]), rollover: toBigNumber(v3d[16]), stakedLiquidity: toBigNumber(v3d[17]), lastUpdated: v3d[18], tickSpacing: v3d[19], } : undefined; const parsedPoolData = { isV2: isV2, isV3: data.v === 3 ? true : false, isUniswap: data.t === 4 ? true : false, pool: data.p, poolType: data.t, swapFee01: swapFee01, swapFee10: swapFee10, protocolFee: data.pf, token0: { token: data.t0[0], symbol: data.t0[1], name: data.t0[2], decimals: data.t0[3], }, token1: { token: data.t1[0], symbol: data.t1[1], name: data.t1[2], decimals: data.t1[3], }, deprecated: data.d ? true : false, reserve0: toBigNumber(data.r0), reserve1: toBigNumber(data.r1), totalSupply: toBigNumber(data.s), accountBalance: data.b ? toBigNumber(data.b) : ZERO, routerAllowance: toBigNumber(data.o), volume0: toBigNumber(data.vo0), volume1: toBigNumber(data.vo1), token0Value: toBigNumber(data.v0), token1Value: toBigNumber(data.v1), feesCurrentEpoch: data.fc ? toBigNumber(data.fc) : ZERO, feesLastEpoch: data.fl ? toBigNumber(data.fl) : ZERO, feeStartTime: data.ft ? toBigNumber(data.ft) : ZERO, totalFeeValue: data.tfv ? toBigNumber(data.tfv) : ZERO, a: data.a ? toBigNumber(data.a) : data.t === 2 ? DECIMALS_3 : ZERO, feesData: ud ? [ud] : [], cryptoPoolData: cryptoData && cryptoData.length > 0 ? [ { gamma: toBigNumber(cryptoData[0]), invariantLast: toBigNumber(cryptoData[1]), priceScale: toBigNumber(cryptoData[2]), futureParamsTime: toBigNumber(cryptoData[3]), virtualPrice: toBigNumber(cryptoData[4]), totalSupply: toBigNumber(cryptoData[5]), }, ] : [], uniswapV3PoolData: uniswapV3Data ? [uniswapV3Data] : [], rangePositions: uniswapV3Data && data.po && data.po.length > 0 ? data.po.map((item) => { const position = { tokenId: toBigNumber(item[1]), token0: item[2], token1: item[3], tickSpacing: item[4], tickLower: item[5], tickUpper: item[6], liquidity: toBigNumber(item[7]), feeGrowthInside0LastX128: toBigNumber(item[8]), feeGrowthInside1LastX128: toBigNumber(item[9]), tokensOwed0: toBigNumber(item[10]), tokensOwed1: toBigNumber(item[11]), tickLowerFeeGrowthOutside0X128: toBigNumber(item[12]), tickLowerFeeGrowthOutside1X128: toBigNumber(item[13]), tickUpperFeeGrowthOutside0X128: toBigNumber(item[14]), tickUpperFeeGrowthOutside1X128: toBigNumber(item[15]), token0Value: toBigNumber(item[16]), token1Value: toBigNumber(item[17]), token0Amount: toBigNumber(item[18]), token1Amount: toBigNumber(item[19]), feesHours: 6, apr: 0, // pool data pool: uniswapV3Data.pool, reserve0: toBigNumber(uniswapV3Data.reserve0), reserve1: toBigNumber(uniswapV3Data.reserve1), tickCurrent: uniswapV3Data.tick, protocolFee: uniswapV3Data.protocolFee, swapFee01: uniswapV3Data.swapFee01, swapFee10: uniswapV3Data.swapFee10, sqrtPriceX96: toBigNumber(uniswapV3Data.sqrtPriceX96), poolLiquidity: toBigNumber(uniswapV3Data.liquidity), poolStakedLiquidity: toBigNumber(uniswapV3Data.stakedLiquidity), feeGrowthGlobal0X128: toBigNumber(uniswapV3Data.feeGrowthGlobal0X128), feeGrowthGlobal1X128: toBigNumber(uniswapV3Data.feeGrowthGlobal1X128), }; return position; }) : [] }; return parsedPoolData; } export async function apiFetchAllPools(network, account) { return new Promise(async (resolve, reject) => { try { let response; let res; if (account === ZERO_ADDRESS) { account = "0x0000000000000000000000000000000000000001"; const cache_key = `cache_fetchAllPools_${network}_${account}_next2_v2`; try { response = await fetch(`${R2_BASE_URL}/${cache_key}`); const r2Res = await response .text() .then((res) => JSON.parse(res, reviveFromJSON)); if (!r2Res || r2Res.pools.length === 0) { throw Error("R2 Failed"); resolve(null); } else { res = r2Res; } } catch (e) { console.warn('apiFetchAllPools: r2 errored, fallback to api', e); response = await fetch(`${API_BASE_URL}/api/fetchers/fetchAllPools?network=${network}&account=${account}&quote=next2&type=v2&range=1`); } } else { response = await fetch(`${API_BASE_URL}/api/fetchers/fetchAllPools?network=${network}&account=${account}&quote=next2&type=v2&range=1`); } if (response.status != 200) { console.warn("apiFetchAllPools: api request failed"); resolve(null); return null; } if (!res) { res = await response .text() .then((res) => JSON.parse(res, reviveFromJSON)); } if (!res) { resolve(null); return null; } // recover data fields. const pools = []; for (const data of res.pools) { const parsedPoolData = parsePoolData(data); pools.push(parsedPoolData); } const allPoolData = { totalPoolCount: res.totalPoolCount, epochDuration: res.epochDuration, epochDurationV2: res.epochDurationV2, pools: pools, }; //console.log('apiFetchAllPools data', allPoolData, 'network', network, 'account', account); resolve(allPoolData); } catch (e) { // reject(e); console.warn(e); resolve(null); return null; } }); } function toBigNumber(s) { return !s || s === 0 ? ZERO : s.hex ? BigNumber.from(s.hex) : BigNumber.from(s); // bignumberish } function toNumber(s) { return !s || s === 0 ? 0 : s.hex ? BigNumber.from(s.hex).toNumber() : s.startsWith("0x") ? BigNumber.from(s).toNumber() : s; } //# sourceMappingURL=index.js.map