@steerprotocol/sdk 1.29.2 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"SubgraphVaultClient.js","sourceRoot":"","sources":["../../../src/utils/SubgraphVaultClient.ts"],"names":[],"mappings":";;;AAEA,oCAAmD;AACnD,0CAA0C;AAS1C;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,YAAoB,IAAI,EAAE,SAAkB,EAAE,EAAE;IACvE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;sBACW,SAAS,8BAA8B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+BhE,CAAC;IACL,CAAC;IAED,OAAO;oBACW,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+BzB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAClC,YAAoB,IAAI,EACxB,SAAkB,EAClB,WAAsB,EACtB,EAAE;IACF,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,4CAA4C;IAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,gBAAgB,GAAG,mBAAmB,eAAe,GAAG,CAAC;IAE/D,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;sBACW,SAAS,8BAA8B,SAAS,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+BtF,CAAC;IACL,CAAC;IAED,OAAO;oBACW,SAAS,cAAc,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+BvD,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAa,mBAAmB;IAAhC;QACmB,mBAAc,GAC7B,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IAuO7E,CAAC;IArOC;;OAEG;IACK,iCAAiC,CACvC,KAAqC,EACrC,OAAe,EACf,MAA2B;QAE3B,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,OAAO;YACP,YAAY,EAAE,KAAK,CAAC,EAAE;YACtB,QAAQ,EAAE,IAAA,+BAAuB,EAAC,KAAK,CAAC,UAAU,CAAC,IAAI,gBAAQ,CAAC,OAAO;YACvE,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC;YAC5D,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;YACtB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1D,UAAU,EAAE,SAAS,EAAE,4BAA4B;YACnD,QAAQ,EAAE,SAAS,EAAE,4BAA4B;YACjD,IAAI,EAAE;gBACJ,EAAE,EAAE,KAAK,CAAC,IAAI;gBACd,WAAW,EAAE,KAAK,CAAC,IAAI;gBACvB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,SAAS;gBACpB,mBAAmB,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE;aACzE;YACD,MAAM,EAAE;gBACN,EAAE,EAAE,KAAK,CAAC,MAAM;gBAChB,MAAM,EAAE,KAAK,CAAC,YAAY;gBAC1B,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,mDAAmD;gBAC7E,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,KAAK,CAAC,MAAM;gBACrB,OAAO;aACR;YACD,MAAM,EAAE;gBACN,EAAE,EAAE,KAAK,CAAC,MAAM;gBAChB,MAAM,EAAE,KAAK,CAAC,YAAY;gBAC1B,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,mDAAmD;gBAC7E,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,KAAK,CAAC,MAAM;gBACrB,OAAO;aACR;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,UAAkB;QAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,QAAQ,GAAG,IAAA,+BAAuB,EAAC,UAAU,CAAC,CAAC;QACrD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,KAAK,gBAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzE,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,WAAW,CAAC,CAAC,UAAU;IAChC,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,KAA2B;QACvD,OAAO;YACL,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,EAAa;gBAC5B,MAAM,EAAE,KAAK,CAAC,MAAiB;gBAC/B,MAAM,EAAE,KAAK,CAAC,MAAiB;gBAC/B,QAAQ,EAAE;oBACR,MAAM,EAAE,KAAK,CAAC,aAAa;oBAC3B,MAAM,EAAE,KAAK,CAAC,aAAa;oBAC3B,WAAW,EAAE,KAAK,CAAC,mBAAmB;oBACtC,eAAe,EAAE,KAAK,CAAC,aAAa;oBACpC,eAAe,EAAE,KAAK,CAAC,aAAa;oBACpC,oBAAoB,EAAE,KAAK,CAAC,mBAAmB;iBAChD;gBACD,GAAG,EAAE;oBACH,OAAO,EAAE,CAAC;oBACV,UAAU,EAAE,CAAC;oBACb,WAAW,EAAE,CAAC;oBACd,WAAW,EAAE,CAAC;oBACd,WAAW,EAAE,CAAC;oBACd,WAAW,EAAE,CAAC;iBACf;gBACD,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,cAAc,EAAE,KAAK,CAAC,cAAc;aACrC;YACD,MAAM,EAAE;gBACN,WAAW,EAAE,EAAE;gBACf,WAAW,EAAE,EAAE;aAChB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,wBAAwB,CACnC,OAA0B;QAE1B,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,KAAK,EAAE,WAAW,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAE5F,MAAM,SAAS,GAAqC,EAAE,CAAC;QAEvD,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,mBAAmB,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc;wBACvD,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE;wBACpC,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,CAAC,mBAAmB;wBACzB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;wBACpB,CAAC,CAAC,2BAA2B,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC;oBAC1D,SAAS,EAAE,EAAE;iBACd,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,eAAe,GACnB,MAAM,mBAAmB,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,aAAa,GAAG,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;YAElE,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,OAAO,WAAW,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;oBACxC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc;4BACvD,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE;4BACpC,CAAC,CAAC,EAAE,CAAC;qBACR;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,CAAC,mBAAmB;4BACzB,CAAC,CAAC,eAAe,CAAC,SAAS,EAAE,aAAa,CAAC;4BAC3C,CAAC,CAAC,2BAA2B,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC;wBACtE,SAAS,EAAE,EAAE;qBACd,CAAC;iBACH,CAAC,CAAC;gBAEH,MAAM,YAAY,GAA2C,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnF,MAAM,MAAM,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;gBAEhD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnB,WAAW,GAAG,KAAK,CAAC;gBACtB,CAAC;gBAED,0CAA0C;gBAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAC7B,CAAC,KAA2B,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CACzF,CAAC;gBAEF,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;oBACtB,WAAW,GAAG,KAAK,CAAC;gBACtB,CAAC;gBAED,6CAA6C;gBAC7C,+DAA+D;gBAC/D,MAAM,gBAAgB,GAAqC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACnF,GAAG,KAAK;oBACR,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;iBAC/C,CAAC,CAAC,CAAC;gBAEJ,SAAS,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;gBACpC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YACtD,CAAC;YAED,qCAAqC;YACrC,mEAAmE;YACnE,gCAAgC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACI,2BAA2B,CAChC,MAAwC,EACxC,OAAe,EACf,QAAgB,EAAE,EAClB,MAA2B,EAC3B,KAAqB;QAErB,8CAA8C;QAC9C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAE1F,mBAAmB;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;YACzE,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,UAAU,GAAG,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC;QAC7D,MAAM,SAAS,GACb,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAErF,MAAM,KAAK,GAAgB,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzD,MAAM,EAAE,KAAK,CAAC,EAAE;YAChB,IAAI,EAAE,IAAI,CAAC,iCAAiC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;SACrE,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,KAAK;YACL,QAAQ,EAAE;gBACR,WAAW;gBACX,SAAS;aACV;YACD,UAAU,EAAE,YAAY,CAAC,MAAM;SAChC,CAAC;IACJ,CAAC;CACF;AAzOD,kDAyOC","sourcesContent":["import { Address } from 'viem';\nimport { VaultEdge, VaultNode, VaultsConnection } from '../base/VaultClient';\nimport { getProtocolTypeByBeacon } from '../const';\nimport { Protocol } from '../const/chain';\nimport {\n LpPriceResponse,\n SubgraphResponse,\n SubgraphVaultDetails,\n SubgraphVaultDetailsWithLpData,\n VaultFetchOptions,\n} from './subgraph-types';\n\n/**\n * GraphQL queries for fetching vault data from Steer subgraphs\n */\nconst FIND_ALL_VAULTS = (batchSize: number = 1000, timestamp?: string) => {\n if (timestamp) {\n return `query {\n vaults(first: ${batchSize}, where: { createdAt_lte: \"${timestamp}\" }, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n }\n\n return `query {\n vaults(first: ${batchSize}, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n};\n\nconst FIND_ALL_VAULTS_BY_PROTOCOL = (\n batchSize: number = 1000,\n timestamp?: string,\n beaconNames?: string[]\n) => {\n if (!beaconNames || beaconNames.length === 0) {\n throw new Error('At least one beacon name is required');\n }\n\n // Format beaconNames for GraphQL _in filter\n const beaconNamesList = beaconNames.map((b) => `\"${b}\"`).join(', ');\n const beaconNameFilter = `beaconName_in: [${beaconNamesList}]`;\n\n if (timestamp) {\n return `query {\n vaults(first: ${batchSize}, where: { createdAt_lte: \"${timestamp}\", ${beaconNameFilter} }, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n }\n\n return `query {\n vaults(first: ${batchSize}, where: { ${beaconNameFilter} }, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n};\n\n/**\n * Utility class for fetching vault data from Steer subgraphs\n */\nexport class SubgraphVaultClient {\n private readonly SENTIO_API_KEY =\n typeof process !== 'undefined' ? process.env?.SENTIO_API_KEY : undefined;\n\n /**\n * Transform subgraph vault data to match VaultClient interface\n */\n private transformSubgraphVaultToVaultNode(\n vault: SubgraphVaultDetailsWithLpData,\n chainId: number,\n aprMap: Map<string, number>\n ): VaultNode {\n // Get the chain enum from chainId\n const feeApr = aprMap.get(vault.id) ? aprMap.get(vault.id) : undefined;\n return {\n id: vault.id,\n chainId,\n vaultAddress: vault.id,\n protocol: getProtocolTypeByBeacon(vault.beaconName) || Protocol.Uniswap,\n beaconName: vault.beaconName,\n protocolBaseType: this.getProtocolBaseType(vault.beaconName),\n name: vault.name || '',\n feeApr: feeApr ? parseFloat(feeApr.toString()) : undefined,\n stakingApr: undefined, // Not available in subgraph\n merklApr: undefined, // Not available in subgraph\n pool: {\n id: vault.pool,\n poolAddress: vault.pool,\n feeTier: vault.feeTier,\n tick: undefined,\n liquidity: undefined,\n volumeUSD: undefined,\n totalValueLockedUSD: vault.lpPriceData?.vault.usd.totalValue?.toString(),\n },\n token0: {\n id: vault.token0,\n symbol: vault.token0Symbol,\n name: vault.token0Symbol, // Using symbol as name since name is not available\n decimals: parseInt(vault.token0Decimals),\n address: vault.token0,\n chainId,\n },\n token1: {\n id: vault.token1,\n symbol: vault.token1Symbol,\n name: vault.token1Symbol, // Using symbol as name since name is not available\n decimals: parseInt(vault.token1Decimals),\n address: vault.token1,\n chainId,\n },\n };\n }\n\n /**\n * Get protocol base type from beacon name\n */\n private getProtocolBaseType(beaconName: string): string {\n if (beaconName.includes('uniswap')) {\n return 'UniswapV3';\n }\n const protocol = getProtocolTypeByBeacon(beaconName);\n if (protocol) {\n return protocol === Protocol.Blackhole ? 'Algebra Integral' : protocol;\n }\n if (beaconName.includes('Stryke')) {\n return 'Stryke';\n }\n return 'UniswapV3'; // Default\n }\n\n /**\n * Create a mock LP price response for vaults without LP data\n */\n private createMockLpPriceData(vault: SubgraphVaultDetails): LpPriceResponse {\n return {\n vault: {\n address: vault.id as Address,\n token0: vault.token0 as Address,\n token1: vault.token1 as Address,\n balances: {\n token0: vault.token0Balance,\n token1: vault.token1Balance,\n totalSupply: vault.totalLPTokensIssued,\n token0Formatted: vault.token0Balance,\n token1Formatted: vault.token1Balance,\n totalSupplyFormatted: vault.totalLPTokensIssued,\n },\n usd: {\n lpValue: 0,\n totalValue: 0,\n token0Price: 0,\n token0Value: 0,\n token1Price: 0,\n token1Value: 0,\n },\n token0Symbol: vault.token0Symbol,\n token1Symbol: vault.token1Symbol,\n token0Decimals: vault.token0Decimals,\n token1Decimals: vault.token1Decimals,\n },\n routes: {\n token0ToUsd: [],\n token1ToUsd: [],\n },\n };\n }\n\n /**\n * Fetch vault data from subgraph\n */\n public async getAllVaultsFromSubgraph(\n options: VaultFetchOptions\n ): Promise<SubgraphVaultDetailsWithLpData[]> {\n const { subgraphUrl, showCurrentProtocol = false, beaconNames, batchSize = 1000 } = options;\n\n const allVaults: SubgraphVaultDetailsWithLpData[] = [];\n\n try {\n // First get the latest vault to get the most recent timestamp\n const latestVaultResponse = await fetch(subgraphUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(subgraphUrl.includes('sentio') && this.SENTIO_API_KEY\n ? { 'api-key': this.SENTIO_API_KEY }\n : {}),\n },\n body: JSON.stringify({\n query: !showCurrentProtocol\n ? FIND_ALL_VAULTS(1)\n : FIND_ALL_VAULTS_BY_PROTOCOL(1, undefined, beaconNames),\n variables: {},\n }),\n });\n\n const latestVaultData: SubgraphResponse<SubgraphVaultDetails> =\n await latestVaultResponse.json();\n let lastTimestamp = latestVaultData?.data?.vaults?.[0]?.createdAt;\n\n let hasMoreData = true;\n while (hasMoreData) {\n const response = await fetch(subgraphUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(subgraphUrl.includes('sentio') && this.SENTIO_API_KEY\n ? { 'api-key': this.SENTIO_API_KEY }\n : {}),\n },\n body: JSON.stringify({\n query: !showCurrentProtocol\n ? FIND_ALL_VAULTS(batchSize, lastTimestamp)\n : FIND_ALL_VAULTS_BY_PROTOCOL(batchSize, lastTimestamp, beaconNames),\n variables: {},\n }),\n });\n\n const responseData: SubgraphResponse<SubgraphVaultDetails> = await response.json();\n const vaults = responseData?.data?.vaults || [];\n\n if (!vaults.length) {\n hasMoreData = false;\n }\n\n // Filter out duplicates based on vault ID\n const newVaults = vaults.filter(\n (vault: SubgraphVaultDetails) => !allVaults.some((existing) => existing.id === vault.id)\n );\n\n if (!newVaults.length) {\n hasMoreData = false;\n }\n\n // For now, attach mock LP data to each vault\n // In a real implementation, you would fetch LP price data here\n const vaultsWithLpData: SubgraphVaultDetailsWithLpData[] = newVaults.map((vault) => ({\n ...vault,\n lpPriceData: this.createMockLpPriceData(vault),\n }));\n\n allVaults.push(...vaultsWithLpData);\n lastTimestamp = vaults[vaults.length - 1].createdAt;\n }\n\n // Filter deprecated vaults if needed\n // Note: In a real implementation, you would fetch deprecation data\n // For now, we return all vaults\n return allVaults;\n } catch (error) {\n console.error('Error fetching vaults from subgraph:', error);\n throw error;\n }\n }\n\n /**\n * Transform subgraph vault data to VaultsConnection format\n */\n public transformToVaultsConnection(\n vaults: SubgraphVaultDetailsWithLpData[],\n chainId: number,\n first: number = 50,\n aprMap: Map<string, number>,\n after?: string | null\n ): VaultsConnection {\n // Sort vaults by creation time (newest first)\n const sortedVaults = vaults.sort((a, b) => parseInt(b.createdAt) - parseInt(a.createdAt));\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = sortedVaults.findIndex((vault) => vault.id === after);\n startIndex = afterIndex + 1;\n }\n\n const paginatedVaults = sortedVaults.slice(startIndex, startIndex + first);\n const hasNextPage = startIndex + first < sortedVaults.length;\n const endCursor =\n paginatedVaults.length > 0 ? paginatedVaults[paginatedVaults.length - 1].id : null;\n\n const edges: VaultEdge[] = paginatedVaults.map((vault) => ({\n cursor: vault.id,\n node: this.transformSubgraphVaultToVaultNode(vault, chainId, aprMap),\n }));\n\n return {\n edges,\n pageInfo: {\n hasNextPage,\n endCursor,\n },\n totalCount: sortedVaults.length,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"SubgraphVaultClient.js","sourceRoot":"","sources":["../../../src/utils/SubgraphVaultClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { Address } from 'viem';\nimport { VaultEdge, VaultNode, VaultsConnection } from '../base/VaultClient';\nimport { getProtocolTypeByBeacon } from '../const';\nimport { Protocol } from '../const/chain';\nimport {\n LpPriceResponse,\n SubgraphResponse,\n SubgraphVaultDetails,\n SubgraphVaultDetailsWithLpData,\n VaultFetchOptions,\n} from './subgraph-types';\n\n/**\n * GraphQL queries for fetching vault data from Steer subgraphs\n */\nconst FIND_ALL_VAULTS = (batchSize: number = 1000, timestamp?: string) => {\n if (timestamp) {\n return `query {\n vaults(first: ${batchSize}, where: { createdAt_lte: \"${timestamp}\" }, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n }\n\n return `query {\n vaults(first: ${batchSize}, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n};\n\nconst FIND_ALL_VAULTS_BY_PROTOCOL = (\n batchSize: number = 1000,\n timestamp?: string,\n beaconNames?: string[]\n) => {\n if (!beaconNames || beaconNames.length === 0) {\n throw new Error('At least one beacon name is required');\n }\n\n // Format beaconNames for GraphQL _in filter\n const beaconNamesList = beaconNames.map((b) => `\"${b}\"`).join(', ');\n const beaconNameFilter = `beaconName_in: [${beaconNamesList}]`;\n\n if (timestamp) {\n return `query {\n vaults(first: ${batchSize}, where: { createdAt_lte: \"${timestamp}\", ${beaconNameFilter} }, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n }\n\n return `query {\n vaults(first: ${batchSize}, where: { ${beaconNameFilter} }, orderBy: createdAt, orderDirection: desc) {\n id\n name\n token0\n token1\n pool\n weeklyFeeAPR\n token0Symbol\n token0Decimals\n token1Symbol\n token1Decimals\n totalValueLockedToken0\n totalValueLockedToken1\n token0Balance\n token1Balance\n totalLPTokensIssued\n createdAt\n feeTier\n strategyToken {\n id\n name\n creator {\n id\n }\n admin\n executionBundle\n }\n beaconName\n payloadIpfs\n deployer\n }\n }`;\n};\n\n/**\n * Utility class for fetching vault data from Steer subgraphs\n */\nexport class SubgraphVaultClient {\n private readonly SENTIO_API_KEY =\n typeof process !== 'undefined' ? process.env?.SENTIO_API_KEY : undefined;\n\n /**\n * Transform subgraph vault data to match VaultClient interface\n */\n private transformSubgraphVaultToVaultNode(\n vault: SubgraphVaultDetailsWithLpData,\n chainId: number,\n aprMap: Map<string, number>\n ): VaultNode {\n // Get the chain enum from chainId\n const feeApr = aprMap.get(vault.id) ? aprMap.get(vault.id) : undefined;\n return {\n id: vault.id,\n chainId,\n vaultAddress: vault.id,\n protocol: getProtocolTypeByBeacon(vault.beaconName) || Protocol.Uniswap,\n beaconName: vault.beaconName,\n protocolBaseType: this.getProtocolBaseType(vault.beaconName),\n name: vault.name || '',\n feeApr: feeApr ? parseFloat(feeApr.toString()) : undefined,\n stakingApr: undefined, // Not available in subgraph\n merklApr: undefined, // Not available in subgraph\n pool: {\n id: vault.pool,\n poolAddress: vault.pool,\n feeTier: vault.feeTier,\n tick: undefined,\n liquidity: undefined,\n volumeUSD: undefined,\n totalValueLockedUSD: vault.lpPriceData?.vault.usd.totalValue?.toString(),\n },\n token0: {\n id: vault.token0,\n symbol: vault.token0Symbol,\n name: vault.token0Symbol, // Using symbol as name since name is not available\n decimals: parseInt(vault.token0Decimals),\n address: vault.token0,\n chainId,\n },\n token1: {\n id: vault.token1,\n symbol: vault.token1Symbol,\n name: vault.token1Symbol, // Using symbol as name since name is not available\n decimals: parseInt(vault.token1Decimals),\n address: vault.token1,\n chainId,\n },\n };\n }\n\n /**\n * Get protocol base type from beacon name\n */\n private getProtocolBaseType(beaconName: string): string {\n if (beaconName.includes('uniswap')) {\n return 'UniswapV3';\n }\n const protocol = getProtocolTypeByBeacon(beaconName);\n if (protocol) {\n return protocol === Protocol.Blackhole ? 'Algebra Integral' : protocol;\n }\n if (beaconName.includes('Stryke')) {\n return 'Stryke';\n }\n return 'UniswapV3'; // Default\n }\n\n /**\n * Create a mock LP price response for vaults without LP data\n */\n private createMockLpPriceData(vault: SubgraphVaultDetails): LpPriceResponse {\n return {\n vault: {\n address: vault.id as Address,\n token0: vault.token0 as Address,\n token1: vault.token1 as Address,\n balances: {\n token0: vault.token0Balance,\n token1: vault.token1Balance,\n totalSupply: vault.totalLPTokensIssued,\n token0Formatted: vault.token0Balance,\n token1Formatted: vault.token1Balance,\n totalSupplyFormatted: vault.totalLPTokensIssued,\n },\n usd: {\n lpValue: 0,\n totalValue: 0,\n token0Price: 0,\n token0Value: 0,\n token1Price: 0,\n token1Value: 0,\n },\n token0Symbol: vault.token0Symbol,\n token1Symbol: vault.token1Symbol,\n token0Decimals: vault.token0Decimals,\n token1Decimals: vault.token1Decimals,\n },\n routes: {\n token0ToUsd: [],\n token1ToUsd: [],\n },\n };\n }\n\n /**\n * Fetch vault data from subgraph\n */\n public async getAllVaultsFromSubgraph(\n options: VaultFetchOptions\n ): Promise<SubgraphVaultDetailsWithLpData[]> {\n const { subgraphUrl, showCurrentProtocol = false, beaconNames, batchSize = 1000 } = options;\n\n const allVaults: SubgraphVaultDetailsWithLpData[] = [];\n\n try {\n // First get the latest vault to get the most recent timestamp\n const latestVaultResponse = await fetch(subgraphUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(subgraphUrl.includes('sentio') && this.SENTIO_API_KEY\n ? { 'api-key': this.SENTIO_API_KEY }\n : {}),\n },\n body: JSON.stringify({\n query: !showCurrentProtocol\n ? FIND_ALL_VAULTS(1)\n : FIND_ALL_VAULTS_BY_PROTOCOL(1, undefined, beaconNames),\n variables: {},\n }),\n });\n\n const latestVaultData: SubgraphResponse<SubgraphVaultDetails> =\n await latestVaultResponse.json();\n let lastTimestamp = latestVaultData?.data?.vaults?.[0]?.createdAt;\n\n if (!lastTimestamp) {\n return [];\n }\n\n let hasMoreData = true;\n while (hasMoreData) {\n const response = await fetch(subgraphUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(subgraphUrl.includes('sentio') && this.SENTIO_API_KEY\n ? { 'api-key': this.SENTIO_API_KEY }\n : {}),\n },\n body: JSON.stringify({\n query: !showCurrentProtocol\n ? FIND_ALL_VAULTS(batchSize, lastTimestamp)\n : FIND_ALL_VAULTS_BY_PROTOCOL(batchSize, lastTimestamp, beaconNames),\n variables: {},\n }),\n });\n\n const responseData: SubgraphResponse<SubgraphVaultDetails> = await response.json();\n const vaults = responseData?.data?.vaults || [];\n\n if (!vaults.length) {\n hasMoreData = false;\n continue;\n }\n\n // Filter out duplicates based on vault ID\n const newVaults = vaults.filter(\n (vault: SubgraphVaultDetails) => !allVaults.some((existing) => existing.id === vault.id)\n );\n\n if (!newVaults.length) {\n hasMoreData = false;\n continue;\n }\n\n // For now, attach mock LP data to each vault\n // In a real implementation, you would fetch LP price data here\n const vaultsWithLpData: SubgraphVaultDetailsWithLpData[] = newVaults.map((vault) => ({\n ...vault,\n lpPriceData: this.createMockLpPriceData(vault),\n }));\n\n allVaults.push(...vaultsWithLpData);\n const lastVaultTimestamp = vaults[vaults.length - 1]?.createdAt;\n if (!lastVaultTimestamp) {\n hasMoreData = false;\n continue;\n }\n lastTimestamp = lastVaultTimestamp;\n }\n\n // Filter deprecated vaults if needed\n // Note: In a real implementation, you would fetch deprecation data\n // For now, we return all vaults\n return allVaults;\n } catch (error) {\n console.error('Error fetching vaults from subgraph:', error);\n throw error;\n }\n }\n\n /**\n * Transform subgraph vault data to VaultsConnection format\n */\n public transformToVaultsConnection(\n vaults: SubgraphVaultDetailsWithLpData[],\n chainId: number,\n first: number = 50,\n aprMap: Map<string, number>,\n after?: string | null\n ): VaultsConnection {\n // Sort vaults by creation time (newest first)\n const sortedVaults = vaults.sort((a, b) => parseInt(b.createdAt) - parseInt(a.createdAt));\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = sortedVaults.findIndex((vault) => vault.id === after);\n startIndex = afterIndex + 1;\n }\n\n const paginatedVaults = sortedVaults.slice(startIndex, startIndex + first);\n const hasNextPage = startIndex + first < sortedVaults.length;\n const endCursor =\n paginatedVaults.length > 0 ? paginatedVaults[paginatedVaults.length - 1].id : null;\n\n const edges: VaultEdge[] = paginatedVaults.map((vault) => ({\n cursor: vault.id,\n node: this.transformSubgraphVaultToVaultNode(vault, chainId, aprMap),\n }));\n\n return {\n edges,\n pageInfo: {\n hasNextPage,\n endCursor,\n },\n totalCount: sortedVaults.length,\n };\n }\n}\n"]}