Skip to content

Commit

Permalink
code refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
g1nt0ki committed Feb 12, 2024
1 parent 7ea0f09 commit cacad79
Show file tree
Hide file tree
Showing 58 changed files with 782 additions and 3,350 deletions.
5 changes: 1 addition & 4 deletions dexs/e3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@ const fetch: any = async (timestamp: number, _: ChainBlocks, { getLogs, api, cre
const dailyVolume = createBalances();
const lpTokens = await api.fetchList({ lengthAbi: ABIs.getNumberOfLBPairs, itemAbi: ABIs.getLBPairAtIndex, target: FACTORY_ADDRESS })

const [underlyingToken0, underlyingToken1] = await Promise.all(['address:getTokenX', 'address:getTokenY'].map((abi: string) => api.multiCall({ abi, calls: lpTokens, })));

const tokens0 = underlyingToken0;
const tokens1 = underlyingToken1;
const [tokens0, tokens1] = await Promise.all(['address:getTokenX', 'address:getTokenY'].map((abi: string) => api.multiCall({ abi, calls: lpTokens, })));

const logs: any[][] = await getLogs({
targets: lpTokens,
Expand Down
169 changes: 23 additions & 146 deletions dexs/primex-finance/index.ts
Original file line number Diff line number Diff line change
@@ -1,158 +1,35 @@
import * as sdk from "@defillama/sdk";
import { FetchResultVolume, SimpleAdapter } from "../../adapters/types"
import { getBlock } from "../../helpers/getBlock";
import { ethers } from "ethers";
import { getPrices } from "../../utils/prices";
import { config, abi, topics } from "./utils";

import { ChainBlocks, FetchOptions, FetchResultVolume, SimpleAdapter } from "../../adapters/types"
import { config, } from "./utils";

const abi = {
"SpotSwap": "event SpotSwap(address indexed trader, address indexed receiver, address tokenA, address tokenB, uint256 amountSold, uint256 amountBought)",
"OpenPosition": "event OpenPosition(uint256 indexed positionId, address indexed trader, address indexed openedBy, (uint256 id, uint256 scaledDebtAmount, address bucket, address soldAsset, uint256 depositAmountInSoldAsset, address positionAsset, uint256 positionAmount, address trader, uint256 openBorrowIndex, uint256 createdAt, uint256 updatedConditionsAt, bytes extraParams) position, address feeToken, uint256 protocolFee, uint256 entryPrice, uint256 leverage, (uint256 managerType, bytes params)[] closeConditions)",
"ClosePosition": "event ClosePosition(uint256 indexed positionId, address indexed trader, address indexed closedBy, address bucketAddress, address soldAsset, address positionAsset, uint256 decreasePositionAmount, int256 profit, uint256 positionDebt, uint256 amountOut, uint8 reason)",
"PartialClosePosition": "event PartialClosePosition(uint256 indexed positionId, address indexed trader, address bucketAddress, address soldAsset, address positionAsset, uint256 decreasePositionAmount, uint256 depositedAmount, uint256 scaledDebtAmount, int256 profit, uint256 positionDebt, uint256 amountOut)"
}

const fetch = (chain: string) => async (timestamp: number): Promise<FetchResultVolume> => {
const fetch = (chain: string) => async (timestamp: number, _: ChainBlocks, { createBalances, getLogs, }: FetchOptions): Promise<FetchResultVolume> => {
const { swapManager, positionManager, batchManager } = config[chain];
const dailyVolume = createBalances()

const logsConfig = [
{
targets: swapManager,
topics: [topics.swap]
},
{
targets: positionManager,
topics: [topics.openPosition]
},
{
targets: positionManager,
topics: [topics.closePosition]
},
{
targets: positionManager,
topics: [topics.partiallyClosePosition]
},
{
targets: batchManager,
topics: [topics.closePosition]
},
{ targets: swapManager, eventAbi: abi.SpotSwap },
{ targets: positionManager, eventAbi: abi.OpenPosition },
{ targets: positionManager, eventAbi: abi.ClosePosition },
{ targets: positionManager, eventAbi: abi.PartialClosePosition },
{ targets: batchManager, eventAbi: abi.ClosePosition },
]

const contractInterface = new ethers.Interface(abi)

const fromTimestamp = timestamp - 60 * 60 * 24
const toTimestamp = timestamp
const fromBlock = (await getBlock(fromTimestamp, chain, {}));
const toBlock = (await getBlock(toTimestamp, chain, {}));

const [swapLogs, openPositionLogs, closePositionLogs, partiallyClosePositionLogs, closePositionBatchLogs] = (await Promise.all(logsConfig.map(async ({ targets, topics }) => {
return (await Promise.all(targets.map(target => {
return sdk.getEventLogs({
target,
toBlock: toBlock,
fromBlock: fromBlock,
chain,
topics
})
}))).map(r => r as ethers.Log[]).flat()
})))

const swapTokens: string[] = swapLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const tokenA = parsedLog!.args.tokenA.toLowerCase();
return tokenA
});

const openPositionTokens: string[] = openPositionLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.position.soldAsset.toLowerCase();
return soldAsset
});

const closePositionTokens: string[] = closePositionLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.soldAsset.toLowerCase();
return soldAsset
})

