@steerprotocol/sdk 3.2.8 → 3.3.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
@@ -19647,6 +19647,365 @@ var VaultWithdrawClient = class {
19647
19647
  }
19648
19648
  };
19649
19649
  //#endregion
19650
+ //#region src/base/vault/execution-context.ts
19651
+ const VAULT_REGISTRY_ABI = (0, viem.parseAbi)(["function getVaultDetails(address vault) view returns ((uint8 state,uint256 tokenId,uint256 vaultID,string payloadIpfs,address vaultAddress,string beaconName) details)", "function beaconAddresses(string beaconName) view returns (address)"]);
19652
+ const VAULT_EXECUTION_ABI = (0, viem.parseAbi)([
19653
+ "function pool() view returns (address)",
19654
+ "function getPositions() view returns (int24[] lowerTicks,int24[] upperTicks,uint16[] relativeWeights)",
19655
+ "function getTotalAmounts() view returns (uint256 total0,uint256 total1)"
19656
+ ]);
19657
+ const V4_VAULT_ABI = (0, viem.parseAbi)([
19658
+ "function poolKey() view returns (address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks)",
19659
+ "function getPositions() view returns (int24[] lowerTicks,int24[] upperTicks,uint16[] relativeWeights)",
19660
+ "function getTotalAmounts() view returns (uint256 total0,uint256 total1)"
19661
+ ]);
19662
+ const V3_POOL_ABI = (0, viem.parseAbi)([
19663
+ "function factory() view returns (address)",
19664
+ "function slot0() view returns (uint160 sqrtPriceX96,int24 tick,uint16 observationIndex,uint16 observationCardinality,uint16 observationCardinalityNext,uint8 feeProtocol,bool unlocked)",
19665
+ "function tickSpacing() view returns (int24)"
19666
+ ]);
19667
+ const AERODROME_POOL_ABI = (0, viem.parseAbi)([
19668
+ "function factory() view returns (address)",
19669
+ "function slot0() view returns (uint160 sqrtPriceX96,int24 tick,uint16 observationIndex,uint16 observationCardinality,uint16 observationCardinalityNext,bool unlocked)",
19670
+ "function tickSpacing() view returns (int24)"
19671
+ ]);
19672
+ const ALGEBRA_POOL_ABI = (0, viem.parseAbi)([
19673
+ "function factory() view returns (address)",
19674
+ "function globalState() view returns (uint160 price,int24 tick,int24 prevInitializedTick,uint16 fee,uint16 timepointIndex,uint8 communityFee,bool unlocked)",
19675
+ "function tickSpacing() view returns (int24)"
19676
+ ]);
19677
+ const ALGEBRA_INTEGRAL_POOL_ABI = (0, viem.parseAbi)([
19678
+ "function factory() view returns (address)",
19679
+ "function globalState() view returns (uint160 price,int24 tick,uint16 lastFee,uint8 pluginConfig,uint16 communityFee,bool unlocked)",
19680
+ "function tickSpacing() view returns (int24)"
19681
+ ]);
19682
+ const ALGEBRA_DIRECTIONAL_POOL_ABI = (0, viem.parseAbi)([
19683
+ "function factory() view returns (address)",
19684
+ "function globalState() view returns (uint160 price,int24 tick,uint16 feeZto,uint16 feeOtz,uint16 timepointIndex,uint8 communityFeeToken0,uint8 communityFeeToken1,bool unlocked)",
19685
+ "function tickSpacing() view returns (int24)"
19686
+ ]);
19687
+ const STATE_VIEW_ABI = (0, viem.parseAbi)(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)"]);
19688
+ const V4_DYNAMIC_FEE_FLAG = 8388608;
19689
+ const V4_MAX_STATIC_FEE = 1e6;
19690
+ const V4_MAX_TICK_SPACING = 32767;
19691
+ const V4_ALL_HOOK_MASK = (1n << 14n) - 1n;
19692
+ const V4_BEFORE_SWAP_FLAG = 1n << 7n;
19693
+ const V4_AFTER_SWAP_FLAG = 1n << 6n;
19694
+ const V4_AFTER_ADD_LIQUIDITY_FLAG = 1n << 10n;
19695
+ const V4_AFTER_REMOVE_LIQUIDITY_FLAG = 1n << 8n;
19696
+ const V4_BEFORE_SWAP_RETURNS_DELTA_FLAG = 1n << 3n;
19697
+ const V4_AFTER_SWAP_RETURNS_DELTA_FLAG = 1n << 2n;
19698
+ const V4_AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG = 1n << 1n;
19699
+ const V4_AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG = 1n;
19700
+ var ExecutionContextError = class extends Error {
19701
+ constructor(status, message) {
19702
+ super(message);
19703
+ this.status = status;
19704
+ }
19705
+ };
19706
+ function resolvePoolFamily(protocol) {
19707
+ if (isPoolSharkProtocol(protocol)) throw new ExecutionContextError(422, "PoolShark vault execution context is not supported.");
19708
+ if (protocol === Protocol.UniswapV4) return "uniswap-v4";
19709
+ if (isAlgebraDirectionProtocol(protocol)) return "algebra-directional";
19710
+ if (isAlgebraIntegralProtocol(protocol)) return "algebra-integral";
19711
+ if (isAlgebraProtocol(protocol)) return "algebra";
19712
+ if (isAerodromeVault(protocol)) return "aerodrome-cl";
19713
+ return "uniswap-v3-compatible";
19714
+ }
19715
+ function assertPoolKey(poolKey, invalidStatus = 400) {
19716
+ if (!(0, viem.isAddress)(poolKey.currency0) || !(0, viem.isAddress)(poolKey.currency1) || !(0, viem.isAddress)(poolKey.hooks)) throw new ExecutionContextError(invalidStatus, "Uniswap v4 poolKey contains an invalid address.");
19717
+ if (!Number.isInteger(poolKey.fee) || poolKey.fee < 0 || poolKey.fee > V4_MAX_STATIC_FEE && poolKey.fee !== V4_DYNAMIC_FEE_FLAG) throw new ExecutionContextError(invalidStatus, "Uniswap v4 poolKey fee must be at most 1000000 or the dynamic fee flag 0x800000.");
19718
+ if (!Number.isInteger(poolKey.tickSpacing) || poolKey.tickSpacing <= 0 || poolKey.tickSpacing > V4_MAX_TICK_SPACING) throw new ExecutionContextError(invalidStatus, "Uniswap v4 poolKey tickSpacing must be between 1 and 32767.");
19719
+ const normalized = {
19720
+ currency0: (0, viem.getAddress)(poolKey.currency0),
19721
+ currency1: (0, viem.getAddress)(poolKey.currency1),
19722
+ fee: poolKey.fee,
19723
+ tickSpacing: poolKey.tickSpacing,
19724
+ hooks: (0, viem.getAddress)(poolKey.hooks)
19725
+ };
19726
+ if (BigInt(normalized.currency0) >= BigInt(normalized.currency1)) throw new ExecutionContextError(invalidStatus, "Uniswap v4 poolKey currencies are not canonically ordered.");
19727
+ const hooks = BigInt(normalized.hooks);
19728
+ const isDynamicFee = normalized.fee === V4_DYNAMIC_FEE_FLAG;
19729
+ const hasFlag = (flag) => (hooks & flag) !== 0n;
19730
+ if (!hasFlag(V4_BEFORE_SWAP_FLAG) && hasFlag(V4_BEFORE_SWAP_RETURNS_DELTA_FLAG) || !hasFlag(V4_AFTER_SWAP_FLAG) && hasFlag(V4_AFTER_SWAP_RETURNS_DELTA_FLAG) || !hasFlag(V4_AFTER_ADD_LIQUIDITY_FLAG) && hasFlag(V4_AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG) || !hasFlag(V4_AFTER_REMOVE_LIQUIDITY_FLAG) && hasFlag(V4_AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)) throw new ExecutionContextError(invalidStatus, "Uniswap v4 poolKey hook return-delta flags require their corresponding action flags.");
19731
+ if (!(hooks === 0n ? !isDynamicFee : (hooks & V4_ALL_HOOK_MASK) !== 0n || isDynamicFee)) throw new ExecutionContextError(invalidStatus, "Uniswap v4 poolKey hook address is incompatible with its fee and permission flags.");
19732
+ return normalized;
19733
+ }
19734
+ function normalizeRawPoolKey(raw) {
19735
+ return assertPoolKey({
19736
+ currency0: raw[0],
19737
+ currency1: raw[1],
19738
+ fee: Number(raw[2]),
19739
+ tickSpacing: Number(raw[3]),
19740
+ hooks: raw[4]
19741
+ }, 422);
19742
+ }
19743
+ function poolKeysEqual(a, b) {
19744
+ return (0, viem.getAddress)(a.currency0) === (0, viem.getAddress)(b.currency0) && (0, viem.getAddress)(a.currency1) === (0, viem.getAddress)(b.currency1) && a.fee === b.fee && a.tickSpacing === b.tickSpacing && (0, viem.getAddress)(a.hooks) === (0, viem.getAddress)(b.hooks);
19745
+ }
19746
+ function getPoolId(poolKey) {
19747
+ return (0, viem.keccak256)((0, viem.encodeAbiParameters)([{
19748
+ type: "tuple",
19749
+ components: [
19750
+ {
19751
+ name: "currency0",
19752
+ type: "address"
19753
+ },
19754
+ {
19755
+ name: "currency1",
19756
+ type: "address"
19757
+ },
19758
+ {
19759
+ name: "fee",
19760
+ type: "uint24"
19761
+ },
19762
+ {
19763
+ name: "tickSpacing",
19764
+ type: "int24"
19765
+ },
19766
+ {
19767
+ name: "hooks",
19768
+ type: "address"
19769
+ }
19770
+ ]
19771
+ }], [poolKey]));
19772
+ }
19773
+ function normalizePositions(raw) {
19774
+ const [lowerTicks, upperTicks, relativeWeights] = raw;
19775
+ if (lowerTicks.length !== upperTicks.length || lowerTicks.length !== relativeWeights.length) throw new ExecutionContextError(422, "Vault returned malformed position arrays.");
19776
+ return lowerTicks.map((lowerTick, index) => ({
19777
+ lowerTick: Number(lowerTick),
19778
+ upperTick: Number(upperTicks[index]),
19779
+ relativeWeight: Number(relativeWeights[index])
19780
+ }));
19781
+ }
19782
+ function protocolFactory(protocol, chain, subgraphStudioKey) {
19783
+ if (!chain) throw new ExecutionContextError(422, "Chain is absent from the SDK network registry.");
19784
+ const address = getAmmConfig(subgraphStudioKey)[protocol]?.factoryAddress?.[chain];
19785
+ if (!address || !(0, viem.isAddress)(address)) throw new ExecutionContextError(422, `${protocol} factory is missing from the SDK protocol registry on ${chain}.`);
19786
+ return (0, viem.getAddress)(address);
19787
+ }
19788
+ async function readLastExecution(publicClient, chainId, vaultAddress, blockNumber, epochTimestamp) {
19789
+ const pinnedBlock = await publicClient.getBlock({ blockNumber });
19790
+ const timestampUpperBound = pinnedBlock.timestamp < epochTimestamp ? pinnedBlock.timestamp : epochTimestamp;
19791
+ const subgraphUrl = getSubgraphUrlByChainId(chainId);
19792
+ if (!subgraphUrl) throw new ExecutionContextError(422, `Chain ${chainId} has no Steer subgraph configuration.`);
19793
+ const response = await fetch(subgraphUrl, {
19794
+ method: "POST",
19795
+ headers: { "Content-Type": "application/json" },
19796
+ body: JSON.stringify({ query: `{
19797
+ vaultSnapshots(
19798
+ where: { vaultAddress: "${vaultAddress.toLowerCase()}", timestamp_lte: "${timestampUpperBound}" }
19799
+ orderDirection: desc
19800
+ orderBy: timestamp
19801
+ first: 1
19802
+ ) { timestamp }
19803
+ }` })
19804
+ });
19805
+ if (!response.ok) throw new ExecutionContextError(502, `Steer subgraph returned HTTP ${response.status}.`);
19806
+ const result = await response.json();
19807
+ if (result.errors?.length) throw new ExecutionContextError(502, `Steer subgraph error: ${result.errors[0].message}`);
19808
+ const rawTimestamp = result.data?.vaultSnapshots?.[0]?.timestamp;
19809
+ if (!rawTimestamp) return {
19810
+ timestamp: null,
19811
+ elapsed: null,
19812
+ provenance: {
19813
+ source: "steer-subgraph",
19814
+ consistency: "timestamp-bounded",
19815
+ status: "not-found",
19816
+ blockNumber: null,
19817
+ detail: `No indexed vaultSnapshot exists through timestamp ${timestampUpperBound}.`
19818
+ }
19819
+ };
19820
+ let timestamp;
19821
+ try {
19822
+ timestamp = BigInt(rawTimestamp);
19823
+ } catch {
19824
+ throw new ExecutionContextError(502, "Steer subgraph returned a malformed vaultSnapshot timestamp.");
19825
+ }
19826
+ if (timestamp > timestampUpperBound) throw new ExecutionContextError(502, "Steer subgraph returned a vaultSnapshot beyond the query bound.");
19827
+ return {
19828
+ timestamp,
19829
+ elapsed: epochTimestamp - timestamp,
19830
+ provenance: {
19831
+ source: "steer-subgraph",
19832
+ consistency: "timestamp-bounded",
19833
+ status: "indexed",
19834
+ blockNumber: null,
19835
+ detail: `Latest indexed vaultSnapshot bounded by epoch and pinned-block timestamp ${timestampUpperBound}; the entity does not expose its block number.`
19836
+ }
19837
+ };
19838
+ }
19839
+ /**
19840
+ * Builds the normalized read-only state consumed by strategy execution.
19841
+ * Every contract read is evaluated at `blockNumber`; `epochTimestamp` is the sole time reference.
19842
+ */
19843
+ async function getVaultExecutionContext(params) {
19844
+ try {
19845
+ const { publicClient, blockNumber, epochTimestamp } = params;
19846
+ if (blockNumber < 0n) throw new ExecutionContextError(400, "blockNumber must be non-negative.");
19847
+ if (epochTimestamp < 0n) throw new ExecutionContextError(400, "epochTimestamp must be a non-negative Unix timestamp.");
19848
+ if (!(0, viem.isAddress)(params.vaultAddress)) throw new ExecutionContextError(400, "vaultAddress must be a valid EVM address.");
19849
+ const chainId = await publicClient.getChainId();
19850
+ const chain = chainIdToName(chainId);
19851
+ const network = getNetworkByChainId(chainId);
19852
+ const vaultRegistry = getContractAddressByChainIdAndContractName(chainId, "VaultRegistry");
19853
+ if (!chain || !network || !vaultRegistry || !(0, viem.isAddress)(vaultRegistry)) throw new ExecutionContextError(422, `Chain ${chainId} is missing required SDK deployment data.`);
19854
+ if (blockNumber < BigInt(network.VaultRegistry.startBlock ?? 0)) throw new ExecutionContextError(400, "blockNumber predates the SDK VaultRegistry deployment.");
19855
+ const vaultAddress = (0, viem.getAddress)(params.vaultAddress);
19856
+ const details = await publicClient.readContract({
19857
+ address: (0, viem.getAddress)(vaultRegistry),
19858
+ abi: VAULT_REGISTRY_ABI,
19859
+ functionName: "getVaultDetails",
19860
+ args: [vaultAddress],
19861
+ blockNumber
19862
+ });
19863
+ if (!details.vaultAddress || (0, viem.getAddress)(details.vaultAddress) !== vaultAddress) throw new ExecutionContextError(404, `${vaultAddress} is not registered in the chain VaultRegistry.`);
19864
+ const protocol = getProtocolTypeByBeacon(details.beaconName);
19865
+ if (!protocol) throw new ExecutionContextError(422, `Vault beacon "${details.beaconName}" is not mapped to a supported SDK protocol.`);
19866
+ const beaconAddress = (0, viem.getAddress)(await publicClient.readContract({
19867
+ address: (0, viem.getAddress)(vaultRegistry),
19868
+ abi: VAULT_REGISTRY_ABI,
19869
+ functionName: "beaconAddresses",
19870
+ args: [details.beaconName],
19871
+ blockNumber
19872
+ }));
19873
+ if (beaconAddress === "0x0000000000000000000000000000000000000000") throw new ExecutionContextError(422, `Vault beacon "${details.beaconName}" is not registered.`);
19874
+ const family = resolvePoolFamily(protocol);
19875
+ const explicitPoolKey = params.poolKey ? assertPoolKey(params.poolKey) : void 0;
19876
+ const [rawPositions, rawTotals] = await Promise.all([publicClient.readContract({
19877
+ address: vaultAddress,
19878
+ abi: family === "uniswap-v4" ? V4_VAULT_ABI : VAULT_EXECUTION_ABI,
19879
+ functionName: "getPositions",
19880
+ blockNumber
19881
+ }), publicClient.readContract({
19882
+ address: vaultAddress,
19883
+ abi: family === "uniswap-v4" ? V4_VAULT_ABI : VAULT_EXECUTION_ABI,
19884
+ functionName: "getTotalAmounts",
19885
+ blockNumber
19886
+ })]);
19887
+ let poolAddress = null;
19888
+ let poolId = null;
19889
+ let factoryAddress = null;
19890
+ let poolManagerAddress = null;
19891
+ let poolKey = null;
19892
+ let currentTick;
19893
+ let tickSpacing;
19894
+ if (family === "uniswap-v4") {
19895
+ let rawPoolKey;
19896
+ try {
19897
+ rawPoolKey = await publicClient.readContract({
19898
+ address: vaultAddress,
19899
+ abi: V4_VAULT_ABI,
19900
+ functionName: "poolKey",
19901
+ blockNumber
19902
+ });
19903
+ } catch {
19904
+ throw new ExecutionContextError(422, "A complete Uniswap v4 pool key cannot be proven from vault poolKey(); refusing partial metadata.");
19905
+ }
19906
+ poolKey = normalizeRawPoolKey(rawPoolKey);
19907
+ if (explicitPoolKey && !poolKeysEqual(explicitPoolKey, poolKey)) throw new ExecutionContextError(409, "The explicit Uniswap v4 poolKey does not match vault poolKey().");
19908
+ poolId = getPoolId(poolKey);
19909
+ const v4Config = getAmmConfig(params.subgraphStudioKey ?? "")[protocol];
19910
+ const poolManager = v4Config?.PoolManager?.[chain];
19911
+ const stateView = v4Config?.StateView?.[chain];
19912
+ if (!poolManager || !stateView || !(0, viem.isAddress)(poolManager) || !(0, viem.isAddress)(stateView)) throw new ExecutionContextError(422, "Uniswap v4 PoolManager or StateView is missing from SDK config.");
19913
+ poolManagerAddress = (0, viem.getAddress)(poolManager);
19914
+ const slot0 = await publicClient.readContract({
19915
+ address: (0, viem.getAddress)(stateView),
19916
+ abi: STATE_VIEW_ABI,
19917
+ functionName: "getSlot0",
19918
+ args: [poolId],
19919
+ blockNumber
19920
+ });
19921
+ if (slot0[0] === 0n) throw new ExecutionContextError(422, `Uniswap v4 pool ${poolId} is not initialized in the configured PoolManager.`);
19922
+ currentTick = Number(slot0[1]);
19923
+ tickSpacing = poolKey.tickSpacing;
19924
+ } else {
19925
+ poolAddress = (0, viem.getAddress)(await publicClient.readContract({
19926
+ address: vaultAddress,
19927
+ abi: VAULT_EXECUTION_ABI,
19928
+ functionName: "pool",
19929
+ blockNumber
19930
+ }));
19931
+ factoryAddress = protocolFactory(protocol, chain, params.subgraphStudioKey ?? "");
19932
+ const poolAbi = family === "aerodrome-cl" ? AERODROME_POOL_ABI : family === "algebra-directional" ? ALGEBRA_DIRECTIONAL_POOL_ABI : family === "algebra-integral" ? ALGEBRA_INTEGRAL_POOL_ABI : family === "algebra" ? ALGEBRA_POOL_ABI : V3_POOL_ABI;
19933
+ const stateFunction = family.startsWith("algebra") ? "globalState" : "slot0";
19934
+ const [actualFactory, state, spacing] = await Promise.all([
19935
+ publicClient.readContract({
19936
+ address: poolAddress,
19937
+ abi: poolAbi,
19938
+ functionName: "factory",
19939
+ blockNumber
19940
+ }),
19941
+ publicClient.readContract({
19942
+ address: poolAddress,
19943
+ abi: poolAbi,
19944
+ functionName: stateFunction,
19945
+ blockNumber
19946
+ }),
19947
+ publicClient.readContract({
19948
+ address: poolAddress,
19949
+ abi: poolAbi,
19950
+ functionName: "tickSpacing",
19951
+ blockNumber
19952
+ })
19953
+ ]);
19954
+ if ((0, viem.getAddress)(actualFactory) !== factoryAddress) throw new ExecutionContextError(409, `Pool factory ${actualFactory} does not match SDK ${protocol} factory ${factoryAddress}.`);
19955
+ currentTick = Number(state[1]);
19956
+ tickSpacing = Number(spacing);
19957
+ }
19958
+ const lastExecution = await readLastExecution(publicClient, chainId, vaultAddress, blockNumber, epochTimestamp);
19959
+ const pinned = (detail) => ({
19960
+ source: "onchain-contract",
19961
+ consistency: "block-pinned",
19962
+ status: "verified",
19963
+ blockNumber: blockNumber.toString(),
19964
+ detail
19965
+ });
19966
+ return {
19967
+ success: true,
19968
+ status: 200,
19969
+ data: {
19970
+ chainId,
19971
+ blockNumber: blockNumber.toString(),
19972
+ epochTimestamp: epochTimestamp.toString(),
19973
+ vaultAddress,
19974
+ protocol,
19975
+ beaconName: details.beaconName,
19976
+ beaconAddress,
19977
+ poolFamily: family,
19978
+ poolAddress,
19979
+ poolId,
19980
+ factoryAddress,
19981
+ poolManagerAddress,
19982
+ poolKey,
19983
+ currentTick,
19984
+ tickSpacing,
19985
+ positions: normalizePositions(rawPositions),
19986
+ totalAmount0: rawTotals[0].toString(),
19987
+ totalAmount1: rawTotals[1].toString(),
19988
+ lastExecutionTimestamp: lastExecution.timestamp?.toString() ?? null,
19989
+ lastExecutionTimeSeconds: lastExecution.elapsed?.toString() ?? null,
19990
+ provenance: {
19991
+ identity: pinned("VaultRegistry getVaultDetails and SDK beacon mapping."),
19992
+ poolState: pinned(family === "uniswap-v4" ? "Vault poolKey and SDK StateView getSlot0." : "Vault pool, SDK factory validation, pool state, and tickSpacing."),
19993
+ positions: pinned("Vault getPositions."),
19994
+ totals: pinned("Vault getTotalAmounts; pending uncollected fees follow vault contract semantics."),
19995
+ lastExecution: lastExecution.provenance
19996
+ }
19997
+ }
19998
+ };
19999
+ } catch (error) {
20000
+ return {
20001
+ success: false,
20002
+ status: error instanceof ExecutionContextError ? error.status : 500,
20003
+ data: null,
20004
+ error: error instanceof Error ? error.message : "Failed to build vault execution context."
20005
+ };
20006
+ }
20007
+ }
20008
+ //#endregion
19650
20009
  //#region src/base/VaultClient.ts
