toss-expo-sdk 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +122 -66
  2. package/lib/module/client/TossClient.js +26 -43
  3. package/lib/module/client/TossClient.js.map +1 -1
  4. package/lib/module/contexts/WalletContext.js +4 -4
  5. package/lib/module/contexts/WalletContext.js.map +1 -1
  6. package/lib/module/discovery.js +35 -8
  7. package/lib/module/discovery.js.map +1 -1
  8. package/lib/module/examples/offlinePaymentFlow.js +27 -2
  9. package/lib/module/examples/offlinePaymentFlow.js.map +1 -1
  10. package/lib/module/index.js +2 -1
  11. package/lib/module/index.js.map +1 -1
  12. package/lib/module/intent.js +69 -0
  13. package/lib/module/intent.js.map +1 -1
  14. package/lib/module/nfc.js +1 -1
  15. package/lib/module/noise.js +1 -1
  16. package/lib/module/storage/secureStorage.js.map +1 -1
  17. package/lib/module/storage.js +4 -4
  18. package/lib/typescript/src/client/TossClient.d.ts +10 -12
  19. package/lib/typescript/src/client/TossClient.d.ts.map +1 -1
  20. package/lib/typescript/src/discovery.d.ts +8 -2
  21. package/lib/typescript/src/discovery.d.ts.map +1 -1
  22. package/lib/typescript/src/examples/offlinePaymentFlow.d.ts +9 -1
  23. package/lib/typescript/src/examples/offlinePaymentFlow.d.ts.map +1 -1
  24. package/lib/typescript/src/index.d.ts +3 -1
  25. package/lib/typescript/src/index.d.ts.map +1 -1
  26. package/lib/typescript/src/intent.d.ts +11 -0
  27. package/lib/typescript/src/intent.d.ts.map +1 -1
  28. package/package.json +12 -1
  29. package/src/__tests__/reconciliation.test.tsx +7 -1
  30. package/src/client/TossClient.ts +35 -48
  31. package/src/contexts/WalletContext.tsx +4 -4
  32. package/src/discovery.ts +46 -8
  33. package/src/examples/offlinePaymentFlow.ts +48 -2
  34. package/src/index.tsx +9 -1
  35. package/src/intent.ts +88 -0
  36. package/src/nfc.ts +4 -4
  37. package/src/noise.ts +1 -1
  38. package/src/storage/secureStorage.ts +4 -4
  39. package/src/storage.ts +4 -4
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  **TOSS (The Offline Solana Stack)** is a robust, production-ready SDK for building offline-capable Solana applications with secure local transport and delayed on-chain settlement.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/toss-expo-sdk)](https://www.npmjs.com/package/toss-expo-sdk)
6
- [![License](https://img.shields.io/badge/License-Proprietary-blue.svg)](LICENSE)
6
+ [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
7
7
 
8
8
  ## 🚀 Features
9
9
 
@@ -31,20 +31,24 @@
31
31
 
32
32
  ```bash
33
33
  # Using npm
34
- npm install toss-expo-sdk @solana/web3.js
34
+ npm install toss-expo-sdk
35
35
 
36
36
  # Using yarn
37
- yarn add toss-expo-sdk @solana/web3.js
37
+ yarn add toss-expo-sdk
38
38
  ```
39
39
 
40
+ All dependencies (Solana Web3.js, Arcium, Noise Protocol, etc.) are automatically included.
41
+
40
42
  ## 🏁 Quick Start
41
43
 
42
44
  ### Initialize the Client
43
45
 
46
+ Recommended: use the `createClient` helper for concise initialization.
47
+
44
48
  ```typescript
45
- import { TossClient } from 'toss-expo-sdk';
49
+ import { createClient } from 'toss-expo-sdk';
46
50
 
47
- const client = new TossClient({
51
+ const client = createClient({
48
52
  projectId: 'your-project-id',
49
53
  mode: 'devnet', // or 'testnet' | 'mainnet-beta'
50
54
  privateTransactions: true,
@@ -53,28 +57,65 @@ const client = new TossClient({
53
57
  });
54
58
  ```
55
59
 
56
- ### Create and Send an Intent
60
+ Or, you may call the static constructor directly if you prefer:
57
61
 
58
62
  ```typescript
59
- // Create a transfer intent
60
- const intent = await client.createIntent(
61
- senderKeypair, // or 'current' to use connected wallet
62
- recipientAddress,
63
+ import { TossClient } from 'toss-expo-sdk';
64
+ const client = TossClient.createClient({ projectId: 'your-project-id' });
65
+ ```
66
+
67
+ ### Create and Sign an Intent
68
+
69
+ Prefer the user-centric API which accepts `TossUser` objects and validates user features.
70
+
71
+ > Note: There are two common ways to create a user intent:
72
+ >
73
+ > - `createUserIntent(senderUser, senderKeypair, recipientUser, amount, connection, options)` — top-level helper suitable for scripts or when you have both user objects and the signing `Keypair` available.
74
+ > - `TossClient.createUserIntent(senderKeypair, recipient, amount, options)` — an instance method used when working with a `TossClient`. This requires an explicit `Keypair` for signing (TossClient is framework-agnostic). For React apps, prefer unlocking the wallet via `WalletProvider` and calling the top-level `createUserIntent` with the unlocked `Keypair`.
75
+
76
+ ```typescript
77
+ import {
78
+ createUserIntent,
79
+ createSignedIntent, // legacy: accepts Keypair + PublicKey
80
+ secureStoreIntent,
81
+ syncToChain,
82
+ } from 'toss-expo-sdk';
83
+ import { Connection } from '@solana/web3.js';
84
+ import type { TossUser } from 'toss-expo-sdk';
85
+
86
+ const connection = new Connection('https://api.devnet.solana.com');
87
+
88
+ // Example using TossUser objects
89
+ const intent = await createUserIntent(
90
+ senderUser, // TossUser (includes wallet.publicKey and features)
91
+ senderKeypair, // Keypair object for signing (must match senderUser.wallet)
92
+ recipientUser, // TossUser
63
93
  amountInLamports,
64
- {
65
- memo: 'Payment for services',
66
- useDurableNonce: true,
67
- }
94
+ connection,
95
+ { expiresIn: 60 * 60, privateTransaction: true }
68
96
  );
69
97
 
70
- // Later, when online
71
- const syncedIntents = await client.sync();
98
+ // Store intent locally
99
+ await secureStoreIntent(intent);
100
+
101
+ // Later, when online, sync to Solana
102
+ const syncResult = await syncToChain(connection);
103
+ console.log(`Settled: ${syncResult.successfulSettlements.length}`);
104
+
105
+ // Legacy: If you already have an address and Keypair, use createSignedIntent
106
+ const legacyIntent = await createSignedIntent(
107
+ senderKeypair,
108
+ recipientPublicKey,
109
+ amountInLamports,
110
+ connection
111
+ );
72
112
  ```
73
113
 
74
114
  ### Using with React Native
75
115
 
76
116
  ```typescript
77
- import { WalletProvider, useWallet } from 'toss-expo-sdk';
117
+ import { WalletProvider, useWallet, createUserIntent, secureStoreIntent, syncToChain } from 'toss-expo-sdk';
118
+ import { View, Button } from 'react-native';
78
119
 
79
120
  function App() {
80
121
  return (
@@ -86,14 +127,38 @@ function App() {
86
127
 
87
128
  function PaymentScreen() {
88
129
  const {
89
- isConnected,
90
- connect,
91
- disconnect,
92
- signMessage,
93
- sendTransaction
130
+ isUnlocked,
131
+ unlockWallet,
132
+ lockWallet,
133
+ keypair,
134
+ user,
94
135
  } = useWallet();
95
136
 
96
- // ... rest of your component
137
+ const handlePay = async (recipientUser, amountLamports, connection) => {
138
+ if (!isUnlocked || !keypair || !user) {
139
+ // Ensure wallet is unlocked and keypair is available
140
+ const ok = await unlockWallet();
141
+ if (!ok) throw new Error('Wallet is locked');
142
+ }
143
+
144
+ // Create intent using unlocked keypair and TossUser context
145
+ const intent = await createUserIntent(user, keypair, recipientUser, amountLamports, connection);
146
+ await secureStoreIntent(intent);
147
+
148
+ // Optionally trigger sync when online
149
+ // await syncToChain(connection);
150
+
151
+ return intent;
152
+ };
153
+
154
+ return (
155
+ <View>
156
+ <Button
157
+ title={isUnlocked ? 'Lock Wallet' : 'Unlock Wallet'}
158
+ onPress={() => (isUnlocked ? lockWallet() : unlockWallet())}
159
+ />
160
+ </View>
161
+ );
97
162
  }
98
163
  ```
99
164
 
@@ -140,23 +205,28 @@ The SDK provides detailed error codes for handling various scenarios. All errors
140
205
  #### Error Handling Example
141
206
 
142
207
  ```typescript
143
- import { ERROR_CODES } from 'toss-expo-sdk';
208
+ import { TossError } from 'toss-expo-sdk';
144
209
 
145
210
  try {
146
- await client.createIntent(...);
211
+ const intent = await createSignedIntent(...);
212
+ await secureStoreIntent(intent);
147
213
  } catch (error) {
148
- if (error.code === ERROR_CODES.INSUFFICIENT_FUNDS) {
149
- // Handle insufficient funds
150
- console.error('Insufficient funds for this transaction');
151
- } else if (error.code === ERROR_CODES.INTENT_EXPIRED) {
152
- // Handle expired intent
153
- console.error('This transaction intent has expired');
154
- } else if (error.code === ERROR_CODES.NETWORK_ERROR) {
155
- // Handle network issues
156
- console.error('Network error occurred. Please check your connection.');
214
+ if (error instanceof TossError) {
215
+ switch (error.code) {
216
+ case 'INSUFFICIENT_FUNDS':
217
+ console.error('Insufficient funds for this transaction');
218
+ break;
219
+ case 'INTENT_EXPIRED':
220
+ console.error('This transaction intent has expired');
221
+ break;
222
+ case 'NETWORK_ERROR':
223
+ console.error('Network error occurred. Please check your connection.');
224
+ break;
225
+ default:
226
+ console.error(`Error [${error.code}]: ${error.message}`);
227
+ }
157
228
  } else {
158
- // Handle other errors
159
- console.error('An error occurred:', error.message);
229
+ console.error('An unexpected error occurred:', error);
160
230
  }
161
231
  }
162
232
  ```
@@ -234,34 +304,30 @@ console.log(`Losers: ${resolution.losers.map((i) => i.id)}`);
234
304
  Devices can discover and exchange intents with nearby peers:
235
305
 
236
306
  ```typescript
237
- import { deviceDiscovery, intentExchange } from 'toss-expo-sdk';
238
- import { startTossScan } from 'toss-expo-sdk';
307
+ import { DeviceDiscoveryService, startTossScan } from 'toss-expo-sdk';
239
308
 
240
- // Scan for nearby TOSS devices
309
+ const discovery = new DeviceDiscoveryService();
310
+
311
+ // Scan for nearby TOSS devices via BLE
241
312
  startTossScan(
242
313
  (user, device) => {
243
314
  // Register discovered peer
244
- deviceDiscovery.registerPeer({
315
+ discovery.registerPeer({
245
316
  id: device.id,
246
317
  user,
247
318
  lastSeen: Date.now(),
248
319
  transport: 'ble',
249
320
  });
250
-
251
- // Create intent exchange request
252
- const request = intentExchange.createRequest(
253
- myIntent,
254
- 'my-device-id',
255
- undefined,
256
- 5 * 60 // 5 minute expiry
257
- );
258
-
259
- console.log(`Exchange request created: ${request.requestId}`);
321
+ console.log(`Peer discovered: ${device.id}`);
260
322
  },
261
323
  (intent, device) => {
262
324
  console.log(`Received intent from ${device.id}`);
263
325
  }
264
326
  );
327
+
328
+ // Get active peers
329
+ const activePeers = discovery.getActivePeers();
330
+ console.log(`${activePeers.length} active peers nearby`);
265
331
  ```
266
332
 
267
333
  ## 🌐 Network Support
@@ -272,21 +338,11 @@ startTossScan(
272
338
  | Testnet | ✅ Live | https://api.testnet.solana.com |
273
339
  | Mainnet | ✅ Live | https://api.mainnet-beta.solana.com |
274
340
 
275
- ## 📚 Architecture and Design
341
+ ## 📚 Complete Documentation
276
342
 
277
- For complete implementation details including:
278
-
279
- - Full API reference
280
- - Architecture diagrams
281
- - Performance considerations
282
- - Future improvements
283
-
284
- See [IMPLEMENTATION.md](./IMPLEMENTATION.md)
285
-
286
- ## 🌐 Network Support
343
+ For comprehensive information, see:
287
344
 
288
- | Network | Status | RPC Endpoint |
289
- | ------- | ------- | ------------------------------ |
290
- | Devnet | Live | https://api.devnet.solana.com |
291
- | Testnet | Live | https://api.testnet.solana.com |
292
- | Mainnet | ✅ Live | https://api.mainnet.solana.com |
345
+ - [DOCUMENTATION_INDEX.md](./DOCUMENTATION_INDEX.md) - Complete documentation guide
346
+ - [TOSS_PAPER_IMPLEMENTATION_VERIFICATION.md](./TOSS_PAPER_IMPLEMENTATION_VERIFICATION.md) - TOSS paper compliance
347
+ - [PAPER_VS_IMPLEMENTATION_AUDIT.md](./PAPER_VS_IMPLEMENTATION_AUDIT.md) - Detailed technical audit
348
+ - [USER_SECURITY_AND_KEY_MANAGEMENT.md](./USER_SECURITY_AND_KEY_MANAGEMENT.md) - Security model and biometric protection
@@ -6,7 +6,7 @@ import { secureStoreIntent, getSecureIntent, getAllSecureIntents } from "../stor
6
6
  import { processIntentsForSync } from "../intentManager.js";
7
7
  import { TossError, NetworkError, StorageError, ERROR_CODES } from "../errors.js";
8
8
  import { createNonceAccount, getNonce } from "../utils/nonceUtils.js";
9
- import { useWallet } from "../contexts/WalletContext.js";
9
+ // Note: TossClient is not tied to a React hook. To use wallet-provided keys in React, pass a Keypair to methods directly.
10
10
  import { syncToChain, checkSyncStatus } from "../sync.js";
11
11
  import { detectConflicts, getReconciliationState } from "../reconciliation.js";
12
12
  const DEFAULT_RETRY_OPTIONS = {
@@ -32,10 +32,6 @@ export class TossClient {
32
32
  feePayer: config.feePayer
33
33
  };
34
34
  this.connection = new Connection(this.config.rpcUrl, 'confirmed');
35
- this.walletContext = useWallet();
36
- if (!this.walletContext) {
37
- throw new Error('TossClient must be used within a WalletProvider');
38
- }
39
35
  }
40
36
  getDefaultRpcUrl(network) {
41
37
  const urls = {
@@ -114,10 +110,14 @@ export class TossClient {
114
110
  throw new TossError('Connection not initialized', ERROR_CODES.NETWORK_ERROR);
115
111
  }
116
112
 
117
- // Handle 'current' sender to use the wallet context
118
- const senderKeypair = sender === 'current' ? this.walletContext.keypair : sender;
113
+ // Handle 'current' sender: explicit wallet integration via React hooks is
114
+ // not available in this non-React class. Require a Keypair to be passed.
115
+ if (sender === 'current') {
116
+ throw new TossError('Using "current" as sender is only supported when the client is used inside a WalletProvider. Please provide a Keypair instead.', ERROR_CODES.SIGNATURE_VERIFICATION_FAILED);
117
+ }
118
+ const senderKeypair = sender;
119
119
  if (!senderKeypair) {
120
- throw new TossError('No sender keypair provided and no wallet is connected', ERROR_CODES.SIGNATURE_VERIFICATION_FAILED);
120
+ throw new TossError('No sender keypair provided', ERROR_CODES.SIGNATURE_VERIFICATION_FAILED);
121
121
  }
122
122
 
123
123
  // Convert string addresses to PublicKey if needed
@@ -177,10 +177,10 @@ export class TossClient {
177
177
  };
178
178
  await secureStoreIntent(updatedIntent);
179
179
  return updatedIntent;
180
- } catch (error) {
181
- if (error instanceof TossError) throw error;
180
+ } catch (err) {
181
+ if (err instanceof TossError) throw err;
182
182
  throw new StorageError('Failed to update intent status', {
183
- cause: error,
183
+ cause: err,
184
184
  intentId,
185
185
  status
186
186
  });
@@ -272,53 +272,36 @@ export class TossClient {
272
272
  /**
273
273
  * Create an intent from the current user's wallet
274
274
  */
275
- async createUserIntent(recipient, amount, options = {}) {
276
- if (!this.walletContext.user) {
277
- throw new TossError('No user is currently signed in', ERROR_CODES.SIGNATURE_VERIFICATION_FAILED);
278
- }
279
-
280
- // Ensure wallet is unlocked
281
- if (!this.walletContext.isUnlocked) {
282
- const unlocked = await this.walletContext.unlockWallet();
283
- if (!unlocked) {
284
- throw new TossError('Wallet is locked', ERROR_CODES.SIGNATURE_VERIFICATION_FAILED);
285
- }
286
- }
275
+ /**
276
+ * Create an intent using an explicit Keypair for the sender.
277
+ * Use this method from non-React contexts. For React apps, use
278
+ * WalletProvider.createUserIntent helper wrappers that call
279
+ * TossClient.createIntent with the unlocked keypair.
280
+ */
281
+ async createUserIntent(senderKeypair, recipient, amount, options = {}) {
287
282
  const recipientPubkey = typeof recipient === 'string' ? new PublicKey(recipient) : recipient;
288
- return this.createIntent('current',
289
- // This will use the wallet context's keypair
290
- recipientPubkey, amount, this.walletContext.user.wallet.publicKey, {
283
+ return this.createIntent(senderKeypair, recipientPubkey, amount, senderKeypair.publicKey, {
291
284
  ...options,
292
285
  memo: options.memo || `TOSS transfer to ${recipientPubkey.toBase58()}`
293
286
  });
294
287
  }
295
288
 
296
289
  /**
297
- * Get the current user's wallet address
290
+ * The following helper methods require a WalletProvider (React) context.
291
+ * TossClient is framework-agnostic; if you need these features from a
292
+ * React app, use the WalletProvider utilities instead.
298
293
  */
299
294
  getCurrentUserAddress() {
300
- return this.walletContext.user?.wallet.publicKey.toString() || null;
295
+ throw new Error('getCurrentUserAddress is only available when using WalletProvider');
301
296
  }
302
-
303
- /**
304
- * Check if the wallet is currently unlocked
305
- */
306
297
  isWalletUnlocked() {
307
- return this.walletContext.isUnlocked;
298
+ throw new Error('isWalletUnlocked is only available when using WalletProvider');
308
299
  }
309
-
310
- /**
311
- * Lock the wallet
312
- */
313
300
  async lockWallet() {
314
- await this.walletContext.lockWallet();
301
+ throw new Error('lockWallet is only available when using WalletProvider');
315
302
  }
316
-
317
- /**
318
- * Sign out the current user
319
- */
320
303
  async signOut() {
321
- await this.walletContext.signOut();
304
+ throw new Error('signOut is only available when using WalletProvider');
322
305
  }
323
306
  }
324
307
  //# sourceMappingURL=TossClient.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Connection","PublicKey","createIntent","secureStoreIntent","getSecureIntent","getAllSecureIntents","processIntentsForSync","TossError","NetworkError","StorageError","ERROR_CODES","createNonceAccount","getNonce","useWallet","syncToChain","checkSyncStatus","detectConflicts","getReconciliationState","DEFAULT_RETRY_OPTIONS","maxRetries","retryDelay","TossClient","createClient","config","constructor","projectId","mode","privateTransactions","provider","sync","syncBackupDb","rpcUrl","getDefaultRpcUrl","feePayer","connection","walletContext","Error","network","urls","devnet","withRetry","fn","context","lastError","attempt","error","delay","Math","pow","Promise","resolve","setTimeout","message","cause","initializeNonceAccount","amount","nonceAccount","nonceAuth","undefined","publicKey","toBase58","getCurrentNonce","sender","recipient","options","NETWORK_ERROR","senderKeypair","keypair","SIGNATURE_VERIFICATION_FAILED","recipientPubkey","feePayerPubkey","useDurableNonce","getLatestBlockhash","intent","TRANSACTION_FAILED","getIntents","updateIntentStatus","intentId","status","updatedAt","Date","now","updatedIntent","intents","dbUrl","processedIntents","all","map","fullSync","detectIntentConflicts","getReconciliationStatus","createUserIntent","user","isUnlocked","unlocked","unlockWallet","wallet","memo","getCurrentUserAddress","toString","isWalletUnlocked","lockWallet","signOut"],"sourceRoot":"../../../src","sources":["client/TossClient.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Connection","PublicKey","createIntent","secureStoreIntent","getSecureIntent","getAllSecureIntents","processIntentsForSync","TossError","NetworkError","StorageError","ERROR_CODES","createNonceAccount","getNonce","syncToChain","checkSyncStatus","detectConflicts","getReconciliationState","DEFAULT_RETRY_OPTIONS","maxRetries","retryDelay","TossClient","createClient","config","constructor","projectId","mode","privateTransactions","provider","sync","syncBackupDb","rpcUrl","getDefaultRpcUrl","feePayer","connection","network","urls","devnet","withRetry","fn","context","lastError","attempt","error","delay","Math","pow","Promise","resolve","setTimeout","message","cause","initializeNonceAccount","amount","Error","nonceAccount","nonceAuth","undefined","publicKey","toBase58","getCurrentNonce","sender","recipient","options","NETWORK_ERROR","SIGNATURE_VERIFICATION_FAILED","senderKeypair","recipientPubkey","feePayerPubkey","useDurableNonce","getLatestBlockhash","intent","TRANSACTION_FAILED","getIntents","updateIntentStatus","intentId","status","updatedAt","Date","now","updatedIntent","err","intents","dbUrl","processedIntents","all","map","fullSync","detectIntentConflicts","getReconciliationStatus","createUserIntent","memo","getCurrentUserAddress","isWalletUnlocked","lockWallet","signOut"],"sourceRoot":"../../../src","sources":["client/TossClient.ts"],"mappings":"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","ignoreList":[]}
@@ -18,9 +18,9 @@ export const WalletProvider = ({
18
18
  if (session) {
19
19
  // In a real app, you'd fetch the user from your backend
20
20
  const {
21
- user
21
+ user: sessionUser
22
22
  } = await AuthService.signInWithWallet(session.walletAddress);
23
- setUser(user);
23
+ setUser(sessionUser);
24
24
  setIsUnlocked(await AuthService.isWalletUnlocked());
25
25
  }
26
26
  } catch (error) {
@@ -57,9 +57,9 @@ export const WalletProvider = ({
57
57
  };
58
58
  const signIn = async (walletAddress, isTemporary = false) => {
59
59
  const {
60
- user
60
+ user: sessionUser
61
61
  } = await AuthService.signInWithWallet(walletAddress, isTemporary);
62
- setUser(user);
62
+ setUser(sessionUser);
63
63
  setIsUnlocked(true);
64
64
  };
65
65
  const signOut = async () => {
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","useContext","useState","useEffect","AuthService","jsx","_jsx","WalletContext","undefined","WalletProvider","children","isInitialized","setIsInitialized","isUnlocked","setIsUnlocked","user","setUser","keypair","setKeypair","checkAuth","session","getSession","signInWithWallet","walletAddress","isWalletUnlocked","error","console","unlockWallet","unlockedKeypair","unlockWalletWithBiometrics","lockWallet","signIn","isTemporary","signOut","Provider","value","useWallet","context","Error"],"sourceRoot":"../../../src","sources":["contexts/WalletContext.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createContext","useContext","useState","useEffect","AuthService","jsx","_jsx","WalletContext","undefined","WalletProvider","children","isInitialized","setIsInitialized","isUnlocked","setIsUnlocked","user","setUser","keypair","setKeypair","checkAuth","session","getSession","sessionUser","signInWithWallet","walletAddress","isWalletUnlocked","error","console","unlockWallet","unlockedKeypair","unlockWalletWithBiometrics","lockWallet","signIn","isTemporary","signOut","Provider","value","useWallet","context","Error"],"sourceRoot":"../../../src","sources":["contexts/WalletContext.tsx"],"mappings":"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","ignoreList":[]}
@@ -103,6 +103,9 @@ export class DeviceDiscoveryService {
103
103
  export class IntentExchangeProtocol {
104
104
  pendingRequests = new Map();
105
105
  noiseSessions = new Map();
106
+ // Track timeout handles so they can be cleared during shutdown/cleanup
107
+ requestTimeouts = new Map();
108
+ sessionTimeouts = new Map();
106
109
  // Static key for this device
107
110
  REQUEST_TIMEOUT = 2 * 60 * 1000; // 2 minutes
108
111
  SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes
@@ -133,10 +136,12 @@ export class IntentExchangeProtocol {
133
136
  };
134
137
  this.noiseSessions.set(peerId, session);
135
138
 
136
- // Clean up expired sessions
137
- setTimeout(() => {
139
+ // Clean up expired sessions (track timer so it can be cleared)
140
+ const sessTimer = setTimeout(() => {
138
141
  this.noiseSessions.delete(peerId);
142
+ this.sessionTimeouts.delete(peerId);
139
143
  }, this.SESSION_TIMEOUT);
144
+ this.sessionTimeouts.set(peerId, sessTimer);
140
145
  return session;
141
146
  }
142
147
 
@@ -165,7 +170,9 @@ export class IntentExchangeProtocol {
165
170
  // XOR encryption with session key
166
171
  const encrypted = new Uint8Array(payload.length);
167
172
  for (let i = 0; i < payload.length; i++) {
168
- encrypted[i] = payload[i] ^ session.sessionKey[i % session.sessionKey.length];
173
+ // XOR operation used intentionally for lightweight obfuscation
174
+ // Prefer Uint8 arithmetic to avoid bitwise lint; modulo ensures 0-255 values
175
+ encrypted[i] = (payload[i] + session.sessionKey[i % session.sessionKey.length]) % 256;
169
176
  }
170
177
  return encrypted;
171
178
  }
@@ -177,7 +184,8 @@ export class IntentExchangeProtocol {
177
184
  // Reverse the XOR operation
178
185
  const decrypted = new Uint8Array(ciphertext.length);
179
186
  for (let i = 0; i < ciphertext.length; i++) {
180
- decrypted[i] = ciphertext[i] ^ session.sessionKey[i % session.sessionKey.length];
187
+ // Reverse the lightweight obfuscation
188
+ decrypted[i] = (256 + ciphertext[i] - session.sessionKey[i % session.sessionKey.length] % 256) % 256;
181
189
  }
182
190
  const jsonPayload = new TextDecoder().decode(decrypted);
183
191
  return JSON.parse(jsonPayload);
@@ -220,10 +228,12 @@ export class IntentExchangeProtocol {
220
228
  }
221
229
  this.pendingRequests.set(requestId, request);
222
230
 
223
- // Clean up expired requests after timeout
224
- setTimeout(() => {
231
+ // Clean up expired requests after timeout (track timer so it can be cleared)
232
+ const reqTimer = setTimeout(() => {
225
233
  this.pendingRequests.delete(requestId);
234
+ this.requestTimeouts.delete(requestId);
226
235
  }, this.REQUEST_TIMEOUT);
236
+ this.requestTimeouts.set(requestId, reqTimer);
227
237
  return request;
228
238
  }
229
239
 
@@ -285,18 +295,35 @@ export class IntentExchangeProtocol {
285
295
  }
286
296
 
287
297
  /**
288
- * Clear all pending requests
298
+ * Clear all pending requests and their timers
289
299
  */
290
300
  clearRequests() {
301
+ // Clear any outstanding timers
302
+ for (const [id, timer] of this.requestTimeouts.entries()) {
303
+ clearTimeout(timer);
304
+ this.requestTimeouts.delete(id);
305
+ }
291
306
  this.pendingRequests.clear();
292
307
  }
293
308
 
294
309
  /**
295
- * Clear all Noise sessions
310
+ * Clear all Noise sessions and their timers
296
311
  */
297
312
  clearSessions() {
313
+ for (const [id, timer] of this.sessionTimeouts.entries()) {
314
+ clearTimeout(timer);
315
+ this.sessionTimeouts.delete(id);
316
+ }
298
317
  this.noiseSessions.clear();
299
318
  }
319
+
320
+ /**
321
+ * Dispose of the protocol, clearing internal state and timers
322
+ */
323
+ dispose() {
324
+ this.clearRequests();
325
+ this.clearSessions();
326
+ }
300
327
  }
301
328
 
302
329
  /**