const partiallyClosePositionTokens: string[] = partiallyClosePositionLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.soldAsset.toLowerCase();
return soldAsset
})

const closePositionBatchTokens: string[] = closePositionBatchLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.soldAsset.toLowerCase();
return soldAsset
})

const uniqueTokens = Array.from(new Set(swapTokens.concat(openPositionTokens, closePositionTokens, partiallyClosePositionTokens, closePositionBatchTokens)))

const priceKeys = uniqueTokens.map((t) => `${chain}:${t}`)
const prices = await getPrices(priceKeys, timestamp);

const swapVolumeUSD: number = swapLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const amountSold = Number(parsedLog!.args.amountSold);
const tokenA = parsedLog!.args.tokenA;
const priceA = prices[`${chain}:${tokenA.toLowerCase()}`]?.price || 0;
const decimalsA = prices[`${chain}:${tokenA.toLowerCase()}`]?.decimals || 0;
return (amountSold / 10 ** decimalsA) * priceA;
})
.reduce((a: number, b: number) => a + b, 0)

const openPositionVolumeUSD: number = openPositionLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.position.soldAsset;
const priceSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.price || 0;
const decimalsSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.decimals || 0;
const depositAmountInSoldAsset = Number(parsedLog!.args.position.depositAmountInSoldAsset) / 10 ** decimalsSoldAsset;
const leverage = Number(parsedLog!.args.leverage) / 10 ** 18
return depositAmountInSoldAsset * leverage * priceSoldAsset;
})
.reduce((a: number, b: number) => a + b, 0)

const closePositionVolumeUSD: number = closePositionLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.soldAsset;
const priceSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.price || 0;
const decimalsSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.decimals || 0;
const amountOut = Number(parsedLog!.args.amountOut) / 10 ** decimalsSoldAsset;
return amountOut * priceSoldAsset;
})
.reduce((a: number, b: number) => a + b, 0)

const partiallyClosePositionVolumeUSD: number = partiallyClosePositionLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.soldAsset;
const priceSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.price || 0;
const decimalsSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.decimals || 0;
const amountOut = Number(parsedLog!.args.amountOut) / 10 ** decimalsSoldAsset;
return amountOut * priceSoldAsset;
})
.reduce((a: number, b: number) => a + b, 0)
const [swapLogs, openPositionLogs, closePositionLogs, partiallyClosePositionLogs, closePositionBatchLogs] = await Promise.all(logsConfig.map(async (config) => getLogs(config)))

const closePositionBatchVolumeUSD: number = closePositionBatchLogs
.map((log: ethers.Log) => {
const parsedLog = contractInterface.parseLog(log as any);
const soldAsset = parsedLog!.args.soldAsset;
const priceSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.price || 0;
const decimalsSoldAsset = prices[`${chain}:${soldAsset.toLowerCase()}`]?.decimals || 0;
const amountOut = Number(parsedLog!.args.amountOut) / 10 ** decimalsSoldAsset;
return amountOut * priceSoldAsset;
})
.reduce((a: number, b: number) => a + b, 0)
swapLogs.forEach((e: any) => dailyVolume.add(e.tokenA, e.amountSold))
openPositionLogs.forEach((e: any) => dailyVolume.add(e.position.soldAsset, e.position.amountSold * e.leverage))
closePositionLogs.forEach((e: any) => dailyVolume.add(e.soldAsset, e.amountOut))
partiallyClosePositionLogs.forEach((e: any) => dailyVolume.add(e.soldAsset, e.amountOut))
closePositionBatchLogs.forEach((e: any) => dailyVolume.add(e.soldAsset, e.amountOut))

