@steerprotocol/sdk 3.5.0 → 3.6.1

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.
package/dist/index.cjs CHANGED
@@ -9272,7 +9272,7 @@ const steerSubgraphConfig = {
9272
9272
  [Chain.Saga]: offlineSubgraphUrl("saga"),
9273
9273
  [Chain.Nibiru]: offlineSubgraphUrl("nibiru"),
9274
9274
  [Chain.Hyperevm]: "https://api.subgraph.ormilabs.com/api/public/803c8c8c-be12-4188-8523-b9853e23051d/subgraphs/steer-protocol-hyperevm/prod/gn",
9275
- [Chain.Bittensor]: "https://subgraph.35-247-158-26.sslip.io/subgraphs/name/steer-subgraph",
9275
+ [Chain.Bittensor]: "https://subgraphs.steer.finance/subgraphs/name/steer-subgraph/graphql",
9276
9276
  [Chain.Robinhood]: "https://api.goldsky.com/api/public/project_cm2k9xbkz4qg901vs51bm5uau/subgraphs/steer-protocol-robinhood/prod/gn"
9277
9277
  };
9278
9278
  /**
@@ -14918,7 +14918,7 @@ const nestVaultConfig = () => ({
14918
14918
  //#region src/const/amm/configs/protocols/bittensor-univ3.ts
14919
14919
  const bittensorUniV3Config = () => ({
14920
14920
  beaconContract: MultiPositionManagers.MultiPositionBittensorUniV3,
14921
- subgraph: { [Chain.Bittensor]: "https://subgraph.35-247-158-26.sslip.io/subgraphs/name/uniswap-v3-bittensor" },
14921
+ subgraph: { [Chain.Bittensor]: "https://subgraphs.steer.finance/subgraphs/name/uniswap-v3-bittensor/graphql" },
14922
14922
  factoryAddress: { [Chain.Bittensor]: "0xfB30AE7542a5E8A5BC134128c0c9dEb4646a2508" },
14923
14923
  NFTManagerAddress: { [Chain.Bittensor]: "0x32aF22F550bB1E9dd1382BEaBb0E3e6bb12fA549" },
14924
14924
  swapRouterAddress: { [Chain.Bittensor]: "0xa0a90ebB2A57083d06146D86d99a2eED3378359d" },
@@ -16377,6 +16377,47 @@ const FIND_ALL_VAULTS_BY_PROTOCOL = (batchSize = 1e3, timestamp, beaconNames) =>
16377
16377
  }
16378
16378
  }`;
16379
16379
  };
16380
+ const FIND_VAULT_BY_ADDRESS = (vaultAddress) => `query {
16381
+ vaults(first: 1, where: { id: "${vaultAddress}" }) {
16382
+ id
16383
+ name
16384
+ token0
16385
+ token1
16386
+ pool
16387
+ weeklyFeeAPR
16388
+ token0Symbol
16389
+ token0Decimals
16390
+ token1Symbol
16391
+ token1Decimals
16392
+ totalValueLockedToken0
16393
+ totalValueLockedToken1
16394
+ token0Balance
16395
+ token1Balance
16396
+ totalLPTokensIssued
16397
+ createdAt
16398
+ feeTier
16399
+ strategyToken {
16400
+ id
16401
+ name
16402
+ creator {
16403
+ id
16404
+ }
16405
+ admin
16406
+ executionBundle
16407
+ }
16408
+ positions(first: 1, orderBy: timestamp, orderDirection: desc) {
16409
+ id
16410
+ upperTick
16411
+ lowerTick
16412
+ relativeWeight
16413
+ }
16414
+ fees0
16415
+ fees1
16416
+ beaconName
16417
+ payloadIpfs
16418
+ deployer
16419
+ }
16420
+ }`;
16380
16421
  /**
16381
16422
  * Utility class for fetching vault data from Steer subgraphs
16382
16423
  */
@@ -16507,6 +16548,29 @@ var SubgraphVaultClient = class {
16507
16548
  };
16508
16549
  }
