Skip to content

Commit

Permalink
Update fee adapters for various chains
Browse files Browse the repository at this point in the history
  • Loading branch information
g1nt0ki committed Feb 10, 2024
1 parent af9e464 commit e2f27b0
Show file tree
Hide file tree
Showing 37 changed files with 405 additions and 1,003 deletions.
86 changes: 13 additions & 73 deletions dexs/shell-protocol/index.ts
Original file line number Diff line number Diff line change
@@ -1,78 +1,18 @@
import ADDRESSES from '../../helpers/coreAssets.json'
import { SimpleAdapter } from "../../adapters/types";
import { ChainBlocks, FetchOptions, SimpleAdapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import * as sdk from "@defillama/sdk";
import { getBlock } from "../../helpers/getBlock";
import BigNumber from "bignumber.js";
import { getPrices } from "../../utils/prices";

const DAI_CONTRACT = ADDRESSES.optimism.DAI;
const USDC_CONTRACT = ADDRESSES.arbitrum.USDC;
const USDT_CONTRACT = ADDRESSES.arbitrum.USDT;
const WBTC_CONTRACT = ADDRESSES.arbitrum.WBTC;

const topic = 'Transfer (index_topic_1 address from, index_topic_2 address to, uint256 value)';
const topic0 = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
const topic1 = '0x000000000000000000000000c32eb36f886f638fffd836df44c124074cfe3584';

interface ITokenList {
address: string;
}

const tokenList: ITokenList[] = [
{
address: DAI_CONTRACT,
},
{
address: USDC_CONTRACT,
},
{
address: USDT_CONTRACT,
},
{
address: WBTC_CONTRACT,
}
];

interface ILog {
data: string;
transactionHash: string;
}

const fetch = async (timestamp: number) => {
const fromTimestamp = timestamp - 60 * 60 * 24
const toTimestamp = timestamp

const fromBlock = (await getBlock(fromTimestamp, 'arbitrum', {}));
const toBlock = (await getBlock(toTimestamp, 'arbitrum', {}));
const logs: ILog[][] = (await Promise.all(tokenList.map(({ address }) => sdk.getEventLogs({
target: address,
topic: topic,
toBlock: toBlock,
fromBlock: fromBlock,
chain: 'arbitrum',
topics: [topic0, topic1]
})))) as any;
const coins = tokenList.map(({ address }) => `arbitrum:${address}`);
const prices = await getPrices(coins, timestamp);
const untrackVolumes = tokenList.map((token: ITokenList, index: number) => {
const log = logs[index]
.map((e: ILog) => { return { ...e, data: e.data } })
.map((p: ILog) => {
const { decimals, price } = prices[`arbitrum:${token.address}`];
const amountUSD = new BigNumber(p.data)
.div(new BigNumber(10).pow(decimals))
.multipliedBy(price);
return amountUSD.toNumber()
})
return log.reduce((a: number, b: number) => a + b, 0);
});

const dailyVolume = untrackVolumes.reduce((a: number, b: number) => a + b, 0);
return {
timestamp,
dailyVolume: dailyVolume.toString()
}
import { addTokensReceived } from "../../helpers/token";


const fetch = async (timestamp: number, _: ChainBlocks, options: FetchOptions) => {
const tokens = [
ADDRESSES.arbitrum.DAI,
ADDRESSES.arbitrum.USDC,
ADDRESSES.arbitrum.USDT,
ADDRESSES.arbitrum.WBTC,
]
const dailyVolume = await addTokensReceived({ tokens, options, fromAddressFilter: '0xC32eB36f886F638fffD836DF44C124074cFe3584' })
return { timestamp, dailyVolume }
}


Expand Down
52 changes: 8 additions & 44 deletions dexs/slingshot/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import { Chain } from "@defillama/sdk/build/general";
import { FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { ChainBlocks, FetchOptions, FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import { getBlock } from "../../helpers/getBlock";
import * as sdk from "@defillama/sdk";
import { getPrices } from "../../utils/prices";

type TContract = {
[s: string | Chain]: string[];
Expand Down Expand Up @@ -38,56 +35,23 @@ const contract_address: TContract = {
'0x8a1d036be71c9c4a6c3d951cc2a3ee028d12d3fa'
]
}
interface ISwap {
token0Address: string;
token1Address: string;
token0Amount: number;
token1Amount: number;
}

const fetchVolume = (chain: Chain) => {
return async (timestamp: number): Promise<FetchResultVolume> => {
const fromTimestamp = timestamp - 60 * 60 * 24
const toTimestamp = timestamp
const fromBlock = (await getBlock(fromTimestamp, chain, {}));
const toBlock = (await getBlock(toTimestamp, chain, {}));
const logs: ILog[] = (await Promise.all(contract_address[chain].map((address: string) => sdk.getEventLogs({
target: address,
toBlock: toBlock,
fromBlock: fromBlock,
chain: chain,
topics: [topic0]
})))).flat();
const rawData: ISwap[] = logs.map((log: ILog) => {
return async (timestamp: number, _: ChainBlocks, { createBalances, getLogs, }: FetchOptions): Promise<FetchResultVolume> => {
const dailyVolume = createBalances()
const logs: ILog[] = await getLogs({ targets: contract_address[chain], topics: [topic0] })
logs.map((log: ILog) => {
const data = log.data.replace('0x', '');
const token0 = data.slice(0, 64);
const token1 = data.slice(64, 128);
const token0Amount = Number('0x' + data.slice(128, 192));
const token1Amount = Number('0x' + data.slice(192, 256));
const token0Address = `0x${token0.slice(24, 64)}`;
const token1Address = `0x${token1.slice(24, 64)}`;
return {
token0Address,
token1Address,
token0Amount,
token1Amount
}
})
const coins = [...new Set(rawData.map((e: ISwap) => `${chain}:${e.token0Address}`).concat(rawData.map((e: ISwap) => `${chain}:${e.token1Address}`)))];
const prices = await getPrices(coins, timestamp);
const volume: number[] = rawData.map((e: ISwap) => {
const token0Price = prices[`${chain}:${e.token0Address}`]?.price || 0;
const token1Price = prices[`${chain}:${e.token1Address}`]?.price || 0;
const token0Decimals = prices[`${chain}:${e.token0Address}`]?.decimals || 0;
const token1Decimals = prices[`${chain}:${e.token1Address}`]?.decimals || 0;
const token0Value = token0Price * (Number(e.token0Amount) / 10 ** token0Decimals);
const token1Value = token1Price * (Number(e.token1Amount) / 10 ** token1Decimals);
const untrackAmountUSD = token0Price !== 0 ? token0Value : token1Price !== 0 ? token1Value : 0;
return untrackAmountUSD;
dailyVolume.add(token0Address, token0Amount);
})
const dailyVolume = volume.reduce((a: number, b: number) => a + b, 0);
return {
dailyVolume: `${dailyVolume}`,
timestamp
timestamp, dailyVolume,
}
}
}
Expand Down
20 changes: 7 additions & 13 deletions dexs/sundaeswap/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import fetchURL from "../../utils/fetchURL"
import { DISABLED_ADAPTER_KEY, FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { ChainBlocks, DISABLED_ADAPTER_KEY, FetchOptions, FetchResultVolume, SimpleAdapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import { getUniqStartOfTodayTimestamp } from "../../helpers/getUniSubgraphVolume";
import disabledAdapter from "../../helpers/disabledAdapter";
import { getPrices } from "../../utils/prices";

const historicalVolumeEndpoint = "https://stats.sundaeswap.finance/api/defillama/v0/global-stats/2100"

Expand All @@ -12,20 +11,15 @@ interface IVolumeall {
day: string;
}

const fetch = async (timestamp: number): Promise<FetchResultVolume> => {
const dayTimestamp = getUniqStartOfTodayTimestamp(new Date(timestamp * 1000))
const fetch = async (timestamp: number, _: ChainBlocks, { createBalances, startOfDay }: FetchOptions): Promise<FetchResultVolume> => {
const dailyVolume = createBalances()
const historicalVolume: IVolumeall[] = (await fetchURL(historicalVolumeEndpoint)).response;

const dailyVolume = historicalVolume
.find(dayItem => getUniqStartOfTodayTimestamp(new Date(dayItem.day)) === dayTimestamp)?.volumeLovelace

const coinId = "coingecko:cardano";
const prices = await getPrices([coinId], timestamp)


dailyVolume.addGasToken(historicalVolume
.find(dayItem => getUniqStartOfTodayTimestamp(new Date(dayItem.day)) === startOfDay)?.volumeLovelace as any)
return {
dailyVolume: dailyVolume ? String(Number(dailyVolume) / 1e6 * prices[coinId].price) : "0",
timestamp: dayTimestamp,
dailyVolume,
timestamp: startOfDay,
};
};

Expand Down
26 changes: 7 additions & 19 deletions dexs/synfutures/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
// SynFutures v1 volume
import { SimpleAdapter } from "../../adapters/types";
import { ChainBlocks, FetchOptions, SimpleAdapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import { getUniqStartOfTodayTimestamp } from "../../helpers/getUniSubgraphVolume";
import { Chain } from '@defillama/sdk/build/general';
import { getPrices } from "../../utils/prices";
const { request, } = require("graphql-request");

const info: {[key: string]: any} = {
Expand All @@ -21,20 +19,14 @@ const info: {[key: string]: any} = {
},
}

interface DailyVolume {
timestamp: number;
quoteAddr: string;
volume: number;
}

export function dayIdFromTimestamp(timestamp: number): number {
return Math.floor(timestamp / 86400);
}

const fetch = (chain: Chain) => {
return async (timestamp: number) => {
const totdayTimestamp = getUniqStartOfTodayTimestamp(new Date(timestamp * 1000));
const endDayId = dayIdFromTimestamp(totdayTimestamp);
return async (timestamp: number , _: ChainBlocks, { createBalances, startOfDay }: FetchOptions) => {
const dailyVolume = createBalances()
const endDayId = dayIdFromTimestamp(startOfDay);

const graphQL = `{
quoteDataDailySnapshots(first: 1000, where: {dayId: ${endDayId}}) {
Expand All @@ -50,17 +42,13 @@ const fetch = (chain: Chain) => {

const data = await request(info[chain].subgraph, graphQL);

let sum = 0;
for (const dailyData of data.quoteDataDailySnapshots) {
const tokenId = chain+':'+dailyData.quote.id;
const prices = await getPrices([tokenId], totdayTimestamp);
sum += Number(dailyData.dayTradeVolume) / 10 ** 18 * prices[tokenId].price;
dailyVolume.add(dailyData.quote.id, Number(dailyData.dayTradeVolume));
}

return {
totalVolume: undefined,
dailyVolume: `${sum}`,
timestamp: totdayTimestamp,
dailyVolume,
timestamp: startOfDay,
};
}
};
Expand Down
21 changes: 6 additions & 15 deletions dexs/wingriders/index.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,17 @@
import BigNumber from "bignumber.js";
import { Adapter } from "../../adapters/types"
import { Adapter, ChainBlocks, FetchOptions } from "../../adapters/types"
import { CHAIN } from "../../helpers/chains";
import { getPrices } from "../../utils/prices";
import { httpPost } from "../../utils/fetchURL";

const volUrl = 'https://aggregator.mainnet.wingriders.com/volumeInAda';

async function fetchVolume(timestamp: number) {
async function fetchVolume(timestamp: number , _: ChainBlocks, { createBalances }: FetchOptions) {
const dailyVolume = createBalances()
const last24hVolInAda = await httpPost(volUrl, { "lastNHours": 24 });
const totalVolumeInAda = await httpPost(volUrl, {});
const coinId = "coingecko:cardano";
const prices = await getPrices([coinId], timestamp)

const adaPrice = prices[coinId].price;

const dailyVolume = (new BigNumber(last24hVolInAda).multipliedBy(adaPrice)).toString();
const totalVolume = (new BigNumber(totalVolumeInAda).multipliedBy(adaPrice)).toString();

// const totalVolumeInAda = await httpPost(volUrl, {});
dailyVolume.addGasToken(last24hVolInAda * 1e6);
return {
dailyVolume,
totalVolume,
timestamp: Date.now() / 1e3
timestamp
}
}

Expand Down
53 changes: 12 additions & 41 deletions fees/aerodrome/bribes.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import ADDRESSES from '../../helpers/coreAssets.json'
import * as sdk from "@defillama/sdk";
import { getPrices } from "../../utils/prices";
import { ethers } from "ethers";
import { CHAIN } from "../../helpers/chains";
import { FetchOptions } from '../../adapters/types';

const event_notify_reward = 'event NotifyReward(address indexed from,address indexed reward,uint256 indexed epoch,uint256 amount)';
const event_geuge_created = 'event GaugeCreated(address indexed poolFactory,address indexed votingRewardsFactory,address indexed gaugeFactory,address pool,address bribeVotingReward,address feeVotingReward,address gauge,address creator)'
Expand All @@ -13,12 +12,6 @@ const contract_interface = new ethers.Interface([
event_geuge_created
]);

type TPrice = {
[s: string]: {
price: number;
decimals: number
};
}
interface ILog {
data: string;
transactionHash: string;
Expand All @@ -37,44 +30,22 @@ const abis: any = {
"all": "function all(uint256 _limit, uint256 _offset, address _account) view returns ((address lp, string symbol, uint8 decimals, bool stable, uint256 total_supply, address token0, uint256 reserve0, uint256 claimable0, address token1, uint256 reserve1, uint256 claimable1, address gauge, uint256 gauge_total_supply, bool gauge_alive, address fee, address bribe, address factory, uint256 emissions, address emissions_token, uint256 account_balance, uint256 account_earned, uint256 account_staked, uint256 pool_fee, uint256 token0_fees, uint256 token1_fees)[])"
}

export const fees_bribes = async (fromBlock: number, toBlock: number, timestamp: number): Promise<number> => {
const ZERO_ADDRESS = ADDRESSES.null;
const bribeVotingReward: string[] = (await sdk.api2.abi.call({
export const fees_bribes = async ({ getLogs, api, createBalances }: FetchOptions)=> {
const dailyFees = createBalances()
const bribeVotingReward: string[] = (await api.call({
target: gurar,
params: [1000, 0, ADDRESSES.null],
abi: abis.all,
chain: CHAIN.BASE,
})).map((e: any) => {
return e.bribe;
}).filter((e: string) => e !== ZERO_ADDRESS);
}).filter((e: string) => e !== ADDRESSES.null);
const bribe_contracct = [...new Set(bribeVotingReward)];
const logs: ILog[] = (await Promise.all(bribe_contracct.map((address: string) => sdk.getEventLogs({
target: address,
toBlock: toBlock,
fromBlock: fromBlock,
chain: CHAIN.BASE,
topics: ['0x52977ea98a2220a03ee9ba5cb003ada08d394ea10155483c95dc2dc77a7eb24b']
})))).flat() as ILog[];

const logs_bribes = logs.map((e: ILog) => {
const value = contract_interface.parseLog(e)
return {
token: value!.args.reward,
amount: Number(value!.args.amount)
} as IBribes
const logs = await getLogs({
targets: bribe_contracct,
eventAbi: event_notify_reward,
})
logs.map((e: any) => {
dailyFees.add(e.reward, e.amount)
})
const coins = [...new Set(logs_bribes.map((e: IBribes) => `${CHAIN.BASE}:${e.token.toLowerCase()}`))]
const coins_split: string[][] = [];
for (let i = 0; i < coins.length; i += 100) {
coins_split.push(coins.slice(i, i + 100))
}
const prices_result: any = (await Promise.all(coins_split.map((a: string[]) => getPrices(a, timestamp)))).flat().flat().flat();
const prices: TPrice = Object.assign({}, {});
prices_result.map((a: any) => Object.assign(prices, a))
const fees_bribes_usd = logs_bribes.map((e: IBribes) => {
const price = prices[`${CHAIN.BASE}:${e.token.toLowerCase()}`]?.price || 0;
const decimals = prices[`${CHAIN.BASE}:${e.token.toLowerCase()}`]?.decimals || 0;
return (Number(e.amount) / 10 ** decimals) * price;
}).reduce((a: number, b: number) => a + b, 0);
return fees_bribes_usd;
return dailyFees;
}
Loading

0 comments on commit e2f27b0

Please sign in to comment.