@syncswap/sdk
Version:
SyncSwap TypeScript SDK for building DeFi applications
253 lines • 9.68 kB
JavaScript
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}"e=next2&type=v2&range=1`);
}
}
else {
response = await fetch(`${API_BASE_URL}/api/fetchers/fetchAllPools?network=${network}&account=${account}"e=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