toss-expo-sdk 1.0.2 → 1.0.4

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/README.md CHANGED
@@ -1,12 +1,24 @@
1
1
  # TOSS Expo SDK
2
2
 
3
- **TOSS (The Offline Solana Stack)** implements the complete [TOSS Technical Paper](./TOSS_PAPER_IMPLEMENTATION_VERIFICATION.md) — a protocol-correct approach to building offline-first Solana applications without compromising security or finality guarantees.
3
+ <img width="1080" height="360" alt="image" src="https://github.com/user-attachments/assets/7e05de78-ef08-4dd6-a736-1ecf6b377c7f" />
4
+
5
+ **TOSS (The Offline Solana Stack)** — The official React Native SDK implementing the complete TOSS Technical Paper specification — a protocol-correct approach to building offline-first Solana applications without compromising security or finality guarantees.
4
6
 
5
7
  [![npm version](https://img.shields.io/npm/v/toss-expo-sdk)](https://www.npmjs.com/package/toss-expo-sdk)
6
8
  [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
7
9
 
10
+ > **"Solana should work anytime, anywhere. Even offline."** — TOSS Whitepaper
11
+
8
12
  **Solana, extended.** TOSS introduces deterministic separation between transaction intent creation and onchain settlement, enabling applications to function seamlessly in disconnected environments while preserving Solana's security model.
9
13
 
14
+ ## 📚 Documentation
15
+
16
+ - **[TOSS Paper Compliance](./TOSS_PAPER_COMPLIANCE.md)** - Complete mapping of implementation to TOSS Technical Paper sections
17
+ - **[TOSS Whitepaper](https://github.com/zyppprotocol/toss-expo-sdk#toss-whitepaper)** - Mission, vision, and use cases
18
+ - **[TOSS Technical Paper](https://github.com/zyppprotocol/toss-expo-sdk#toss-technical-paper)** - Protocol specification and architecture
19
+
20
+ This SDK is a **protocol-correct implementation** of the TOSS specification, ensuring all security guarantees, design principles, and architectural requirements are met.
21
+
10
22
  ## Features
11
23
 
12
24
  ### Core Capabilities
@@ -690,14 +702,3 @@ But TOSS **does not guarantee**:
690
702
  | Devnet | Live | https://api.devnet.solana.com |
691
703
  | Testnet | Live | https://api.testnet.solana.com |
692
704
  | Mainnet | Live | https://api.mainnet-beta.solana.com |
693
-
694
- ## Complete Documentation
695
-
696
- For comprehensive information, see:
697
-
698
- - [DOCUMENTATION_INDEX.md](./DOCUMENTATION_INDEX.md) - Complete documentation guide
699
- - [TOSS_PAPER_IMPLEMENTATION_VERIFICATION.md](./TOSS_PAPER_IMPLEMENTATION_VERIFICATION.md) - TOSS paper compliance
700
- - [PAPER_VS_IMPLEMENTATION_AUDIT.md](./PAPER_VS_IMPLEMENTATION_AUDIT.md) - Detailed technical audit
701
- - [USER_SECURITY_AND_KEY_MANAGEMENT.md](./USER_SECURITY_AND_KEY_MANAGEMENT.md) - Security model and biometric protection
702
- # toss-expo-sdk
703
- # toss-expo-sdk
@@ -11,9 +11,12 @@ export { BLETransactionHandler } from "./client/BLETransactionHandler.js";
11
11
  export { useOfflineTransaction, useBLETransactionTransmission, useNonceAccountManagement } from "./hooks/useOfflineBLETransactions.js";
12
12
  // Intent management
13
13
  export { verifyIntentSignature, isIntentExpired, updateIntentStatus, validateIntent, processIntentsForSync, filterExpiredIntents } from "./intentManager.js";
14
+ export { verifyIntent } from "./intent.js";
14
15
 
15
16
  // Storage
16
17
  export { storePendingIntent, getPendingIntents, clearPendingIntents } from "./storage.js";
18
+ // Secure storage (hardware-backed)
19
+ export { secureStoreIntent, getSecureIntent, getAllSecureIntents, removeSecureIntent, clearAllSecureIntents, cleanupExpiredIntents } from "./storage/secureStorage.js";
17
20
 
18
21
  // Transport methods (enhanced with fragmentation)
19
22
  export { startTossScan, requestBLEPermissions, sendOfflineTransactionFragmented, receiveOfflineTransactionFragment, getBLEMTUConfig, setBLEMTUConfig } from "./ble.js";
@@ -21,7 +24,10 @@ export { initNFC, readNFCUser, writeUserToNFC, writeIntentToNFC } from "./nfc.js
21
24
  export { QRScanner } from "./qr.js";
22
25
 
23
26
  // Client
24
- export { TossClient } from "./client/TossClient.js";
27
+ import { TossClient } from "./client/TossClient.js";
28
+ export { TossClient };
29
+ // Convenience helper for createClient (matches README)
30
+ export const createClient = TossClient.createClient;
25
31
  export { WalletProvider, useWallet } from "./contexts/WalletContext.js";
26
32
 
27
33
  // Authentication Service (enhanced with nonce accounts)
@@ -1 +1 @@
1
- {"version":3,"names":["createIntent","createUserIntent","createSignedIntent","createOfflineIntent","NonceAccountManager","BLETransactionHandler","useOfflineTransaction","useBLETransactionTransmission","useNonceAccountManagement","verifyIntentSignature","isIntentExpired","updateIntentStatus","validateIntent","processIntentsForSync","filterExpiredIntents","storePendingIntent","getPendingIntents","clearPendingIntents","startTossScan","requestBLEPermissions","sendOfflineTransactionFragmented","receiveOfflineTransactionFragment","getBLEMTUConfig","setBLEMTUConfig","initNFC","readNFCUser","writeUserToNFC","writeIntentToNFC","QRScanner","TossClient","WalletProvider","useWallet","AuthService","syncToChain","checkSyncStatus","reconcilePendingIntents","settleIntent","validateIntentOnchain","buildTransactionFromIntent","submitTransactionToChain","detectConflicts","getReconciliationState","DeviceDiscoveryService","IntentExchangeProtocol","IntentRoutingService","MultiDeviceConflictResolver","deviceDiscovery","intentExchange","intentRouting","compressMetadata","decompressMetadata","compressIntentMetadata","decompressIntentMetadata","estimateCompressionSavings","WiFiDirectTransport","SmartTransportSelector"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SACEA,YAAY,EACZC,gBAAgB,EAChBC,kBAAkB,EAClBC,mBAAmB,QAGd,aAAU;;AAEjB;AACA,SAASC,mBAAmB,QAAQ,iCAA8B;AAQlE;AACA,SAASC,qBAAqB,QAAQ,mCAAgC;AAOtE;AACA,SACEC,qBAAqB,EACrBC,6BAA6B,EAC7BC,yBAAyB,QACpB,sCAAmC;AAM1C;AACA,SACEC,qBAAqB,EACrBC,eAAe,EACfC,kBAAkB,EAClBC,cAAc,EACdC,qBAAqB,EACrBC,oBAAoB,QACf,oBAAiB;;AAExB;AACA,SACEC,kBAAkB,EAClBC,iBAAiB,EACjBC,mBAAmB,QACd,cAAW;;AAElB;AACA,SACEC,aAAa,EACbC,qBAAqB,EACrBC,gCAAgC,EAChCC,iCAAiC,EACjCC,eAAe,EACfC,eAAe,QACV,UAAO;AACd,SAASC,OAAO,EAAEC,WAAW,EAAEC,cAAc,EAAEC,gBAAgB,QAAQ,UAAO;AAC9E,SAASC,SAAS,QAAQ,SAAM;;AAEhC;AACA,SAASC,UAAU,QAAyB,wBAAqB;AAEjE,SAASC,cAAc,EAAEC,SAAS,QAAQ,6BAA0B;;AAEpE;AACA,SAASC,WAAW,QAAQ,2BAAwB;AACpD;AACA,SAASC,WAAW,EAAEC,eAAe,QAAyB,WAAQ;;AAEtE;AACA,SACEC,uBAAuB,EACvBC,YAAY,EACZC,qBAAqB,EACrBC,0BAA0B,EAC1BC,wBAAwB,EACxBC,eAAe,EACfC,sBAAsB,QAGjB,qBAAkB;;AAEzB;AACA,SACEC,sBAAsB,EACtBC,sBAAsB,EACtBC,oBAAoB,EACpBC,2BAA2B,EAC3BC,eAAe,EACfC,cAAc,EACdC,aAAa,QAIR,gBAAa;;AAEpB;AACA,SACEC,gBAAgB,EAChBC,kBAAkB,EAClBC,sBAAsB,EACtBC,wBAAwB,EACxBC,0BAA0B,QACrB,wBAAqB;;AAE5B;AACA,SAASC,mBAAmB,EAAEC,sBAAsB,QAAQ,WAAQ","ignoreList":[]}
1
+ {"version":3,"names":["createIntent","createUserIntent","createSignedIntent","createOfflineIntent","NonceAccountManager","BLETransactionHandler","useOfflineTransaction","useBLETransactionTransmission","useNonceAccountManagement","verifyIntentSignature","isIntentExpired","updateIntentStatus","validateIntent","processIntentsForSync","filterExpiredIntents","verifyIntent","storePendingIntent","getPendingIntents","clearPendingIntents","secureStoreIntent","getSecureIntent","getAllSecureIntents","removeSecureIntent","clearAllSecureIntents","cleanupExpiredIntents","startTossScan","requestBLEPermissions","sendOfflineTransactionFragmented","receiveOfflineTransactionFragment","getBLEMTUConfig","setBLEMTUConfig","initNFC","readNFCUser","writeUserToNFC","writeIntentToNFC","QRScanner","TossClient","createClient","WalletProvider","useWallet","AuthService","syncToChain","checkSyncStatus","reconcilePendingIntents","settleIntent","validateIntentOnchain","buildTransactionFromIntent","submitTransactionToChain","detectConflicts","getReconciliationState","DeviceDiscoveryService","IntentExchangeProtocol","IntentRoutingService","MultiDeviceConflictResolver","deviceDiscovery","intentExchange","intentRouting","compressMetadata","decompressMetadata","compressIntentMetadata","decompressIntentMetadata","estimateCompressionSavings","WiFiDirectTransport","SmartTransportSelector"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SACEA,YAAY,EACZC,gBAAgB,EAChBC,kBAAkB,EAClBC,mBAAmB,QAGd,aAAU;;AAEjB;AACA,SAASC,mBAAmB,QAAQ,iCAA8B;AAQlE;AACA,SAASC,qBAAqB,QAAQ,mCAAgC;AAOtE;AACA,SACEC,qBAAqB,EACrBC,6BAA6B,EAC7BC,yBAAyB,QACpB,sCAAmC;AAM1C;AACA,SACEC,qBAAqB,EACrBC,eAAe,EACfC,kBAAkB,EAClBC,cAAc,EACdC,qBAAqB,EACrBC,oBAAoB,QACf,oBAAiB;AACxB,SAASC,YAAY,QAAQ,aAAU;;AAEvC;AACA,SACEC,kBAAkB,EAClBC,iBAAiB,EACjBC,mBAAmB,QACd,cAAW;AAClB;AACA,SACEC,iBAAiB,EACjBC,eAAe,EACfC,mBAAmB,EACnBC,kBAAkB,EAClBC,qBAAqB,EACrBC,qBAAqB,QAChB,4BAAyB;;AAEhC;AACA,SACEC,aAAa,EACbC,qBAAqB,EACrBC,gCAAgC,EAChCC,iCAAiC,EACjCC,eAAe,EACfC,eAAe,QACV,UAAO;AACd,SAASC,OAAO,EAAEC,WAAW,EAAEC,cAAc,EAAEC,gBAAgB,QAAQ,UAAO;AAC9E,SAASC,SAAS,QAAQ,SAAM;;AAEhC;AACA,SAASC,UAAU,QAAyB,wBAAqB;AACjE,SAASA,UAAU;AACnB;AACA,OAAO,MAAMC,YAAY,GAAGD,UAAU,CAACC,YAAY;AAEnD,SAASC,cAAc,EAAEC,SAAS,QAAQ,6BAA0B;;AAEpE;AACA,SAASC,WAAW,QAAQ,2BAAwB;AACpD;AACA,SAASC,WAAW,EAAEC,eAAe,QAAyB,WAAQ;;AAEtE;AACA,SACEC,uBAAuB,EACvBC,YAAY,EACZC,qBAAqB,EACrBC,0BAA0B,EAC1BC,wBAAwB,EACxBC,eAAe,EACfC,sBAAsB,QAGjB,qBAAkB;;AAEzB;AACA,SACEC,sBAAsB,EACtBC,sBAAsB,EACtBC,oBAAoB,EACpBC,2BAA2B,EAC3BC,eAAe,EACfC,cAAc,EACdC,aAAa,QAIR,gBAAa;;AAEpB;AACA,SACEC,gBAAgB,EAChBC,kBAAkB,EAClBC,sBAAsB,EACtBC,wBAAwB,EACxBC,0BAA0B,QACrB,wBAAqB;;AAE5B;AACA,SAASC,mBAAmB,EAAEC,sBAAsB,QAAQ,WAAQ","ignoreList":[]}
@@ -6,11 +6,15 @@ export type { BLEFragment, EncryptedBLEMessage, BLEMTUConfig, } from './client/B
6
6
  export { useOfflineTransaction, useBLETransactionTransmission, useNonceAccountManagement, } from './hooks/useOfflineBLETransactions';
7
7
  export type { BLETransmissionState, OfflineTransactionState, } from './hooks/useOfflineBLETransactions';
8
8
  export { verifyIntentSignature, isIntentExpired, updateIntentStatus, validateIntent, processIntentsForSync, filterExpiredIntents, } from './intentManager';
9
+ export { verifyIntent } from './intent';
9
10
  export { storePendingIntent, getPendingIntents, clearPendingIntents, } from './storage';
11
+ export { secureStoreIntent, getSecureIntent, getAllSecureIntents, removeSecureIntent, clearAllSecureIntents, cleanupExpiredIntents, } from './storage/secureStorage';
10
12
  export { startTossScan, requestBLEPermissions, sendOfflineTransactionFragmented, receiveOfflineTransactionFragment, getBLEMTUConfig, setBLEMTUConfig, } from './ble';
11
13
  export { initNFC, readNFCUser, writeUserToNFC, writeIntentToNFC } from './nfc';
12
14
  export { QRScanner } from './qr';
13
- export { TossClient, type TossConfig } from './client/TossClient';
15
+ import { TossClient, type TossConfig } from './client/TossClient';
16
+ export { TossClient, type TossConfig };
17
+ export declare const createClient: typeof TossClient.createClient;
14
18
  export type { TossUser } from './types/tossUser';
15
19
  export { WalletProvider, useWallet } from './contexts/WalletContext';
16
20
  export { AuthService } from './services/authService';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gCAAgC,EAChC,iCAAiC,EACjC,eAAe,EACf,eAAe,GAChB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGvE,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,eAAe,EACf,cAAc,EACd,aAAa,EACb,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gCAAgC,EAChC,iCAAiC,EACjC,eAAe,EACf,eAAe,GAChB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,CAAC;AAEvC,eAAO,MAAM,YAAY,gCAA0B,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGvE,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,eAAe,EACf,cAAc,EACd,aAAa,EACb,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toss-expo-sdk",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "The official React Native SDK for The Offline Solana Stack (TOSS)",
5
5
  "type": "module",
6
6
  "main": "./lib/module/index.js",
package/src/index.tsx CHANGED
@@ -45,6 +45,7 @@ export {
45
45
  processIntentsForSync,
46
46
  filterExpiredIntents,
47
47
  } from './intentManager';
48
+ export { verifyIntent } from './intent';
48
49
 
49
50
  // Storage
50
51
  export {
@@ -52,6 +53,15 @@ export {
52
53
  getPendingIntents,
53
54
  clearPendingIntents,
54
55
  } from './storage';
56
+ // Secure storage (hardware-backed)
57
+ export {
58
+ secureStoreIntent,
59
+ getSecureIntent,
60
+ getAllSecureIntents,
61
+ removeSecureIntent,
62
+ clearAllSecureIntents,
63
+ cleanupExpiredIntents,
64
+ } from './storage/secureStorage';
55
65
 
56
66
  // Transport methods (enhanced with fragmentation)
57
67
  export {
@@ -66,7 +76,10 @@ export { initNFC, readNFCUser, writeUserToNFC, writeIntentToNFC } from './nfc';
66
76
  export { QRScanner } from './qr';
67
77
 
68
78
  // Client
69
- export { TossClient, type TossConfig } from './client/TossClient';
79
+ import { TossClient, type TossConfig } from './client/TossClient';
80
+ export { TossClient, type TossConfig };
81
+ // Convenience helper for createClient (matches README)
82
+ export const createClient = TossClient.createClient;
70
83
  export type { TossUser } from './types/tossUser';
71
84
  export { WalletProvider, useWallet } from './contexts/WalletContext';
72
85