use-stellar 0.1.0

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.js ADDED
@@ -0,0 +1,527 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ StellarProvider: () => StellarProvider,
34
+ formatAmount: () => formatAmount,
35
+ formatAssetCode: () => formatAssetCode,
36
+ isValidStellarAddress: () => isValidStellarAddress,
37
+ shortenAddress: () => shortenAddress,
38
+ useAccount: () => useAccount,
39
+ useAsset: () => useAsset,
40
+ useBalance: () => useBalance,
41
+ useNetwork: () => useNetwork,
42
+ useSendPayment: () => useSendPayment,
43
+ useSorobanContract: () => useSorobanContract,
44
+ useTransaction: () => useTransaction,
45
+ useWallet: () => useWallet
46
+ });
47
+ module.exports = __toCommonJS(index_exports);
48
+
49
+ // src/context/StellarProvider.tsx
50
+ var import_react = __toESM(require("react"));
51
+
52
+ // src/types/index.ts
53
+ var NETWORK_CONFIGS = {
54
+ testnet: {
55
+ network: "testnet",
56
+ horizonUrl: "https://horizon-testnet.stellar.org",
57
+ sorobanUrl: "https://soroban-testnet.stellar.org"
58
+ },
59
+ mainnet: {
60
+ network: "mainnet",
61
+ horizonUrl: "https://horizon.stellar.org",
62
+ sorobanUrl: "https://soroban.stellar.org"
63
+ }
64
+ };
65
+
66
+ // src/context/StellarProvider.tsx
67
+ var DEFAULT_WALLET = {
68
+ connected: false,
69
+ address: null,
70
+ network: null,
71
+ wallet: null,
72
+ connecting: false,
73
+ error: null
74
+ };
75
+ var StellarContext = (0, import_react.createContext)(null);
76
+ function StellarProvider({
77
+ network = "testnet",
78
+ children
79
+ }) {
80
+ const [wallet, setWallet] = (0, import_react.useState)(DEFAULT_WALLET);
81
+ const value = {
82
+ network,
83
+ networkConfig: NETWORK_CONFIGS[network],
84
+ wallet,
85
+ setWallet
86
+ };
87
+ return /* @__PURE__ */ import_react.default.createElement(StellarContext.Provider, { value }, children);
88
+ }
89
+ function useStellarContext() {
90
+ const ctx = (0, import_react.useContext)(StellarContext);
91
+ if (!ctx) {
92
+ throw new Error(
93
+ "use-stellar: No StellarProvider found. Wrap your app in <StellarProvider> before using any use-stellar hooks."
94
+ );
95
+ }
96
+ return ctx;
97
+ }
98
+
99
+ // src/hooks/useWallet.ts
100
+ var import_react2 = require("react");
101
+ function useWallet() {
102
+ const { wallet, setWallet, network } = useStellarContext();
103
+ const connect = (0, import_react2.useCallback)(
104
+ async (walletType = "freighter") => {
105
+ setWallet((prev) => ({ ...prev, connecting: true, error: null }));
106
+ try {
107
+ let address;
108
+ if (walletType === "freighter") {
109
+ address = await connectFreighter(network);
110
+ } else {
111
+ throw new Error(
112
+ `Wallet "${walletType}" not yet supported. Contributions welcome \u2014 see GitHub issues.`
113
+ );
114
+ }
115
+ setWallet({
116
+ connected: true,
117
+ address,
118
+ network,
119
+ wallet: walletType,
120
+ connecting: false,
121
+ error: null
122
+ });
123
+ } catch (err) {
124
+ setWallet((prev) => ({
125
+ ...prev,
126
+ connecting: false,
127
+ error: err instanceof Error ? err.message : "Failed to connect wallet"
128
+ }));
129
+ }
130
+ },
131
+ [setWallet, network]
132
+ );
133
+ const disconnect = (0, import_react2.useCallback)(() => {
134
+ setWallet({
135
+ connected: false,
136
+ address: null,
137
+ network: null,
138
+ wallet: null,
139
+ connecting: false,
140
+ error: null
141
+ });
142
+ }, [setWallet]);
143
+ return { ...wallet, connect, disconnect };
144
+ }
145
+ async function connectFreighter(network) {
146
+ const freighter = window.freighter;
147
+ if (!freighter) {
148
+ throw new Error(
149
+ "Freighter wallet not found. Install the Freighter browser extension and try again."
150
+ );
151
+ }
152
+ const isAllowed = await freighter.isAllowed();
153
+ if (!isAllowed) {
154
+ await freighter.setAllowed();
155
+ }
156
+ const { publicKey } = await freighter.getPublicKey();
157
+ const { networkPassphrase } = await freighter.getNetworkDetails();
158
+ const expectedPassphrase = network === "mainnet" ? "Public Global Stellar Network ; September 2015" : "Test SDF Network ; September 2015";
159
+ if (networkPassphrase !== expectedPassphrase) {
160
+ throw new Error(
161
+ `Wrong network. Switch Freighter to ${network} and try again.`
162
+ );
163
+ }
164
+ return publicKey;
165
+ }
166
+
167
+ // src/hooks/useBalance.ts
168
+ var import_react3 = require("react");
169
+
170
+ // src/utils/index.ts
171
+ var import_stellar_sdk = require("@stellar/stellar-sdk");
172
+ function getHorizonServer(network) {
173
+ return new import_stellar_sdk.Horizon.Server(NETWORK_CONFIGS[network].horizonUrl);
174
+ }
175
+ function isNativeAsset(asset) {
176
+ return asset === "XLM";
177
+ }
178
+ function formatAssetCode(asset) {
179
+ return isNativeAsset(asset) ? "XLM" : asset.code;
180
+ }
181
+ function parseHorizonBalance(raw) {
182
+ if (raw.asset_type === "native") {
183
+ return {
184
+ asset: "XLM",
185
+ balance: raw.balance
186
+ };
187
+ }
188
+ const issued = raw;
189
+ return {
190
+ asset: {
191
+ code: issued.asset_code,
192
+ issuer: issued.asset_issuer
193
+ },
194
+ balance: issued.balance,
195
+ limit: issued.limit
196
+ };
197
+ }
198
+ function isValidStellarAddress(address) {
199
+ return /^G[A-Z0-9]{55}$/.test(address);
200
+ }
201
+ function shortenAddress(address, chars = 6) {
202
+ if (!address) return "";
203
+ return `${address.slice(0, chars)}...${address.slice(-chars)}`;
204
+ }
205
+ function formatAmount(amount, decimals = 7) {
206
+ const num = parseFloat(amount);
207
+ if (isNaN(num)) return "0";
208
+ return num.toFixed(decimals).replace(/\.?0+$/, "");
209
+ }
210
+
211
+ // src/hooks/useBalance.ts
212
+ function useBalance({
213
+ address,
214
+ asset = "XLM",
215
+ watch = false
216
+ } = {}) {
217
+ const { network, wallet } = useStellarContext();
218
+ const resolvedAddress = address ?? wallet.address;
219
+ const [balances, setBalances] = (0, import_react3.useState)([]);
220
+ const [loading, setLoading] = (0, import_react3.useState)(false);
221
+ const [error, setError] = (0, import_react3.useState)(null);
222
+ const fetchBalances = (0, import_react3.useCallback)(async () => {
223
+ if (!resolvedAddress) return;
224
+ setLoading(true);
225
+ setError(null);
226
+ try {
227
+ const server = getHorizonServer(network);
228
+ const account = await server.loadAccount(resolvedAddress);
229
+ const parsed = account.balances.map(parseHorizonBalance);
230
+ setBalances(parsed);
231
+ } catch (err) {
232
+ setError(err instanceof Error ? err.message : "Failed to fetch balance");
233
+ } finally {
234
+ setLoading(false);
235
+ }
236
+ }, [resolvedAddress, network]);
237
+ (0, import_react3.useEffect)(() => {
238
+ fetchBalances();
239
+ if (watch) {
240
+ const interval = setInterval(fetchBalances, 1e4);
241
+ return () => clearInterval(interval);
242
+ }
243
+ }, [fetchBalances, watch]);
244
+ const match = balances.find((b) => {
245
+ if (asset === "XLM") return b.asset === "XLM";
246
+ if (typeof asset === "object" && typeof b.asset === "object") {
247
+ return b.asset.code === asset.code && b.asset.issuer === asset.issuer;
248
+ }
249
+ return false;
250
+ });
251
+ const balance = match?.balance ?? null;
252
+ return {
253
+ balance,
254
+ balances,
255
+ loading,
256
+ error,
257
+ refetch: fetchBalances
258
+ };
259
+ }
260
+
261
+ // src/hooks/useAccount.ts
262
+ var import_react4 = require("react");
263
+ function useAccount({ address } = {}) {
264
+ const { network, wallet } = useStellarContext();
265
+ const resolvedAddress = address ?? wallet.address;
266
+ const [account, setAccount] = (0, import_react4.useState)(null);
267
+ const [loading, setLoading] = (0, import_react4.useState)(false);
268
+ const [error, setError] = (0, import_react4.useState)(null);
269
+ async function fetchAccount() {
270
+ if (!resolvedAddress) return;
271
+ setLoading(true);
272
+ setError(null);
273
+ try {
274
+ const server = getHorizonServer(network);
275
+ const raw = await server.loadAccount(resolvedAddress);
276
+ const info = {
277
+ address: raw.id,
278
+ sequence: raw.sequenceNumber(),
279
+ balances: raw.balances.map(parseHorizonBalance),
280
+ subentryCount: raw.subentry_count,
281
+ thresholds: {
282
+ lowThreshold: raw.thresholds.low_threshold,
283
+ medThreshold: raw.thresholds.med_threshold,
284
+ highThreshold: raw.thresholds.high_threshold
285
+ },
286
+ signers: raw.signers.map((s) => ({
287
+ key: s.key,
288
+ weight: s.weight,
289
+ type: s.type
290
+ }))
291
+ };
292
+ setAccount(info);
293
+ } catch (err) {
294
+ setError(err instanceof Error ? err.message : "Failed to fetch account");
295
+ } finally {
296
+ setLoading(false);
297
+ }
298
+ }
299
+ (0, import_react4.useEffect)(() => {
300
+ fetchAccount();
301
+ }, [resolvedAddress, network]);
302
+ return { account, loading, error, refetch: fetchAccount };
303
+ }
304
+
305
+ // src/hooks/useSendPayment.ts
306
+ var import_react5 = require("react");
307
+ var import_stellar_sdk2 = require("@stellar/stellar-sdk");
308
+ function useSendPayment() {
309
+ const { network, networkConfig, wallet } = useStellarContext();
310
+ const [loading, setLoading] = (0, import_react5.useState)(false);
311
+ const [error, setError] = (0, import_react5.useState)(null);
312
+ const [result, setResult] = (0, import_react5.useState)(null);
313
+ const send = (0, import_react5.useCallback)(
314
+ async (options) => {
315
+ if (!wallet.connected || !wallet.address) {
316
+ throw new Error("Wallet not connected. Call connect() first.");
317
+ }
318
+ setLoading(true);
319
+ setError(null);
320
+ try {
321
+ const server = getHorizonServer(network);
322
+ const sourceAcc = await server.loadAccount(wallet.address);
323
+ const networkPass = network === "mainnet" ? import_stellar_sdk2.Networks.PUBLIC : import_stellar_sdk2.Networks.TESTNET;
324
+ const stellarAsset = toStellarAsset(options.asset);
325
+ const operation = import_stellar_sdk2.Operation.payment({
326
+ destination: options.to,
327
+ asset: stellarAsset,
328
+ amount: options.amount
329
+ });
330
+ const builder = new import_stellar_sdk2.TransactionBuilder(sourceAcc, {
331
+ fee: import_stellar_sdk2.BASE_FEE,
332
+ networkPassphrase: networkPass
333
+ }).addOperation(operation).setTimeout(30);
334
+ if (options.memo) {
335
+ builder.addMemo(import_stellar_sdk2.Memo.text(options.memo));
336
+ }
337
+ const tx = builder.build();
338
+ const xdr = tx.toXDR();
339
+ const freighter = window.freighter;
340
+ if (!freighter) throw new Error("Freighter wallet not found");
341
+ const { signedTxXdr } = await freighter.signTransaction(xdr, {
342
+ networkPassphrase: networkPass
343
+ });
344
+ const signed = import_stellar_sdk2.TransactionBuilder.fromXDR(signedTxXdr, networkPass);
345
+ const res = await server.submitTransaction(signed);
346
+ const outcome = {
347
+ hash: res.hash,
348
+ status: "success"
349
+ };
350
+ setResult(outcome);
351
+ return outcome;
352
+ } catch (err) {
353
+ const message = err instanceof Error ? err.message : "Transaction failed";
354
+ setError(message);
355
+ throw new Error(message);
356
+ } finally {
357
+ setLoading(false);
358
+ }
359
+ },
360
+ [network, wallet]
361
+ );
362
+ const reset = (0, import_react5.useCallback)(() => {
363
+ setError(null);
364
+ setResult(null);
365
+ }, []);
366
+ return { send, loading, error, result, reset };
367
+ }
368
+ function toStellarAsset(asset) {
369
+ if (isNativeAsset(asset)) return import_stellar_sdk2.Asset.native();
370
+ return new import_stellar_sdk2.Asset(asset.code, asset.issuer);
371
+ }
372
+
373
+ // src/hooks/useTransaction.ts
374
+ var import_react6 = require("react");
375
+ function useTransaction({
376
+ hash,
377
+ watch = false
378
+ }) {
379
+ const { network } = useStellarContext();
380
+ const [transaction, setTransaction] = (0, import_react6.useState)(null);
381
+ const [loading, setLoading] = (0, import_react6.useState)(false);
382
+ const [error, setError] = (0, import_react6.useState)(null);
383
+ const transactionRef = (0, import_react6.useRef)(null);
384
+ transactionRef.current = transaction;
385
+ const fetchTransaction = (0, import_react6.useCallback)(async () => {
386
+ if (!hash) return;
387
+ setLoading(true);
388
+ setError(null);
389
+ try {
390
+ const server = getHorizonServer(network);
391
+ const raw = await server.transactions().transaction(hash).call();
392
+ const status = raw.successful ? "success" : "failed";
393
+ setTransaction({
394
+ hash: raw.hash,
395
+ status,
396
+ ledger: Number(raw.ledger),
397
+ createdAt: raw.created_at,
398
+ fee: String(raw.fee_charged)
399
+ });
400
+ } catch (err) {
401
+ const is404 = err?.response?.status === 404;
402
+ if (is404) {
403
+ setTransaction({ hash, status: watch ? "pending" : "not_found" });
404
+ } else {
405
+ setError(err instanceof Error ? err.message : "Failed to fetch transaction");
406
+ }
407
+ } finally {
408
+ setLoading(false);
409
+ }
410
+ }, [hash, network, watch]);
411
+ (0, import_react6.useEffect)(() => {
412
+ fetchTransaction();
413
+ if (watch) {
414
+ const interval = setInterval(() => {
415
+ const status = transactionRef.current?.status;
416
+ if (status === "success" || status === "failed") return;
417
+ fetchTransaction();
418
+ }, 3e3);
419
+ return () => clearInterval(interval);
420
+ }
421
+ }, [fetchTransaction, watch]);
422
+ return { transaction, loading, error, refetch: fetchTransaction };
423
+ }
424
+
425
+ // src/hooks/useNetwork.ts
426
+ function useNetwork() {
427
+ const { network, networkConfig } = useStellarContext();
428
+ return {
429
+ network,
430
+ networkConfig,
431
+ isTestnet: network === "testnet",
432
+ isMainnet: network === "mainnet"
433
+ };
434
+ }
435
+
436
+ // src/hooks/useAsset.ts
437
+ var import_react7 = require("react");
438
+ function useAsset({ code, issuer }) {
439
+ const { network } = useStellarContext();
440
+ const [asset, setAsset] = (0, import_react7.useState)(null);
441
+ const [loading, setLoading] = (0, import_react7.useState)(false);
442
+ const [error, setError] = (0, import_react7.useState)(null);
443
+ const fetchAsset = (0, import_react7.useCallback)(async () => {
444
+ setLoading(true);
445
+ setError(null);
446
+ try {
447
+ const server = getHorizonServer(network);
448
+ const res = await server.assets().forCode(code).forIssuer(issuer).call();
449
+ const raw = res.records[0];
450
+ if (!raw) throw new Error(`Asset ${code}:${issuer} not found`);
451
+ const assetRecord = raw;
452
+ setAsset({
453
+ code: raw.asset_code,
454
+ issuer: raw.asset_issuer,
455
+ supply: raw.amount,
456
+ numAccounts: raw.num_accounts,
457
+ homeDomain: assetRecord.home_domain,
458
+ flags: {
459
+ authRequired: raw.flags.auth_required,
460
+ authRevocable: raw.flags.auth_revocable,
461
+ authImmutable: raw.flags.auth_immutable
462
+ }
463
+ });
464
+ } catch (err) {
465
+ setError(err instanceof Error ? err.message : "Failed to fetch asset");
466
+ } finally {
467
+ setLoading(false);
468
+ }
469
+ }, [code, issuer, network]);
470
+ (0, import_react7.useEffect)(() => {
471
+ fetchAsset();
472
+ }, [fetchAsset]);
473
+ return { asset, loading, error, refetch: fetchAsset };
474
+ }
475
+
476
+ // src/hooks/useSorobanContract.ts
477
+ var import_react8 = require("react");
478
+ function useSorobanContract({
479
+ contractId,
480
+ method
481
+ }) {
482
+ const { networkConfig } = useStellarContext();
483
+ const [data, setData] = (0, import_react8.useState)(null);
484
+ const [loading, setLoading] = (0, import_react8.useState)(false);
485
+ const [error, setError] = (0, import_react8.useState)(null);
486
+ const callContract = (0, import_react8.useCallback)(async () => {
487
+ setLoading(true);
488
+ setError(null);
489
+ try {
490
+ if (!contractId || !method) {
491
+ setData(null);
492
+ return;
493
+ }
494
+ setData({
495
+ contractId,
496
+ method,
497
+ network: networkConfig.network,
498
+ note: "Simulation wiring tracked in issue #10"
499
+ });
500
+ } catch (err) {
501
+ setError(err instanceof Error ? err.message : "Contract call failed");
502
+ } finally {
503
+ setLoading(false);
504
+ }
505
+ }, [contractId, method, networkConfig]);
506
+ (0, import_react8.useEffect)(() => {
507
+ callContract();
508
+ }, [callContract]);
509
+ return { data, loading, error, refetch: callContract };
510
+ }
511
+ // Annotate the CommonJS export names for ESM import in node:
512
+ 0 && (module.exports = {
513
+ StellarProvider,
514
+ formatAmount,
515
+ formatAssetCode,
516
+ isValidStellarAddress,
517
+ shortenAddress,
518
+ useAccount,
519
+ useAsset,
520
+ useBalance,
521
+ useNetwork,
522
+ useSendPayment,
523
+ useSorobanContract,
524
+ useTransaction,
525
+ useWallet
526
+ });
527
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/context/StellarProvider.tsx","../src/types/index.ts","../src/hooks/useWallet.ts","../src/hooks/useBalance.ts","../src/utils/index.ts","../src/hooks/useAccount.ts","../src/hooks/useSendPayment.ts","../src/hooks/useTransaction.ts","../src/hooks/useNetwork.ts","../src/hooks/useAsset.ts","../src/hooks/useSorobanContract.ts"],"sourcesContent":["// ── Provider ───────────────────────────────────────────────────────────────\nexport { StellarProvider } from \"./context/StellarProvider\";\n\n// ── Hooks ──────────────────────────────────────────────────────────────────\nexport { useWallet } from \"./hooks/useWallet\";\nexport { useBalance } from \"./hooks/useBalance\";\nexport { useAccount } from \"./hooks/useAccount\";\nexport { useSendPayment } from \"./hooks/useSendPayment\";\nexport { useTransaction } from \"./hooks/useTransaction\";\nexport { useNetwork } from \"./hooks/useNetwork\";\nexport { useAsset } from \"./hooks/useAsset\";\nexport { useSorobanContract } from \"./hooks/useSorobanContract\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\nexport type {\n StellarNetwork,\n NetworkConfig,\n WalletType,\n WalletState,\n Asset,\n NativeAsset,\n IssuedAsset,\n Balance,\n AccountInfo,\n TransactionResult,\n TransactionStatus,\n SendPaymentOptions,\n SendPaymentResult,\n ContractCallOptions,\n StellarContextValue,\n} from \"./types\";\n\n// ── Utils (public) ─────────────────────────────────────────────────────────\nexport {\n isValidStellarAddress,\n shortenAddress,\n formatAmount,\n formatAssetCode,\n} from \"./utils\";\n","import React, {\n createContext,\n useContext,\n useState,\n type ReactNode,\n} from \"react\";\nimport type {\n StellarContextValue,\n StellarNetwork,\n WalletState,\n} from \"../types\";\nimport { NETWORK_CONFIGS } from \"../types\";\n\n// ── Default wallet state ───────────────────────────────────────────────────\nconst DEFAULT_WALLET: WalletState = {\n connected: false,\n address: null,\n network: null,\n wallet: null,\n connecting: false,\n error: null,\n};\n\n// ── Context ────────────────────────────────────────────────────────────────\nconst StellarContext = createContext<StellarContextValue | null>(null);\n\n// ── Provider ───────────────────────────────────────────────────────────────\nexport interface StellarProviderProps {\n network?: StellarNetwork;\n children: ReactNode;\n}\n\nexport function StellarProvider({\n network = \"testnet\",\n children,\n}: StellarProviderProps) {\n const [wallet, setWallet] = useState<WalletState>(DEFAULT_WALLET);\n\n const value: StellarContextValue = {\n network,\n networkConfig: NETWORK_CONFIGS[network],\n wallet,\n setWallet,\n };\n\n return (\n <StellarContext.Provider value={value}>\n {children}\n </StellarContext.Provider>\n );\n}\n\n// ── Hook to consume context ────────────────────────────────────────────────\nexport function useStellarContext(): StellarContextValue {\n const ctx = useContext(StellarContext);\n if (!ctx) {\n throw new Error(\n \"use-stellar: No StellarProvider found. \" +\n \"Wrap your app in <StellarProvider> before using any use-stellar hooks.\"\n );\n }\n return ctx;\n}\n","import type { Dispatch, SetStateAction } from \"react\";\n\nexport type StellarNetwork = \"testnet\" | \"mainnet\";\n\nexport interface NetworkConfig {\n network: StellarNetwork;\n horizonUrl: string;\n sorobanUrl: string;\n}\n\nexport const NETWORK_CONFIGS: Record<StellarNetwork, NetworkConfig> = {\n testnet: {\n network: \"testnet\",\n horizonUrl: \"https://horizon-testnet.stellar.org\",\n sorobanUrl: \"https://soroban-testnet.stellar.org\",\n },\n mainnet: {\n network: \"mainnet\",\n horizonUrl: \"https://horizon.stellar.org\",\n sorobanUrl: \"https://soroban.stellar.org\",\n },\n};\n\nexport type WalletType = \"freighter\" | \"albedo\" | \"rabet\";\n\nexport interface WalletState {\n connected: boolean;\n address: string | null;\n network: StellarNetwork | null;\n wallet: WalletType | null;\n connecting: boolean;\n error: string | null;\n}\n\nexport type NativeAsset = \"XLM\";\n\nexport interface IssuedAsset {\n code: string;\n issuer: string;\n}\n\nexport type Asset = NativeAsset | IssuedAsset;\n\nexport interface Balance {\n asset: Asset;\n balance: string;\n limit?: string;\n buying?: string;\n selling?: string;\n}\n\nexport interface AccountInfo {\n address: string;\n sequence: string;\n balances: Balance[];\n subentryCount: number;\n thresholds: {\n lowThreshold: number;\n medThreshold: number;\n highThreshold: number;\n };\n signers: {\n key: string;\n weight: number;\n type: string;\n }[];\n}\n\nexport type TransactionStatus = \"pending\" | \"success\" | \"failed\" | \"not_found\";\n\nexport interface TransactionResult {\n hash: string;\n status: TransactionStatus;\n ledger?: number;\n createdAt?: string;\n fee?: string;\n}\n\nexport interface SendPaymentOptions {\n to: string;\n asset: Asset;\n amount: string;\n memo?: string;\n}\n\nexport interface SendPaymentResult {\n hash: string;\n status: TransactionStatus;\n}\n\nexport interface ContractCallOptions {\n contractId: string;\n method: string;\n args?: unknown[];\n}\n\nexport interface StellarContextValue {\n network: StellarNetwork;\n networkConfig: NetworkConfig;\n wallet: WalletState;\n setWallet: Dispatch<SetStateAction<WalletState>>;\n}\n","import { useCallback } from \"react\";\nimport { useStellarContext } from \"../context/StellarProvider\";\nimport type { WalletState, WalletType } from \"../types\";\n\nexport interface UseWalletReturn extends WalletState {\n connect: (wallet?: WalletType) => Promise<void>;\n disconnect: () => void;\n}\n\nexport function useWallet(): UseWalletReturn {\n const { wallet, setWallet, network } = useStellarContext();\n\n const connect = useCallback(\n async (walletType: WalletType = \"freighter\") => {\n setWallet(prev => ({ ...prev, connecting: true, error: null }));\n\n try {\n let address: string;\n\n if (walletType === \"freighter\") {\n address = await connectFreighter(network);\n } else {\n throw new Error(\n `Wallet \"${walletType}\" not yet supported. ` +\n `Contributions welcome — see GitHub issues.`\n );\n }\n\n setWallet({\n connected: true,\n address,\n network,\n wallet: walletType,\n connecting: false,\n error: null,\n });\n } catch (err) {\n setWallet(prev => ({\n ...prev,\n connecting: false,\n error: err instanceof Error ? err.message : \"Failed to connect wallet\",\n }));\n }\n },\n [setWallet, network]\n );\n\n const disconnect = useCallback(() => {\n setWallet({\n connected: false,\n address: null,\n network: null,\n wallet: null,\n connecting: false,\n error: null,\n });\n }, [setWallet]);\n\n return { ...wallet, connect, disconnect };\n}\n\n// ── Freighter connector ────────────────────────────────────────────────────\nasync function connectFreighter(network: string): Promise<string> {\n // Freighter injects window.freighter\n const freighter = (window as unknown as { freighter?: FreighterAPI }).freighter;\n\n if (!freighter) {\n throw new Error(\n \"Freighter wallet not found. \" +\n \"Install the Freighter browser extension and try again.\"\n );\n }\n\n const isAllowed = await freighter.isAllowed();\n if (!isAllowed) {\n await freighter.setAllowed();\n }\n\n const { publicKey } = await freighter.getPublicKey();\n const { networkPassphrase } = await freighter.getNetworkDetails();\n\n // Validate we're on the right network\n const expectedPassphrase =\n network === \"mainnet\"\n ? \"Public Global Stellar Network ; September 2015\"\n : \"Test SDF Network ; September 2015\";\n\n if (networkPassphrase !== expectedPassphrase) {\n throw new Error(\n `Wrong network. Switch Freighter to ${network} and try again.`\n );\n }\n\n return publicKey;\n}\n\n// ── Freighter API types ────────────────────────────────────────────────────\n// Full type definitions tracked in GitHub issue #9\ninterface FreighterAPI {\n isAllowed: () => Promise<boolean>;\n setAllowed: () => Promise<void>;\n getPublicKey: () => Promise<{ publicKey: string }>;\n getNetworkDetails: () => Promise<{ networkPassphrase: string; network: string }>;\n signTransaction: (xdr: string, opts?: object) => Promise<{ signedTxXdr: string }>;\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useStellarContext } from \"../context/StellarProvider\";\nimport { getHorizonServer, parseHorizonBalance } from \"../utils\";\nimport type { Asset, Balance } from \"../types\";\n\nexport interface UseBalanceOptions {\n address?: string | null; // defaults to connected wallet address\n asset?: Asset; // defaults to XLM\n watch?: boolean; // re-fetch every 10s\n}\n\nexport interface UseBalanceReturn {\n balance: string | null;\n balances: Balance[];\n loading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\nexport function useBalance({\n address,\n asset = \"XLM\",\n watch = false,\n}: UseBalanceOptions = {}): UseBalanceReturn {\n const { network, wallet } = useStellarContext();\n const resolvedAddress = address ?? wallet.address;\n\n const [balances, setBalances] = useState<Balance[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchBalances = useCallback(async () => {\n if (!resolvedAddress) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const server = getHorizonServer(network);\n const account = await server.loadAccount(resolvedAddress);\n const parsed = account.balances.map(parseHorizonBalance);\n setBalances(parsed);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch balance\");\n } finally {\n setLoading(false);\n }\n }, [resolvedAddress, network]);\n\n useEffect(() => {\n fetchBalances();\n\n if (watch) {\n const interval = setInterval(fetchBalances, 10_000);\n return () => clearInterval(interval);\n }\n }, [fetchBalances, watch]);\n\n // Find the specific asset balance\n const match = balances.find(b => {\n if (asset === \"XLM\") return b.asset === \"XLM\";\n if (typeof asset === \"object\" && typeof b.asset === \"object\") {\n return b.asset.code === asset.code && b.asset.issuer === asset.issuer;\n }\n return false;\n });\n const balance = match?.balance ?? null;\n\n return {\n balance,\n balances,\n loading,\n error,\n refetch: fetchBalances,\n };\n}\n","import { Horizon } from \"@stellar/stellar-sdk\";\nimport type { Asset, Balance, NetworkConfig, StellarNetwork } from \"../types\";\nimport { NETWORK_CONFIGS } from \"../types\";\n\n// ── Network helpers ────────────────────────────────────────────────────────\nexport function getNetworkConfig(network: StellarNetwork): NetworkConfig {\n return NETWORK_CONFIGS[network];\n}\n\nexport function getHorizonServer(network: StellarNetwork): Horizon.Server {\n return new Horizon.Server(NETWORK_CONFIGS[network].horizonUrl);\n}\n\n// ── Asset helpers ──────────────────────────────────────────────────────────\nexport function isNativeAsset(asset: Asset): asset is \"XLM\" {\n return asset === \"XLM\";\n}\n\nexport function formatAssetCode(asset: Asset): string {\n return isNativeAsset(asset) ? \"XLM\" : asset.code;\n}\n\nexport function parseHorizonBalance(\n raw: Horizon.HorizonApi.BalanceLine\n): Balance {\n if (raw.asset_type === \"native\") {\n return {\n asset: \"XLM\",\n balance: raw.balance,\n };\n }\n\n const issued = raw as Horizon.HorizonApi.BalanceLineAsset;\n return {\n asset: {\n code: issued.asset_code,\n issuer: issued.asset_issuer,\n },\n balance: issued.balance,\n limit: issued.limit,\n };\n}\n\n// ── Address helpers ────────────────────────────────────────────────────────\nexport function isValidStellarAddress(address: string): boolean {\n return /^G[A-Z0-9]{55}$/.test(address);\n}\n\nexport function shortenAddress(address: string, chars = 6): string {\n if (!address) return \"\";\n return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\n// ── Amount helpers ─────────────────────────────────────────────────────────\nexport function formatAmount(amount: string, decimals = 7): string {\n const num = parseFloat(amount);\n if (isNaN(num)) return \"0\";\n return num.toFixed(decimals).replace(/\\.?0+$/, \"\");\n}\n","import { useState, useEffect } from \"react\";\nimport { useStellarContext } from \"../context/StellarProvider\";\nimport { getHorizonServer, parseHorizonBalance } from \"../utils\";\nimport type { AccountInfo } from \"../types\";\n\nexport interface UseAccountOptions {\n address?: string | null; // defaults to connected wallet address\n}\n\nexport interface UseAccountReturn {\n account: AccountInfo | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\nexport function useAccount({ address }: UseAccountOptions = {}): UseAccountReturn {\n const { network, wallet } = useStellarContext();\n const resolvedAddress = address ?? wallet.address;\n\n const [account, setAccount] = useState<AccountInfo | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function fetchAccount() {\n if (!resolvedAddress) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const server = getHorizonServer(network);\n const raw = await server.loadAccount(resolvedAddress);\n\n const info: AccountInfo = {\n address: raw.id,\n sequence: raw.sequenceNumber(),\n balances: raw.balances.map(parseHorizonBalance),\n subentryCount: raw.subentry_count,\n thresholds: {\n lowThreshold: raw.thresholds.low_threshold,\n medThreshold: raw.thresholds.med_threshold,\n highThreshold: raw.thresholds.high_threshold,\n },\n signers: raw.signers.map(s => ({\n key: s.key,\n weight: s.weight,\n type: s.type,\n })),\n };\n\n setAccount(info);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch account\");\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n fetchAccount();\n }, [resolvedAddress, network]);\n\n return { account, loading, error, refetch: fetchAccount };\n}\n","import { useState, useCallback } from \"react\";\nimport {\n TransactionBuilder,\n Networks,\n BASE_FEE,\n Operation,\n Asset as StellarAsset,\n Memo,\n} from \"@stellar/stellar-sdk\";\nimport { useStellarContext } from \"../context/StellarProvider\";\nimport { getHorizonServer, isNativeAsset } from \"../utils\";\nimport type { SendPaymentOptions, SendPaymentResult, Asset } from \"../types\";\n\nexport interface UseSendPaymentReturn {\n send: (options: SendPaymentOptions) => Promise<SendPaymentResult>;\n loading: boolean;\n error: string | null;\n result: SendPaymentResult | null;\n reset: () => void;\n}\n\nexport function useSendPayment(): UseSendPaymentReturn {\n const { network, networkConfig, wallet } = useStellarContext();\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<SendPaymentResult | null>(null);\n\n const send = useCallback(\n async (options: SendPaymentOptions): Promise<SendPaymentResult> => {\n if (!wallet.connected || !wallet.address) {\n throw new Error(\"Wallet not connected. Call connect() first.\");\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const server = getHorizonServer(network);\n const sourceAcc = await server.loadAccount(wallet.address);\n const networkPass = network === \"mainnet\"\n ? Networks.PUBLIC\n : Networks.TESTNET;\n\n // ── Build the operation ──────────────────────────────────────────\n const stellarAsset = toStellarAsset(options.asset);\n const operation = Operation.payment({\n destination: options.to,\n asset: stellarAsset,\n amount: options.amount,\n });\n\n // ── Build the transaction ────────────────────────────────────────\n const builder = new TransactionBuilder(sourceAcc, {\n fee: BASE_FEE,\n networkPassphrase: networkPass,\n }).addOperation(operation).setTimeout(30);\n\n if (options.memo) {\n builder.addMemo(Memo.text(options.memo));\n }\n\n const tx = builder.build();\n const xdr = tx.toXDR();\n\n // ── Sign with Freighter ──────────────────────────────────────────\n const freighter = (window as unknown as { freighter?: { signTransaction: (xdr: string, opts?: object) => Promise<{ signedTxXdr: string }> } }).freighter;\n if (!freighter) throw new Error(\"Freighter wallet not found\");\n\n const { signedTxXdr } = await freighter.signTransaction(xdr, {\n networkPassphrase: networkPass,\n });\n\n // ── Submit ───────────────────────────────────────────────────────\n const signed = TransactionBuilder.fromXDR(signedTxXdr, networkPass);\n const res = await server.submitTransaction(signed);\n\n const outcome: SendPaymentResult = {\n hash: res.hash,\n status: \"success\",\n };\n\n setResult(outcome);\n return outcome;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Transaction failed\";\n setError(message);\n throw new Error(message);\n } finally {\n setLoading(false);\n }\n },\n [network, wallet]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setResult(null);\n }, []);\n\n return { send, loading, error, result, reset };\n}\n\n// ── Convert our Asset type to Stellar SDK Asset ────────────────────────────\nfunction toStellarAsset(asset: Asset): StellarAsset {\n if (isNativeAsset(asset)) return StellarAsset.native();\n return new StellarAsset(asset.code, asset.issuer);\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { useStellarContext } from \"../context/StellarProvider\";\nimport { getHorizonServer } from \"../utils\";\nimport type { TransactionResult, TransactionStatus } from \"../types\";\n\nexport interface UseTransactionOptions {\n hash: string | null;\n watch?: boolean; // keep polling until success or failed\n}\n\nexport interface UseTransactionReturn {\n transaction: TransactionResult | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\nexport function useTransaction({\n hash,\n watch = false,\n}: UseTransactionOptions): UseTransactionReturn {\n const { network } = useStellarContext();\n\n const [transaction, setTransaction] = useState<TransactionResult | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const transactionRef = useRef<TransactionResult | null>(null);\n\n transactionRef.current = transaction;\n\n const fetchTransaction = useCallback(async () => {\n if (!hash) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const server = getHorizonServer(network);\n const raw = await server.transactions().transaction(hash).call();\n\n const status: TransactionStatus = raw.successful ? \"success\" : \"failed\";\n\n setTransaction({\n hash: raw.hash,\n status,\n ledger: Number(raw.ledger),\n createdAt: raw.created_at,\n fee: String(raw.fee_charged),\n });\n } catch (err: unknown) {\n // 404 means not found / still pending\n const is404 = (err as { response?: { status: number } })?.response?.status === 404;\n if (is404) {\n setTransaction({ hash: hash!, status: watch ? \"pending\" : \"not_found\" });\n } else {\n setError(err instanceof Error ? err.message : \"Failed to fetch transaction\");\n }\n } finally {\n setLoading(false);\n }\n }, [hash, network, watch]);\n\n useEffect(() => {\n fetchTransaction();\n\n if (watch) {\n const interval = setInterval(() => {\n const status = transactionRef.current?.status;\n if (status === \"success\" || status === \"failed\") return;\n fetchTransaction();\n }, 3000);\n return () => clearInterval(interval);\n }\n }, [fetchTransaction, watch]);\n\n return { transaction, loading, error, refetch: fetchTransaction };\n}\n","import { useStellarContext } from \"../context/StellarProvider\";\nimport type { StellarNetwork, NetworkConfig } from \"../types\";\n\nexport interface UseNetworkReturn {\n network: StellarNetwork;\n networkConfig: NetworkConfig;\n isTestnet: boolean;\n isMainnet: boolean;\n}\n\nexport function useNetwork(): UseNetworkReturn {\n const { network, networkConfig } = useStellarContext();\n\n return {\n network,\n networkConfig,\n isTestnet: network === \"testnet\",\n isMainnet: network === \"mainnet\",\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useStellarContext } from \"../context/StellarProvider\";\nimport { getHorizonServer } from \"../utils\";\n\nexport interface AssetInfo {\n code: string;\n issuer: string;\n supply: string;\n homeDomain?: string;\n numAccounts: number;\n flags: {\n authRequired: boolean;\n authRevocable: boolean;\n authImmutable: boolean;\n };\n}\n\nexport interface UseAssetOptions {\n code: string;\n issuer: string;\n}\n\nexport interface UseAssetReturn {\n asset: AssetInfo | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\nexport function useAsset({ code, issuer }: UseAssetOptions): UseAssetReturn {\n const { network } = useStellarContext();\n\n const [asset, setAsset] = useState<AssetInfo | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchAsset = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const server = getHorizonServer(network);\n const res = await server\n .assets()\n .forCode(code)\n .forIssuer(issuer)\n .call();\n\n const raw = res.records[0];\n if (!raw) throw new Error(`Asset ${code}:${issuer} not found`);\n const assetRecord = raw as typeof raw & { home_domain?: string };\n\n setAsset({\n code: raw.asset_code,\n issuer: raw.asset_issuer,\n supply: raw.amount,\n numAccounts: raw.num_accounts,\n homeDomain: assetRecord.home_domain,\n flags: {\n authRequired: raw.flags.auth_required,\n authRevocable: raw.flags.auth_revocable,\n authImmutable: raw.flags.auth_immutable,\n },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch asset\");\n } finally {\n setLoading(false);\n }\n }, [code, issuer, network]);\n\n useEffect(() => {\n fetchAsset();\n }, [fetchAsset]);\n\n return { asset, loading, error, refetch: fetchAsset };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useStellarContext } from \"../context/StellarProvider\";\nimport type { ContractCallOptions } from \"../types\";\n\nexport interface UseSorobanContractReturn {\n data: unknown | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\nexport function useSorobanContract({\n contractId,\n method,\n}: ContractCallOptions): UseSorobanContractReturn {\n const { networkConfig } = useStellarContext();\n\n const [data, setData] = useState<unknown | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const callContract = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n if (!contractId || !method) {\n setData(null);\n return;\n }\n\n setData({\n contractId,\n method,\n network: networkConfig.network,\n note: \"Simulation wiring tracked in issue #10\",\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Contract call failed\");\n } finally {\n setLoading(false);\n }\n }, [contractId, method, networkConfig]);\n\n useEffect(() => {\n callContract();\n }, [callContract]);\n\n return { data, loading, error, refetch: callContract };\n}\n"],"mappings":"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","names":["React","import_react","import_react","import_react","import_react","import_stellar_sdk","StellarAsset","import_react","import_react","import_react"]}