From 92f34b7fe80665aaf99c602f70aaab337831e362 Mon Sep 17 00:00:00 2001 From: 0xgnek <0xgnek@gmail.com> Date: Tue, 7 Mar 2023 16:20:08 +0000 Subject: [PATCH 1/6] create y2k-finance fees adapter --- fees/y2k-finance.ts | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 fees/y2k-finance.ts diff --git a/fees/y2k-finance.ts b/fees/y2k-finance.ts new file mode 100644 index 0000000000..c9f0f03a3d --- /dev/null +++ b/fees/y2k-finance.ts @@ -0,0 +1,72 @@ +import { Adapter, FetchResultFees } from "../adapters/types"; +import { CHAIN } from "../helpers/chains"; +import { getTimestampAtStartOfDayUTC, getTimestampAtStartOfNextDayUTC } from "../utils/date"; +import * as sdk from "@defillama/sdk"; +import { getPrices } from "../utils/prices"; +import { getBlock } from "../helpers/getBlock"; +import { Chain } from "@defillama/sdk/build/general"; + +const topic0 = '0x4c48fdcd7e3cb84b81aa54aa5dd04105736ae1bc179d84611c6fa5a642e803f2'; + +type TAddress = { + [l: string | Chain]: string; +} +const address: TAddress = { + [CHAIN.ARBITRUM]: '0x225acf1d32f0928a96e49e6110aba1fdf777c85f', +} + +interface ITx { + data: string; + transactionHash: string; +} + + +const fetch = (chain: Chain) => { + return async (timestamp: number): Promise => { + const todaysTimestamp = getTimestampAtStartOfDayUTC(timestamp) + const yesterdaysTimestamp = getTimestampAtStartOfNextDayUTC(timestamp) + + const fromBlock = (await getBlock(todaysTimestamp, chain, {})); + const toBlock = (await getBlock(yesterdaysTimestamp, chain, {})); + const logs: ITx[] = (await sdk.api.util.getLogs({ + target: address[chain], + topic: '', + fromBlock: fromBlock, + toBlock: toBlock, + topics: [topic0], + keys: [], + chain: chain + })).output.map((e: any) => { return { data: e.data.replace('0x', ''), transactionHash: e.transactionHash } as ITx}); + + const rawLogsData: number[] = logs.map((tx: ITx) => { + const insrFinalTvl = Number('0x' + tx.data.slice(256, 320)) / 10 ** 18; // 4 + const riskFinalTvl = Number('0x' + tx.data.slice(128, 192)) / 10 ** 18; // 2 + const isDisaster = Number('0x' + tx.data.slice(320, 384)); // 5 + return isDisaster === 1 ? riskFinalTvl : insrFinalTvl + }); + const dailyFees = rawLogsData.reduce((a: number, b: number) => a+b,0) + const ethAddress = "ethereum:0x0000000000000000000000000000000000000000"; + const ethPrice = (await getPrices([ethAddress], timestamp))[ethAddress].price; + const dailyFeesUSD = (dailyFees * ethPrice) * 0.05; + return { + dailyFees: dailyFeesUSD.toString(), + dailyRevenue: dailyFeesUSD.toString(), + timestamp + } + } +} + +const methodology = { + Fees: "5% of Hedge Vault deposits, 5% of Risk Vault deposits upon a depeg event", + Revenue: "5% of Hedge Vault deposits, 5% of Risk Vault deposits upon a depeg event", +} +const adapter: Adapter = { + adapter: { + [CHAIN.ARBITRUM]: { + fetch: fetch(CHAIN.ARBITRUM), + start: async () => 1675382400, + }, + } +} + +export default adapter; From ee5bc6923df22e7030d42f551f6334b3ea434cca Mon Sep 17 00:00:00 2001 From: 0xgnek <0xgnek@gmail.com> Date: Wed, 7 Jun 2023 12:34:23 +0000 Subject: [PATCH 2/6] add get volult --- fees/y2k-finance.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/fees/y2k-finance.ts b/fees/y2k-finance.ts index c9f0f03a3d..cdbc253064 100644 --- a/fees/y2k-finance.ts +++ b/fees/y2k-finance.ts @@ -15,6 +15,43 @@ const address: TAddress = { [CHAIN.ARBITRUM]: '0x225acf1d32f0928a96e49e6110aba1fdf777c85f', } +const vault_factory = '0x984e0eb8fb687afa53fc8b33e12e04967560e092'; + +const abis: any = { + getVaults: { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getVaults", + "outputs": [ + { + "internalType": "address[]", + "name": "vaults", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + marketIndex: { + "inputs": [], + "name": "marketIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +} + interface ITx { data: string; transactionHash: string; @@ -38,6 +75,25 @@ const fetch = (chain: Chain) => { chain: chain })).output.map((e: any) => { return { data: e.data.replace('0x', ''), transactionHash: e.transactionHash } as ITx}); + const poolLength = (await sdk.api.abi.call({ + target: vault_factory, + chain: chain, + abi: abis.marketIndex, + })).output; + + const vaultRes = (await sdk.api.abi.multiCall({ + abi: abis.getVaults, + calls: Array.from(Array(Number(poolLength)).keys()).map((i) => ({ + target: vault_factory, + params: i, + })), + chain: chain + })) + + const vaults_address = vaultRes.output + .map(({ output }) => output).flat().map((e: string) => e.toLowerCase()); + + const rawLogsData: number[] = logs.map((tx: ITx) => { const insrFinalTvl = Number('0x' + tx.data.slice(256, 320)) / 10 ** 18; // 4 const riskFinalTvl = Number('0x' + tx.data.slice(128, 192)) / 10 ** 18; // 2 From b0d49cb68ba52a0043f04517f5e5154fc60bd96c Mon Sep 17 00:00:00 2001 From: 0xgnek <0xgnek@gmail.com> Date: Wed, 7 Jun 2023 13:18:04 +0000 Subject: [PATCH 3/6] include withdraw fees --- fees/y2k-finance.ts | 49 ++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/fees/y2k-finance.ts b/fees/y2k-finance.ts index cdbc253064..5515fd3dc8 100644 --- a/fees/y2k-finance.ts +++ b/fees/y2k-finance.ts @@ -1,10 +1,10 @@ import { Adapter, FetchResultFees } from "../adapters/types"; import { CHAIN } from "../helpers/chains"; -import { getTimestampAtStartOfDayUTC, getTimestampAtStartOfNextDayUTC } from "../utils/date"; import * as sdk from "@defillama/sdk"; import { getPrices } from "../utils/prices"; import { getBlock } from "../helpers/getBlock"; import { Chain } from "@defillama/sdk/build/general"; +import { queryFlipside } from "../helpers/flipsidecrypto"; const topic0 = '0x4c48fdcd7e3cb84b81aa54aa5dd04105736ae1bc179d84611c6fa5a642e803f2'; @@ -60,16 +60,15 @@ interface ITx { const fetch = (chain: Chain) => { return async (timestamp: number): Promise => { - const todaysTimestamp = getTimestampAtStartOfDayUTC(timestamp) - const yesterdaysTimestamp = getTimestampAtStartOfNextDayUTC(timestamp) - - const fromBlock = (await getBlock(todaysTimestamp, chain, {})); - const toBlock = (await getBlock(yesterdaysTimestamp, chain, {})); + const fromTimestamp = timestamp - 60 * 60 * 24 + const toTimestamp = timestamp + const startblock = (await getBlock(fromTimestamp, chain, {})); + const endblock = (await getBlock(toTimestamp, chain, {})); const logs: ITx[] = (await sdk.api.util.getLogs({ target: address[chain], topic: '', - fromBlock: fromBlock, - toBlock: toBlock, + fromBlock: startblock, + toBlock: endblock, topics: [topic0], keys: [], chain: chain @@ -94,28 +93,46 @@ const fetch = (chain: Chain) => { .map(({ output }) => output).flat().map((e: string) => e.toLowerCase()); + const query = ` + SELECT tx_hash from arbitrum.core.fact_event_logs + WHERE topics[0] = '0xbbbdee62287b5bf3bee13cab60a29ad729cf38109bccbd2a986a11c99b8ca704' + and contract_address in (${vaults_address.map(a => `'${a.toLowerCase()}'`).join(',')}) + and BLOCK_NUMBER > ${startblock} AND BLOCK_NUMBER < ${endblock} + ` + + const value: string[] = (await queryFlipside(query)).flat(); + const query_tx_ether = ` + SELECT data from arbitrum.core.fact_event_logs + WHERE topics[0] = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' + and topics[2] = '0x0000000000000000000000005c84cf4d91dc0acde638363ec804792bb2108258' + and contract_address = '0x82af49447d8a07e3bd95bd0d56f35241523fbab1' + and tx_hash in (${value.map(a => `'${a.toLowerCase()}'`).join(',')}) + and BLOCK_NUMBER > ${startblock} AND BLOCK_NUMBER < ${endblock} + ` + const ether_tx_value: string[] = (await queryFlipside(query_tx_ether)).flat(); + const withdrawFeesAmount: number = ether_tx_value.map((e: string) => Number(e) / 1e18).reduce((a: number, b: number) => a + b, 0) + + const rawLogsData: number[] = logs.map((tx: ITx) => { const insrFinalTvl = Number('0x' + tx.data.slice(256, 320)) / 10 ** 18; // 4 const riskFinalTvl = Number('0x' + tx.data.slice(128, 192)) / 10 ** 18; // 2 const isDisaster = Number('0x' + tx.data.slice(320, 384)); // 5 return isDisaster === 1 ? riskFinalTvl : insrFinalTvl }); - const dailyFees = rawLogsData.reduce((a: number, b: number) => a+b,0) + const dailyFee = rawLogsData.reduce((a: number, b: number) => a+b,0) const ethAddress = "ethereum:0x0000000000000000000000000000000000000000"; const ethPrice = (await getPrices([ethAddress], timestamp))[ethAddress].price; - const dailyFeesUSD = (dailyFees * ethPrice) * 0.05; + const withdrawFeesAmountUSD = withdrawFeesAmount * ethPrice; + const dailyFeesUSD = (dailyFee * ethPrice) * 0.05; + const dailyFees = dailyFeesUSD+withdrawFeesAmountUSD; return { - dailyFees: dailyFeesUSD.toString(), - dailyRevenue: dailyFeesUSD.toString(), + dailyFees: dailyFees.toString(), + dailyRevenue: dailyFees.toString(), timestamp } } } -const methodology = { - Fees: "5% of Hedge Vault deposits, 5% of Risk Vault deposits upon a depeg event", - Revenue: "5% of Hedge Vault deposits, 5% of Risk Vault deposits upon a depeg event", -} const adapter: Adapter = { adapter: { [CHAIN.ARBITRUM]: { From d1b01bcec9b65951af382f1a0145707995bd5ae9 Mon Sep 17 00:00:00 2001 From: 0xgnek <0xgnek@gmail.com> Date: Wed, 7 Jun 2023 13:34:48 +0000 Subject: [PATCH 4/6] typo --- fees/y2k-finance.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fees/y2k-finance.ts b/fees/y2k-finance.ts index 5515fd3dc8..dd77ddb977 100644 --- a/fees/y2k-finance.ts +++ b/fees/y2k-finance.ts @@ -133,11 +133,19 @@ const fetch = (chain: Chain) => { } } +const methodology = { + Fees: "5% of Hedge Vault deposits, 5% of Risk Vault deposits upon a depeg event and withdraw fees" , + Revenue: "5% of Hedge Vault deposits, 5% of Risk Vault deposits upon a depeg event and withdraw fees", +} + const adapter: Adapter = { adapter: { [CHAIN.ARBITRUM]: { fetch: fetch(CHAIN.ARBITRUM), start: async () => 1675382400, + meta: { + methodology + } }, } } From 3d0fa5389df2bdcbcb4986a970251f0ffd42f21d Mon Sep 17 00:00:00 2001 From: 0xgnek <0xgnek@gmail.com> Date: Fri, 30 Jun 2023 10:36:49 +0000 Subject: [PATCH 5/6] fix type --- fees/y2k-finance.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fees/y2k-finance.ts b/fees/y2k-finance.ts index dd77ddb977..3b7803183b 100644 --- a/fees/y2k-finance.ts +++ b/fees/y2k-finance.ts @@ -82,7 +82,7 @@ const fetch = (chain: Chain) => { const vaultRes = (await sdk.api.abi.multiCall({ abi: abis.getVaults, - calls: Array.from(Array(Number(poolLength)).keys()).map((i) => ({ + calls: Array.from(Array(Number(poolLength)).keys()).map((i: any) => ({ target: vault_factory, params: i, })), @@ -90,13 +90,13 @@ const fetch = (chain: Chain) => { })) const vaults_address = vaultRes.output - .map(({ output }) => output).flat().map((e: string) => e.toLowerCase()); + .map(({ output }: any) => output).flat().map((e: string) => e.toLowerCase()); const query = ` SELECT tx_hash from arbitrum.core.fact_event_logs WHERE topics[0] = '0xbbbdee62287b5bf3bee13cab60a29ad729cf38109bccbd2a986a11c99b8ca704' - and contract_address in (${vaults_address.map(a => `'${a.toLowerCase()}'`).join(',')}) + and contract_address in (${vaults_address.map((a: string) => `'${a.toLowerCase()}'`).join(',')}) and BLOCK_NUMBER > ${startblock} AND BLOCK_NUMBER < ${endblock} ` From 2ef8363d0c332a10c7cc693f02e1daf6f929c48f Mon Sep 17 00:00:00 2001 From: 0xgnek <0xgnek@gmail.com> Date: Fri, 30 Jun 2023 11:02:11 +0000 Subject: [PATCH 6/6] add v2 --- fees/y2k-finance-v2.ts | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 fees/y2k-finance-v2.ts diff --git a/fees/y2k-finance-v2.ts b/fees/y2k-finance-v2.ts new file mode 100644 index 0000000000..c40bd07d97 --- /dev/null +++ b/fees/y2k-finance-v2.ts @@ -0,0 +1,68 @@ +import { Adapter, FetchResultFees } from "../adapters/types" +import { CHAIN } from "../helpers/chains"; +import * as sdk from "@defillama/sdk"; +import { getBlock } from "../helpers/getBlock"; +import { queryFlipside } from "../helpers/flipsidecrypto"; +import { getPrices } from "../utils/prices"; + + +const controller_address = '0xC0655f3dace795cc48ea1E2e7BC012c1eec912dC'; +const topic0 = '0x4b66c73cef2a561fd3c21c2af17630b43dddcff66e6803219be3989857b29e80'; + + +interface ITx { + data: string; + transactionHash: string; +} + +const fetch = async (timestamp: number): Promise => { + const fromTimestamp = timestamp - 60 * 60 * 24 + const toTimestamp = timestamp + + const fromBlock = (await getBlock(fromTimestamp, CHAIN.ARBITRUM, {})); + const toBlock = (await getBlock(toTimestamp, CHAIN.ARBITRUM, {})); + + const logs: ITx[] = (await sdk.api.util.getLogs({ + target: controller_address, + topic: '', + fromBlock: fromBlock, + toBlock: toBlock, + topics: [topic0], + keys: [], + chain: CHAIN.ARBITRUM + })).output as ITx[]; + const transactionHash = [...new Set(logs.map((e:ITx) => e.transactionHash.toLowerCase()))] + + const query_tx_ether = ` + SELECT contract_address, raw_amount from arbitrum.core.fact_token_transfers + WHERE contract_address in ('0x912ce59144191c1204e64559fe8253a0e49e6548', '0x82af49447d8a07e3bd95bd0d56f35241523fbab1') + and to_address = '0x5c84cf4d91dc0acde638363ec804792bb2108258' + and tx_hash in (${transactionHash.map((a: string) => `'${a.toLowerCase()}'`).join(',')}) + and BLOCK_NUMBER > ${fromBlock} AND BLOCK_NUMBER < ${toBlock} + ` + const ether_tx_value: any[] = (await queryFlipside(query_tx_ether)); + const coins = [...new Set(ether_tx_value.map((e: any[]) => `${CHAIN.ARBITRUM}:${e[0]}`))]; + const prices = await getPrices(coins, timestamp); + const dailyFees = ether_tx_value.map((e: any[]) => { + const price = prices[`${CHAIN.ARBITRUM}:${e[0]}`].price; + const decimals = prices[`${CHAIN.ARBITRUM}:${e[0]}`].decimals; + return (Number(e[1]) / 10 ** decimals) * price; + }).reduce((a: number, b:number) => a + b, 0) + return { + dailyFees: `${dailyFees}`, + dailyRevenue: `${dailyFees}`, + timestamp + } +} + + +const adapter: Adapter = { + adapter: { + [CHAIN.ARBITRUM]: { + fetch: fetch, + start: async () => 1685404800, + }, + } +} + +export default adapter;