@cookill/wallet-adapter 2.5.4 → 3.0.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.cjs CHANGED
@@ -1,39 +1,8 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
19
4
 
20
- // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
23
- NETWORKS: () => NETWORKS,
24
- RialoWallet: () => RialoWallet,
25
- default: () => src_default,
26
- formatAddress: () => formatAddress,
27
- formatBalance: () => formatBalance,
28
- fromChainId: () => fromChainId,
29
- getRialoProvider: () => getRialoProvider,
30
- isRialoInstalled: () => isRialoInstalled,
31
- isValidAddress: () => isValidAddress,
32
- parseBalance: () => parseBalance,
33
- toChainId: () => toChainId,
34
- waitForRialoProvider: () => waitForRialoProvider
35
- });
36
- module.exports = __toCommonJS(src_exports);
5
+ // src/core/types.ts
37
6
  var NETWORKS = {
38
7
  mainnet: {
39
8
  chainId: "rialo:mainnet",
@@ -72,193 +41,353 @@ var NETWORKS = {
72
41
  decimals: 9
73
42
  }
74
43
  };
75
- function isRialoInstalled() {
44
+
45
+ // src/core/provider.ts
46
+ function isInstalled() {
76
47
  if (typeof window === "undefined") return false;
77
- return !!window.rialo?.isRialo;
48
+ try {
49
+ return !!window.rialo?.isRialo;
50
+ } catch {
51
+ return false;
52
+ }
78
53
  }
79
- function getRialoProvider() {
54
+ function getProvider() {
80
55
  if (typeof window === "undefined") return void 0;
81
- const rialo = window.rialo;
82
- return rialo?.isRialo ? rialo : void 0;
56
+ try {
57
+ const provider = window.rialo;
58
+ if (provider?.isRialo) return provider;
59
+ } catch {
60
+ }
61
+ return void 0;
83
62
  }
84
- function waitForRialoProvider(timeout = 3e3) {
63
+ function waitForProvider(timeout = 3e3) {
85
64
  return new Promise((resolve) => {
86
- if (isRialoInstalled()) {
87
- resolve(getRialoProvider());
65
+ const existing = getProvider();
66
+ if (existing) {
67
+ resolve(existing);
88
68
  return;
89
69
  }
90
70
  let resolved = false;
91
- const checkInterval = setInterval(() => {
92
- if (isRialoInstalled() && !resolved) {
93
- resolved = true;
94
- clearInterval(checkInterval);
95
- resolve(getRialoProvider());
96
- }
71
+ let checkInterval = null;
72
+ let timeoutId = null;
73
+ const cleanup = () => {
74
+ resolved = true;
75
+ if (checkInterval) clearInterval(checkInterval);
76
+ if (timeoutId) clearTimeout(timeoutId);
77
+ };
78
+ const done = (provider) => {
79
+ if (resolved) return;
80
+ cleanup();
81
+ resolve(provider);
82
+ };
83
+ checkInterval = setInterval(() => {
84
+ const p = getProvider();
85
+ if (p) done(p);
97
86
  }, 100);
98
- setTimeout(() => {
99
- if (!resolved) {
100
- resolved = true;
101
- clearInterval(checkInterval);
102
- resolve(void 0);
103
- }
87
+ const onInit = () => done(getProvider());
88
+ window.addEventListener("rialo#initialized", onInit, { once: true });
89
+ timeoutId = setTimeout(() => {
90
+ window.removeEventListener("rialo#initialized", onInit);
91
+ done(void 0);
104
92
  }, timeout);
105
- const handler = () => {
106
- if (!resolved) {
107
- resolved = true;
108
- clearInterval(checkInterval);
109
- resolve(getRialoProvider());
110
- }
93
+ });
94
+ }
95
+ function withTimeout(promise, ms, errorMessage = "Operation timed out") {
96
+ let timeoutId;
97
+ const timeout = new Promise((_, reject) => {
98
+ timeoutId = setTimeout(() => reject(new Error(errorMessage)), ms);
99
+ });
100
+ return Promise.race([promise, timeout]).finally(() => {
101
+ if (timeoutId) clearTimeout(timeoutId);
102
+ });
103
+ }
104
+
105
+ // src/core/utils.ts
106
+ function formatAddress(address, chars = 4) {
107
+ if (!address) return "";
108
+ if (address.length <= chars * 2 + 3) return address;
109
+ return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;
110
+ }
111
+ function formatBalance(kelvins, decimals = 4) {
112
+ const value = typeof kelvins === "string" ? BigInt(kelvins || "0") : kelvins;
113
+ const rlo = Number(value) / 1e9;
114
+ return rlo.toFixed(decimals);
115
+ }
116
+ function parseBalance(rlo) {
117
+ const value = typeof rlo === "string" ? parseFloat(rlo) : rlo;
118
+ return BigInt(Math.floor(value * 1e9));
119
+ }
120
+ function isValidAddress(address) {
121
+ if (!address || typeof address !== "string") return false;
122
+ if (address.length < 32 || address.length > 50) return false;
123
+ return /^[1-9A-HJ-NP-Za-km-z]+$/.test(address);
124
+ }
125
+ function toChainId(network) {
126
+ return `rialo:${network}`;
127
+ }
128
+ function fromChainId(chainId) {
129
+ return chainId.replace("rialo:", "");
130
+ }
131
+ function normalizeAccounts(accounts) {
132
+ if (!Array.isArray(accounts)) return [];
133
+ return accounts.map((acc) => {
134
+ if (typeof acc === "string") {
135
+ return { address: acc, publicKey: acc };
136
+ }
137
+ return {
138
+ address: acc.address,
139
+ publicKey: acc.publicKey || acc.address,
140
+ label: acc.label
111
141
  };
112
- window.addEventListener("rialo#initialized", handler, { once: true });
113
142
  });
114
143
  }
115
- var RialoWallet = class {
144
+
145
+ // src/core/wallet.ts
146
+ var CONNECT_TIMEOUT = 2e4;
147
+ var OPERATION_TIMEOUT = 3e4;
148
+ var SheepWallet = class {
116
149
  constructor() {
117
150
  this._connected = false;
118
151
  this._accounts = [];
119
152
  this._network = "devnet";
120
- this._listeners = /* @__PURE__ */ new Map();
121
- this.provider = getRialoProvider();
122
- this.setupEvents();
123
- }
124
- setupEvents() {
125
- if (!this.provider) return;
126
- this.provider.on("disconnect", () => {
127
- this._connected = false;
128
- this._accounts = [];
129
- });
130
- this.provider.on("accountsChanged", (data) => {
131
- const accounts = data;
132
- this._accounts = accounts;
133
- });
134
- this.provider.on("networkChanged", (data) => {
135
- const { network } = data;
136
- this._network = network;
137
- });
153
+ this._cleanupFns = [];
154
+ this._provider = getProvider();
155
+ this._setupEvents();
138
156
  }
157
+ // =========================================================================
158
+ // Getters (all synchronous, never block)
159
+ // =========================================================================
139
160
  get isInstalled() {
140
- return isRialoInstalled();
161
+ return isInstalled();
141
162
  }
142
163
  get connected() {
143
164
  return this._connected;
144
165
  }
145
166
  get accounts() {
146
- return this._accounts;
167
+ return [...this._accounts];
147
168
  }
148
169
  get activeAccount() {
149
170
  return this._accounts[0];
150
171
  }
172
+ get address() {
173
+ return this._accounts[0]?.address;
174
+ }
151
175
  get network() {
152
176
  return this._network;
153
177
  }
154
178
  get chainId() {
155
179
  return `rialo:${this._network}`;
156
180
  }
181
+ // =========================================================================
182
+ // Connection (with timeout protection)
183
+ // =========================================================================
157
184
  async connect() {
158
- this.provider = getRialoProvider();
159
- if (!this.provider) {
160
- throw new Error("Rialo Wallet not installed. Download at https://rialo.io/wallet");
185
+ this._provider = getProvider();
186
+ if (!this._provider) {
187
+ throw new Error("Sheep Wallet not installed. Get it at https://rialo.io/wallet");
188
+ }
189
+ try {
190
+ const rawAccounts = await withTimeout(
191
+ this._provider.connect(),
192
+ CONNECT_TIMEOUT,
193
+ "Connection timed out. Please open Sheep Wallet extension and approve the request."
194
+ );
195
+ this._accounts = normalizeAccounts(rawAccounts);
196
+ this._connected = true;
197
+ try {
198
+ this._network = await withTimeout(
199
+ this._provider.getNetwork(),
200
+ 5e3,
201
+ "Network request timed out"
202
+ );
203
+ } catch {
204
+ }
205
+ return this._accounts;
206
+ } catch (error) {
207
+ this._connected = false;
208
+ this._accounts = [];
209
+ throw error;
161
210
  }
162
- const accounts = await this.provider.connect();
163
- this._accounts = accounts;
164
- this._connected = true;
165
- const network = await this.provider.getNetwork();
166
- this._network = network;
167
- return this._accounts;
168
211
  }
169
212
  async disconnect() {
170
- if (this.provider) {
171
- await this.provider.disconnect();
213
+ try {
214
+ if (this._provider) {
215
+ await withTimeout(
216
+ this._provider.disconnect(),
217
+ 5e3,
218
+ "Disconnect timed out"
219
+ );
220
+ }
221
+ } catch {
172
222
  }
173
223
  this._connected = false;
174
224
  this._accounts = [];
175
225
  }
176
- async signMessage(message) {
177
- if (!this.provider || !this._connected) {
178
- throw new Error("Wallet not connected");
226
+ // =========================================================================
227
+ // Silent session check (for auto-connect, never triggers approval)
228
+ // =========================================================================
229
+ async checkSession() {
230
+ if (!this._provider) return null;
231
+ try {
232
+ const isConn = await withTimeout(
233
+ this._provider.isConnected(),
234
+ 3e3,
235
+ "Session check timed out"
236
+ );
237
+ if (!isConn) return null;
238
+ const rawAccounts = await withTimeout(
239
+ this._provider.getAccounts(),
240
+ 3e3,
241
+ "Get accounts timed out"
242
+ );
243
+ const accounts = normalizeAccounts(rawAccounts);
244
+ if (accounts.length > 0) {
245
+ this._accounts = accounts;
246
+ this._connected = true;
247
+ try {
248
+ this._network = await this._provider.getNetwork();
249
+ } catch {
250
+ }
251
+ return accounts;
252
+ }
253
+ } catch {
179
254
  }
180
- return this.provider.signMessage(message);
255
+ return null;
256
+ }
257
+ // =========================================================================
258
+ // Transactions
259
+ // =========================================================================
260
+ async signMessage(message) {
261
+ this._ensureConnected();
262
+ return withTimeout(
263
+ this._provider.signMessage(message),
264
+ OPERATION_TIMEOUT,
265
+ "Sign message timed out. Please check Sheep Wallet."
266
+ );
181
267
  }
182
268
  async signTransaction(tx) {
183
- if (!this.provider || !this._connected) {
184
- throw new Error("Wallet not connected");
185
- }
186
- const result = await this.provider.signTransaction(tx);
269
+ this._ensureConnected();
270
+ const result = await withTimeout(
271
+ this._provider.signTransaction(tx),
272
+ OPERATION_TIMEOUT,
273
+ "Sign transaction timed out. Please check Sheep Wallet."
274
+ );
187
275
  return result.signature;
188
276
  }
189
277
  async sendTransaction(tx) {
190
- if (!this.provider || !this._connected) {
191
- throw new Error("Wallet not connected");
192
- }
193
- return this.provider.sendTransaction(tx);
278
+ this._ensureConnected();
279
+ return withTimeout(
280
+ this._provider.sendTransaction(tx),
281
+ OPERATION_TIMEOUT,
282
+ "Send transaction timed out. Please check Sheep Wallet."
283
+ );
194
284
  }
195
285
  async signAndSendTransaction(tx) {
196
- if (!this.provider || !this._connected) {
197
- throw new Error("Wallet not connected");
198
- }
199
- return this.provider.signAndSendTransaction(tx);
286
+ this._ensureConnected();
287
+ return withTimeout(
288
+ this._provider.signAndSendTransaction(tx),
289
+ OPERATION_TIMEOUT,
290
+ "Transaction timed out. Please check Sheep Wallet."
291
+ );
200
292
  }
293
+ // =========================================================================
294
+ // Balance & Network
295
+ // =========================================================================
201
296
  async getBalance(address) {
202
- if (!this.provider) {
297
+ if (!this._provider) {
203
298
  throw new Error("Wallet not available");
204
299
  }
205
- const result = await this.provider.getBalance(address);
206
- if (typeof result === "string") return result;
207
- return result.balance;
300
+ const result = await withTimeout(
301
+ this._provider.getBalance(address),
302
+ 1e4,
303
+ "Balance request timed out"
304
+ );
305
+ return typeof result === "string" ? result : result.balance;
208
306
  }
209
307
  async switchNetwork(network) {
210
- if (!this.provider) {
308
+ if (!this._provider) {
211
309
  throw new Error("Wallet not available");
212
310
  }
213
- await this.provider.switchNetwork(network);
311
+ await withTimeout(
312
+ this._provider.switchNetwork(network),
313
+ 1e4,
314
+ "Switch network timed out"
315
+ );
214
316
  this._network = network;
215
317
  }
318
+ // =========================================================================
319
+ // Events
320
+ // =========================================================================
216
321
  on(event, callback) {
217
- if (!this.provider) {
322
+ if (!this._provider) {
218
323
  return () => {
219
324
  };
220
325
  }
221
- return this.provider.on(event, callback);
326
+ const cleanup = this._provider.on(event, callback);
327
+ this._cleanupFns.push(cleanup);
328
+ return cleanup;
329
+ }
330
+ destroy() {
331
+ this._cleanupFns.forEach((fn) => {
332
+ try {
333
+ fn();
334
+ } catch {
335
+ }
336
+ });
337
+ this._cleanupFns = [];
338
+ this._connected = false;
339
+ this._accounts = [];
340
+ }
341
+ // =========================================================================
342
+ // Private
343
+ // =========================================================================
344
+ _ensureConnected() {
345
+ if (!this._provider) {
346
+ throw new Error("Sheep Wallet not installed");
347
+ }
348
+ if (!this._connected || this._accounts.length === 0) {
349
+ throw new Error("Wallet not connected");
350
+ }
351
+ }
352
+ _setupEvents() {
353
+ if (!this._provider) return;
354
+ const onDisconnect = () => {
355
+ this._connected = false;
356
+ this._accounts = [];
357
+ };
358
+ const onAccountsChanged = (data) => {
359
+ const raw = data;
360
+ this._accounts = normalizeAccounts(raw);
361
+ };
362
+ const onNetworkChanged = (data) => {
363
+ const { network } = data;
364
+ if (network) this._network = network;
365
+ };
366
+ this._cleanupFns.push(
367
+ this._provider.on("disconnect", onDisconnect),
368
+ this._provider.on("accountsChanged", onAccountsChanged),
369
+ this._provider.on("networkChanged", onNetworkChanged)
370
+ );
222
371
  }
223
372
  };
224
- function formatAddress(address, chars = 4) {
225
- if (!address) return "";
226
- if (address.length <= chars * 2 + 3) return address;
227
- return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;
228
- }
229
- function formatBalance(kelvins, decimals = 4) {
230
- const value = typeof kelvins === "string" ? BigInt(kelvins || "0") : kelvins;
231
- const rlo = Number(value) / 1e9;
232
- return rlo.toFixed(decimals);
233
- }
234
- function parseBalance(rlo) {
235
- const value = typeof rlo === "string" ? parseFloat(rlo) : rlo;
236
- return BigInt(Math.floor(value * 1e9));
237
- }
238
- function isValidAddress(address) {
239
- if (!address || typeof address !== "string") return false;
240
- if (address.length < 32 || address.length > 50) return false;
241
- return /^[1-9A-HJ-NP-Za-km-z]+$/.test(address);
242
- }
243
- function toChainId(network) {
244
- return `rialo:${network}`;
245
- }
246
- function fromChainId(chainId) {
247
- return chainId.replace("rialo:", "");
248
- }
249
- var src_default = RialoWallet;
250
- // Annotate the CommonJS export names for ESM import in node:
251
- 0 && (module.exports = {
252
- NETWORKS,
253
- RialoWallet,
254
- formatAddress,
255
- formatBalance,
256
- fromChainId,
257
- getRialoProvider,
258
- isRialoInstalled,
259
- isValidAddress,
260
- parseBalance,
261
- toChainId,
262
- waitForRialoProvider
263
- });
373
+
374
+ exports.NETWORKS = NETWORKS;
375
+ exports.RialoWallet = SheepWallet;
376
+ exports.SheepWallet = SheepWallet;
377
+ exports.default = SheepWallet;
378
+ exports.formatAddress = formatAddress;
379
+ exports.formatBalance = formatBalance;
380
+ exports.fromChainId = fromChainId;
381
+ exports.getProvider = getProvider;
382
+ exports.getRialoProvider = getProvider;
383
+ exports.isInstalled = isInstalled;
384
+ exports.isRialoInstalled = isInstalled;
385
+ exports.isValidAddress = isValidAddress;
386
+ exports.normalizeAccounts = normalizeAccounts;
387
+ exports.parseBalance = parseBalance;
388
+ exports.toChainId = toChainId;
389
+ exports.waitForProvider = waitForProvider;
390
+ exports.waitForRialoProvider = waitForProvider;
391
+ exports.withTimeout = withTimeout;
392
+ //# sourceMappingURL=index.cjs.map
264
393
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @cookill/wallet-adapter v2.5.0\n * Sheep Wallet adapter for Rialo blockchain dApps\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RialoChain = 'rialo:mainnet' | 'rialo:testnet' | 'rialo:devnet' | 'rialo:localnet';\nexport type RialoNetwork = 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\nexport interface WalletAccount {\n address: string;\n publicKey?: Uint8Array | string;\n label?: string;\n}\n\nexport interface TransactionRequest {\n to: string;\n value: string;\n data?: string;\n memo?: string;\n}\n\nexport interface TransactionResult {\n hash: string;\n signature?: string;\n status: 'pending' | 'confirmed' | 'failed';\n blockNumber?: number;\n}\n\nexport interface SignedMessage {\n signature: string;\n message: string;\n address: string;\n publicKey?: string;\n}\n\nexport interface BalanceResult {\n balance: string;\n balanceKelvins: string;\n formatted: string;\n}\n\nexport interface NetworkConfig {\n chainId: string;\n name: string;\n rpcUrl: string;\n wsUrl?: string;\n explorerUrl?: string;\n symbol: string;\n decimals: number;\n}\n\nexport interface WalletInfo {\n id: string;\n name: string;\n icon: string;\n installed?: boolean;\n downloadUrl?: string;\n}\n\nexport type WalletEvent = \n | 'connect' \n | 'disconnect' \n | 'accountsChanged'\n | 'networkChanged' \n | 'chainChanged'\n | 'error';\n\n// ============================================================================\n// Network Configurations\n// ============================================================================\n\nexport const NETWORKS: Record<RialoNetwork, NetworkConfig> = {\n mainnet: {\n chainId: 'rialo:mainnet',\n name: 'Rialo Mainnet',\n rpcUrl: 'https://mainnet.rialo.io:4101',\n wsUrl: 'wss://mainnet.rialo.io:4102',\n explorerUrl: 'https://explorer.rialo.io',\n symbol: 'RLO',\n decimals: 9,\n },\n testnet: {\n chainId: 'rialo:testnet',\n name: 'Rialo Testnet',\n rpcUrl: 'https://testnet.rialo.io:4101',\n wsUrl: 'wss://testnet.rialo.io:4102',\n explorerUrl: 'https://testnet.explorer.rialo.io',\n symbol: 'tRLO',\n decimals: 9,\n },\n devnet: {\n chainId: 'rialo:devnet',\n name: 'Rialo Devnet',\n rpcUrl: 'https://devnet.rialo.io:4101',\n wsUrl: 'wss://devnet.rialo.io:4102',\n explorerUrl: 'https://devnet.explorer.rialo.io',\n symbol: 'dRLO',\n decimals: 9,\n },\n localnet: {\n chainId: 'rialo:localnet',\n name: 'Rialo Localnet',\n rpcUrl: 'http://localhost:4101',\n wsUrl: 'ws://localhost:4102',\n explorerUrl: 'http://localhost:3000',\n symbol: 'lRLO',\n decimals: 9,\n },\n};\n\n// ============================================================================\n// Provider Interface\n// ============================================================================\n\nexport interface RialoProvider {\n // Metadata\n isRialo: boolean;\n isSheepWallet?: boolean;\n name?: string;\n walletName?: string;\n version: string;\n icon?: string;\n\n // Connection\n connect(options?: { silent?: boolean }): Promise<WalletAccount[]>;\n disconnect(): Promise<void>;\n isConnected(): Promise<boolean>;\n getAccounts(): Promise<WalletAccount[]>;\n\n // Transactions\n signTransaction(tx: TransactionRequest): Promise<{ signature: string; signedTransaction?: string; rawTransaction?: string }>;\n sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n signAllTransactions?(txs: TransactionRequest[]): Promise<{ signedTransactions: string[] }>;\n\n // Message signing\n signMessage(message: string | Uint8Array): Promise<SignedMessage>;\n\n // Network\n getNetwork(): Promise<RialoNetwork>;\n switchNetwork(network: RialoNetwork): Promise<{ success: boolean }>;\n getChainId(): Promise<string>;\n getBalance(address?: string): Promise<BalanceResult | string>;\n\n // Events\n on(event: WalletEvent, callback: (data: unknown) => void): () => void;\n off?(event: WalletEvent, callback: (data: unknown) => void): void;\n removeListener(event: WalletEvent, callback: (data: unknown) => void): void;\n removeAllListeners(event?: WalletEvent): void;\n\n // Utilities\n utils?: {\n isValidAddress(address: string): boolean;\n formatAddress(address: string, chars?: number): string;\n };\n\n // Wallet Standard\n features?: string[];\n supportsFeature?(feature: string): boolean;\n\n // State getters\n readonly connected?: boolean;\n readonly accounts?: WalletAccount[];\n readonly address?: string | null;\n readonly publicKey?: string | null;\n readonly network?: RialoNetwork;\n readonly chainId?: string;\n}\n\n// ============================================================================\n// Detection & Access\n// ============================================================================\n\nexport function isRialoInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n return !!(window as RialoWindow).rialo?.isRialo;\n}\n\nexport function getRialoProvider(): RialoProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n const rialo = (window as RialoWindow).rialo;\n return rialo?.isRialo ? rialo : undefined;\n}\n\nexport function waitForRialoProvider(timeout = 3000): Promise<RialoProvider | undefined> {\n return new Promise((resolve) => {\n if (isRialoInstalled()) {\n resolve(getRialoProvider());\n return;\n }\n\n let resolved = false;\n const checkInterval = setInterval(() => {\n if (isRialoInstalled() && !resolved) {\n resolved = true;\n clearInterval(checkInterval);\n resolve(getRialoProvider());\n }\n }, 100);\n\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n clearInterval(checkInterval);\n resolve(undefined);\n }\n }, timeout);\n\n // Also listen for initialization event\n const handler = () => {\n if (!resolved) {\n resolved = true;\n clearInterval(checkInterval);\n resolve(getRialoProvider());\n }\n };\n window.addEventListener('rialo#initialized', handler, { once: true });\n });\n}\n\n// ============================================================================\n// Simple Wallet Class (Non-React)\n// ============================================================================\n\nexport class RialoWallet {\n private provider: RialoProvider | undefined;\n private _connected = false;\n private _accounts: WalletAccount[] = [];\n private _network: RialoNetwork = 'devnet';\n private _listeners: Map<string, Set<() => void>> = new Map();\n\n constructor() {\n this.provider = getRialoProvider();\n this.setupEvents();\n }\n\n private setupEvents() {\n if (!this.provider) return;\n\n this.provider.on('disconnect', () => {\n this._connected = false;\n this._accounts = [];\n });\n\n this.provider.on('accountsChanged', (data: unknown) => {\n const accounts = data as WalletAccount[];\n this._accounts = accounts;\n });\n\n this.provider.on('networkChanged', (data: unknown) => {\n const { network } = data as { network: RialoNetwork };\n this._network = network;\n });\n }\n\n get isInstalled(): boolean {\n return isRialoInstalled();\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get accounts(): WalletAccount[] {\n return this._accounts;\n }\n\n get activeAccount(): WalletAccount | undefined {\n return this._accounts[0];\n }\n\n get network(): RialoNetwork {\n return this._network;\n }\n\n get chainId(): string {\n return `rialo:${this._network}`;\n }\n\n async connect(): Promise<WalletAccount[]> {\n this.provider = getRialoProvider();\n if (!this.provider) {\n throw new Error('Rialo Wallet not installed. Download at https://rialo.io/wallet');\n }\n\n const accounts = await this.provider.connect();\n this._accounts = accounts;\n this._connected = true;\n\n const network = await this.provider.getNetwork();\n this._network = network;\n\n return this._accounts;\n }\n\n async disconnect(): Promise<void> {\n if (this.provider) {\n await this.provider.disconnect();\n }\n this._connected = false;\n this._accounts = [];\n }\n\n async signMessage(message: string): Promise<SignedMessage> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n return this.provider.signMessage(message);\n }\n\n async signTransaction(tx: TransactionRequest): Promise<string> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n const result = await this.provider.signTransaction(tx);\n return result.signature;\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n return this.provider.sendTransaction(tx);\n }\n\n async signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n return this.provider.signAndSendTransaction(tx);\n }\n\n async getBalance(address?: string): Promise<string> {\n if (!this.provider) {\n throw new Error('Wallet not available');\n }\n const result = await this.provider.getBalance(address);\n if (typeof result === 'string') return result;\n return result.balance;\n }\n\n async switchNetwork(network: RialoNetwork): Promise<void> {\n if (!this.provider) {\n throw new Error('Wallet not available');\n }\n await this.provider.switchNetwork(network);\n this._network = network;\n }\n\n on(event: WalletEvent, callback: (data: unknown) => void): () => void {\n if (!this.provider) {\n return () => {};\n }\n return this.provider.on(event, callback);\n }\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport function formatAddress(address: string, chars = 4): string {\n if (!address) return '';\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\nexport function formatBalance(kelvins: string | bigint, decimals = 4): string {\n const value = typeof kelvins === 'string' ? BigInt(kelvins || '0') : kelvins;\n const rlo = Number(value) / 1_000_000_000;\n return rlo.toFixed(decimals);\n}\n\nexport function parseBalance(rlo: string | number): bigint {\n const value = typeof rlo === 'string' ? parseFloat(rlo) : rlo;\n return BigInt(Math.floor(value * 1_000_000_000));\n}\n\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== 'string') return false;\n if (address.length < 32 || address.length > 50) return false;\n return /^[1-9A-HJ-NP-Za-km-z]+$/.test(address);\n}\n\nexport function toChainId(network: RialoNetwork): RialoChain {\n return `rialo:${network}` as RialoChain;\n}\n\nexport function fromChainId(chainId: RialoChain): RialoNetwork {\n return chainId.replace('rialo:', '') as RialoNetwork;\n}\n\n// ============================================================================\n// Window Extension\n// ============================================================================\n\ninterface RialoWindow extends Window {\n rialo?: RialoProvider;\n}\n\ndeclare global {\n interface Window {\n rialo?: RialoProvider;\n Rialo?: RialoProvider;\n }\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport default RialoWallet;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/provider.ts","../src/core/utils.ts","../src/core/wallet.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @cookill/wallet-adapter v3.0.0\n * Core type definitions\n */\n\n// ============================================================================\n// Network & Chain Types\n// ============================================================================\n\nexport type RialoNetwork = 'mainnet' | 'testnet' | 'devnet' | 'localnet';\nexport type RialoChainId = `rialo:${RialoNetwork}`;\n\nexport interface NetworkConfig {\n chainId: RialoChainId;\n name: string;\n rpcUrl: string;\n wsUrl?: string;\n explorerUrl?: string;\n symbol: string;\n decimals: number;\n}\n\nexport const NETWORKS: Record<RialoNetwork, NetworkConfig> = {\n mainnet: {\n chainId: 'rialo:mainnet',\n name: 'Rialo Mainnet',\n rpcUrl: 'https://mainnet.rialo.io:4101',\n wsUrl: 'wss://mainnet.rialo.io:4102',\n explorerUrl: 'https://explorer.rialo.io',\n symbol: 'RLO',\n decimals: 9,\n },\n testnet: {\n chainId: 'rialo:testnet',\n name: 'Rialo Testnet',\n rpcUrl: 'https://testnet.rialo.io:4101',\n wsUrl: 'wss://testnet.rialo.io:4102',\n explorerUrl: 'https://testnet.explorer.rialo.io',\n symbol: 'tRLO',\n decimals: 9,\n },\n devnet: {\n chainId: 'rialo:devnet',\n name: 'Rialo Devnet',\n rpcUrl: 'https://devnet.rialo.io:4101',\n wsUrl: 'wss://devnet.rialo.io:4102',\n explorerUrl: 'https://devnet.explorer.rialo.io',\n symbol: 'dRLO',\n decimals: 9,\n },\n localnet: {\n chainId: 'rialo:localnet',\n name: 'Rialo Localnet',\n rpcUrl: 'http://localhost:4101',\n wsUrl: 'ws://localhost:4102',\n explorerUrl: 'http://localhost:3000',\n symbol: 'lRLO',\n decimals: 9,\n },\n};\n\n// ============================================================================\n// Account Types\n// ============================================================================\n\nexport interface WalletAccount {\n address: string;\n publicKey?: string | Uint8Array;\n label?: string;\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport interface TransactionRequest {\n to: string;\n value: string;\n data?: string;\n memo?: string;\n}\n\nexport interface TransactionResult {\n hash: string;\n signature?: string;\n status: 'pending' | 'confirmed' | 'failed';\n blockNumber?: number;\n}\n\nexport interface SignedMessage {\n signature: string;\n message: string;\n address: string;\n publicKey?: string;\n}\n\nexport interface BalanceResult {\n balance: string;\n formatted: string;\n}\n\n// ============================================================================\n// Wallet Info\n// ============================================================================\n\nexport interface WalletInfo {\n id: string;\n name: string;\n icon: string;\n installed?: boolean;\n downloadUrl?: string;\n}\n\n// ============================================================================\n// Provider Interface (what window.rialo exposes)\n// ============================================================================\n\nexport type WalletEventType = \n | 'connect' \n | 'disconnect' \n | 'accountsChanged'\n | 'networkChanged' \n | 'chainChanged'\n | 'error';\n\nexport interface RialoProvider {\n // Identity\n isRialo: boolean;\n isSheepWallet?: boolean;\n version: string;\n \n // Connection\n connect(options?: { silent?: boolean }): Promise<Array<string | WalletAccount>>;\n disconnect(): Promise<void>;\n isConnected(): Promise<boolean>;\n getAccounts(): Promise<Array<string | WalletAccount>>;\n \n // Transactions\n signTransaction(tx: TransactionRequest): Promise<{ signature: string; rawTransaction?: string }>;\n sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n \n // Message signing\n signMessage(message: string | Uint8Array): Promise<SignedMessage>;\n \n // Network\n getNetwork(): Promise<RialoNetwork>;\n switchNetwork(network: RialoNetwork): Promise<{ success: boolean }>;\n getBalance(address?: string): Promise<BalanceResult | string>;\n \n // Events\n on(event: WalletEventType, callback: (data: unknown) => void): () => void;\n removeListener(event: WalletEventType, callback: (data: unknown) => void): void;\n removeAllListeners(event?: WalletEventType): void;\n}\n\n// Window extension\ndeclare global {\n interface Window {\n rialo?: RialoProvider;\n }\n}\n","/**\n * @cookill/wallet-adapter v3.0.0\n * Provider detection and access utilities\n * \n * CRITICAL: All provider access is non-blocking and defensive\n */\n\nimport type { RialoProvider } from './types';\n\n/**\n * Check if Rialo/Sheep Wallet is installed\n * This is synchronous and never blocks\n */\nexport function isInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return !!window.rialo?.isRialo;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the provider reference (synchronous)\n * Returns undefined if not installed\n */\nexport function getProvider(): RialoProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n try {\n const provider = window.rialo;\n if (provider?.isRialo) return provider;\n } catch {}\n return undefined;\n}\n\n/**\n * Wait for provider to become available\n * Uses polling + event listener, with guaranteed timeout\n * \n * @param timeout Maximum time to wait in ms (default 3000)\n */\nexport function waitForProvider(timeout = 3000): Promise<RialoProvider | undefined> {\n return new Promise((resolve) => {\n // Already available?\n const existing = getProvider();\n if (existing) {\n resolve(existing);\n return;\n }\n\n let resolved = false;\n let checkInterval: ReturnType<typeof setInterval> | null = null;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n resolved = true;\n if (checkInterval) clearInterval(checkInterval);\n if (timeoutId) clearTimeout(timeoutId);\n };\n\n const done = (provider: RialoProvider | undefined) => {\n if (resolved) return;\n cleanup();\n resolve(provider);\n };\n\n // Poll every 100ms\n checkInterval = setInterval(() => {\n const p = getProvider();\n if (p) done(p);\n }, 100);\n\n // Listen for initialization event\n const onInit = () => done(getProvider());\n window.addEventListener('rialo#initialized', onInit, { once: true });\n\n // Guaranteed timeout\n timeoutId = setTimeout(() => {\n window.removeEventListener('rialo#initialized', onInit);\n done(undefined);\n }, timeout);\n });\n}\n\n/**\n * Promise timeout wrapper\n * Ensures promises never hang indefinitely\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n errorMessage = 'Operation timed out'\n): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeout = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(errorMessage)), ms);\n });\n\n return Promise.race([promise, timeout]).finally(() => {\n if (timeoutId) clearTimeout(timeoutId);\n }) as Promise<T>;\n}\n","/**\n * @cookill/wallet-adapter v3.0.0\n * Utility functions\n */\n\nimport type { WalletAccount, RialoNetwork, RialoChainId } from './types';\n\n/**\n * Format address for display (truncated)\n */\nexport function formatAddress(address: string, chars = 4): string {\n if (!address) return '';\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\n/**\n * Format balance from kelvins to RLO\n */\nexport function formatBalance(kelvins: string | bigint, decimals = 4): string {\n const value = typeof kelvins === 'string' ? BigInt(kelvins || '0') : kelvins;\n const rlo = Number(value) / 1_000_000_000;\n return rlo.toFixed(decimals);\n}\n\n/**\n * Parse RLO amount to kelvins\n */\nexport function parseBalance(rlo: string | number): bigint {\n const value = typeof rlo === 'string' ? parseFloat(rlo) : rlo;\n return BigInt(Math.floor(value * 1_000_000_000));\n}\n\n/**\n * Validate Rialo address format\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== 'string') return false;\n if (address.length < 32 || address.length > 50) return false;\n return /^[1-9A-HJ-NP-Za-km-z]+$/.test(address);\n}\n\n/**\n * Convert network name to chain ID\n */\nexport function toChainId(network: RialoNetwork): RialoChainId {\n return `rialo:${network}`;\n}\n\n/**\n * Extract network from chain ID\n */\nexport function fromChainId(chainId: RialoChainId): RialoNetwork {\n return chainId.replace('rialo:', '') as RialoNetwork;\n}\n\n/**\n * Normalize account data (handles both string and object formats)\n * CRITICAL: Extension can return either string[] or WalletAccount[]\n */\nexport function normalizeAccounts(accounts: Array<string | WalletAccount>): WalletAccount[] {\n if (!Array.isArray(accounts)) return [];\n \n return accounts.map((acc): WalletAccount => {\n if (typeof acc === 'string') {\n return { address: acc, publicKey: acc };\n }\n return {\n address: acc.address,\n publicKey: acc.publicKey || acc.address,\n label: acc.label,\n };\n });\n}\n","/**\n * @cookill/wallet-adapter v3.0.0\n * Pure JavaScript wallet class (no React dependency)\n * \n * Usage:\n * const wallet = new SheepWallet();\n * if (!wallet.isInstalled) { ... prompt install ... }\n * const accounts = await wallet.connect();\n */\n\nimport type { \n RialoProvider, \n WalletAccount, \n RialoNetwork,\n TransactionRequest, \n TransactionResult, \n SignedMessage \n} from './types';\nimport { isInstalled, getProvider, withTimeout } from './provider';\nimport { normalizeAccounts } from './utils';\n\n// Connection timeout (20 seconds)\nconst CONNECT_TIMEOUT = 20_000;\n\n// Other operation timeout (30 seconds)\nconst OPERATION_TIMEOUT = 30_000;\n\nexport class SheepWallet {\n private _provider: RialoProvider | undefined;\n private _connected = false;\n private _accounts: WalletAccount[] = [];\n private _network: RialoNetwork = 'devnet';\n private _cleanupFns: Array<() => void> = [];\n\n constructor() {\n this._provider = getProvider();\n this._setupEvents();\n }\n\n // =========================================================================\n // Getters (all synchronous, never block)\n // =========================================================================\n\n get isInstalled(): boolean {\n return isInstalled();\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get accounts(): WalletAccount[] {\n return [...this._accounts];\n }\n\n get activeAccount(): WalletAccount | undefined {\n return this._accounts[0];\n }\n\n get address(): string | undefined {\n return this._accounts[0]?.address;\n }\n\n get network(): RialoNetwork {\n return this._network;\n }\n\n get chainId(): string {\n return `rialo:${this._network}`;\n }\n\n // =========================================================================\n // Connection (with timeout protection)\n // =========================================================================\n\n async connect(): Promise<WalletAccount[]> {\n // Refresh provider reference\n this._provider = getProvider();\n \n if (!this._provider) {\n throw new Error('Sheep Wallet not installed. Get it at https://rialo.io/wallet');\n }\n\n try {\n // CRITICAL: Wrap connect() with timeout to prevent infinite hang\n const rawAccounts = await withTimeout(\n this._provider.connect(),\n CONNECT_TIMEOUT,\n 'Connection timed out. Please open Sheep Wallet extension and approve the request.'\n );\n\n this._accounts = normalizeAccounts(rawAccounts);\n this._connected = true;\n\n // Get network (with separate timeout, non-blocking on failure)\n try {\n this._network = await withTimeout(\n this._provider.getNetwork(),\n 5_000,\n 'Network request timed out'\n );\n } catch {\n // Keep default network on failure\n }\n\n return this._accounts;\n } catch (error) {\n this._connected = false;\n this._accounts = [];\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n if (this._provider) {\n await withTimeout(\n this._provider.disconnect(),\n 5_000,\n 'Disconnect timed out'\n );\n }\n } catch {\n // Ignore disconnect errors\n }\n \n this._connected = false;\n this._accounts = [];\n }\n\n // =========================================================================\n // Silent session check (for auto-connect, never triggers approval)\n // =========================================================================\n\n async checkSession(): Promise<WalletAccount[] | null> {\n if (!this._provider) return null;\n\n try {\n const isConn = await withTimeout(\n this._provider.isConnected(),\n 3_000,\n 'Session check timed out'\n );\n\n if (!isConn) return null;\n\n const rawAccounts = await withTimeout(\n this._provider.getAccounts(),\n 3_000,\n 'Get accounts timed out'\n );\n\n const accounts = normalizeAccounts(rawAccounts);\n if (accounts.length > 0) {\n this._accounts = accounts;\n this._connected = true;\n\n try {\n this._network = await this._provider.getNetwork();\n } catch {}\n\n return accounts;\n }\n } catch {\n // Session check failure is not an error\n }\n\n return null;\n }\n\n // =========================================================================\n // Transactions\n // =========================================================================\n\n async signMessage(message: string): Promise<SignedMessage> {\n this._ensureConnected();\n \n return withTimeout(\n this._provider!.signMessage(message),\n OPERATION_TIMEOUT,\n 'Sign message timed out. Please check Sheep Wallet.'\n );\n }\n\n async signTransaction(tx: TransactionRequest): Promise<string> {\n this._ensureConnected();\n \n const result = await withTimeout(\n this._provider!.signTransaction(tx),\n OPERATION_TIMEOUT,\n 'Sign transaction timed out. Please check Sheep Wallet.'\n );\n \n return result.signature;\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this._ensureConnected();\n \n return withTimeout(\n this._provider!.sendTransaction(tx),\n OPERATION_TIMEOUT,\n 'Send transaction timed out. Please check Sheep Wallet.'\n );\n }\n\n async signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this._ensureConnected();\n \n return withTimeout(\n this._provider!.signAndSendTransaction(tx),\n OPERATION_TIMEOUT,\n 'Transaction timed out. Please check Sheep Wallet.'\n );\n }\n\n // =========================================================================\n // Balance & Network\n // =========================================================================\n\n async getBalance(address?: string): Promise<string> {\n if (!this._provider) {\n throw new Error('Wallet not available');\n }\n\n const result = await withTimeout(\n this._provider.getBalance(address),\n 10_000,\n 'Balance request timed out'\n );\n\n return typeof result === 'string' ? result : result.balance;\n }\n\n async switchNetwork(network: RialoNetwork): Promise<void> {\n if (!this._provider) {\n throw new Error('Wallet not available');\n }\n\n await withTimeout(\n this._provider.switchNetwork(network),\n 10_000,\n 'Switch network timed out'\n );\n\n this._network = network;\n }\n\n // =========================================================================\n // Events\n // =========================================================================\n\n on(event: string, callback: (data: unknown) => void): () => void {\n if (!this._provider) {\n return () => {};\n }\n\n const cleanup = this._provider.on(event as any, callback);\n this._cleanupFns.push(cleanup);\n return cleanup;\n }\n\n destroy(): void {\n this._cleanupFns.forEach(fn => {\n try { fn(); } catch {}\n });\n this._cleanupFns = [];\n this._connected = false;\n this._accounts = [];\n }\n\n // =========================================================================\n // Private\n // =========================================================================\n\n private _ensureConnected(): void {\n if (!this._provider) {\n throw new Error('Sheep Wallet not installed');\n }\n if (!this._connected || this._accounts.length === 0) {\n throw new Error('Wallet not connected');\n }\n }\n\n private _setupEvents(): void {\n if (!this._provider) return;\n\n const onDisconnect = () => {\n this._connected = false;\n this._accounts = [];\n };\n\n const onAccountsChanged = (data: unknown) => {\n const raw = data as Array<string | WalletAccount>;\n this._accounts = normalizeAccounts(raw);\n };\n\n const onNetworkChanged = (data: unknown) => {\n const { network } = data as { network: RialoNetwork };\n if (network) this._network = network;\n };\n\n this._cleanupFns.push(\n this._provider.on('disconnect', onDisconnect),\n this._provider.on('accountsChanged', onAccountsChanged),\n this._provider.on('networkChanged', onNetworkChanged)\n );\n }\n}\n\nexport default SheepWallet;\n"]}