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.
Files changed (55) hide show
  1. package/README.md +38 -11
  2. package/dist/AnimatedNumber.d.ts +10 -0
  3. package/dist/AnimatedNumber.d.ts.map +1 -0
  4. package/dist/AnimatedNumber.js +35 -0
  5. package/dist/AnimatedNumber.js.map +1 -0
  6. package/dist/BandPanel.d.ts.map +1 -1
  7. package/dist/BandPanel.js +50 -4
  8. package/dist/BandPanel.js.map +1 -1
  9. package/dist/BotDecisionPanel.d.ts.map +1 -1
  10. package/dist/BotDecisionPanel.js +24 -15
  11. package/dist/BotDecisionPanel.js.map +1 -1
  12. package/dist/ContractEventFeed.d.ts.map +1 -1
  13. package/dist/ContractEventFeed.js +11 -2
  14. package/dist/ContractEventFeed.js.map +1 -1
  15. package/dist/GasBadge.d.ts.map +1 -1
  16. package/dist/GasBadge.js +10 -2
  17. package/dist/GasBadge.js.map +1 -1
  18. package/dist/OrderBookWidget.d.ts.map +1 -1
  19. package/dist/OrderBookWidget.js +27 -3
  20. package/dist/OrderBookWidget.js.map +1 -1
  21. package/dist/RegimeBadge.d.ts.map +1 -1
  22. package/dist/RegimeBadge.js +3 -1
  23. package/dist/RegimeBadge.js.map +1 -1
  24. package/dist/Skeleton.d.ts +15 -0
  25. package/dist/Skeleton.d.ts.map +1 -0
  26. package/dist/Skeleton.js +26 -0
  27. package/dist/Skeleton.js.map +1 -0
  28. package/dist/StrategyValueSparkline.d.ts +9 -0
  29. package/dist/StrategyValueSparkline.d.ts.map +1 -0
  30. package/dist/StrategyValueSparkline.js +99 -0
  31. package/dist/StrategyValueSparkline.js.map +1 -0
  32. package/dist/SwapWidget.d.ts +12 -0
  33. package/dist/SwapWidget.d.ts.map +1 -0
  34. package/dist/SwapWidget.js +46 -0
  35. package/dist/SwapWidget.js.map +1 -0
  36. package/dist/TradeTape.d.ts.map +1 -1
  37. package/dist/TradeTape.js +16 -7
  38. package/dist/TradeTape.js.map +1 -1
  39. package/dist/UniswapPoolStats.d.ts +7 -0
  40. package/dist/UniswapPoolStats.d.ts.map +1 -0
  41. package/dist/UniswapPoolStats.js +66 -0
  42. package/dist/UniswapPoolStats.js.map +1 -0
  43. package/dist/index.d.ts +7 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +11 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/useStrategyValueHistory.d.ts +24 -0
  48. package/dist/useStrategyValueHistory.d.ts.map +1 -0
  49. package/dist/useStrategyValueHistory.js +112 -0
  50. package/dist/useStrategyValueHistory.js.map +1 -0
  51. package/dist/useUniswapPoolStats.d.ts +24 -0
  52. package/dist/useUniswapPoolStats.d.ts.map +1 -0
  53. package/dist/useUniswapPoolStats.js +85 -0
  54. package/dist/useUniswapPoolStats.js.map +1 -0
  55. 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.5",
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
  }