16509
16550
  /**
16551
+ * Fetches one vault by its address without enumerating the chain's vault set.
16552
+ */
16553
+ async getVaultByAddress(options) {
16554
+ const { subgraphUrl, chainId, vaultAddress } = options;
16555
+ if (!vaultAddress) throw new Error("vaultAddress is required for an address lookup");
16556
+ const vault = (await (await fetch(subgraphUrl, {
16557
+ method: "POST",
16558
+ headers: {
16559
+ "Content-Type": "application/json",
16560
+ ...subgraphUrl.includes("sentio") && this.SENTIO_API_KEY ? { "api-key": this.SENTIO_API_KEY } : {}
16561
+ },
16562
+ body: JSON.stringify({
16563
+ query: FIND_VAULT_BY_ADDRESS(vaultAddress.toLowerCase()),
16564
+ variables: {}
16565
+ })
16566
+ })).json())?.data?.vaults?.[0];
16567
+ if (!vault) return null;
16568
+ return this.transformSubgraphVaultToVaultNode({
16569
+ ...vault,
16570
+ lpPriceData: this.createMockLpPriceData(vault)
16571
+ }, chainId, /* @__PURE__ */ new Map());
16572
+ }
16573
+ /**
16510
16574
  * Fetch vault data from subgraph
16511
16575
  */
16512
16576
  async getAllVaultsFromSubgraph(options) {
@@ -20490,6 +20554,45 @@ var VaultClient = class extends SubgraphClient {
20490
20554
  }
20491
20555
  return apiFilter;
20492
20556
  }