19651
20010
  const VAULT_ABI = abis.QuickSwapUniv3MultiPositionLiquidityManager;
19652
20011
  const REWARD_FUNCTIONS_ABI = [{
@@ -19768,6 +20127,17 @@ var VaultClient = class extends SubgraphClient {
19768
20127
  this.subgraphVaultClient = new SubgraphVaultClient();
19769
20128
  this.subgraphStudioKey = subgraphStudioKey || "";
19770
20129
  }
20130
+ /**
20131
+ * Returns normalized strategy execution inputs from one explicitly pinned block.
20132
+ * `epochTimestamp` is a Unix timestamp in seconds and is never derived from wall-clock time.
20133
+ */
20134
+ async getExecutionContext(params) {
20135
+ return getVaultExecutionContext({
20136
+ publicClient: this.publicClient,
20137
+ subgraphStudioKey: this.subgraphStudioKey,
20138
+ ...params
20139
+ });
20140
+ }
19771
20141
  normalizeProtocolValue(value) {
19772
20142
  return value.toLowerCase().replace(/[^a-z0-9]/g, "");
19773
20143
  }
@@ -23856,6 +24226,7 @@ exports.getSwapRouterAddress = getSwapRouterAddress;
23856
24226
  exports.getTheGraphResolverUrl = getTheGraphResolverUrl;
23857
24227
  exports.getTickLensAddress = getTickLensAddress;
23858
24228
  exports.getUniswapV4BeaconSupportedChains = getUniswapV4BeaconSupportedChains;
24229
+ exports.getVaultExecutionContext = getVaultExecutionContext;
23859
24230
  exports.getVaultReserves = getVaultReserves;
23860
24231
  exports.glyphConfig = glyphConfig;
23861
24232
  exports.goerliAddresses = goerliAddresses;