timelock-sdk 0.0.95 → 0.0.97

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/client.d.cts CHANGED
@@ -1,3 +1,3 @@
1
1
  import "./uniswapMathLens-B_cHjOOB.cjs";
2
- import { B as OptionTimelineData, F as useUserOperators, G as useMintOption, H as useExtendOption, I as useOperatorPerms, K as useMaxPositionSize, L as usePerpsOperator, P as useSetOperatorPerms, R as useClosePerp, U as useOptionPremium, V as useOptionTimeline, W as useOptionPnl, a as batchGetAmountsFromLiquidity, c as useLiquidityBlocks, ct as useMarketData, d as usePriceAtTick, dt as useActiveUserOptions, f as UniswapPoolData, ft as useClosedUserOptions, h as useCurrentPrice, ht as useTimelockConfig, i as useVaultData, l as useBurnLiquidity, lt as useExerciseOption, m as useCurrentTick, mt as useCurrentMarket, n as useLens, o as useMintLiquidity, p as usePoolData, pt as TimelockProvider, r as useVaultTVL, s as LiquidityBlockData, t as useApproval, u as usePriceHistory, ut as OptionData, z as useMintPerp } from "./client-BanYHaNs.cjs";
2
+ import { B as OptionTimelineData, F as useUserOperators, G as useMintOption, H as useExtendOption, I as useOperatorPerms, K as useMaxPositionSize, L as usePerpsOperator, P as useSetOperatorPerms, R as useClosePerp, U as useOptionPremium, V as useOptionTimeline, W as useOptionPnl, a as batchGetAmountsFromLiquidity, c as useLiquidityBlocks, ct as useMarketData, d as usePriceAtTick, dt as useActiveUserOptions, f as UniswapPoolData, ft as useClosedUserOptions, h as useCurrentPrice, ht as useTimelockConfig, i as useVaultData, l as useBurnLiquidity, lt as useExerciseOption, m as useCurrentTick, mt as useCurrentMarket, n as useLens, o as useMintLiquidity, p as usePoolData, pt as TimelockProvider, r as useVaultTVL, s as LiquidityBlockData, t as useApproval, u as usePriceHistory, ut as OptionData, z as useMintPerp } from "./client-uwDDNqle.cjs";
3
3
  export { LiquidityBlockData, OptionData, OptionTimelineData, TimelockProvider, UniswapPoolData, batchGetAmountsFromLiquidity, useActiveUserOptions, useApproval, useBurnLiquidity, useClosePerp, useClosedUserOptions, useCurrentMarket, useCurrentPrice, useCurrentTick, useExerciseOption, useExtendOption, useLens, useLiquidityBlocks, useMarketData, useMaxPositionSize, useMintLiquidity, useMintOption, useMintPerp, useOperatorPerms, useOptionPnl, useOptionPremium, useOptionTimeline, usePerpsOperator, usePoolData, usePriceAtTick, usePriceHistory, useSetOperatorPerms, useTimelockConfig, useUserOperators, useVaultData, useVaultTVL };