const dailyVolume = swapVolumeUSD + openPositionVolumeUSD + closePositionVolumeUSD + partiallyClosePositionVolumeUSD + closePositionBatchVolumeUSD
return { dailyVolume: dailyVolume, timestamp, }

return {
dailyVolume: `${dailyVolume}`,
timestamp
}

}
const adapters: SimpleAdapter = {
Expand Down
36 changes: 15 additions & 21 deletions dexs/saber/index.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,22 @@
import ADDRESSES from '../../helpers/coreAssets.json'
import { ChainBlocks, FetchOptions } from '../../adapters/types';
import { httpPost } from "../../utils/fetchURL";
import { getPrices } from "../../utils/prices";

async function last24h(timestamp: number) {
const data = await httpPost('https://saberqltest.aleph.cloud/', { "query": "{\n pools {\n ammId\n name\n coin {\n chainId\n address\n name\n decimals\n symbol\n logoURI\n }\n pc {\n chainId\n address\n name\n decimals\n symbol\n logoURI\n }\n lp {\n chainId\n address\n name\n decimals\n symbol\n logoURI\n }\n stats {\n tvl_pc\n tvl_coin\n price\n vol24h\n }\n }\n}\n" })
const coinId = "solana:" + ADDRESSES.solana.SOL;
const prices = await getPrices([coinId], timestamp)
const vol = data.data.pools.reduce(
(a: number, b: any) =>
a + b.stats.vol24h *
(b.pc.address === ADDRESSES.solana.SOL ? prices[coinId].price : 1)
, 0)
return {
dailyVolume: vol,
timestamp: Date.now() / 1e3
}
async function last24h(timestamp: number, _: ChainBlocks, { createBalances }: FetchOptions) {
const { data: { pools } } = await httpPost('https://saberqltest.aleph.cloud/', { "query": "{ pools { stats { vol24h_usd } } }" })
const dailyVolume = createBalances()
pools.forEach((pool: any) => dailyVolume.addCGToken('tether', pool.stats.vol24h_usd))
return {
dailyVolume,
timestamp: Math.floor(Date.now() / 1e3)
}
}

export default {
adapter: {
"solana": {
fetch: last24h,
runAtCurrTime: true,
start: 0,
}
adapter: {
"solana": {
fetch: last24h,
runAtCurrTime: true,
start: 0,
}
}
}
16 changes: 5 additions & 11 deletions dexs/sanctum/index.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
import { FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { ChainBlocks, FetchOptions, FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { queryDune } from "../../helpers/dune";
import { getPrices } from "../../utils/prices";

const fetch = async (timestamp: number): Promise<FetchResultVolume> => {
const fetch = async (timestamp: number, _: ChainBlocks, { createBalances }: FetchOptions): Promise<FetchResultVolume> => {
const dailyVolume = createBalances()
const solDispensed = (
await queryDune("3276095", {
endTime: timestamp,
})
)[0].sol_dispensed;
const dailyVolume =
solDispensed *
(await getPrices(["coingecko:solana"], timestamp))["coingecko:solana"]
.price;
dailyVolume.addCGToken("solana", solDispensed);

return {
dailyVolume: `${dailyVolume}`,
timestamp,
};
return { dailyVolume, timestamp, };
};

const adapter: SimpleAdapter = {
Expand Down
20 changes: 10 additions & 10 deletions dexs/saucerswap/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SimpleAdapter } from "../../adapters/types";
import { ChainBlocks, FetchOptions, SimpleAdapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import { getUniqStartOfTodayTimestamp } from "../../helpers/getUniSubgraphVolume";
import { getPrices } from "../../utils/prices";
Expand All @@ -11,26 +11,26 @@ interface IVolumeall {
valueHbar: string;
}

const fetch = async (timestamp: number) => {
const dayTimestamp = getUniqStartOfTodayTimestamp(new Date(timestamp * 1000))
const fetch = async (timestamp: number , _: ChainBlocks, { createBalances, startOfDay }: FetchOptions) => {
const historicalVolume: IVolumeall[] = (await httpGet(historicalVolumeEndpoint(new Date().getTime() / 1000), { headers: {
'origin': 'https://analytics.saucerswap.finance',
}}));

const totalVolume = historicalVolume
.filter(volItem => Number(volItem.timestampSeconds) <= dayTimestamp)
.filter(volItem => Number(volItem.timestampSeconds) <= startOfDay)
.reduce((acc, { valueHbar }) => acc + Number(valueHbar), 0)

const dailyVolume = historicalVolume
.find(dayItem => Number(dayItem.timestampSeconds) === dayTimestamp)?.valueHbar
const _dailyVolume = historicalVolume
.find(dayItem => Number(dayItem.timestampSeconds) === startOfDay)?.valueHbar

const coinId = "coingecko:hedera-hashgraph";
const prices = await getPrices([coinId], dayTimestamp)

const dailyVolume = createBalances()
dailyVolume.addCGToken("hedera-hashgraph", (_dailyVolume as any)/1e8)

return {
// totalVolume: totalVolume ? String(totalVolume/1e8 * prices[coinId].price) : "0",
dailyVolume: dailyVolume ? String(Number(dailyVolume)/1e8 * prices[coinId].price) : "0",
timestamp: dayTimestamp,
dailyVolume,
timestamp: startOfDay,
};
};

Expand Down
31 changes: 9 additions & 22 deletions dexs/tokenlon/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import ADDRESSES from '../../helpers/coreAssets.json'
import { FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { ChainBlocks, FetchOptions, FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import { gql, request } from "graphql-request";
import { Chain } from "@defillama/sdk/build/general";
Expand All @@ -21,14 +21,13 @@ type TEndpoint = {
};

const endpoints: TEndpoint = {
[CHAIN.ETHEREUM]:"https://api.thegraph.com/subgraphs/name/consenlabs/tokenlon-v5-exchange",
[CHAIN.ETHEREUM]: "https://api.thegraph.com/subgraphs/name/consenlabs/tokenlon-v5-exchange",
};

const fetchVolume = (chain: Chain) => {
return async (timestamp: number): Promise<FetchResultVolume> => {
const fromTimestamp = timestamp - 60 * 60 * 24
const toTimestamp = timestamp
const query = gql`
return async (timestamp: number, _: ChainBlocks, { createBalances, fromTimestamp, toTimestamp, }: FetchOptions): Promise<FetchResultVolume> => {
const dailyVolume = createBalances()
const query = `
{
swappeds(first:1000, where:{timestamp_gte:${fromTimestamp}, timestamp_lte:${toTimestamp}}) {
makerAssetAddr
Expand All @@ -42,22 +41,10 @@ const fetchVolume = (chain: Chain) => {
`;
const response: IData = (await request(endpoints[chain], query));
const historicalData: IGraph[] = [...response.fillOrders, ...response.swappeds]
const coins = [...new Set(historicalData.map((e: IGraph) => `${chain}:${e.makerAssetAddr}`))]
const prices = await getPrices(coins, toTimestamp);
if (!prices[`ethereum:0x3212b29e33587a00fb1c83346f5dbfa69a458923`]) {
prices[`ethereum:0x3212b29e33587a00fb1c83346f5dbfa69a458923`] = prices[`ethereum:` + ADDRESSES.ethereum.WBTC] // imBTC
}
const dailyVolume = historicalData.map((e: IGraph) => {
const price = prices[`${chain}:${e.makerAssetAddr}`]?.price || 0;
const decimals = prices[`${chain}:${e.makerAssetAddr}`]?.decimals || 0;
return (Number(e.makerAssetAmount) / 10 ** decimals) * price;
}).filter((e: any) => !isNaN(e))
.reduce((a: number, b: number) => a + b, 0);

return {
dailyVolume: `${dailyVolume}`,
timestamp: toTimestamp,
};
historicalData.map((e: IGraph) => {
dailyVolume.add(e.makerAssetAddr, e.makerAssetAmount)
})
return { dailyVolume, timestamp: toTimestamp }
};
};

Expand Down
15 changes: 1 addition & 14 deletions dexs/velodrome-v2/index.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,11 @@
import { SimpleAdapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import { Chain } from "@defillama/sdk/build/general";
import { fetchV2 } from "./v2";


const fetch = (_: Chain) => {
return async (timestamp: number) => {
const [v2] = await Promise.all([fetchV2(timestamp)])
const dailyVolume = Number(v2.dailyVolume);
return {
dailyVolume: `${dailyVolume}`,
timestamp
}
}
}

const adapter: SimpleAdapter = {
adapter: {
[CHAIN.OPTIMISM]: {
fetch: fetch(CHAIN.OPTIMISM),
fetch: fetchV2,
start: 1677110400
},
},
Expand Down
Loading

0 comments on commit cacad79

Please sign in to comment.