Skip to content

Commit

Permalink
Add cacheInCloud option to FetchGetLogsOptions
Browse files Browse the repository at this point in the history
  • Loading branch information
g1nt0ki committed Feb 5, 2024
1 parent 403b2aa commit 3bae5a8
Show file tree
Hide file tree
Showing 12 changed files with 174 additions and 528 deletions.
1 change: 1 addition & 0 deletions adapters/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export type FetchGetLogsOptions = {
fromBlock?: number,
toBlock?: number,
flatten?: boolean,
cacheInCloud?: boolean,
topics?: string[],
}

Expand Down
4 changes: 2 additions & 2 deletions adapters/utils/runAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ export default async function runAdapter(volumeAdapter: BaseAdapter, cleanCurren
const fromChainBlocks = {}
const getFromBlock = async () => await getBlock(fromTimestamp, chain, fromChainBlocks)
const getToBlock = async () => await getBlock(toTimestamp, chain, chainBlocks)
const getLogs = async ({ target, targets, onlyArgs = true, fromBlock, toBlock, flatten = true, eventAbi, topics, topic, }: FetchGetLogsOptions) => {
const getLogs = async ({ target, targets, onlyArgs = true, fromBlock, toBlock, flatten = true, eventAbi, topics, topic, cacheInCloud = false, }: FetchGetLogsOptions) => {
fromBlock = fromBlock ?? await getFromBlock()
toBlock = toBlock ?? await getToBlock()

return getEventLogs({ fromBlock, toBlock, chain, target, targets, onlyArgs, flatten, eventAbi, topics, topic, })
return getEventLogs({ fromBlock, toBlock, chain, target, targets, onlyArgs, flatten, eventAbi, topics, topic, cacheInCloud, })
}

return {
Expand Down
91 changes: 22 additions & 69 deletions fees/reserve/index.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,20 @@
import { ethers } from "ethers";
import { Adapter } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";
import * as sdk from "@defillama/sdk";
import { getBlock } from "../../helpers/getBlock";
import { getPrices } from "../../utils/prices";
import request, { gql } from "graphql-request";
import request from "graphql-request";

const deployerAddresses = [
"0xFd6CC4F251eaE6d02f9F7B41D1e80464D3d2F377",
"0x5c46b718Cd79F2BBA6869A3BeC13401b9a4B69bB",
];

const rtokenCreationTopic0 =
"0x27a62b7d4a7ee7a705ae91fe5a3ad74f32fc3d14e82eb82c3730630601ce9ae6";
const rtokenCreationTopic =
"RTokenCreated(address,address,address,address,string)";

const rtokenCreationAbi =
"event RTokenCreated(address indexed main, address indexed rToken, address stRSR, address indexed owner, string version)";

const deployerInterface = new ethers.Interface([rtokenCreationAbi]);

const endpoints = {
[CHAIN.ETHEREUM]: "https://api.thegraph.com/subgraphs/name/lcamargof/reserve",
};

const graphQuery = gql`
const graphQuery = `
query ($rtokens: [String!], $currentTime: Int!) {
rtokens(where: { id_in: $rtokens }) {
dailySnapshots(
Expand All @@ -44,73 +33,37 @@ const graphQuery = gql`
}
`;

const getFees = () => {
return async (timestamp: number) => {
const currentBlock = await getBlock(timestamp, CHAIN.ETHEREUM, {});

const rsrPriceObj = await getPrices(
["ethereum:0x320623b8e4ff03373931769a31fc52a4e78b5d70"],
timestamp
); // RSR contract

const rsrPrice = Object.values(rsrPriceObj)[0].price;

// Get list of deployed RTokens
const rtokenCreationLogs = (
await Promise.all(
deployerAddresses.map((deployerAddress) =>
sdk.getEventLogs({
target: deployerAddress,
topic: rtokenCreationTopic,
topics: [rtokenCreationTopic0],
fromBlock: 16680995,
toBlock: currentBlock,
chain: "ethereum",
})
)
)
)
.flatMap((x: any) => x as any[])
.map((e: any) => deployerInterface.parseLog(e));

// Key RToken contracts
const rtokens = rtokenCreationLogs.map((i) => i!.args.rToken.toLowerCase());

const graphRes = (
await request(endpoints[CHAIN.ETHEREUM], graphQuery, {
currentTime: timestamp,
rtokens,
})
).rtokens;
const fetch: any = async (timestamp: number, _, { getLogs, createBalances }) => {
const RSR = '0x320623b8e4ff03373931769a31fc52a4e78b5d70'

let sumDailyFees = 0;
// Get list of deployed RTokens
const rtokenCreationLogs = await getLogs({ targets: deployerAddresses, fromBlock: 16680995, eventAbi: rtokenCreationAbi, })

// Use increase in RSR redemption rate & total staked to calculate fees
// Total Staked * RSR Price * (rate_today - rate_yesterday) = daily_fees
graphRes.forEach(({ dailySnapshots: snapshots }: any) => {
if (snapshots.length < 2) return;
const todayRate = snapshots[0].rsrExchangeRate;
const yesterdayRate = snapshots[1].rsrExchangeRate;
// Key RToken contracts
const rtokens = rtokenCreationLogs.map((i) => i.rToken.toLowerCase());

const rsrStaked = snapshots[0].rsrStaked / 1e18;
const graphRes = (
await request(endpoints[CHAIN.ETHEREUM], graphQuery, { currentTime: timestamp, rtokens, })
).rtokens;

const dailyFees = rsrStaked * rsrPrice * (todayRate - yesterdayRate);
const dailyFees = createBalances();
// Use increase in RSR redemption rate & total staked to calculate fees
// Total Staked * RSR Price * (rate_today - rate_yesterday) = daily_fees
graphRes.forEach(({ dailySnapshots: snapshots }: any) => {
if (snapshots.length < 2) return;
const todayRate = snapshots[0].rsrExchangeRate;
const yesterdayRate = snapshots[1].rsrExchangeRate;

sumDailyFees += dailyFees;
});
dailyFees.add(RSR, snapshots[0].rsrStaked * (todayRate - yesterdayRate));
});

return {
timestamp,
dailyFees: sumDailyFees.toString(),
dailyRevenue: sumDailyFees.toString(),
};
};
return { timestamp, dailyFees, dailyRevenue: dailyFees, };
};

const adapter: Adapter = {
adapter: {
[CHAIN.ETHEREUM]: {
fetch: getFees(),
fetch,
start: 1681850303,
},
},
Expand Down
65 changes: 12 additions & 53 deletions fees/shoebillFinance-v2/helpers.ts
Original file line number Diff line number Diff line change
@@ -1,59 +1,18 @@
import { ETHER_ADDRESS } from "@defillama/sdk/build/general";
import { CHAIN } from "../../helpers/chains";
import { comptrollerABI, CTokenABI } from "./_abi";
import * as sdk from "@defillama/sdk";

const getAllMarkets = async (
unitroller: string,
chain: CHAIN
): Promise<string[]> => {
return (
await sdk.api2.abi.call({
target: unitroller,
abi: comptrollerABI.getAllMarkets,
chain: chain,
})
);
};
const getAllMarketsMulti = async (
unitrollers: string[],
chain: CHAIN
): Promise<string[]> => {
const getAllMarkets = async (unitroller: string, api: sdk.ChainApi,): Promise<string[]> => {
return (api.call({ target: unitroller, abi: comptrollerABI.getAllMarkets, }));
}

return (
await sdk.api2.abi.multiCall({
calls: unitrollers.map((unitroller: string) => ({target:unitroller})),
abi: comptrollerABI.getAllMarkets,
chain: chain,
})
).flat();
};
const getAllMarketsMulti = async (unitrollers: string[], api: sdk.ChainApi,): Promise<string[]> => {
return (await api.multiCall({ calls: unitrollers, abi: comptrollerABI.getAllMarkets, })).flat();
}

const getMarketDetails = async (markets: string[], chain: CHAIN) => {
const getMarketDetails = async (markets: string[], api: sdk.ChainApi,) => {
const underlyings = await api.multiCall({ calls: markets, abi: CTokenABI.underlying, permitFailure: true, });
const reserveFactors = await api.multiCall({ calls: markets, abi: CTokenABI.reserveFactorMantissa, });
return { underlyings, reserveFactors, };
}

const underlyings = await sdk.api2.abi.multiCall({
calls: markets.map((market: string) => ({
target: market,
})),
abi: CTokenABI.underlying,
chain: chain,
permitFailure: true,
});

const reserveFactors = await sdk.api2.abi.multiCall({
calls: markets.map((market: string) => ({
target: market,
})),
abi: CTokenABI.reserveFactorMantissa,
chain: chain,
});

return {
underlyings: underlyings,
reserveFactors: reserveFactors,
};
};



export { getAllMarkets, getMarketDetails,getAllMarketsMulti };
export { getAllMarkets, getMarketDetails, getAllMarketsMulti };
Loading

0 comments on commit 3bae5a8

Please sign in to comment.