package/dist/client.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import "./uniswapMathLens-ChJFZ6hc.js";
2
- import { B as OptionTimelineData, F as useUserOperators, G as useMintOption, H as useExtendOption, I as useOperatorPerms, K as useMaxPositionSize, L as usePerpsOperator, P as useSetOperatorPerms, R as useClosePerp, U as useOptionPremium, V as useOptionTimeline, W as useOptionPnl, a as batchGetAmountsFromLiquidity, c as useLiquidityBlocks, ct as useMarketData, d as usePriceAtTick, dt as useActiveUserOptions, f as UniswapPoolData, ft as useClosedUserOptions, h as useCurrentPrice, ht as useTimelockConfig, i as useVaultData, l as useBurnLiquidity, lt as useExerciseOption, m as useCurrentTick, mt as useCurrentMarket, n as useLens, o as useMintLiquidity, p as usePoolData, pt as TimelockProvider, r as useVaultTVL, s as LiquidityBlockData, t as useApproval, u as usePriceHistory, ut as OptionData, z as useMintPerp } from "./client-BSZsqyLp.js";
2
+ import { B as OptionTimelineData, F as useUserOperators, G as useMintOption, H as useExtendOption, I as useOperatorPerms, K as useMaxPositionSize, L as usePerpsOperator, P as useSetOperatorPerms, R as useClosePerp, U as useOptionPremium, V as useOptionTimeline, W as useOptionPnl, a as batchGetAmountsFromLiquidity, c as useLiquidityBlocks, ct as useMarketData, d as usePriceAtTick, dt as useActiveUserOptions, f as UniswapPoolData, ft as useClosedUserOptions, h as useCurrentPrice, ht as useTimelockConfig, i as useVaultData, l as useBurnLiquidity, lt as useExerciseOption, m as useCurrentTick, mt as useCurrentMarket, n as useLens, o as useMintLiquidity, p as usePoolData, pt as TimelockProvider, r as useVaultTVL, s as LiquidityBlockData, t as useApproval, u as usePriceHistory, ut as OptionData, z as useMintPerp } from "./client--LwyAjN0.js";
3
3
  export { LiquidityBlockData, OptionData, OptionTimelineData, TimelockProvider, UniswapPoolData, batchGetAmountsFromLiquidity, useActiveUserOptions, useApproval, useBurnLiquidity, useClosePerp, useClosedUserOptions, useCurrentMarket, useCurrentPrice, useCurrentTick, useExerciseOption, useExtendOption, useLens, useLiquidityBlocks, useMarketData, useMaxPositionSize, useMintLiquidity, useMintOption, useMintPerp, useOperatorPerms, useOptionPnl, useOptionPremium, useOptionTimeline, usePerpsOperator, usePoolData, usePriceAtTick, usePriceHistory, useSetOperatorPerms, useTimelockConfig, useUserOperators, useVaultData, useVaultTVL };
package/dist/client.js CHANGED
@@ -5,12 +5,13 @@ import { r as lensAbi, t as optionsMarketAbi } from "./optionsMarket-DBuVI-kl.js
5
5
  import { A as getErc20, D as token1ToToken0, E as token0ToToken1, F as uniswapMathLenses, M as getTimelockMarket, N as getUniswapMathLens, P as timelockLenses, _ as getAmountsFromLiquidity, d as wrapAmount, j as getTimelockLens, k as getPriceHistory, n as EMPTY_ARRAY, p as wrapPrice, t as getPayoutAtTick, v as getNearestValidStrikeTick, w as roundTickDown, y as getPriceAtTick } from "./optionUtils-BkogxEAT.js";
6
6
  import { n as uniswapV3PoolAbi, t as singleOwnerVaultAbi } from "./singleOwnerVault-BeJChjfJ.js";
7
7
  import { encodeAbiParameters, encodeFunctionData, erc20Abi, maxUint256, zeroAddress } from "viem";
8
- import React, { createContext, useContext, useMemo } from "react";
9
- import { useAccount, useChainId, useClient, useReadContract, useWaitForTransactionReceipt, useWriteContract } from "wagmi";
8
+ import React, { createContext, useContext, useEffect, useMemo } from "react";
9
+ import { useAccount, useChainId, useClient, useReadContract, useSignMessage, useWaitForTransactionReceipt, useWriteContract } from "wagmi";
10
10
  import { GraphQLClient, RequestOptions } from "graphql-request";
11
11
  import gql from "graphql-tag";
12
12
  import { waitForTransactionReceipt } from "viem/actions";
13
13
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
14
+ import { z } from "zod";
14
15
 
15
16
  //#region src/generated/graphql.ts