20557
+ transformApiVaultNode(vault) {
20558
+ return {
20559
+ id: vault.id,
20560
+ chainId: vault.chainId,
20561
+ vaultAddress: vault.vaultAddress,
20562
+ protocol: vault.protocol,
20563
+ beaconName: vault.beaconName,
20564
+ protocolBaseType: vault.protocolBaseType,
20565
+ name: vault.name || "",
20566
+ feeApr: vault.feeApr || void 0,
20567
+ stakingApr: vault.stakingApr || void 0,
20568
+ merklApr: vault.merklApr || void 0,
20569
+ pool: {
20570
+ id: vault.pool?.id || "",
20571
+ poolAddress: vault.pool?.poolAddress || "",
20572
+ feeTier: vault.pool?.feeTier || "",
20573
+ tick: void 0,
20574
+ liquidity: void 0,
20575
+ volumeUSD: void 0,
20576
+ totalValueLockedUSD: void 0
20577
+ },
20578
+ token0: {
20579
+ id: vault.token0?.id || "",
20580
+ symbol: vault.token0?.symbol || "",
20581
+ name: vault.token0?.name || "",
20582
+ decimals: vault.token0?.decimals || 0,
20583
+ address: vault.token0?.address || "",
20584
+ chainId: vault.token0?.chainId || 0
20585
+ },
20586
+ token1: {
20587
+ id: vault.token1?.id || "",
20588
+ symbol: vault.token1?.symbol || "",
20589
+ name: vault.token1?.name || "",
20590
+ decimals: vault.token1?.decimals || 0,
20591
+ address: vault.token1?.address || "",
20592
+ chainId: vault.token1?.chainId || 0
20593
+ }
20594
+ };
20595
+ }
20493
20596
  vaultMatchesProtocolFilter(vault, protocolFilter, resolvedProtocol) {
20494
20597
  const normalizedFilter = this.normalizeProtocolValue(protocolFilter);
20495
20598
  const normalizedBeaconName = this.normalizeProtocolValue(vault.beaconName);
@@ -20673,43 +20776,7 @@ var VaultClient = class extends SubgraphClient {
20673
20776
  data: {
20674
20777
  edges: response.data.vaults.edges.map((edge) => ({
20675
20778
  cursor: edge.cursor,
20676
- node: {
20677
- id: edge.node.id,
20678
- chainId: edge.node.chainId,
20679
- vaultAddress: edge.node.vaultAddress,
20680
- protocol: edge.node.protocol,
20681
- beaconName: edge.node.beaconName,
20682
- protocolBaseType: edge.node.protocolBaseType,
20683
- name: edge.node.name || "",
20684
- feeApr: edge.node.feeApr || void 0,
20685
- stakingApr: edge.node.stakingApr || void 0,
20686
- merklApr: edge.node.merklApr || void 0,
20687
- pool: {
20688
- id: edge.node.pool?.id || "",
20689
- poolAddress: edge.node.pool?.poolAddress || "",
20690
- feeTier: edge.node.pool?.feeTier || "",
20691
- tick: void 0,
20692
- liquidity: void 0,
20693
- volumeUSD: void 0,
20694
- totalValueLockedUSD: void 0
20695
- },
20696
- token0: {
20697
- id: edge.node.token0?.id || "",
20698
- symbol: edge.node.token0?.symbol || "",
20699
- name: edge.node.token0?.name || "",
20700
- decimals: edge.node.token0?.decimals || 0,
20701
- address: edge.node.token0?.address || "",
20702
- chainId: edge.node.token0?.chainId || 0
20703
- },
20704
- token1: {
20705
- id: edge.node.token1?.id || "",
20706
- symbol: edge.node.token1?.symbol || "",
20707
- name: edge.node.token1?.name || "",
20708
- decimals: edge.node.token1?.decimals || 0,
20709
- address: edge.node.token1?.address || "",
20710
- chainId: edge.node.token1?.chainId || 0
20711
- }
20712
- }
20779
+ node: this.transformApiVaultNode(edge.node)
20713
20780
  })),
20714
20781
  pageInfo: {
20715
20782
  hasNextPage: response.data.vaults.pageInfo.hasNextPage,
@@ -21246,21 +21313,62 @@ var VaultClient = class extends SubgraphClient {
21246
21313
  };
21247
21314
  }
21248
21315
  async getVaultByAddress(vaultAddress, filter) {
21249
- const response = await this.searchVaults({
21250
- ...filter,
21251
- vaultAddress
21252
- });
21253
- if (!response.success || !response.data) return {
21316
+ const chainId = filter?.chainId;
21317
+ const normalizedVaultAddress = this.normalizeAddress(vaultAddress);
21318
+ if (!chainId) return {
21254
21319
  data: null,
21255
- status: response.status,
21256
- success: response.success,
21257
- error: response.error
21320
+ status: 400,
21321
+ success: false,
21322
+ error: "chainId is required for a direct vault address lookup"
21258
21323
  };
21259
- return {
21260
- data: response.data[0] || null,
21261
- status: 200,
21262
- success: true
21324
+ if (!normalizedVaultAddress || !(0, viem.isAddress)(vaultAddress)) return {
21325
+ data: null,
21326
+ status: 400,
21327
+ success: false,
21328
+ error: "vaultAddress must be a valid EVM address"
21263
21329
  };
21330
+ try {
21331
+ const chain = chainIdToName(chainId);
21332
+ const subgraphUrl = chain ? steerSubgraphConfig[chain] : void 0;
21333
+ if (!subgraphUrl) throw new Error(`No subgraph configured for chainId: ${chainId}`);
21334
+ const node = await this.subgraphVaultClient.getVaultByAddress({
21335
+ subgraphUrl,
21336
+ chainId,
21337
+ vaultAddress: normalizedVaultAddress
21338
+ });
21339
+ return {
21340
+ data: node ? this.filterVaultNodes([node], {
21341
+ ...filter,
21342
+ vaultAddress: normalizedVaultAddress
21343
+ })[0] || null : null,
21344
+ status: 200,
21345
+ success: true
21346
+ };
21347
+ } catch (error) {
21348
+ console.warn("Direct subgraph vault lookup failed, falling back to the API:", error);
21349
+ }
21350
+ try {
21351
+ const response = await this.apiClient.vault({
21352
+ id: normalizedVaultAddress,
21353
+ chainId
21354
+ });
21355
+ const vault = response.data?.vault;
21356
+ return {
21357
+ data: vault ? this.filterVaultNodes([this.transformApiVaultNode(vault)], {
21358
+ ...filter,
21359
+ vaultAddress: normalizedVaultAddress
21360
+ })[0] || null : null,
21361
+ status: response.status,
21362
+ success: true
21363
+ };
21364
+ } catch (error) {
21365
+ return {
21366
+ data: null,
21367
+ status: 500,
21368
+ success: false,
21369
+ error: error instanceof Error ? error.message : "Direct vault lookup failed"
21370
+ };
21371
+ }
21264
21372
  }
21265
21373
  async getVaultsForPool(poolAddress, filter) {
21266
21374
  return this.searchVaults({