diff --git a/dexs/justbet/constants.ts b/dexs/justbet/constants.ts new file mode 100644 index 0000000000..ed02ef4a35 --- /dev/null +++ b/dexs/justbet/constants.ts @@ -0,0 +1,22 @@ +export const WINR_VAULT_ADAPTER_CONTRACT = + "0xc942b79E51fe075c9D8d2c7501A596b4430b9Dd7"; + +export const JUSTBET_BANKROLL_INDEXES = [ + "0x0000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000E", + "0x0000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000019", + "0x0000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000017", +]; diff --git a/dexs/justbet/index.ts b/dexs/justbet/index.ts new file mode 100644 index 0000000000..cb262d59a6 --- /dev/null +++ b/dexs/justbet/index.ts @@ -0,0 +1,47 @@ +import { ethers } from 'ethers' + +import { CHAIN } from "../../helpers/chains"; +import { Adapter, } from "../../adapters/types"; +import { + JUSTBET_BANKROLL_INDEXES, + WINR_VAULT_ADAPTER_CONTRACT, +} from "./constants"; + +const abis = { + "returnEpochResultInActiveEpochByAddress": "function returnEpochResultInActiveEpochByAddress(address _bankrollIdentifierAddress) view returns ((uint256 totalPaidInNoRakeUSD, uint256 totalPaidInRakedUSD, uint256 totalPaidOutNoRakeUSD, uint256 totalPaidOutRakedUSD, uint256 totalPaidInAllTimeUSD, uint256 totalPaidOutAllTimeUSD, uint256 secondsLeftInEpoch) epochResult_)", + "returnBankrollTokenInfoByAddress": "function returnBankrollTokenInfoByAddress(address _bankrollIdentifierAddress) external view returns ((uint8 tokenType, address tokenAddress, string name, string symbol, uint8 decimals, uint256 totalAmount, uint256 priceInUSD, uint256 assetRatio, uint256 totalAmountInUsd) tokenInfo_)", + "getAllDataBatch": "function getAllDataBatch(address[] bankrollIndexes) view returns ((uint256 vaultIndex, address bankrollBytesIdentifier, address vaultAddress, address bankrollTokenAddress, address shareTokenAddress, address controllerAddress, address liquidityManagerAddress)[] vaultDetails_, (uint256 bankrollAmount, uint256 shareTokenAmount, uint256 epochAmount, uint256 totalAmount, uint256 totalAmountExcluding, uint64 bankrollTokenPrice, bool isProfitEpcoh, bool isProfitTotal, bool isProfitTotalExcluding)[] vaultAmounts_)" +} + + +export default { + adapter: { + [CHAIN.WINR]: { + fetch: (async ({ api, fromApi, }) => { + const volumeDetails = await api.multiCall({ abi: abis.returnEpochResultInActiveEpochByAddress, calls: JUSTBET_BANKROLL_INDEXES as any, target: WINR_VAULT_ADAPTER_CONTRACT, permitFailure: true }) + const volumeDetailsYesterday = await fromApi.multiCall({ abi: abis.returnEpochResultInActiveEpochByAddress, calls: JUSTBET_BANKROLL_INDEXES as any, target: WINR_VAULT_ADAPTER_CONTRACT, permitFailure: true }) + const vaultCurrentPrices = await api.multiCall({ abi: abis.returnBankrollTokenInfoByAddress, calls: JUSTBET_BANKROLL_INDEXES as any, target: WINR_VAULT_ADAPTER_CONTRACT, permitFailure: true }) + + let dailyVolume = 0 + let totalVolume = 0 + + volumeDetails.forEach((vault, i) => { + if (!vault || !volumeDetailsYesterday[i] || !vaultCurrentPrices[i]) return; + + const vaultDecimal = Number(vaultCurrentPrices[i].decimals) + const vaultCurrentPrice = Number(ethers.formatUnits(vaultCurrentPrices[i].priceInUSD, 8)) + const totalVolumeUSDToday = Number(ethers.formatUnits(vault.totalPaidOutAllTimeUSD, vaultDecimal)) * vaultCurrentPrice + const totalVolumeUSDYesterday = Number(ethers.formatUnits(volumeDetailsYesterday[i].totalPaidOutAllTimeUSD, vaultDecimal)) * vaultCurrentPrice + + dailyVolume += totalVolumeUSDToday - totalVolumeUSDYesterday + totalVolume += totalVolumeUSDToday + }) + + return { totalVolume, dailyVolume } + + }), + start: 1732060800, + }, + }, + version: 2, +} as Adapter; diff --git a/fees/justbet/constants.ts b/fees/justbet/constants.ts new file mode 100644 index 0000000000..23009defb3 --- /dev/null +++ b/fees/justbet/constants.ts @@ -0,0 +1,42 @@ +export const WINR_VAULT_ADAPTER_CONTRACT = + "0xc942b79E51fe075c9D8d2c7501A596b4430b9Dd7"; + +export const JUSTBET_BANKROLL_INDEXES = [ + "0x0000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000019", +]; + +export const TOKEN_DETAILS = { + "0xd77b108d4f6cefaa0cae9506a934e825becca46e": { + coingeckoId: "winr-protocol", + decimals: 18, + }, // WINR on arbitrum + "0xbf6fa9d2bf9f681e7b6521b49cf8eccf9ad8d31d": { + coingeckoId: "winr-protocol", + decimals: 18, + }, // WWINR on winr chain + "0x59edbb343991d30f77dcdbad94003777e9b09ba9": { + coingeckoId: "usd-coin", + decimals: 6, + }, // USDC on winr chain + "0x0381132632e9e27a8f37f1bc56bd5a62d21a382b": { + coingeckoId: "tether", + decimals: 6, + }, // Tether on winr chain + "0xf2857668777135e22f8cd53c97abf8821b7f0bdf": { + coingeckoId: "arbitrum", + decimals: 18, + }, // Arbitrum on winr chain + "0xe60256921ae414d7b35d6e881e47931f45e027cf": { + coingeckoId: "ethereum", + decimals: 18, + }, // Ether on winr chain + "0x5b20dcab6b91f157a39036c6c0e6f16e56d74cdb": { + coingeckoId: "solana", + decimals: 18, + }, // Solana on winr chain +}; diff --git a/fees/justbet/index.ts b/fees/justbet/index.ts new file mode 100644 index 0000000000..19183999eb --- /dev/null +++ b/fees/justbet/index.ts @@ -0,0 +1,60 @@ +import { ChainApi } from "@defillama/sdk"; + +import { CHAIN } from "../../helpers/chains"; +import { Adapter, FetchOptions } from "../../adapters/types"; + +const abis = { + "getAllDataBatch": "function getAllDataBatch(address[] bankrollIndexes) view returns ((uint256 vaultIndex, address bankrollBytesIdentifier, address vaultAddress, address bankrollTokenAddress, address shareTokenAddress, address controllerAddress, address liquidityManagerAddress)[] vaultDetails, (uint256 bankrollAmount, uint256 shareTokenAmount, uint256 epochAmount, uint256 totalAmount, uint256 totalAmountExcluding, uint64 bankrollTokenPrice, bool isProfitEpcoh, bool isProfitTotal, bool isProfitTotalExcluding)[] vaultAmounts)", + "returnAllTimeProfitLossIncludingActiveEpoch": "function returnAllTimeProfitLossIncludingActiveEpoch() view returns (bool isProfit_, uint256 amountDelta_)", + "epochCounter": "uint256:epochCounter", + "currentEpochEnd": "uint256:currentEpochEnd", + "returnNetProfitOrLossInActiveEpoch": "function returnNetProfitOrLossInActiveEpoch() view returns (bool isProfit_, uint256 amountDelta_)" +} + + +import { + JUSTBET_BANKROLL_INDEXES, + WINR_VAULT_ADAPTER_CONTRACT, +} from "./constants"; + +const getVaultAddresses = async (api: ChainApi) => { + const { vaultDetails, } = await api.call({ + abi: abis.getAllDataBatch, + target: WINR_VAULT_ADAPTER_CONTRACT, + params: [JUSTBET_BANKROLL_INDEXES as any], + }); + + return {vaults: vaultDetails.map(i => i.vaultAddress), tokens: vaultDetails.map(i => i.bankrollTokenAddress) }; +}; + +export default { + adapter: { + [CHAIN.WINR]: { + fetch: (async ({ api, fromApi, createBalances, }: FetchOptions) => { + const { vaults, tokens } = await getVaultAddresses(api); + const yesterdayData = await fromApi.multiCall({ abi: abis.returnAllTimeProfitLossIncludingActiveEpoch, calls: vaults, permitFailure: true }); + const todayData = await api.multiCall({ abi: abis.returnAllTimeProfitLossIncludingActiveEpoch, calls: vaults, permitFailure: true }); + const dailyFees = createBalances() + const totalFees = createBalances() + tokens.forEach((token, i) => { + if (!todayData[i] || !yesterdayData[i]) return; + const vaultProfitToday = Number(todayData[i].amountDelta_) * (todayData[i].isProfit_ ? 1 : -1) + const vaultProfitYesterday = Number(yesterdayData[i].amountDelta_) * (yesterdayData[i].isProfit_ ? 1 : -1) + dailyFees.add(token, vaultProfitToday - vaultProfitYesterday) + totalFees.add(token, vaultProfitToday) + }) + + return { + dailyFees, + totalFees, + dailyRevenue: dailyFees.clone(60/100), + totalRevenue: totalFees.clone(60/100), + dailyHoldersRevenue: dailyFees.clone(20/100), + totalHoldersRevenue: totalFees.clone(20/100), + }; + }), + start: 1732060800, + }, + }, + version: 2, +} as Adapter; diff --git a/helpers/chains.ts b/helpers/chains.ts index c937beb141..467f3e2999 100644 --- a/helpers/chains.ts +++ b/helpers/chains.ts @@ -225,6 +225,7 @@ export enum CHAIN { SUPERPOSITION = "spn", SWELLCHAIN = "swellchain", ANCIENT8 = "ancient8", + WINR = "winr", SOPHON = "sophon", KARAK = "karak", } diff --git a/package-lock.json b/package-lock.json index 372819ac3b..507afea8b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -949,9 +949,9 @@ } }, "node_modules/@defillama/sdk": { - "version": "5.0.125", - "resolved": "https://registry.npmjs.org/@defillama/sdk/-/sdk-5.0.125.tgz", - "integrity": "sha512-QsQ1f/Ji17ShFCLPmzsCXwVdmQFiIFkcQv1aqGeijiOTODDEvbC+qx8ESE4ypG1UaXZt1S75pVEJjC6YjvQRnQ==", + "version": "5.0.129", + "resolved": "https://registry.npmjs.org/@defillama/sdk/-/sdk-5.0.129.tgz", + "integrity": "sha512-2t/Wx7T46Zr3loxFXWBzTbOoZjfAanU6dIK7vyOnRK7h6DbGXld9KH/AmjMntCxmvGut2eYpVxll+JP4GL4twQ==", "license": "ISC", "dependencies": { "@aws-sdk/client-s3": "^3.400.0",