@lukso/up-connector 0.4.0-dev.a8c9315

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 (109) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +280 -0
  3. package/dist/account-modal.cjs +9 -0
  4. package/dist/account-modal.cjs.map +1 -0
  5. package/dist/account-modal.d.cts +16 -0
  6. package/dist/account-modal.d.ts +16 -0
  7. package/dist/account-modal.js +9 -0
  8. package/dist/account-modal.js.map +1 -0
  9. package/dist/auto-setup.cjs +17 -0
  10. package/dist/auto-setup.cjs.map +1 -0
  11. package/dist/auto-setup.d.cts +123 -0
  12. package/dist/auto-setup.d.ts +123 -0
  13. package/dist/auto-setup.js +17 -0
  14. package/dist/auto-setup.js.map +1 -0
  15. package/dist/avatar-CmUCtW_w.d.cts +205 -0
  16. package/dist/avatar-CmUCtW_w.d.ts +205 -0
  17. package/dist/avatar.cjs +12 -0
  18. package/dist/avatar.cjs.map +1 -0
  19. package/dist/avatar.d.cts +1 -0
  20. package/dist/avatar.d.ts +1 -0
  21. package/dist/avatar.js +12 -0
  22. package/dist/avatar.js.map +1 -0
  23. package/dist/backup-modal.cjs +9 -0
  24. package/dist/backup-modal.cjs.map +1 -0
  25. package/dist/backup-modal.d.cts +41 -0
  26. package/dist/backup-modal.d.ts +41 -0
  27. package/dist/backup-modal.js +9 -0
  28. package/dist/backup-modal.js.map +1 -0
  29. package/dist/chunk-3SGSPHOZ.js +595 -0
  30. package/dist/chunk-3SGSPHOZ.js.map +1 -0
  31. package/dist/chunk-6AYZOIFY.js +181 -0
  32. package/dist/chunk-6AYZOIFY.js.map +1 -0
  33. package/dist/chunk-6N35TCFT.js +852 -0
  34. package/dist/chunk-6N35TCFT.js.map +1 -0
  35. package/dist/chunk-7ETKG6KR.cjs +387 -0
  36. package/dist/chunk-7ETKG6KR.cjs.map +1 -0
  37. package/dist/chunk-EUXUH3YW.js +15 -0
  38. package/dist/chunk-EUXUH3YW.js.map +1 -0
  39. package/dist/chunk-GFVUWAG4.cjs +158 -0
  40. package/dist/chunk-GFVUWAG4.cjs.map +1 -0
  41. package/dist/chunk-IAKQFHFD.cjs +595 -0
  42. package/dist/chunk-IAKQFHFD.cjs.map +1 -0
  43. package/dist/chunk-MH7MP7XK.cjs +181 -0
  44. package/dist/chunk-MH7MP7XK.cjs.map +1 -0
  45. package/dist/chunk-NWCNJSG3.js +387 -0
  46. package/dist/chunk-NWCNJSG3.js.map +1 -0
  47. package/dist/chunk-NXU2DQAV.js +1128 -0
  48. package/dist/chunk-NXU2DQAV.js.map +1 -0
  49. package/dist/chunk-ORJK2YGG.cjs +852 -0
  50. package/dist/chunk-ORJK2YGG.cjs.map +1 -0
  51. package/dist/chunk-RFA6SEIS.cjs +1128 -0
  52. package/dist/chunk-RFA6SEIS.cjs.map +1 -0
  53. package/dist/chunk-XGIT7YUY.js +31 -0
  54. package/dist/chunk-XGIT7YUY.js.map +1 -0
  55. package/dist/chunk-XOKG3KIL.cjs +31 -0
  56. package/dist/chunk-XOKG3KIL.cjs.map +1 -0
  57. package/dist/chunk-YIWSPI4I.js +158 -0
  58. package/dist/chunk-YIWSPI4I.js.map +1 -0
  59. package/dist/chunk-ZBDE64SD.cjs +15 -0
  60. package/dist/chunk-ZBDE64SD.cjs.map +1 -0
  61. package/dist/connect-modal/index.cjs +20 -0
  62. package/dist/connect-modal/index.cjs.map +1 -0
  63. package/dist/connect-modal/index.d.cts +9 -0
  64. package/dist/connect-modal/index.d.ts +9 -0
  65. package/dist/connect-modal/index.js +20 -0
  66. package/dist/connect-modal/index.js.map +1 -0
  67. package/dist/index-D2orHGFi.d.cts +8 -0
  68. package/dist/index-D2orHGFi.d.ts +8 -0
  69. package/dist/index.cjs +793 -0
  70. package/dist/index.cjs.map +1 -0
  71. package/dist/index.d.cts +189 -0
  72. package/dist/index.d.ts +189 -0
  73. package/dist/index.js +793 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/restore-modal.cjs +9 -0
  76. package/dist/restore-modal.cjs.map +1 -0
  77. package/dist/restore-modal.d.cts +68 -0
  78. package/dist/restore-modal.d.ts +68 -0
  79. package/dist/restore-modal.js +9 -0
  80. package/dist/restore-modal.js.map +1 -0
  81. package/dist/wagmi-CVuDs_0h.d.cts +386 -0
  82. package/dist/wagmi-CVuDs_0h.d.ts +386 -0
  83. package/package.json +158 -0
  84. package/src/account-modal.ts +142 -0
  85. package/src/auto-setup.ts +362 -0
  86. package/src/avatar.ts +1135 -0
  87. package/src/backup-modal.ts +439 -0
  88. package/src/connect-modal/components/connection-view.ts +398 -0
  89. package/src/connect-modal/components/eoa-connection-view.ts +408 -0
  90. package/src/connect-modal/components/qr-code-view.ts +71 -0
  91. package/src/connect-modal/connect-modal.base.ts +18 -0
  92. package/src/connect-modal/connect-modal.config.ts +27 -0
  93. package/src/connect-modal/connect-modal.templates.ts +21 -0
  94. package/src/connect-modal/connect-modal.ts +270 -0
  95. package/src/connect-modal/connect-modal.types.ts +104 -0
  96. package/src/connect-modal/images/up-cube-glass.png +0 -0
  97. package/src/connect-modal/index.ts +23 -0
  98. package/src/connect-modal/services/wagmi.ts +266 -0
  99. package/src/connect-modal/styles/styles.css +1 -0
  100. package/src/connect-modal/utils/walletConnectDeepLinkUrl.ts +43 -0
  101. package/src/connector.ts +544 -0
  102. package/src/index.ts +62 -0
  103. package/src/popup-instance.ts +537 -0
  104. package/src/restore-modal.ts +702 -0
  105. package/src/styles/index.ts +28 -0
  106. package/src/styles/styles.css +1 -0
  107. package/src/types/css-raw.d.ts +4 -0
  108. package/src/types/images.d.ts +4 -0
  109. package/src/types.ts +168 -0
