@pyefi/sdk 0.1.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/LICENSE +21 -0
- package/README.md +81 -0
- package/dist/apy-store-CNq9A4Xc.d.ts +225 -0
- package/dist/chunk-5XHGVQ3Z.js +3626 -0
- package/dist/chunk-5XHGVQ3Z.js.map +1 -0
- package/dist/index.d.ts +317 -0
- package/dist/index.js +1340 -0
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +53 -0
- package/dist/react.js +415 -0
- package/dist/react.js.map +1 -0
- package/package.json +87 -0
package/dist/react.js
ADDED
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createApyStore,
|
|
3
|
+
createBalanceStore,
|
|
4
|
+
createMarketStore,
|
|
5
|
+
createWalletStore,
|
|
6
|
+
fetchBalances,
|
|
7
|
+
fetchExchangeBalances,
|
|
8
|
+
fetchUserStakeAccounts,
|
|
9
|
+
getPyeConfig,
|
|
10
|
+
parseOrderBook
|
|
11
|
+
} from "./chunk-5XHGVQ3Z.js";
|
|
12
|
+
|
|
13
|
+
// src/react/providers.tsx
|
|
14
|
+
import { createContext, useContext, useRef } from "react";
|
|
15
|
+
import { useStore } from "zustand";
|
|
16
|
+
import { jsx } from "react/jsx-runtime";
|
|
17
|
+
var WalletStoreContext = createContext(null);
|
|
18
|
+
function WalletStoreProvider({ children }) {
|
|
19
|
+
const storeRef = useRef(void 0);
|
|
20
|
+
if (!storeRef.current) {
|
|
21
|
+
storeRef.current = createWalletStore();
|
|
22
|
+
}
|
|
23
|
+
return /* @__PURE__ */ jsx(WalletStoreContext.Provider, { value: storeRef.current, children });
|
|
24
|
+
}
|
|
25
|
+
function useWalletStore(selector) {
|
|
26
|
+
const store = useContext(WalletStoreContext);
|
|
27
|
+
if (!store) {
|
|
28
|
+
throw new Error("useWalletStore must be used within WalletStoreProvider");
|
|
29
|
+
}
|
|
30
|
+
return useStore(store, selector);
|
|
31
|
+
}
|
|
32
|
+
var BalanceStoreContext = createContext(null);
|
|
33
|
+
function BalanceStoreProvider({ children }) {
|
|
34
|
+
const storeRef = useRef(void 0);
|
|
35
|
+
if (!storeRef.current) {
|
|
36
|
+
storeRef.current = createBalanceStore();
|
|
37
|
+
}
|
|
38
|
+
return /* @__PURE__ */ jsx(BalanceStoreContext.Provider, { value: storeRef.current, children });
|
|
39
|
+
}
|
|
40
|
+
function useBalanceStore(selector) {
|
|
41
|
+
const store = useContext(BalanceStoreContext);
|
|
42
|
+
if (!store) {
|
|
43
|
+
throw new Error("useBalanceStore must be used within BalanceStoreProvider");
|
|
44
|
+
}
|
|
45
|
+
return useStore(store, selector);
|
|
46
|
+
}
|
|
47
|
+
var MarketStoreContext = createContext(null);
|
|
48
|
+
function MarketStoreProvider({ children }) {
|
|
49
|
+
const storeRef = useRef(void 0);
|
|
50
|
+
if (!storeRef.current) {
|
|
51
|
+
storeRef.current = createMarketStore();
|
|
52
|
+
}
|
|
53
|
+
return /* @__PURE__ */ jsx(MarketStoreContext.Provider, { value: storeRef.current, children });
|
|
54
|
+
}
|
|
55
|
+
function useMarketStore(selector) {
|
|
56
|
+
const store = useContext(MarketStoreContext);
|
|
57
|
+
if (!store) {
|
|
58
|
+
throw new Error("useMarketStore must be used within MarketStoreProvider");
|
|
59
|
+
}
|
|
60
|
+
return useStore(store, selector);
|
|
61
|
+
}
|
|
62
|
+
var ApyStoreContext = createContext(null);
|
|
63
|
+
function ApyStoreProvider({ children }) {
|
|
64
|
+
const storeRef = useRef(void 0);
|
|
65
|
+
if (!storeRef.current) {
|
|
66
|
+
storeRef.current = createApyStore();
|
|
67
|
+
}
|
|
68
|
+
return /* @__PURE__ */ jsx(ApyStoreContext.Provider, { value: storeRef.current, children });
|
|
69
|
+
}
|
|
70
|
+
function useApyStore(selector) {
|
|
71
|
+
const store = useContext(ApyStoreContext);
|
|
72
|
+
if (!store) {
|
|
73
|
+
throw new Error("useApyStore must be used within ApyStoreProvider");
|
|
74
|
+
}
|
|
75
|
+
return useStore(store, selector);
|
|
76
|
+
}
|
|
77
|
+
function PyeSDKProvider({ children }) {
|
|
78
|
+
return /* @__PURE__ */ jsx(WalletStoreProvider, { children: /* @__PURE__ */ jsx(BalanceStoreProvider, { children: /* @__PURE__ */ jsx(MarketStoreProvider, { children: /* @__PURE__ */ jsx(ApyStoreProvider, { children }) }) }) });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// src/react/BalanceSyncer.tsx
|
|
82
|
+
import { useEffect, useRef as useRef2 } from "react";
|
|
83
|
+
import { useConnection } from "@solana/wallet-adapter-react";
|
|
84
|
+
import { PublicKey } from "@solana/web3.js";
|
|
85
|
+
|
|
86
|
+
// src/lib/stake-accounts-cache.ts
|
|
87
|
+
var STORAGE_PREFIX = "pye.stakeAccounts.v1.";
|
|
88
|
+
var MAX_AGE_MS = 24 * 60 * 60 * 1e3;
|
|
89
|
+
function getStorage() {
|
|
90
|
+
try {
|
|
91
|
+
if (typeof window === "undefined") return null;
|
|
92
|
+
return window.localStorage;
|
|
93
|
+
} catch (e) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function readCachedStakeAccounts(publicKey) {
|
|
98
|
+
const storage = getStorage();
|
|
99
|
+
if (!storage) return null;
|
|
100
|
+
try {
|
|
101
|
+
const raw = storage.getItem(STORAGE_PREFIX + publicKey);
|
|
102
|
+
if (!raw) return null;
|
|
103
|
+
const parsed = JSON.parse(raw);
|
|
104
|
+
if (!(parsed == null ? void 0 : parsed.timestamp) || !Array.isArray(parsed.accounts)) return null;
|
|
105
|
+
if (Date.now() - parsed.timestamp > MAX_AGE_MS) return null;
|
|
106
|
+
return parsed.accounts;
|
|
107
|
+
} catch (e) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function writeCachedStakeAccounts(publicKey, accounts) {
|
|
112
|
+
const storage = getStorage();
|
|
113
|
+
if (!storage) return;
|
|
114
|
+
try {
|
|
115
|
+
const payload = { timestamp: Date.now(), accounts };
|
|
116
|
+
storage.setItem(STORAGE_PREFIX + publicKey, JSON.stringify(payload));
|
|
117
|
+
} catch (e) {
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// src/react/BalanceSyncer.tsx
|
|
122
|
+
var POLL_INTERVAL_MS = 5 * 60 * 1e3;
|
|
123
|
+
function BalanceSyncer() {
|
|
124
|
+
const { connection } = useConnection();
|
|
125
|
+
const status = useWalletStore((s) => s.status);
|
|
126
|
+
const publicKey = useWalletStore((s) => s.publicKey);
|
|
127
|
+
const setWalletBalances = useBalanceStore((s) => s.setWalletBalances);
|
|
128
|
+
const setExchangeBalances = useBalanceStore((s) => s.setExchangeBalances);
|
|
129
|
+
const setOpenOrdersBalances = useBalanceStore((s) => s.setOpenOrdersBalances);
|
|
130
|
+
const setSolBalances = useBalanceStore((s) => s.setSolBalances);
|
|
131
|
+
const setSolOpenOrdersBalances = useBalanceStore((s) => s.setSolOpenOrdersBalances);
|
|
132
|
+
const setOpenOrders = useBalanceStore((s) => s.setOpenOrders);
|
|
133
|
+
const setPerMarketBaseBalances = useBalanceStore((s) => s.setPerMarketBaseBalances);
|
|
134
|
+
const setUserStakeAccounts = useBalanceStore((s) => s.setUserStakeAccounts);
|
|
135
|
+
const setUserStakeAccountsLoading = useBalanceStore((s) => s.setUserStakeAccountsLoading);
|
|
136
|
+
const resetBalances = useBalanceStore((s) => s.resetBalances);
|
|
137
|
+
const marketsRecord = useMarketStore((s) => s.markets);
|
|
138
|
+
const markets = Object.values(marketsRecord);
|
|
139
|
+
const intervalRef = useRef2(null);
|
|
140
|
+
const prevPublicKeyRef = useRef2(null);
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
if (intervalRef.current) {
|
|
143
|
+
clearInterval(intervalRef.current);
|
|
144
|
+
intervalRef.current = null;
|
|
145
|
+
}
|
|
146
|
+
if (status !== "connected" || !publicKey) {
|
|
147
|
+
prevPublicKeyRef.current = null;
|
|
148
|
+
resetBalances();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const walletChanged = prevPublicKeyRef.current !== publicKey;
|
|
152
|
+
if (walletChanged) {
|
|
153
|
+
console.log("[BalanceSyncer] wallet changed:", prevPublicKeyRef.current, "\u2192", publicKey);
|
|
154
|
+
prevPublicKeyRef.current = publicKey;
|
|
155
|
+
resetBalances();
|
|
156
|
+
const cached = readCachedStakeAccounts(publicKey);
|
|
157
|
+
if (cached && cached.length > 0) {
|
|
158
|
+
setUserStakeAccounts(cached);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const owner = new PublicKey(publicKey);
|
|
162
|
+
const pkAtStart = publicKey;
|
|
163
|
+
setUserStakeAccountsLoading(true);
|
|
164
|
+
fetchUserStakeAccounts(connection, owner).then((stakeAccounts) => {
|
|
165
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
166
|
+
setUserStakeAccounts(stakeAccounts);
|
|
167
|
+
writeCachedStakeAccounts(pkAtStart, stakeAccounts);
|
|
168
|
+
}).catch((err) => {
|
|
169
|
+
console.error("[BalanceSyncer] stake-accounts fetch failed:", err);
|
|
170
|
+
}).finally(() => {
|
|
171
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
172
|
+
setUserStakeAccountsLoading(false);
|
|
173
|
+
});
|
|
174
|
+
fetchBalances(connection, owner).then((walletBals) => {
|
|
175
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
176
|
+
setWalletBalances(walletBals);
|
|
177
|
+
}).catch((err) => {
|
|
178
|
+
console.error("[BalanceSyncer] wallet-balances fetch failed:", err);
|
|
179
|
+
});
|
|
180
|
+
fetchExchangeBalances(connection, owner, markets).then((exchangeResult) => {
|
|
181
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
182
|
+
setExchangeBalances(exchangeResult.exchangeBalances);
|
|
183
|
+
setOpenOrdersBalances(exchangeResult.openOrdersBalances);
|
|
184
|
+
setSolBalances(exchangeResult.solBalances);
|
|
185
|
+
setSolOpenOrdersBalances(exchangeResult.solOpenOrdersBalances);
|
|
186
|
+
setOpenOrders(exchangeResult.openOrders);
|
|
187
|
+
setPerMarketBaseBalances(exchangeResult.perMarketBaseBalances);
|
|
188
|
+
}).catch((err) => {
|
|
189
|
+
console.error("[BalanceSyncer] exchange-balances fetch failed:", err);
|
|
190
|
+
});
|
|
191
|
+
intervalRef.current = setInterval(() => {
|
|
192
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
193
|
+
fetchUserStakeAccounts(connection, owner).then((stakeAccounts) => {
|
|
194
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
195
|
+
setUserStakeAccounts(stakeAccounts);
|
|
196
|
+
writeCachedStakeAccounts(pkAtStart, stakeAccounts);
|
|
197
|
+
}).catch((err) => {
|
|
198
|
+
console.error("[BalanceSyncer] stake-accounts poll failed:", err);
|
|
199
|
+
});
|
|
200
|
+
fetchBalances(connection, owner).then((walletBals) => {
|
|
201
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
202
|
+
setWalletBalances(walletBals);
|
|
203
|
+
}).catch((err) => {
|
|
204
|
+
console.error("[BalanceSyncer] wallet-balances poll failed:", err);
|
|
205
|
+
});
|
|
206
|
+
fetchExchangeBalances(connection, owner, markets).then((exchangeResult) => {
|
|
207
|
+
if (prevPublicKeyRef.current !== pkAtStart) return;
|
|
208
|
+
setExchangeBalances(exchangeResult.exchangeBalances);
|
|
209
|
+
setOpenOrdersBalances(exchangeResult.openOrdersBalances);
|
|
210
|
+
setSolBalances(exchangeResult.solBalances);
|
|
211
|
+
setSolOpenOrdersBalances(exchangeResult.solOpenOrdersBalances);
|
|
212
|
+
setOpenOrders(exchangeResult.openOrders);
|
|
213
|
+
setPerMarketBaseBalances(exchangeResult.perMarketBaseBalances);
|
|
214
|
+
}).catch((err) => {
|
|
215
|
+
console.error("[BalanceSyncer] exchange-balances poll failed:", err);
|
|
216
|
+
});
|
|
217
|
+
}, POLL_INTERVAL_MS);
|
|
218
|
+
return () => {
|
|
219
|
+
if (intervalRef.current) {
|
|
220
|
+
clearInterval(intervalRef.current);
|
|
221
|
+
intervalRef.current = null;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}, [
|
|
225
|
+
status,
|
|
226
|
+
publicKey,
|
|
227
|
+
connection,
|
|
228
|
+
marketsRecord,
|
|
229
|
+
setWalletBalances,
|
|
230
|
+
setExchangeBalances,
|
|
231
|
+
setOpenOrdersBalances,
|
|
232
|
+
setSolBalances,
|
|
233
|
+
setSolOpenOrdersBalances,
|
|
234
|
+
setOpenOrders,
|
|
235
|
+
setPerMarketBaseBalances,
|
|
236
|
+
setUserStakeAccounts,
|
|
237
|
+
setUserStakeAccountsLoading,
|
|
238
|
+
resetBalances
|
|
239
|
+
]);
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// src/react/WalletSyncer.tsx
|
|
244
|
+
import { useEffect as useEffect2, useRef as useRef3 } from "react";
|
|
245
|
+
import { useWallet, useConnection as useConnection2 } from "@solana/wallet-adapter-react";
|
|
246
|
+
import { address as toAddress } from "@solana/kit";
|
|
247
|
+
function shortenAddress(address) {
|
|
248
|
+
return address.slice(0, 4) + "..." + address.slice(-4);
|
|
249
|
+
}
|
|
250
|
+
function WalletSyncer() {
|
|
251
|
+
const { publicKey, connected, connecting } = useWallet();
|
|
252
|
+
const { connection } = useConnection2();
|
|
253
|
+
const fetchedKeyRef = useRef3(null);
|
|
254
|
+
const setWalletStatus = useWalletStore((s) => s.setWalletStatus);
|
|
255
|
+
const setWalletPublicKey = useWalletStore((s) => s.setWalletPublicKey);
|
|
256
|
+
const setDisplayAddress = useWalletStore((s) => s.setDisplayAddress);
|
|
257
|
+
const setBalanceLamports = useWalletStore((s) => s.setBalanceLamports);
|
|
258
|
+
const setWalletInitialized = useWalletStore((s) => s.setWalletInitialized);
|
|
259
|
+
const resetWallet = useWalletStore((s) => s.resetWallet);
|
|
260
|
+
const fetchBalance = async (retries = 3) => {
|
|
261
|
+
if (!publicKey || !connection) return;
|
|
262
|
+
for (let i = 0; i < retries; i++) {
|
|
263
|
+
try {
|
|
264
|
+
const balance = await connection.getBalance(publicKey, "confirmed");
|
|
265
|
+
console.log("[WalletSyncer] balanceLamports:", balance);
|
|
266
|
+
setBalanceLamports(balance);
|
|
267
|
+
return;
|
|
268
|
+
} catch (e) {
|
|
269
|
+
if (i < retries - 1) {
|
|
270
|
+
await new Promise((r) => setTimeout(r, 1e3 * (i + 1)));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
console.warn("[WalletSyncer] balance fetch failed after all retries");
|
|
275
|
+
setBalanceLamports(null);
|
|
276
|
+
};
|
|
277
|
+
useEffect2(() => {
|
|
278
|
+
setWalletInitialized(true);
|
|
279
|
+
if (connecting) {
|
|
280
|
+
setWalletStatus("connecting");
|
|
281
|
+
} else if (connected && publicKey) {
|
|
282
|
+
const base58 = publicKey.toBase58();
|
|
283
|
+
if (fetchedKeyRef.current && fetchedKeyRef.current !== base58) {
|
|
284
|
+
console.log("[WalletSyncer] wallet changed:", fetchedKeyRef.current, "\u2192", base58);
|
|
285
|
+
}
|
|
286
|
+
setWalletStatus("connected");
|
|
287
|
+
setWalletPublicKey(toAddress(base58));
|
|
288
|
+
setDisplayAddress(shortenAddress(base58));
|
|
289
|
+
if (fetchedKeyRef.current !== base58) {
|
|
290
|
+
fetchedKeyRef.current = base58;
|
|
291
|
+
fetchBalance();
|
|
292
|
+
}
|
|
293
|
+
} else {
|
|
294
|
+
resetWallet();
|
|
295
|
+
fetchedKeyRef.current = null;
|
|
296
|
+
}
|
|
297
|
+
}, [connected, connecting, publicKey]);
|
|
298
|
+
useEffect2(() => {
|
|
299
|
+
if (!connected || !publicKey) return;
|
|
300
|
+
const interval = setInterval(() => fetchBalance(1), 3e4);
|
|
301
|
+
return () => clearInterval(interval);
|
|
302
|
+
}, [connected, publicKey == null ? void 0 : publicKey.toBase58()]);
|
|
303
|
+
useEffect2(() => {
|
|
304
|
+
if (!connected || !publicKey || !connection) return;
|
|
305
|
+
const id = connection.onAccountChange(
|
|
306
|
+
publicKey,
|
|
307
|
+
(accountInfo) => setBalanceLamports(accountInfo.lamports),
|
|
308
|
+
"confirmed"
|
|
309
|
+
);
|
|
310
|
+
return () => {
|
|
311
|
+
connection.removeAccountChangeListener(id);
|
|
312
|
+
};
|
|
313
|
+
}, [connected, publicKey == null ? void 0 : publicKey.toBase58(), connection]);
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// src/react/MarketSyncer.tsx
|
|
318
|
+
import { useEffect as useEffect3 } from "react";
|
|
319
|
+
import { createClient } from "@supabase/supabase-js";
|
|
320
|
+
function MarketSyncer() {
|
|
321
|
+
const fetchMarkets = useMarketStore((s) => s.fetchMarkets);
|
|
322
|
+
const fetchRtBacking = useMarketStore((s) => s.fetchRtBacking);
|
|
323
|
+
const updateMarketOrderBook = useMarketStore((s) => s.updateMarketOrderBook);
|
|
324
|
+
const pubkeyIndex = useMarketStore((s) => s.pubkeyIndex);
|
|
325
|
+
useEffect3(() => {
|
|
326
|
+
fetchMarkets();
|
|
327
|
+
fetchRtBacking();
|
|
328
|
+
}, [fetchMarkets, fetchRtBacking]);
|
|
329
|
+
useEffect3(() => {
|
|
330
|
+
const interval = setInterval(() => {
|
|
331
|
+
fetchRtBacking();
|
|
332
|
+
}, 6e4);
|
|
333
|
+
return () => clearInterval(interval);
|
|
334
|
+
}, [fetchRtBacking]);
|
|
335
|
+
useEffect3(() => {
|
|
336
|
+
let config;
|
|
337
|
+
try {
|
|
338
|
+
config = getPyeConfig();
|
|
339
|
+
} catch (e) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const supabase = createClient(config.supabaseUrl, config.supabaseAnonKey);
|
|
343
|
+
const channel = supabase.channel("manifest-markets-changes").on(
|
|
344
|
+
"postgres_changes",
|
|
345
|
+
{
|
|
346
|
+
event: "UPDATE",
|
|
347
|
+
schema: "public",
|
|
348
|
+
table: "manifest_markets"
|
|
349
|
+
},
|
|
350
|
+
(payload) => {
|
|
351
|
+
const row = payload.new;
|
|
352
|
+
if (!row.pubkey || !row.account_data) return;
|
|
353
|
+
if (!pubkeyIndex[row.pubkey]) return;
|
|
354
|
+
try {
|
|
355
|
+
const summary = parseOrderBook(row.pubkey, row.account_data);
|
|
356
|
+
updateMarketOrderBook(row.pubkey, summary);
|
|
357
|
+
} catch (e) {
|
|
358
|
+
console.error(
|
|
359
|
+
`Realtime parse error for ${row.pubkey}:`,
|
|
360
|
+
e instanceof Error ? e.message : e
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
).subscribe();
|
|
365
|
+
return () => {
|
|
366
|
+
supabase.removeChannel(channel);
|
|
367
|
+
};
|
|
368
|
+
}, [pubkeyIndex, updateMarketOrderBook]);
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// src/react/ApySyncer.tsx
|
|
373
|
+
import { useEffect as useEffect4, useMemo } from "react";
|
|
374
|
+
var POLL_INTERVAL_MS2 = 5 * 60 * 1e3;
|
|
375
|
+
function ApySyncer() {
|
|
376
|
+
const fetchApyForVoteAccounts = useApyStore((s) => s.fetchApyForVoteAccounts);
|
|
377
|
+
const userStakeAccounts = useBalanceStore((s) => s.userStakeAccounts);
|
|
378
|
+
const voteAccounts = useMemo(() => {
|
|
379
|
+
const set = /* @__PURE__ */ new Set();
|
|
380
|
+
const config = getPyeConfig();
|
|
381
|
+
if (config.voteAccount) set.add(config.voteAccount);
|
|
382
|
+
for (const sa of userStakeAccounts) {
|
|
383
|
+
if (sa.validatorVoteAccount) set.add(sa.validatorVoteAccount);
|
|
384
|
+
}
|
|
385
|
+
return Array.from(set);
|
|
386
|
+
}, [userStakeAccounts]);
|
|
387
|
+
useEffect4(() => {
|
|
388
|
+
if (voteAccounts.length === 0) return;
|
|
389
|
+
fetchApyForVoteAccounts(voteAccounts);
|
|
390
|
+
}, [voteAccounts, fetchApyForVoteAccounts]);
|
|
391
|
+
useEffect4(() => {
|
|
392
|
+
if (voteAccounts.length === 0) return;
|
|
393
|
+
const interval = setInterval(() => {
|
|
394
|
+
fetchApyForVoteAccounts(voteAccounts, true);
|
|
395
|
+
}, POLL_INTERVAL_MS2);
|
|
396
|
+
return () => clearInterval(interval);
|
|
397
|
+
}, [voteAccounts, fetchApyForVoteAccounts]);
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
export {
|
|
401
|
+
ApyStoreProvider,
|
|
402
|
+
ApySyncer,
|
|
403
|
+
BalanceStoreProvider,
|
|
404
|
+
BalanceSyncer,
|
|
405
|
+
MarketStoreProvider,
|
|
406
|
+
MarketSyncer,
|
|
407
|
+
PyeSDKProvider,
|
|
408
|
+
WalletStoreProvider,
|
|
409
|
+
WalletSyncer,
|
|
410
|
+
useApyStore,
|
|
411
|
+
useBalanceStore,
|
|
412
|
+
useMarketStore,
|
|
413
|
+
useWalletStore
|
|
414
|
+
};
|
|
415
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/providers.tsx","../src/react/BalanceSyncer.tsx","../src/lib/stake-accounts-cache.ts","../src/react/WalletSyncer.tsx","../src/react/MarketSyncer.tsx","../src/react/ApySyncer.tsx"],"sourcesContent":["import { createContext, useContext, useRef, type ReactNode } from \"react\";\nimport { useStore } from \"zustand\";\nimport { createWalletStore, type WalletStore } from \"../stores/wallet-store\";\nimport { createBalanceStore, type BalanceStore } from \"../stores/balance-store\";\nimport { createMarketStore, type MarketStore } from \"../stores/market-store\";\nimport { createApyStore, type ApyStore } from \"../stores/apy-store\";\n\n// ── Wallet Store ──\n\ntype WalletStoreApi = ReturnType<typeof createWalletStore>;\nconst WalletStoreContext = createContext<WalletStoreApi | null>(null);\n\nexport function WalletStoreProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<WalletStoreApi>(undefined);\n if (!storeRef.current) {\n storeRef.current = createWalletStore();\n }\n return (\n <WalletStoreContext.Provider value={storeRef.current}>\n {children}\n </WalletStoreContext.Provider>\n );\n}\n\nexport function useWalletStore<T>(selector: (state: WalletStore) => T): T {\n const store = useContext(WalletStoreContext);\n if (!store) {\n throw new Error(\"useWalletStore must be used within WalletStoreProvider\");\n }\n return useStore(store, selector);\n}\n\n// ── Balance Store ──\n\ntype BalanceStoreApi = ReturnType<typeof createBalanceStore>;\nconst BalanceStoreContext = createContext<BalanceStoreApi | null>(null);\n\nexport function BalanceStoreProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<BalanceStoreApi>(undefined);\n if (!storeRef.current) {\n storeRef.current = createBalanceStore();\n }\n return (\n <BalanceStoreContext.Provider value={storeRef.current}>\n {children}\n </BalanceStoreContext.Provider>\n );\n}\n\nexport function useBalanceStore<T>(selector: (state: BalanceStore) => T): T {\n const store = useContext(BalanceStoreContext);\n if (!store) {\n throw new Error(\"useBalanceStore must be used within BalanceStoreProvider\");\n }\n return useStore(store, selector);\n}\n\n// ── Market Store ──\n\ntype MarketStoreApi = ReturnType<typeof createMarketStore>;\nconst MarketStoreContext = createContext<MarketStoreApi | null>(null);\n\nexport function MarketStoreProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<MarketStoreApi>(undefined);\n if (!storeRef.current) {\n storeRef.current = createMarketStore();\n }\n return (\n <MarketStoreContext.Provider value={storeRef.current}>\n {children}\n </MarketStoreContext.Provider>\n );\n}\n\nexport function useMarketStore<T>(selector: (state: MarketStore) => T): T {\n const store = useContext(MarketStoreContext);\n if (!store) {\n throw new Error(\"useMarketStore must be used within MarketStoreProvider\");\n }\n return useStore(store, selector);\n}\n\n// ── APY Store ──\n\ntype ApyStoreApi = ReturnType<typeof createApyStore>;\nconst ApyStoreContext = createContext<ApyStoreApi | null>(null);\n\nexport function ApyStoreProvider({ children }: { children: ReactNode }) {\n const storeRef = useRef<ApyStoreApi>(undefined);\n if (!storeRef.current) {\n storeRef.current = createApyStore();\n }\n return (\n <ApyStoreContext.Provider value={storeRef.current}>\n {children}\n </ApyStoreContext.Provider>\n );\n}\n\nexport function useApyStore<T>(selector: (state: ApyStore) => T): T {\n const store = useContext(ApyStoreContext);\n if (!store) {\n throw new Error(\"useApyStore must be used within ApyStoreProvider\");\n }\n return useStore(store, selector);\n}\n\n// ── Composed Provider ──\n\nexport function PyeSDKProvider({ children }: { children: ReactNode }) {\n return (\n <WalletStoreProvider>\n <BalanceStoreProvider>\n <MarketStoreProvider>\n <ApyStoreProvider>\n {children}\n </ApyStoreProvider>\n </MarketStoreProvider>\n </BalanceStoreProvider>\n </WalletStoreProvider>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useConnection } from \"@solana/wallet-adapter-react\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { useWalletStore, useBalanceStore, useMarketStore } from \"./providers\";\nimport { fetchBalances } from \"../lib/fetch-balances\";\nimport { fetchExchangeBalances } from \"../lib/fetch-exchange-balances\";\nimport { fetchUserStakeAccounts } from \"../lib/fetch-user-stake-accounts\";\nimport {\n readCachedStakeAccounts,\n writeCachedStakeAccounts,\n} from \"../lib/stake-accounts-cache\";\n\nconst POLL_INTERVAL_MS = 5 * 60 * 1000;\n\nexport default function BalanceSyncer() {\n const { connection } = useConnection();\n const status = useWalletStore((s) => s.status);\n const publicKey = useWalletStore((s) => s.publicKey);\n const setWalletBalances = useBalanceStore((s) => s.setWalletBalances);\n const setExchangeBalances = useBalanceStore((s) => s.setExchangeBalances);\n const setOpenOrdersBalances = useBalanceStore((s) => s.setOpenOrdersBalances);\n const setSolBalances = useBalanceStore((s) => s.setSolBalances);\n const setSolOpenOrdersBalances = useBalanceStore((s) => s.setSolOpenOrdersBalances);\n const setOpenOrders = useBalanceStore((s) => s.setOpenOrders);\n const setPerMarketBaseBalances = useBalanceStore((s) => s.setPerMarketBaseBalances);\n const setUserStakeAccounts = useBalanceStore((s) => s.setUserStakeAccounts);\n const setUserStakeAccountsLoading = useBalanceStore((s) => s.setUserStakeAccountsLoading);\n const resetBalances = useBalanceStore((s) => s.resetBalances);\n const marketsRecord = useMarketStore((s) => s.markets);\n const markets = Object.values(marketsRecord);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const prevPublicKeyRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n\n if (status !== \"connected\" || !publicKey) {\n prevPublicKeyRef.current = null;\n resetBalances();\n return;\n }\n\n const walletChanged = prevPublicKeyRef.current !== publicKey;\n if (walletChanged) {\n console.log(\"[BalanceSyncer] wallet changed:\", prevPublicKeyRef.current, \"→\", publicKey);\n prevPublicKeyRef.current = publicKey;\n resetBalances();\n\n // Hydrate from cache synchronously so WelcomeScreen can render enabled rows\n // before the expensive getParsedProgramAccounts scan finishes.\n const cached = readCachedStakeAccounts(publicKey);\n if (cached && cached.length > 0) {\n setUserStakeAccounts(cached);\n }\n }\n\n const owner = new PublicKey(publicKey);\n const pkAtStart = publicKey;\n\n // Fire the three fetches independently so each store slice updates the moment\n // its own request resolves, instead of waiting on the slowest of the batch.\n setUserStakeAccountsLoading(true);\n fetchUserStakeAccounts(connection, owner)\n .then((stakeAccounts) => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n setUserStakeAccounts(stakeAccounts);\n writeCachedStakeAccounts(pkAtStart, stakeAccounts);\n })\n .catch((err) => {\n console.error(\"[BalanceSyncer] stake-accounts fetch failed:\", err);\n })\n .finally(() => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n setUserStakeAccountsLoading(false);\n });\n\n fetchBalances(connection, owner)\n .then((walletBals) => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n setWalletBalances(walletBals);\n })\n .catch((err) => {\n console.error(\"[BalanceSyncer] wallet-balances fetch failed:\", err);\n });\n\n fetchExchangeBalances(connection, owner, markets)\n .then((exchangeResult) => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n setExchangeBalances(exchangeResult.exchangeBalances);\n setOpenOrdersBalances(exchangeResult.openOrdersBalances);\n setSolBalances(exchangeResult.solBalances);\n setSolOpenOrdersBalances(exchangeResult.solOpenOrdersBalances);\n setOpenOrders(exchangeResult.openOrders);\n setPerMarketBaseBalances(exchangeResult.perMarketBaseBalances);\n })\n .catch((err) => {\n console.error(\"[BalanceSyncer] exchange-balances fetch failed:\", err);\n });\n\n intervalRef.current = setInterval(() => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n fetchUserStakeAccounts(connection, owner)\n .then((stakeAccounts) => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n setUserStakeAccounts(stakeAccounts);\n writeCachedStakeAccounts(pkAtStart, stakeAccounts);\n })\n .catch((err) => {\n console.error(\"[BalanceSyncer] stake-accounts poll failed:\", err);\n });\n fetchBalances(connection, owner)\n .then((walletBals) => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n setWalletBalances(walletBals);\n })\n .catch((err) => {\n console.error(\"[BalanceSyncer] wallet-balances poll failed:\", err);\n });\n fetchExchangeBalances(connection, owner, markets)\n .then((exchangeResult) => {\n if (prevPublicKeyRef.current !== pkAtStart) return;\n setExchangeBalances(exchangeResult.exchangeBalances);\n setOpenOrdersBalances(exchangeResult.openOrdersBalances);\n setSolBalances(exchangeResult.solBalances);\n setSolOpenOrdersBalances(exchangeResult.solOpenOrdersBalances);\n setOpenOrders(exchangeResult.openOrders);\n setPerMarketBaseBalances(exchangeResult.perMarketBaseBalances);\n })\n .catch((err) => {\n console.error(\"[BalanceSyncer] exchange-balances poll failed:\", err);\n });\n }, POLL_INTERVAL_MS);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [\n status,\n publicKey,\n connection,\n marketsRecord,\n setWalletBalances,\n setExchangeBalances,\n setOpenOrdersBalances,\n setSolBalances,\n setSolOpenOrdersBalances,\n setOpenOrders,\n setPerMarketBaseBalances,\n setUserStakeAccounts,\n setUserStakeAccountsLoading,\n resetBalances,\n ]);\n\n return null;\n}\n","import type { UserStakeAccount } from \"../stores/balance-store\";\n\nconst STORAGE_PREFIX = \"pye.stakeAccounts.v1.\";\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\ninterface CachedPayload {\n timestamp: number;\n accounts: UserStakeAccount[];\n}\n\nfunction getStorage(): Storage | null {\n try {\n if (typeof window === \"undefined\") return null;\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nexport function readCachedStakeAccounts(\n publicKey: string,\n): UserStakeAccount[] | null {\n const storage = getStorage();\n if (!storage) return null;\n try {\n const raw = storage.getItem(STORAGE_PREFIX + publicKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as CachedPayload;\n if (!parsed?.timestamp || !Array.isArray(parsed.accounts)) return null;\n if (Date.now() - parsed.timestamp > MAX_AGE_MS) return null;\n return parsed.accounts;\n } catch {\n return null;\n }\n}\n\nexport function writeCachedStakeAccounts(\n publicKey: string,\n accounts: UserStakeAccount[],\n): void {\n const storage = getStorage();\n if (!storage) return;\n try {\n const payload: CachedPayload = { timestamp: Date.now(), accounts };\n storage.setItem(STORAGE_PREFIX + publicKey, JSON.stringify(payload));\n } catch {\n // Silently ignore quota / serialization errors — cache is a perf hint, not correctness.\n }\n}\n","import { useEffect, useRef } from \"react\";\nimport { useWallet, useConnection } from \"@solana/wallet-adapter-react\";\nimport { address as toAddress } from \"@solana/kit\";\nimport { useWalletStore } from \"./providers\";\n\nfunction shortenAddress(address: string): string {\n return address.slice(0, 4) + \"...\" + address.slice(-4);\n}\n\n/**\n * Invisible component that syncs the Solana wallet adapter state into the\n * Zustand wallet store.\n */\nexport default function WalletSyncer() {\n const { publicKey, connected, connecting } = useWallet();\n const { connection } = useConnection();\n const fetchedKeyRef = useRef<string | null>(null);\n\n const setWalletStatus = useWalletStore((s) => s.setWalletStatus);\n const setWalletPublicKey = useWalletStore((s) => s.setWalletPublicKey);\n const setDisplayAddress = useWalletStore((s) => s.setDisplayAddress);\n const setBalanceLamports = useWalletStore((s) => s.setBalanceLamports);\n const setWalletInitialized = useWalletStore((s) => s.setWalletInitialized);\n const resetWallet = useWalletStore((s) => s.resetWallet);\n\n const fetchBalance = async (retries = 3) => {\n if (!publicKey || !connection) return;\n for (let i = 0; i < retries; i++) {\n try {\n const balance = await connection.getBalance(publicKey, \"confirmed\");\n console.log(\"[WalletSyncer] balanceLamports:\", balance);\n setBalanceLamports(balance);\n return;\n } catch {\n if (i < retries - 1) {\n await new Promise((r) => setTimeout(r, 1000 * (i + 1)));\n }\n }\n }\n console.warn(\"[WalletSyncer] balance fetch failed after all retries\");\n setBalanceLamports(null);\n };\n\n useEffect(() => {\n setWalletInitialized(true);\n\n if (connecting) {\n setWalletStatus(\"connecting\");\n } else if (connected && publicKey) {\n const base58 = publicKey.toBase58();\n if (fetchedKeyRef.current && fetchedKeyRef.current !== base58) {\n console.log(\"[WalletSyncer] wallet changed:\", fetchedKeyRef.current, \"→\", base58);\n }\n setWalletStatus(\"connected\");\n setWalletPublicKey(toAddress(base58));\n setDisplayAddress(shortenAddress(base58));\n if (fetchedKeyRef.current !== base58) {\n fetchedKeyRef.current = base58;\n fetchBalance();\n }\n } else {\n resetWallet();\n fetchedKeyRef.current = null;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [connected, connecting, publicKey]);\n\n useEffect(() => {\n if (!connected || !publicKey) return;\n const interval = setInterval(() => fetchBalance(1), 30_000);\n return () => clearInterval(interval);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [connected, publicKey?.toBase58()]);\n\n useEffect(() => {\n if (!connected || !publicKey || !connection) return;\n const id = connection.onAccountChange(\n publicKey,\n (accountInfo) => setBalanceLamports(accountInfo.lamports),\n \"confirmed\",\n );\n return () => {\n connection.removeAccountChangeListener(id);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [connected, publicKey?.toBase58(), connection]);\n\n return null;\n}\n","import { useEffect } from \"react\";\nimport { createClient } from \"@supabase/supabase-js\";\nimport { useMarketStore } from \"./providers\";\nimport { parseOrderBook } from \"../lib/manifest-parser\";\nimport { getPyeConfig } from \"../config\";\n\n/**\n * Invisible component that:\n * 1. Fetches markets and RT backing on mount\n * 2. Polls RT backing every 60s\n * 3. Subscribes to Supabase Realtime for order book updates\n */\nexport default function MarketSyncer() {\n const fetchMarkets = useMarketStore((s) => s.fetchMarkets);\n const fetchRtBacking = useMarketStore((s) => s.fetchRtBacking);\n const updateMarketOrderBook = useMarketStore((s) => s.updateMarketOrderBook);\n const pubkeyIndex = useMarketStore((s) => s.pubkeyIndex);\n\n // Initial fetch\n useEffect(() => {\n fetchMarkets();\n fetchRtBacking();\n }, [fetchMarkets, fetchRtBacking]);\n\n // Re-poll rt_backing every 60s\n useEffect(() => {\n const interval = setInterval(() => {\n fetchRtBacking();\n }, 60_000);\n return () => clearInterval(interval);\n }, [fetchRtBacking]);\n\n // Supabase Realtime subscription for order book updates\n useEffect(() => {\n let config: ReturnType<typeof getPyeConfig>;\n try {\n config = getPyeConfig();\n } catch {\n return;\n }\n\n const supabase = createClient(config.supabaseUrl, config.supabaseAnonKey);\n\n const channel = supabase\n .channel(\"manifest-markets-changes\")\n .on(\n \"postgres_changes\",\n {\n event: \"UPDATE\",\n schema: \"public\",\n table: \"manifest_markets\",\n },\n (payload) => {\n const row = payload.new as { pubkey?: string; account_data?: string };\n if (!row.pubkey || !row.account_data) return;\n if (!pubkeyIndex[row.pubkey]) return;\n try {\n const summary = parseOrderBook(row.pubkey, row.account_data);\n updateMarketOrderBook(row.pubkey, summary);\n } catch (e) {\n console.error(\n `Realtime parse error for ${row.pubkey}:`,\n e instanceof Error ? e.message : e,\n );\n }\n },\n )\n .subscribe();\n\n return () => {\n supabase.removeChannel(channel);\n };\n }, [pubkeyIndex, updateMarketOrderBook]);\n\n return null;\n}\n","import { useEffect, useMemo } from \"react\";\nimport { useApyStore, useBalanceStore } from \"./providers\";\nimport { getPyeConfig } from \"../config\";\n\nconst POLL_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Fetches staking APY from stakewiz_apy for relevant vote accounts.\n *\n * - Single-validator mode: fetches for the configured vote account on mount.\n * - Universal mode: fetches for vote accounts detected in the user's stake accounts.\n * - Polls every 5 minutes.\n */\nexport default function ApySyncer() {\n const fetchApyForVoteAccounts = useApyStore((s) => s.fetchApyForVoteAccounts);\n const userStakeAccounts = useBalanceStore((s) => s.userStakeAccounts);\n\n // Collect unique vote accounts from config + detected stake accounts\n const voteAccounts = useMemo(() => {\n const set = new Set<string>();\n const config = getPyeConfig();\n if (config.voteAccount) set.add(config.voteAccount);\n for (const sa of userStakeAccounts) {\n if (sa.validatorVoteAccount) set.add(sa.validatorVoteAccount);\n }\n return Array.from(set);\n }, [userStakeAccounts]);\n\n // Fetch whenever vote accounts change (new stake accounts detected)\n useEffect(() => {\n if (voteAccounts.length === 0) return;\n fetchApyForVoteAccounts(voteAccounts);\n }, [voteAccounts, fetchApyForVoteAccounts]);\n\n // Re-poll every 5 minutes (force refresh existing data)\n useEffect(() => {\n if (voteAccounts.length === 0) return;\n const interval = setInterval(() => {\n fetchApyForVoteAccounts(voteAccounts, true);\n }, POLL_INTERVAL_MS);\n return () => clearInterval(interval);\n }, [voteAccounts, fetchApyForVoteAccounts]);\n\n return null;\n}\n"],"mappings":"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","names":["useRef","useRef","useEffect","useRef","useConnection","useConnection","useRef","useEffect","useEffect","useEffect","useEffect","POLL_INTERVAL_MS","useEffect"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pyefi/sdk",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Core SDK for the Pye Finance Solana yield protocol — stores, data fetching, transaction execution.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"solana",
|
|
7
|
+
"defi",
|
|
8
|
+
"yield",
|
|
9
|
+
"staking",
|
|
10
|
+
"sdk",
|
|
11
|
+
"pye"
|
|
12
|
+
],
|
|
13
|
+
"author": "Pye Finance",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"homepage": "https://github.com/pyefi/pye-widget#readme",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/pyefi/pye-widget.git",
|
|
19
|
+
"directory": "packages/sdk"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/pyefi/pye-widget/issues"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"type": "module",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"import": "./dist/index.js",
|
|
34
|
+
"types": "./dist/index.d.ts"
|
|
35
|
+
},
|
|
36
|
+
"./react": {
|
|
37
|
+
"import": "./dist/react.js",
|
|
38
|
+
"types": "./dist/react.d.ts"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"README.md",
|
|
44
|
+
"LICENSE"
|
|
45
|
+
],
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"zustand": "^5.0.0",
|
|
48
|
+
"immer": "^10.0.0"
|
|
49
|
+
},
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"@solana/web3.js": "^1.90.0",
|
|
52
|
+
"@solana/spl-token": "^0.4.0",
|
|
53
|
+
"@solana/wallet-adapter-react": "^0.15.0",
|
|
54
|
+
"@solana/kit": "^2.0.0",
|
|
55
|
+
"@cks-systems/manifest-sdk": ">=0.1.0",
|
|
56
|
+
"@supabase/supabase-js": "^2.0.0",
|
|
57
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
58
|
+
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"react": {
|
|
61
|
+
"optional": true
|
|
62
|
+
},
|
|
63
|
+
"@solana/wallet-adapter-react": {
|
|
64
|
+
"optional": true
|
|
65
|
+
},
|
|
66
|
+
"@supabase/supabase-js": {
|
|
67
|
+
"optional": true
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"tsup": "^8.0.0",
|
|
72
|
+
"typescript": "^5.7.0",
|
|
73
|
+
"@solana/web3.js": "^1.90.0",
|
|
74
|
+
"@solana/spl-token": "^0.4.0",
|
|
75
|
+
"@solana/wallet-adapter-react": "^0.15.0",
|
|
76
|
+
"@solana/kit": "^2.0.0",
|
|
77
|
+
"@cks-systems/manifest-sdk": ">=0.1.0",
|
|
78
|
+
"@supabase/supabase-js": "^2.0.0",
|
|
79
|
+
"@types/react": "^19.0.0",
|
|
80
|
+
"react": "^19.0.0"
|
|
81
|
+
},
|
|
82
|
+
"scripts": {
|
|
83
|
+
"build": "tsup",
|
|
84
|
+
"dev": "tsup --watch",
|
|
85
|
+
"typecheck": "tsc --noEmit"
|
|
86
|
+
}
|
|
87
|
+
}
|