16
17
  const UserOptionFieldsFragmentDoc = gql`
@@ -793,12 +794,13 @@ const useOptionTimeline = (marketAddr, optionId) => {
793
794
  //#endregion
794
795
  //#region src/lib/perpsOperator.ts
795
796
  var PerpsOperator = class {
796
- baseUrl;
797
+ #baseUrl;
798
+ auth;
797
799
  constructor(baseUrl) {
798
- this.baseUrl = baseUrl;
800
+ this.#baseUrl = baseUrl;
799
801
  }
800
802
  async #request(path, body) {
801
- const url = new URL(path, this.baseUrl);
803
+ const url = new URL(path, this.#baseUrl);
802
804
  const res = await fetch(url, {
803
805
  method: body ? "POST" : "GET",
804
806
  headers: {
@@ -824,6 +826,27 @@ var PerpsOperator = class {
824
826
  const { address } = await this.#request("api/operator/address");
825
827
  return address;
826
828
  }
829
+ async genAuthMessage(userAddr) {
830
+ const { message } = await this.#request("api/auth/message", { userAddr });
831
+ return message;
832
+ }
833
+ async validateAuthMessage(authMessage, signature) {
834
+ const { address, createdAt, validUntil } = await this.#request("api/auth/validate", {
835
+ authMessage,
836
+ signature
837
+ });
838
+ return {
839
+ address,
840
+ createdAt,
841
+ validUntil
842
+ };
843
+ }
844
+ setAuth(authMessage, signature) {
845
+ this.auth = {
846
+ authMessage,
847
+ signature
848
+ };
849
+ }
827
850
  async getUserPerps(userAddr, marketAddr, type, offset = 0, limit = 1e3) {
828
851
  const params = new URLSearchParams({
829
852
  offset: offset.toString(),
@@ -838,8 +861,10 @@ var PerpsOperator = class {
838
861
  }));
839
862
  }
840
863
  async mintPerp(body) {
864
+ if (!this.auth) throw new Error("Authentication required. Call setAuth() with authMessage and signature before exercising perps.");
841
865
  const { txHash, optionId } = await this.#request("api/positions/mint", {
842
866
  ...body,
867
+ ...this.auth,
843
868
  amount: body.amount.toString()
844
869
  });
845
870
  return {
@@ -848,8 +873,10 @@ var PerpsOperator = class {
848
873
  };
849
874
  }
850
875
  async exercisePerp(body) {
876
+ if (!this.auth) throw new Error("Authentication required. Call setAuth() with authMessage and signature before exercising perps.");
851
877
  const { txHash, optionId } = await this.#request("api/positions/exercise", {
852
878
  ...body,
879
+ ...this.auth,
853
880
  optionId: body.optionId.toString(),
854
881
  liquidities: body.liquidities.map((l) => l.toString())
855
882
  });
@@ -862,8 +889,38 @@ var PerpsOperator = class {
862
889
 
863
890
  //#endregion
864
891
  //#region src/hooks/perps/usePerpsOperator.ts
892
+ const ZHex = z.string().regex(/^0x[a-fA-F0-9]+$/, "Invalid hex string").transform((v) => v);
893
+ const ZSavedSignature = z.object({
894
+ signature: ZHex,
895
+ message: z.string()
896
+ });
897
+ const getSavedSignature = (userAddr) => {
898
+ const key = `perps-auth-${userAddr.toLowerCase()}`;
899
+ const raw = localStorage.getItem(key);
900
+ if (!raw) return;
901
+ try {
902
+ return ZSavedSignature.parse(JSON.parse(raw));
903
+ } catch (error) {
904
+ clearSignature(userAddr);
905
+ throw new Error("Invalid stored signature: " + raw);
906
+ }
907
+ };
908
+ const saveSignature = (userAddr, message, signature) => {
909
+ const key = `perps-auth-${userAddr.toLowerCase()}`;
910
+ const data = JSON.stringify({
911
+ message,
912
+ signature
913
+ });
914
+ localStorage.setItem(key, data);
915
+ };
916
+ const clearSignature = (userAddr) => {
917
+ const key = `perps-auth-${userAddr.toLowerCase()}`;
918
+ localStorage.removeItem(key);
919
+ };
865
920
  const usePerpsOperator = () => {
921
+ const { address: userAddr } = useAccount();
866
922
  const { perpsOperatorUrl } = useTimelockConfig();
923
+ const { signMessageAsync } = useSignMessage();
867
924
  const operator = useMemo(() => perpsOperatorUrl ? new PerpsOperator(perpsOperatorUrl) : void 0, [perpsOperatorUrl]);
868
925
  const { data: address } = useQuery({
869
926
  queryKey: ["perpsOperatorAddr", perpsOperatorUrl || "--"],
@@ -872,9 +929,34 @@ const usePerpsOperator = () => {
872
929
  refetchInterval: 1e4,
873
930
  enabled: !!operator
874
931
  });
932
+ const validateAndSetAuth = async (message, signature) => {
933
+ if (!operator || !userAddr) return;
934
+ try {
935
+ const { address: address$1, validUntil } = await operator.validateAuthMessage(message, signature);
936
+ if (validUntil < Date.now()) throw new Error("Signature expired");
937
+ if (address$1 !== userAddr) throw new Error("Valid signature but different user address");
938
+ operator.setAuth(userAddr, signature);
939
+ } catch (error) {
940
+ clearSignature(userAddr);
941
+ console.error(error);
942
+ }
943
+ };
944
+ useEffect(() => {
945
+ if (!userAddr || !operator) return;
946
+ const sig = getSavedSignature(userAddr);
947
+ if (!sig) return;
948
+ validateAndSetAuth(sig.message, sig.signature);
949
+ }, [userAddr, operator]);
875
950
  return {
876
951
  operator,
877
- address
952
+ address,
953
+ signMessage: useMutation({ mutationFn: async () => {
954
+ if (!operator || !userAddr || !signMessageAsync) return;
955
+ const message = await operator.genAuthMessage(userAddr);
956
+ const signature = await signMessageAsync({ message });
957
+ saveSignature(userAddr, message, signature);
958
+ operator.setAuth(message, signature);
959
+ } })
878
960
  };
879
961
  };
880
962
 
@@ -948,7 +1030,7 @@ const useMintPerp = (marketAddr) => {
948
1030
  const queryClient = useQueryClient();
949
1031
  const client = useClient();
950
1032
  const { address } = useAccount();
951
- const { operator, address: operatorAddr } = usePerpsOperator();
1033
+ const { operator, address: operatorAddr, signMessage: { mutateAsync: signMessage } } = usePerpsOperator();
952
1034
  const { askForApproval } = useApproval();
953
1035
  const { data: operators } = useUserOperators(address, marketAddr);
954
1036
  const { mutateAsync: setOperatorPerms } = useSetOperatorPerms(marketAddr);
@@ -964,6 +1046,7 @@ const useMintPerp = (marketAddr) => {
964
1046
  if (!operator || !operatorAddr) throw new Error("Operator address not found");
965
1047
  if (!tickSpacing || currentTick === void 0) throw new Error("Pool data not found");
966
1048
  if (optionAssetIsToken0 === void 0 || !payoutAsset) throw new Error("Market data not found");
1049
+ if (!operator.auth) await signMessage();
967
1050
  if (!hasEnoughPerms) await setOperatorPerms({
968
1051
  operator: operatorAddr,
969
1052
  canMint: true,
@@ -998,15 +1081,16 @@ const useMintPerp = (marketAddr) => {
998
1081
  //#endregion
999
1082
  //#region src/hooks/perps/useClosePerp.ts
1000
1083
  const useClosePerp = () => {
1001
- const { operator } = usePerpsOperator();
1002
- return useMutation({ mutationFn: (body) => {
1084
+ const { operator, signMessage: { mutateAsync: signMessage } } = usePerpsOperator();
1085
+ return useMutation({ mutationFn: async (body) => {
1003
1086
  if (!operator) throw new Error("Operator not connected");
1004
- return operator.exercisePerp(body);
1087
+ if (!operator.auth) await signMessage();
1088
+ return await operator.exercisePerp(body);
1005
1089
  } });
1006
1090
  };
1007
1091
 
1008
1092
  //#endregion
1009
- //#region src/hooks/operators/useOperatorPerps.ts
1093
+ //#region src/hooks/operators/useOperatorPerms.ts
1010
1094
  const useOperatorPerms = (marketAddr, userAddr, operatorAddr) => {
1011
1095
  const { data,...rest } = useReadContract({
1012
1096
  abi: optionsMarketAbi,