@@ -0,0 +1,362 @@
1
+ /**
2
+ * Auto-setup utilities for LUKSO products
3
+ *
4
+ * Provides zero-config setup for:
5
+ * - Embedded Wallet (passkey-based)
6
+ * - UP Extension (browser extension)
7
+ * - UP Mobile (WalletConnect)
8
+ */
9
+
10
+ import type { Config } from '@wagmi/core'
11
+ import type { ConnectModalSetup } from './connect-modal/index.js'
12
+ import { setupConnectModal } from './connect-modal/index.js'
13
+
14
+ /**
15
+ * Embedded wallet constants
16
+ */
17
+ export const EMBEDDED_WALLET_ID = 'dev.lukso.auth'
18
+ export const EMBEDDED_WALLET_URL_DEV = 'http://localhost:9100'
19
+ export const EMBEDDED_WALLET_URL_PROD = 'https://auth-simple.pages.dev'
20
+
21
+ /**
22
+ * UP Extension ID
23
+ */
24
+ export const UP_EXTENSION_ID = 'cloud.universalprofile'
25
+
26
+ /**
27
+ * Get default wallet URL based on environment
28
+ */
29
+ function getDefaultWalletUrl(): string {
30
+ // Check for environment variable (CI builds)
31
+ if (typeof process !== 'undefined' && process.env?.WALLET_URL) {
32
+ return process.env.WALLET_URL
33
+ }
34
+
35
+ // Check if we're in production (browser)
36
+ if (typeof window !== 'undefined') {
37
+ const isLocalhost =
38
+ window.location.hostname === 'localhost' ||
39
+ window.location.hostname === '127.0.0.1'
40
+ return isLocalhost ? EMBEDDED_WALLET_URL_DEV : EMBEDDED_WALLET_URL_PROD
41
+ }
42
+
43
+ // Default to dev
44
+ return EMBEDDED_WALLET_URL_DEV
45
+ }
46
+
47
+ export interface LuksoConnectorConfig {
48
+ /**
49
+ * Embedded wallet configuration
50
+ */
51
+ embeddedWallet?: {
52
+ /**
53
+ * Enable embedded wallet option (default: true)
54
+ */
55
+ enabled?: boolean
56
+
57
+ /**
58
+ * URL to the wallet service
59
+ * @default 'http://localhost:9100'
60
+ */
61
+ url?: string
62
+
63
+ /**
64
+ * Storage key for UP Provider state
65
+ * @default 'up-provider'
66
+ */
67
+ storageKey?: string
68
+
69
+ /**
70
+ * Display name for the wallet
71
+ * @default 'Create Passkey Wallet'
72
+ */
73
+ name?: string
74
+ }
75
+
76
+ /**
77
+ * WalletConnect configuration for mobile app
78
+ */
79
+ walletConnect?: {
80
+ /**
81
+ * Enable WalletConnect (default: true)
82
+ */
83
+ enabled?: boolean
84
+
85
+ /**
86
+ * WalletConnect Project ID
87
+ * @default LUKSO's default project ID
88
+ */
89
+ projectId?: string
90
+
91
+ /**
92
+ * Show QR code modal on mobile devices (default: false)
93
+ */
94
+ showQrModal?: boolean
95
+ }
96
+
97
+ /**
98
+ * Chain configuration
99
+ */
100
+ chains?: {
101
+ /**
102
+ * Default chain ID
103
+ * @default 42 (LUKSO mainnet)
104
+ */
105
+ defaultChainId?: number
106
+
107
+ /**
108
+ * Enable testnet (default: true)
109
+ */
110
+ enableTestnet?: boolean
111
+ }
112
+
113
+ /**
114
+ * Storage configuration
115
+ */
116
+ storage?: {
117
+ /**
118
+ * Storage key prefix for wagmi state
119
+ * @default 'up-wagmi'
120
+ */
121
+ key?: string
122
+ }
123
+
124
+ /**
125
+ * Pass an existing wagmi config instead of auto-creating one
126
+ */
127
+ wagmiConfig?: any
128
+ }
129
+
130
+ const DEFAULT_CONFIG: Required<LuksoConnectorConfig> = {
131
+ embeddedWallet: {
132
+ enabled: true,
133
+ url: getDefaultWalletUrl(),
134
+ storageKey: 'up-provider',
135
+ name: 'UE Embedded Wallet',
136
+ },
137
+ walletConnect: {
138
+ enabled: true,
139
+ projectId: '7d1af65dc2722192d9914b5d6eaeb421', // LUKSO's default
140
+ showQrModal: false,
141
+ },
142
+ chains: {
143
+ defaultChainId: 42, // LUKSO mainnet
144
+ enableTestnet: true,
145
+ },
146
+ storage: {
147
+ key: 'up-wagmi',
148
+ },
149
+ wagmiConfig: undefined,
150
+ }
151
+
152
+ /**
153
+ * Auto-setup LUKSO connector with sensible defaults
154
+ *
155
+ * This function creates a wagmi config and sets up the connect modal
156
+ * with support for:
157
+ * - Embedded Wallet (passkey-based)
158
+ * - UP Extension (auto-detected via EIP-6963)
159
+ * - UP Mobile (WalletConnect)
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * // Zero config - uses all defaults
164
+ * setupLuksoConnector()
165
+ *
166
+ * // Custom configuration
167
+ * setupLuksoConnector({
168
+ * embeddedWallet: {
169
+ * url: 'https://wallet.example.com'
170
+ * },
171
+ * chains: {
172
+ * defaultChainId: 4201 // LUKSO Testnet
173
+ * }
174
+ * })
175
+ * ```
176
+ */
177
+ export async function setupLuksoConnector(
178
+ config: LuksoConnectorConfig = {}
179
+ ): Promise<{ wagmiConfig: Config }> {
180
+ const cfg = {
181
+ embeddedWallet: {
182
+ ...DEFAULT_CONFIG.embeddedWallet,
183
+ ...config.embeddedWallet,
184
+ } as Required<typeof DEFAULT_CONFIG.embeddedWallet>,
185
+ walletConnect: {
186
+ ...DEFAULT_CONFIG.walletConnect,
187
+ ...config.walletConnect,
188
+ } as Required<typeof DEFAULT_CONFIG.walletConnect>,
189
+ chains: {
190
+ ...DEFAULT_CONFIG.chains,
191
+ ...config.chains,
192
+ } as Required<typeof DEFAULT_CONFIG.chains>,
193
+ storage: {
194
+ ...DEFAULT_CONFIG.storage,
195
+ ...config.storage,
196
+ } as Required<typeof DEFAULT_CONFIG.storage>,
197
+ wagmiConfig: config.wagmiConfig,
198
+ }
199
+
200
+ // IMPORTANT: Create UP Provider BEFORE wagmi config
201
+ // The UP Provider registers via EIP-6963, and wagmi's injected() will detect it
202
+ // This matches the order in demo-app: UP Provider first, then wagmi config
203
+
204
+ // Step 1: Create UP Provider (if enabled)
205
+ if (cfg.embeddedWallet?.enabled) {
206
+ await createUPProvider(cfg.embeddedWallet)
207
+ }
208
+
209
+ // Step 2: Create or use provided wagmi config
210
+ const wagmiConfig = cfg.wagmiConfig || (await createWagmiConfig(cfg))
211
+
212
+ // Note: Wagmi will auto-reconnect in the background
213
+ // The connector's watchWagmiAccount will detect the connection when it completes
214
+
215
+ // Step 3: Setup connect modal
216
+ // The UP Provider is already registered via EIP-6963 and will appear in wagmi connectors
217
+ // Use the embedded wallet ID to identify it in the connector list
218
+ setupConnectModal({
219
+ wagmiConfig,
220
+ chainId: cfg.chains.defaultChainId,
221
+ embeddedWalletId: cfg.embeddedWallet.enabled
222
+ ? EMBEDDED_WALLET_ID
223
+ : undefined,
224
+ })
225
+
226
+ return { wagmiConfig }
227
+ }
228
+
229
+ /**
230
+ * Create wagmi config with LUKSO chains and connectors
231
+ */
232
+ async function createWagmiConfig(cfg: any): Promise<any> {
233
+ try {
234
+ // Dynamic imports to keep dependencies optional
235
+ const [
236
+ { createConfig, createStorage, injected },
237
+ { walletConnect },
238
+ { createClient, http },
239
+ { lukso, luksoTestnet },
240
+ ] = await Promise.all([
241
+ import('@wagmi/core'),
242
+ import('@wagmi/connectors'),
243
+ import('viem'),
244
+ import('viem/chains'),
245
+ ])
246
+
247
+ // Create storage adapter
248
+ const storage = createStorage({
249
+ key: cfg.storage.key,
250
+ storage: getDefaultStorage(),
251
+ })
252
+
253
+ // Build chains array
254
+ const chains = cfg.chains.enableTestnet
255
+ ? ([luksoTestnet, lukso] as const)
256
+ : ([lukso] as const)
257
+
258
+ // Build connectors array
259
+ const connectors = []
260
+
261
+ // Add WalletConnect if enabled
262
+ if (cfg.walletConnect.enabled) {
263
+ connectors.push(
264
+ walletConnect({
265
+ projectId: cfg.walletConnect.projectId,
266
+ showQrModal: cfg.walletConnect.showQrModal,
267
+ })
268
+ )
269
+ }
270
+
271
+ // Add injected (for UP Extension and other EIP-6963 wallets)
272
+ connectors.push(injected())
273
+
274
+ // Create wagmi config
275
+ return createConfig({
276
+ storage,
277
+ multiInjectedProviderDiscovery: true, // Enable EIP-6963
278
+ connectors,
279
+ chains,
280
+ client({ chain }: any) {
281
+ return createClient({ chain, transport: http() })
282
+ },
283
+ })
284
+ } catch (error) {
285
+ console.error('Failed to create wagmi config:', error)
286
+ throw new Error(
287
+ 'Failed to create wagmi config. Make sure @wagmi/core, @wagmi/connectors, and viem are installed.'
288
+ )
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Create UP Provider (registers via EIP-6963)
294
+ */
295
+ async function createUPProvider(config: {
296
+ url: string
297
+ storageKey: string
298
+ name: string
299
+ }): Promise<void> {
300
+ // Validate URL - throw error if explicitly set to empty string
301
+ if (config.url != null && config.url.trim() === '') {
302
+ throw new Error(
303
+ 'UP Provider URL is defined but empty. Please set WALLET_URL environment variable to a valid URL or leave it undefined.'
304
+ )
305
+ }
306
+
307
+ try {
308
+ const { createClientUPProvider } = await import('@lukso/up-provider')
309
+
310
+ // Create UP Provider - it automatically registers via EIP-6963
311
+ createClientUPProvider({
312
+ url: config.url,
313
+ mode: 'iframe',
314
+ get: async () => {
315
+ const stored = localStorage.getItem(config.storageKey)
316
+ return stored ? JSON.parse(stored) : {}
317
+ },
318
+ set: async (value: Record<string, unknown>) => {
319
+ localStorage.setItem(config.storageKey, JSON.stringify(value))
320
+ },
321
+ name: config.name,
322
+ })
323
+
324
+ // Wait for EIP-6963 registration
325
+ await new Promise((resolve) => setTimeout(resolve, 100))
326
+ } catch (error) {
327
+ console.warn('⚠️ Failed to create UP Provider:', error)
328
+ throw error
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Default storage adapter (localStorage with error handling)
334
+ */
335
+ function getDefaultStorage() {
336
+ const storage = (() => {
337
+ if (typeof window !== 'undefined' && window.localStorage) {
338
+ return window.localStorage
339
+ }
340
+ return {
341
+ getItem: () => null,
342
+ setItem: () => {},
343
+ removeItem: () => {},
344
+ }
345
+ })()
346
+
347
+ return {
348
+ getItem(key: string) {
349
+ return storage.getItem(key)
350
+ },
351
+ removeItem(key: string) {
352
+ storage.removeItem(key)
353
+ },
354
+ setItem(key: string, value: string) {
355
+ try {
356
+ storage.setItem(key, value)
357
+ } catch {
358
+ // Silence QuotaExceededError, SecurityError, etc.
359
+ }
360
+ },
361
+ }
362
+ }