bandkit 1.0.5 → 1.0.7
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/README.md +38 -11
- package/dist/AnimatedNumber.d.ts +10 -0
- package/dist/AnimatedNumber.d.ts.map +1 -0
- package/dist/AnimatedNumber.js +35 -0
- package/dist/AnimatedNumber.js.map +1 -0
- package/dist/BandPanel.d.ts.map +1 -1
- package/dist/BandPanel.js +50 -4
- package/dist/BandPanel.js.map +1 -1
- package/dist/BotDecisionPanel.d.ts.map +1 -1
- package/dist/BotDecisionPanel.js +24 -15
- package/dist/BotDecisionPanel.js.map +1 -1
- package/dist/ContractEventFeed.d.ts.map +1 -1
- package/dist/ContractEventFeed.js +11 -2
- package/dist/ContractEventFeed.js.map +1 -1
- package/dist/GasBadge.d.ts.map +1 -1
- package/dist/GasBadge.js +10 -2
- package/dist/GasBadge.js.map +1 -1
- package/dist/OrderBookWidget.d.ts.map +1 -1
- package/dist/OrderBookWidget.js +27 -3
- package/dist/OrderBookWidget.js.map +1 -1
- package/dist/RegimeBadge.d.ts.map +1 -1
- package/dist/RegimeBadge.js +3 -1
- package/dist/RegimeBadge.js.map +1 -1
- package/dist/Skeleton.d.ts +15 -0
- package/dist/Skeleton.d.ts.map +1 -0
- package/dist/Skeleton.js +26 -0
- package/dist/Skeleton.js.map +1 -0
- package/dist/StrategyValueSparkline.d.ts +9 -0
- package/dist/StrategyValueSparkline.d.ts.map +1 -0
- package/dist/StrategyValueSparkline.js +99 -0
- package/dist/StrategyValueSparkline.js.map +1 -0
- package/dist/SwapWidget.d.ts +12 -0
- package/dist/SwapWidget.d.ts.map +1 -0
- package/dist/SwapWidget.js +46 -0
- package/dist/SwapWidget.js.map +1 -0
- package/dist/TradeTape.d.ts.map +1 -1
- package/dist/TradeTape.js +16 -7
- package/dist/TradeTape.js.map +1 -1
- package/dist/UniswapPoolStats.d.ts +7 -0
- package/dist/UniswapPoolStats.d.ts.map +1 -0
- package/dist/UniswapPoolStats.js +66 -0
- package/dist/UniswapPoolStats.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/useStrategyValueHistory.d.ts +24 -0
- package/dist/useStrategyValueHistory.d.ts.map +1 -0
- package/dist/useStrategyValueHistory.js +112 -0
- package/dist/useStrategyValueHistory.js.map +1 -0
- package/dist/useUniswapPoolStats.d.ts +24 -0
- package/dist/useUniswapPoolStats.d.ts.map +1 -0
- package/dist/useUniswapPoolStats.js +85 -0
- package/dist/useUniswapPoolStats.js.map +1 -0
- package/package.json +7 -2
package/dist/index.js
CHANGED
|
@@ -29,6 +29,17 @@ export { useCoinbaseTicker } from "./useCoinbaseTicker.js";
|
|
|
29
29
|
export { useBotDecision } from "./useBotDecision.js";
|
|
30
30
|
export { computeBotDecision, computeBookImbalance, computeBookDepth, computeTradeImbalance, DEFAULT_DECISION_THRESHOLDS } from "./decisionEngine.js";
|
|
31
31
|
export { BotDecisionPanel } from "./BotDecisionPanel.js";
|
|
32
|
+
// --- Strategy value tracking --------------------------------------------
|
|
33
|
+
export { useStrategyValueHistory } from "./useStrategyValueHistory.js";
|
|
34
|
+
export { StrategyValueSparkline } from "./StrategyValueSparkline.js";
|
|
35
|
+
// --- UI primitives -------------------------------------------------------
|
|
36
|
+
export { Skeleton, SkeletonRow } from "./Skeleton.js";
|
|
37
|
+
export { AnimatedNumber } from "./AnimatedNumber.js";
|
|
38
|
+
// --- Swap surface --------------------------------------------------------
|
|
39
|
+
export { SwapWidget } from "./SwapWidget.js";
|
|
40
|
+
// --- Uniswap pool stats (on-chain market context) ------------------------
|
|
41
|
+
export { useUniswapPoolStats } from "./useUniswapPoolStats.js";
|
|
42
|
+
export { UniswapPoolStats } from "./UniswapPoolStats.js";
|
|
32
43
|
/** @deprecated Use BAND_STRATEGY_ABI. Will be removed in v1.0. */
|
|
33
44
|
export { BAND_STRATEGY_ABI as ETH_BOT_VAULT_ABI } from "./bandStrategyAbi.js";
|
|
34
45
|
/** @deprecated Use BAND_STRATEGY_BYTECODE. Will be removed in v1.0. */
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Address } from "viem";
|
|
2
|
+
import { type UseStrategyContractOptions } from "./useStrategyContract.js";
|
|
3
|
+
export type ValueSample = {
|
|
4
|
+
at: number;
|
|
5
|
+
contractEth: number;
|
|
6
|
+
allocatedEth: number;
|
|
7
|
+
totalEth: number;
|
|
8
|
+
};
|
|
9
|
+
export type UseStrategyValueHistoryOptions = UseStrategyContractOptions & {
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
sampleIntervalMs?: number;
|
|
12
|
+
maxSamples?: number;
|
|
13
|
+
storageKey?: (address: Address) => string;
|
|
14
|
+
};
|
|
15
|
+
export type UseStrategyValueHistoryResult = {
|
|
16
|
+
samples: ValueSample[];
|
|
17
|
+
currentTotalEth: number;
|
|
18
|
+
firstTotalEth: number;
|
|
19
|
+
changeEth: number;
|
|
20
|
+
changePct: number | null;
|
|
21
|
+
clear: () => void;
|
|
22
|
+
};
|
|
23
|
+
export declare function useStrategyValueHistory(options: UseStrategyValueHistoryOptions): UseStrategyValueHistoryResult;
|
|
24
|
+
//# sourceMappingURL=useStrategyValueHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrategyValueHistory.d.ts","sourceRoot":"","sources":["../src/useStrategyValueHistory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEhG,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,0BAA0B,GAAG;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAkCF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,8BAA8B,GACtC,6BAA6B,CA8E/B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { useStrategyContract } from "./useStrategyContract.js";
|
|
3
|
+
const DEFAULT_INTERVAL_MS = 10_000;
|
|
4
|
+
const DEFAULT_MAX_SAMPLES = 360; // ~1 hour at 10s
|
|
5
|
+
const STORAGE_PREFIX = "bandkit:value-history:";
|
|
6
|
+
function defaultStorageKey(address) {
|
|
7
|
+
return `${STORAGE_PREFIX}${address.toLowerCase()}`;
|
|
8
|
+
}
|
|
9
|
+
function readStored(key) {
|
|
10
|
+
if (typeof window === "undefined")
|
|
11
|
+
return [];
|
|
12
|
+
try {
|
|
13
|
+
const raw = window.localStorage.getItem(key);
|
|
14
|
+
if (!raw)
|
|
15
|
+
return [];
|
|
16
|
+
const parsed = JSON.parse(raw);
|
|
17
|
+
if (!Array.isArray(parsed))
|
|
18
|
+
return [];
|
|
19
|
+
return parsed.filter((s) => typeof s.at === "number" && typeof s.totalEth === "number" && Number.isFinite(s.totalEth));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function writeStored(key, samples) {
|
|
26
|
+
if (typeof window === "undefined")
|
|
27
|
+
return;
|
|
28
|
+
try {
|
|
29
|
+
window.localStorage.setItem(key, JSON.stringify(samples));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// quota or disabled — ignore
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function useStrategyValueHistory(options) {
|
|
36
|
+
const enabled = options.enabled ?? true;
|
|
37
|
+
const intervalMs = options.sampleIntervalMs ?? DEFAULT_INTERVAL_MS;
|
|
38
|
+
const maxSamples = options.maxSamples ?? DEFAULT_MAX_SAMPLES;
|
|
39
|
+
const storageKeyFn = options.storageKey ?? defaultStorageKey;
|
|
40
|
+
const strategy = useStrategyContract(options);
|
|
41
|
+
const address = options.strategyContractAddress;
|
|
42
|
+
const [samples, setSamples] = useState([]);
|
|
43
|
+
const lastWriteAtRef = useRef(0);
|
|
44
|
+
// Hydrate from storage when address changes
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (!address) {
|
|
47
|
+
setSamples([]);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const stored = readStored(storageKeyFn(address));
|
|
51
|
+
setSamples(stored);
|
|
52
|
+
}, [address, storageKeyFn]);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!enabled || !address)
|
|
55
|
+
return;
|
|
56
|
+
if (typeof window === "undefined")
|
|
57
|
+
return;
|
|
58
|
+
function sample() {
|
|
59
|
+
const contractEth = Number(strategy.balanceEth);
|
|
60
|
+
const allocatedEth = Number(strategy.allocatedToStrategyEth);
|
|
61
|
+
if (!Number.isFinite(contractEth) || !Number.isFinite(allocatedEth))
|
|
62
|
+
return;
|
|
63
|
+
const totalEth = contractEth + allocatedEth;
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
if (now - lastWriteAtRef.current < intervalMs - 250)
|
|
66
|
+
return;
|
|
67
|
+
lastWriteAtRef.current = now;
|
|
68
|
+
setSamples((prev) => {
|
|
69
|
+
const next = [...prev, { at: now, contractEth, allocatedEth, totalEth }].slice(-maxSamples);
|
|
70
|
+
if (address)
|
|
71
|
+
writeStored(storageKeyFn(address), next);
|
|
72
|
+
return next;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
sample();
|
|
76
|
+
const id = window.setInterval(sample, intervalMs);
|
|
77
|
+
return () => window.clearInterval(id);
|
|
78
|
+
}, [
|
|
79
|
+
address,
|
|
80
|
+
enabled,
|
|
81
|
+
intervalMs,
|
|
82
|
+
maxSamples,
|
|
83
|
+
storageKeyFn,
|
|
84
|
+
strategy.allocatedToStrategyEth,
|
|
85
|
+
strategy.balanceEth
|
|
86
|
+
]);
|
|
87
|
+
return useMemo(() => {
|
|
88
|
+
const currentTotalEth = samples.length > 0 ? samples[samples.length - 1].totalEth : 0;
|
|
89
|
+
const firstTotalEth = samples.length > 0 ? samples[0].totalEth : 0;
|
|
90
|
+
const changeEth = currentTotalEth - firstTotalEth;
|
|
91
|
+
const changePct = firstTotalEth > 0 ? (changeEth / firstTotalEth) * 100 : null;
|
|
92
|
+
return {
|
|
93
|
+
samples,
|
|
94
|
+
currentTotalEth,
|
|
95
|
+
firstTotalEth,
|
|
96
|
+
changeEth,
|
|
97
|
+
changePct,
|
|
98
|
+
clear: () => {
|
|
99
|
+
if (address) {
|
|
100
|
+
try {
|
|
101
|
+
window.localStorage.removeItem(storageKeyFn(address));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// ignore
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
setSamples([]);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}, [address, samples, storageKeyFn]);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=useStrategyValueHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrategyValueHistory.js","sourceRoot":"","sources":["../src/useStrategyValueHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type UniswapPoolStatsStatus = "idle" | "loading" | "live" | "error";
|
|
2
|
+
export type UniswapPoolStats = {
|
|
3
|
+
poolId: string;
|
|
4
|
+
token0Symbol: string;
|
|
5
|
+
token1Symbol: string;
|
|
6
|
+
feeTierBps: number;
|
|
7
|
+
totalValueLockedUsd: number;
|
|
8
|
+
volume24hUsd: number;
|
|
9
|
+
fees24hUsd: number;
|
|
10
|
+
updatedAt?: Date;
|
|
11
|
+
};
|
|
12
|
+
export type UseUniswapPoolStatsOptions = {
|
|
13
|
+
poolId?: string;
|
|
14
|
+
subgraphUrl?: string;
|
|
15
|
+
refetchIntervalMs?: number;
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
};
|
|
18
|
+
export type UseUniswapPoolStatsResult = {
|
|
19
|
+
stats: UniswapPoolStats | null;
|
|
20
|
+
status: UniswapPoolStatsStatus;
|
|
21
|
+
error?: string;
|
|
22
|
+
};
|
|
23
|
+
export declare function useUniswapPoolStats(options?: UseUniswapPoolStatsOptions): UseUniswapPoolStatsResult;
|
|
24
|
+
//# sourceMappingURL=useUniswapPoolStats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUniswapPoolStats.d.ts","sourceRoot":"","sources":["../src/useUniswapPoolStats.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAsCF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,yBAAyB,CA2DvG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { GraphQLClient, gql } from "graphql-request";
|
|
3
|
+
// Default: ETH/USDC 0.05% on mainnet
|
|
4
|
+
const DEFAULT_POOL_ID = "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640";
|
|
5
|
+
// Public hosted-service endpoint (may be migrated; consumers can override via prop).
|
|
6
|
+
const DEFAULT_SUBGRAPH = "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3";
|
|
7
|
+
const POOL_QUERY = gql `
|
|
8
|
+
query Pool($id: ID!) {
|
|
9
|
+
pool(id: $id) {
|
|
10
|
+
id
|
|
11
|
+
feeTier
|
|
12
|
+
totalValueLockedUSD
|
|
13
|
+
token0 {
|
|
14
|
+
symbol
|
|
15
|
+
}
|
|
16
|
+
token1 {
|
|
17
|
+
symbol
|
|
18
|
+
}
|
|
19
|
+
poolDayData(first: 1, orderBy: date, orderDirection: desc) {
|
|
20
|
+
volumeUSD
|
|
21
|
+
feesUSD
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
export function useUniswapPoolStats(options = {}) {
|
|
27
|
+
const enabled = options.enabled ?? true;
|
|
28
|
+
const poolId = (options.poolId ?? DEFAULT_POOL_ID).toLowerCase();
|
|
29
|
+
const subgraphUrl = options.subgraphUrl ?? DEFAULT_SUBGRAPH;
|
|
30
|
+
const refetchIntervalMs = options.refetchIntervalMs ?? 60_000;
|
|
31
|
+
const [stats, setStats] = useState(null);
|
|
32
|
+
const [status, setStatus] = useState("idle");
|
|
33
|
+
const [error, setError] = useState();
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (!enabled) {
|
|
36
|
+
setStatus("idle");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const client = new GraphQLClient(subgraphUrl);
|
|
40
|
+
let cancelled = false;
|
|
41
|
+
async function fetchOnce() {
|
|
42
|
+
if (!cancelled)
|
|
43
|
+
setStatus(stats ? "live" : "loading");
|
|
44
|
+
try {
|
|
45
|
+
const data = (await client.request(POOL_QUERY, { id: poolId }));
|
|
46
|
+
if (cancelled)
|
|
47
|
+
return;
|
|
48
|
+
if (!data.pool) {
|
|
49
|
+
setError("Pool not found in subgraph");
|
|
50
|
+
setStatus("error");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const day = data.pool.poolDayData[0];
|
|
54
|
+
setStats({
|
|
55
|
+
poolId: data.pool.id,
|
|
56
|
+
token0Symbol: data.pool.token0.symbol,
|
|
57
|
+
token1Symbol: data.pool.token1.symbol,
|
|
58
|
+
feeTierBps: Number(data.pool.feeTier) / 100,
|
|
59
|
+
totalValueLockedUsd: Number(data.pool.totalValueLockedUSD),
|
|
60
|
+
volume24hUsd: day ? Number(day.volumeUSD) : 0,
|
|
61
|
+
fees24hUsd: day ? Number(day.feesUSD) : 0,
|
|
62
|
+
updatedAt: new Date()
|
|
63
|
+
});
|
|
64
|
+
setStatus("live");
|
|
65
|
+
setError(undefined);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (cancelled)
|
|
69
|
+
return;
|
|
70
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
71
|
+
setStatus("error");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
fetchOnce();
|
|
75
|
+
const id = setInterval(fetchOnce, refetchIntervalMs);
|
|
76
|
+
return () => {
|
|
77
|
+
cancelled = true;
|
|
78
|
+
clearInterval(id);
|
|
79
|
+
};
|
|
80
|
+
// stats is intentionally excluded — only refetch on poolId/url change.
|
|
81
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
82
|
+
}, [enabled, poolId, refetchIntervalMs, subgraphUrl]);
|
|
83
|
+
return useMemo(() => ({ stats, status, error }), [stats, status, error]);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=useUniswapPoolStats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUniswapPoolStats.js","sourceRoot":"","sources":["../src/useUniswapPoolStats.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bandkit",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Open-source scaffolding for Ethereum range-bound trading strategies: strategy contract deployment, restricted executor, and React hooks. Strategy logic is not included.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -86,5 +86,10 @@
|
|
|
86
86
|
"bollinger-bands",
|
|
87
87
|
"defi",
|
|
88
88
|
"open-source"
|
|
89
|
-
]
|
|
89
|
+
],
|
|
90
|
+
"dependencies": {
|
|
91
|
+
"framer-motion": "^12.40.0",
|
|
92
|
+
"graphql-request": "^7.4.0",
|
|
93
|
+
"sonner": "^2.0.7"
|
|
94
|
+
}
|
|
90
95
|
}
|