ULDM Performance
Challenging The Leading DEX Aggregators
async function main() {
const X = parseInt(prompt("Enter number of tokens in dataset to be considered "));
const rawData = fs.readFileSync('tokenlist.json');
const jsonData = JSON.parse(rawData);
const tokenList = jsonData.tokens;
const randomTokens = getRandomTokens(tokenList, X);
for (let i = 0; i < randomTokens.length - 1; i++) {
const tokenIn = randomTokens[i].address;
const tokenOut = randomTokens[i + 1].address;
const chainId = 1;
const tokenInDetails = await getTokenDetails(tokenIn, chainId);
const amountIn = new BigNumber(10000).dividedBy(tokenInDetails.price).multipliedBy(new BigNumber(10).pow(tokenInDetails.decimals)).toFixed(0);
const result = await getQuotes(tokenIn, tokenOut, amountIn, chainId);
console.log(`Swapping 10,000 USD worth of ${tokenList.find(token => token.address === tokenIn).symbol} tokens to ${tokenList.find(token => token.address === tokenOut).symbol} will get you:`);
console.log(`ZCX: ${result.zcx}`);
console.log(`Paraswap: ${result.paraswap}`);
console.log(`1inch: ${result.oneInch}`);
}
}
function getRandomTokens(tokenList, X) {
const randomTokens = [];
for (let i = 0; i < X; i++) {
const randomIndex = Math.floor(Math.random() * tokenList.length);
randomTokens.push(tokenList[randomIndex]);
}
return randomTokens;
}
async function getTokenDetails(tokenAddress, chainId) {
const apiUrl = ``;
const response = await axios.get(apiUrl);
const data = response.data;
return {
decimals: data.decimals,
price: data.price
};
}
async function getQuotes(tokenIn, tokenOut, amountIn, chainId) {
const paraswapUrl = `https://apiv5.paraswap.io/prices`;
const oneInchUrl = `https://api.1inch.io/v5.0/${chainId}/quote`;
let chainIdToRPC = new Map();
chainIdToRPC.set(1, "");
chainIdToRPC.set(137, "");
chainIdToRPC.set(56, "");
chainIdToRPC.set(43114, "");
chainIdToRPC.set(42161, "");
chainIdToRPC.set(10, "");
chainIdToRPC.set(250, "");
const tradeParams = {
tokenIn: tokenIn,
tokenOut: tokenOut,
slippage: 0.03,
chainId: chainId,
inNative: false,
outNative: false,
deadline: 1679649641,
isVIP: true,
amount: amountIn,
};
const dexAggr = new DexAggregatorSDK(chainIdToRPC, undefined);
// fetching zcx quotes
let uzParams = dexAggr.getBestQuoteCall(
tradeParams,
false,
undefined,
undefined,
false,
true,
false,
);
// fetching paraswap
const paraswapParams = new URLSearchParams({
srcToken: tokenIn,
destToken: tokenOut,
amount: amountIn,
side: 'SELL',
network: chainId,
srcDecimals: 18,
destDecimals: 18
});
// fetching 1inch
const oneInchParams = new URLSearchParams({
fromTokenAddress: tokenIn,
toTokenAddress: tokenOut,
amount: amountIn
});
const paraswapRequest = fetch(`${paraswapUrl}?${paraswapParams}`).then(response => response.json());
const oneInchRequest = fetch(`${oneInchUrl}?${oneInchParams}`).then(response => response.json());
const [uzResult, paraswapResult, oneInchResult] = await Promise.all([
uzParams,
paraswapRequest,
oneInchRequest,
]);
// splitting trade for zcx quotes
let paramsSplit = await dexAggr.getBestQuoteCall(
tradeParams,
false,
undefined,
undefined,
false,
true,
true,
uzResult
);
let tot = new BigNumber(0)
for (let i = 0; i < paramsSplit.length; i++) {
tot = tot.plus(new BigNumber(paramsSplit[i].actualQuote));
}
console.log(uzResult[0].actualQuote, tot.toFixed(0))
const results = {
tokenIn: tokenIn,
tokenOut: tokenOut,
amountIn: amountIn,
timestamp: Math.floor(Date.now() / 1000),
chainId: chainId,
zcx: BigNumber.max(uzResult[0].actualQuote, tot).toFixed(0),
paraswap: paraswapResult.priceRoute == undefined ? undefined : paraswapResult.priceRoute.destAmount,
oneInch: oneInchResult.toTokenAmount,
};
return results;
}
Sold
Bought
Network
Unizen Out
Paraswap Out
1inch Out
Trade
Unizen vs Paraswap
Unizen vs 1inch
Last updated