@rhinestone/1auth 0.1.1 → 0.4.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/wagmi.js CHANGED
@@ -44,12 +44,15 @@ var import_viem = require("viem");
44
44
  var viemChains = __toESM(require("viem/chains"));
45
45
  var import_sdk = require("@rhinestone/sdk");
46
46
  var env = typeof process !== "undefined" ? process.env : {};
47
- var ALL_VIEM_CHAINS = Object.values(viemChains).filter(
48
- (value) => typeof value === "object" && value !== null && "id" in value && "name" in value
49
- );
50
- var VIEM_CHAIN_BY_ID = new Map(
51
- ALL_VIEM_CHAINS.map((chain) => [chain.id, chain])
52
- );
47
+ var VIEM_CHAIN_BY_ID = /* @__PURE__ */ new Map();
48
+ for (const value of Object.values(viemChains)) {
49
+ if (typeof value !== "object" || value === null || !("id" in value) || !("name" in value)) continue;
50
+ const chain = value;
51
+ const existing = VIEM_CHAIN_BY_ID.get(chain.id);
52
+ if (!existing || existing.testnet && !chain.testnet) {
53
+ VIEM_CHAIN_BY_ID.set(chain.id, chain);
54
+ }
55
+ }
53
56
  var SUPPORTED_CHAIN_IDS = new Set(
54
57
  (0, import_sdk.getAllSupportedChainsAndTokens)().map((entry) => entry.chainId)
55
58
  );
@@ -89,9 +92,6 @@ function getChainById(chainId) {
89
92
  }
90
93
  return chain;
91
94
  }
92
- function getSupportedTokens(chainId) {
93
- return (0, import_sdk.getSupportedTokens)(chainId);
94
- }
95
95
  function isTestnet(chainId) {
96
96
  try {
97
97
  return getChainById(chainId).testnet ?? false;
@@ -136,7 +136,7 @@ function encodeWebAuthnSignature(sig) {
136
136
 
137
137
  // src/provider.ts
138
138
  var DEFAULT_STORAGE_KEY = "1auth-user";
139
- function createPasskeyProvider(options) {
139
+ function createOneAuthProvider(options) {
140
140
  const { client } = options;
141
141
  let chainId = options.chainId;
142
142
  const storageKey = options.storageKey || DEFAULT_STORAGE_KEY;
@@ -152,7 +152,7 @@ function createPasskeyProvider(options) {
152
152
  const raw = localStorage.getItem(storageKey);
153
153
  if (!raw) return null;
154
154
  const parsed = JSON.parse(raw);
155
- if (!parsed?.username || !parsed?.address) return null;
155
+ if (!parsed?.address) return null;
156
156
  return parsed;
157
157
  } catch {
158
158
  return null;
@@ -167,12 +167,11 @@ function createPasskeyProvider(options) {
167
167
  localStorage.removeItem(storageKey);
168
168
  };
169
169
  const resolveAccountAddress = async (username) => {
170
+ const clientId = client.getClientId();
170
171
  const response = await fetch(
171
172
  `${client.getProviderUrl()}/api/users/${encodeURIComponent(username)}/account`,
172
173
  {
173
- headers: {
174
- "x-client-id": client.getClientId()
175
- }
174
+ headers: clientId ? { "x-client-id": clientId } : {}
176
175
  }
177
176
  );
178
177
  if (!response.ok) {
@@ -187,12 +186,29 @@ function createPasskeyProvider(options) {
187
186
  if (stored) {
188
187
  return [stored.address];
189
188
  }
190
- const result = await client.authWithModal();
191
- if (!result.success || !result.username) {
192
- throw new Error(result.error?.message || "Authentication failed");
189
+ const connectResult = await client.connectWithModal();
190
+ let username;
191
+ let address;
192
+ if (connectResult.success) {
193
+ username = connectResult.username;
194
+ address = connectResult.address;
195
+ } else if (connectResult.action === "switch") {
196
+ const authResult = await client.authWithModal();
197
+ if (!authResult.success) {
198
+ throw new Error(authResult.error?.message || "Authentication failed");
199
+ }
200
+ username = authResult.username;
201
+ address = authResult.address;
202
+ } else {
203
+ throw new Error(connectResult.error?.message || "Connection cancelled");
204
+ }
205
+ if (!address && username) {
206
+ address = await resolveAccountAddress(username);
193
207
  }
194
- const address = await resolveAccountAddress(result.username);
195
- setStoredUser({ username: result.username, address });
208
+ if (!address) {
209
+ throw new Error("No account address available");
210
+ }
211
+ setStoredUser({ username, address });
196
212
  emit("accountsChanged", [address]);
197
213
  emit("connect", { chainId: (0, import_viem3.numberToHex)(chainId) });
198
214
  return [address];
@@ -206,11 +222,11 @@ function createPasskeyProvider(options) {
206
222
  const stored = getStoredUser();
207
223
  if (stored) return stored;
208
224
  const [address] = await connect();
209
- const username = getStoredUser()?.username;
210
- if (!username || !address) {
225
+ if (!address) {
211
226
  throw new Error("Failed to resolve user session");
212
227
  }
213
- return { username, address };
228
+ const user = getStoredUser();
229
+ return user || { address };
214
230
  };
215
231
  const parseChainId = (value) => {
216
232
  if (typeof value === "number") return value;
@@ -249,6 +265,16 @@ function createPasskeyProvider(options) {
249
265
  };
250
266
  });
251
267
  };
268
+ const normalizeTokenRequests = (requests) => {
269
+ if (!Array.isArray(requests)) return void 0;
270
+ return requests.map((r) => {
271
+ const req = r;
272
+ return {
273
+ token: req.token,
274
+ amount: typeof req.amount === "bigint" ? req.amount : BigInt(String(req.amount || "0"))
275
+ };
276
+ });
277
+ };
252
278
  const decodeMessage = (value) => {
253
279
  if (!(0, import_viem3.isHex)(value)) return value;
254
280
  try {
@@ -258,9 +284,13 @@ function createPasskeyProvider(options) {
258
284
  }
259
285
  };
260
286
  const signMessage = async (message) => {
261
- const { username } = await ensureUser();
287
+ const user = await ensureUser();
288
+ if (!user.username && !user.address) {
289
+ throw new Error("Username or address required for signing.");
290
+ }
262
291
  const result = await client.signMessage({
263
- username,
292
+ username: user.username,
293
+ accountAddress: user.address,
264
294
  message
265
295
  });
266
296
  if (!result.success || !result.signature) {
@@ -269,10 +299,14 @@ function createPasskeyProvider(options) {
269
299
  return encodeWebAuthnSignature(result.signature);
270
300
  };
271
301
  const signTypedData = async (typedData) => {
272
- const { username } = await ensureUser();
302
+ const user = await ensureUser();
303
+ if (!user.username && !user.address) {
304
+ throw new Error("Username or address required for signing.");
305
+ }
273
306
  const data = typeof typedData === "string" ? JSON.parse(typedData) : typedData;
274
307
  const result = await client.signTypedData({
275
- username,
308
+ username: user.username,
309
+ accountAddress: user.address,
276
310
  domain: data.domain,
277
311
  types: data.types,
278
312
  primaryType: data.primaryType,
@@ -287,32 +321,40 @@ function createPasskeyProvider(options) {
287
321
  if (!options.signIntent) {
288
322
  return {
289
323
  username: payload.username,
324
+ accountAddress: payload.accountAddress,
290
325
  targetChain: payload.targetChain,
291
- calls: payload.calls
326
+ calls: payload.calls,
327
+ tokenRequests: payload.tokenRequests
292
328
  };
293
329
  }
330
+ if (!payload.username) {
331
+ throw new Error("Username required for signed intents. Set a username first.");
332
+ }
294
333
  const signedIntent = await options.signIntent({
295
334
  username: payload.username,
296
335
  accountAddress: payload.accountAddress,
297
336
  targetChain: payload.targetChain,
298
- calls: payload.calls
337
+ calls: payload.calls,
338
+ tokenRequests: payload.tokenRequests
299
339
  });
300
340
  return { signedIntent };
301
341
  };
302
342
  const sendIntent = async (payload) => {
303
- const closeOn = options.waitForHash ?? true ? "completed" : "preconfirmed";
343
+ const closeOn = options.closeOn ?? (options.waitForHash ?? true ? "completed" : "preconfirmed");
304
344
  const intentPayload = await resolveIntentPayload(payload);
305
345
  const result = await client.sendIntent({
306
346
  ...intentPayload,
347
+ tokenRequests: payload.tokenRequests,
348
+ sourceChainId: payload.sourceChainId,
307
349
  closeOn,
308
350
  waitForHash: options.waitForHash ?? true,
309
351
  hashTimeoutMs: options.hashTimeoutMs,
310
352
  hashIntervalMs: options.hashIntervalMs
311
353
  });
312
- if (!result.success || !result.transactionHash) {
354
+ if (!result.success) {
313
355
  throw new Error(result.error?.message || "Transaction failed");
314
356
  }
315
- return result.transactionHash;
357
+ return result.intentId;
316
358
  };
317
359
  const request = async ({ method, params }) => {
318
360
  switch (method) {
@@ -365,11 +407,15 @@ function createPasskeyProvider(options) {
365
407
  const user = await ensureUser();
366
408
  const targetChain = parseChainId(tx.chainId) ?? chainId;
367
409
  const calls = normalizeCalls([tx]);
410
+ const tokenRequests = normalizeTokenRequests(tx.tokenRequests);
411
+ const txSourceChainId = parseChainId(tx.sourceChainId);
368
412
  return sendIntent({
369
413
  username: user.username,
370
414
  accountAddress: user.address,
371
415
  targetChain,
372
- calls
416
+ calls,
417
+ tokenRequests,
418
+ sourceChainId: txSourceChainId
373
419
  });
374
420
  }
375
421
  case "wallet_sendCalls": {
@@ -378,22 +424,131 @@ function createPasskeyProvider(options) {
378
424
  const user = await ensureUser();
379
425
  const targetChain = parseChainId(payload.chainId) ?? chainId;
380
426
  const calls = normalizeCalls(payload.calls || []);
427
+ const tokenRequests = normalizeTokenRequests(payload.tokenRequests);
428
+ const sourceChainId = parseChainId(payload.sourceChainId);
381
429
  if (!calls.length) throw new Error("No calls provided");
382
430
  return sendIntent({
383
431
  username: user.username,
384
432
  accountAddress: user.address,
385
433
  targetChain,
386
- calls
434
+ calls,
435
+ tokenRequests,
436
+ sourceChainId
387
437
  });
388
438
  }
389
439
  case "wallet_getCapabilities": {
440
+ const paramList = Array.isArray(params) ? params : [];
441
+ const requestedChains = paramList[1];
390
442
  const chainIds = getSupportedChainIds();
391
- const tokensByChain = Object.fromEntries(
392
- chainIds.map((id) => [id, getSupportedTokens(id)])
443
+ const capabilities = {};
444
+ for (const chainId2 of chainIds) {
445
+ const hexChainId = `0x${chainId2.toString(16)}`;
446
+ if (requestedChains && !requestedChains.includes(hexChainId)) {
447
+ continue;
448
+ }
449
+ capabilities[hexChainId] = {
450
+ atomic: { status: "supported" },
451
+ paymasterService: { supported: true },
452
+ auxiliaryFunds: { supported: true }
453
+ };
454
+ }
455
+ return capabilities;
456
+ }
457
+ case "wallet_getAssets": {
458
+ const user = await ensureUser();
459
+ if (!user.username) {
460
+ throw new Error("Username required to fetch assets. Set a username first.");
461
+ }
462
+ const clientId = client.getClientId();
463
+ const response = await fetch(
464
+ `${client.getProviderUrl()}/api/users/${encodeURIComponent(user.username)}/portfolio`,
465
+ {
466
+ headers: clientId ? { "x-client-id": clientId } : {}
467
+ }
468
+ );
469
+ if (!response.ok) {
470
+ const data = await response.json().catch(() => ({}));
471
+ throw new Error(data.error || "Failed to get assets");
472
+ }
473
+ return response.json();
474
+ }
475
+ case "wallet_getCallsStatus": {
476
+ const paramList = Array.isArray(params) ? params : [];
477
+ const callsId = paramList[0];
478
+ if (!callsId) {
479
+ throw new Error("callsId is required");
480
+ }
481
+ const statusClientId = client.getClientId();
482
+ const response = await fetch(
483
+ `${client.getProviderUrl()}/api/intent/status/${encodeURIComponent(callsId)}`,
484
+ {
485
+ headers: statusClientId ? { "x-client-id": statusClientId } : {}
486
+ }
393
487
  );
488
+ if (!response.ok) {
489
+ const data2 = await response.json().catch(() => ({}));
490
+ throw new Error(data2.error || "Failed to get calls status");
491
+ }
492
+ const data = await response.json();
493
+ const statusMap = {
494
+ pending: "PENDING",
495
+ preconfirmed: "PENDING",
496
+ completed: "CONFIRMED",
497
+ failed: "CONFIRMED",
498
+ expired: "CONFIRMED"
499
+ };
500
+ return {
501
+ status: statusMap[data.status] || "PENDING",
502
+ receipts: data.transactionHash ? [
503
+ {
504
+ logs: [],
505
+ status: data.status === "completed" ? "0x1" : "0x0",
506
+ blockHash: data.blockHash,
507
+ blockNumber: data.blockNumber,
508
+ transactionHash: data.transactionHash
509
+ }
510
+ ] : []
511
+ };
512
+ }
513
+ case "wallet_getCallsHistory": {
514
+ const paramList = Array.isArray(params) ? params : [];
515
+ const options2 = paramList[0] || {};
516
+ const queryParams = new URLSearchParams();
517
+ if (options2.limit) queryParams.set("limit", String(options2.limit));
518
+ if (options2.offset) queryParams.set("offset", String(options2.offset));
519
+ if (options2.status) queryParams.set("status", options2.status);
520
+ if (options2.from) queryParams.set("from", options2.from);
521
+ if (options2.to) queryParams.set("to", options2.to);
522
+ const url = `${client.getProviderUrl()}/api/intent/history${queryParams.toString() ? `?${queryParams}` : ""}`;
523
+ const historyClientId = client.getClientId();
524
+ const response = await fetch(url, {
525
+ headers: historyClientId ? { "x-client-id": historyClientId } : {},
526
+ credentials: "include"
527
+ });
528
+ if (!response.ok) {
529
+ const data2 = await response.json().catch(() => ({}));
530
+ throw new Error(data2.error || "Failed to get calls history");
531
+ }
532
+ const data = await response.json();
533
+ const statusMap = {
534
+ pending: "PENDING",
535
+ preconfirmed: "PENDING",
536
+ completed: "CONFIRMED",
537
+ failed: "CONFIRMED",
538
+ expired: "CONFIRMED"
539
+ };
394
540
  return {
395
- chains: chainIds,
396
- tokens: tokensByChain
541
+ calls: data.intents.map(
542
+ (intent) => ({
543
+ callsId: intent.intentId,
544
+ // intentId is the orchestrator's ID
545
+ status: statusMap[intent.status] || "PENDING",
546
+ receipts: intent.transactionHash ? [{ transactionHash: intent.transactionHash }] : [],
547
+ chainId: `0x${intent.targetChain.toString(16)}`
548
+ })
549
+ ),
550
+ total: data.total,
551
+ hasMore: data.hasMore
397
552
  };
398
553
  }
399
554
  default:
@@ -416,6 +571,7 @@ function createPasskeyProvider(options) {
416
571
  disconnect
417
572
  };
418
573
  }
574
+ var createPasskeyProvider = createOneAuthProvider;
419
575
 
420
576
  // src/wagmi.ts
421
577
  function oneAuth(options) {
package/dist/wagmi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wagmi.ts","../src/provider.ts","../src/registry.ts","../src/walletClient/utils.ts"],"sourcesContent":["import { createConnector, type Connector } from \"@wagmi/core\";\nimport {\n numberToHex,\n type Address,\n type Chain,\n type ProviderConnectInfo,\n} from \"viem\";\nimport { createPasskeyProvider, type PasskeyProvider } from \"./provider\";\nimport type { OneAuthClient } from \"./client\";\nimport type { IntentSigner } from \"./types\";\n\nexport type OneAuthConnectorOptions = {\n client: OneAuthClient;\n chainId?: number;\n storageKey?: string;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n signIntent?: IntentSigner;\n};\n\nexport function oneAuth(options: OneAuthConnectorOptions) {\n type Provider = PasskeyProvider;\n\n return createConnector<Provider>((wagmiConfig) => {\n const chains = (wagmiConfig.chains ?? []) as readonly [Chain, ...Chain[]];\n const initialChainId = options.chainId ?? chains[0]?.id;\n\n let provider: Provider | null = null;\n let accountsChanged: Connector[\"onAccountsChanged\"] | undefined;\n let chainChanged: Connector[\"onChainChanged\"] | undefined;\n let connect: Connector[\"onConnect\"] | undefined;\n let disconnect: Connector[\"onDisconnect\"] | undefined;\n\n return {\n id: \"1auth\",\n name: \"1auth Passkey\",\n type: \"wallet\",\n async connect<withCapabilities extends boolean = false>(\n { chainId, isReconnecting, withCapabilities }:\n | {\n chainId?: number;\n isReconnecting?: boolean;\n withCapabilities?: withCapabilities | boolean;\n }\n | undefined = {}\n ): Promise<{\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n }> {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n\n const provider = await this.getProvider({ chainId });\n let accounts: readonly Address[] = [];\n let currentChainId = await this.getChainId();\n\n if (isReconnecting) {\n accounts = await this.getAccounts().catch(() => []);\n }\n\n if (!accounts.length) {\n accounts = (await provider.request({\n method: \"wallet_connect\",\n })) as Address[];\n currentChainId = await this.getChainId();\n }\n\n if (chainId && currentChainId !== chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n currentChainId = await this.getChainId();\n }\n\n if (connect) {\n provider.removeListener(\"connect\", connect as never);\n connect = undefined;\n }\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n provider.on(\"accountsChanged\", accountsChanged as never);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n provider.on(\"chainChanged\", chainChanged as never);\n }\n if (!disconnect) {\n disconnect = this.onDisconnect.bind(this);\n provider.on(\"disconnect\", disconnect as never);\n }\n\n const response = withCapabilities\n ? {\n accounts: accounts.map((account) => ({\n address: account,\n capabilities: {},\n })),\n chainId: currentChainId,\n }\n : {\n accounts,\n chainId: currentChainId,\n };\n\n return response as unknown as {\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n };\n },\n async disconnect() {\n const provider = await this.getProvider();\n await provider.disconnect();\n if (chainChanged) {\n provider.removeListener(\"chainChanged\", chainChanged as never);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider.removeListener(\"disconnect\", disconnect as never);\n disconnect = undefined;\n }\n },\n async getAccounts() {\n const provider = await this.getProvider();\n return (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n },\n async getChainId() {\n const provider = await this.getProvider();\n const hexChainId = (await provider.request({\n method: \"eth_chainId\",\n })) as string;\n return Number.parseInt(hexChainId, 16);\n },\n async getProvider({ chainId } = {}) {\n if (!provider) {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n provider = createPasskeyProvider({\n client: options.client,\n chainId: initialChainId,\n storageKey: options.storageKey,\n waitForHash: options.waitForHash,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n signIntent: options.signIntent,\n });\n }\n if (chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n }\n return provider;\n },\n async setup() {\n const provider = await this.getProvider();\n if (!connect) {\n const onConnect = this.onConnect?.bind(this);\n if (onConnect) {\n connect = onConnect;\n provider.on(\"connect\", connect as never);\n }\n }\n },\n async isAuthorized() {\n try {\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n } catch {\n return false;\n }\n },\n async switchChain({ chainId }) {\n const chain = chains.find((chain) => chain.id === chainId);\n if (!chain) {\n throw new Error(\"Chain not configured\");\n }\n const provider = await this.getProvider();\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n return chain;\n },\n async onConnect(connectInfo: ProviderConnectInfo) {\n const accounts = await this.getAccounts();\n if (!accounts.length) return;\n const chainId = Number(connectInfo.chainId);\n wagmiConfig.emitter.emit(\"connect\", { accounts, chainId });\n },\n onAccountsChanged(accounts: string[]) {\n wagmiConfig.emitter.emit(\"change\", {\n accounts: accounts as Address[],\n });\n },\n onChainChanged(chainId: string) {\n wagmiConfig.emitter.emit(\"change\", {\n chainId: Number(chainId),\n });\n },\n onDisconnect(_error?: Error) {\n wagmiConfig.emitter.emit(\"disconnect\");\n },\n };\n });\n}\n","import {\n hexToString,\n isHex,\n numberToHex,\n type Address,\n type Hex,\n} from \"viem\";\nimport { OneAuthClient } from \"./client\";\nimport { getSupportedChainIds, getSupportedTokens } from \"./registry\";\nimport type { IntentCall, IntentSigner } from \"./types\";\nimport { encodeWebAuthnSignature } from \"./walletClient/utils\";\n\ntype ProviderRequest = {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n};\n\ntype Listener = (...args: unknown[]) => void;\n\ntype StoredUser = {\n username: string;\n address: Address;\n};\n\nexport type PasskeyProvider = {\n request: (args: ProviderRequest) => Promise<unknown>;\n on: (event: string, listener: Listener) => void;\n removeListener: (event: string, listener: Listener) => void;\n disconnect: () => Promise<void>;\n};\n\nexport type PasskeyProviderOptions = {\n client: OneAuthClient;\n chainId: number;\n storageKey?: string;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n signIntent?: IntentSigner;\n};\n\nconst DEFAULT_STORAGE_KEY = \"1auth-user\";\n\nexport function createPasskeyProvider(\n options: PasskeyProviderOptions\n): PasskeyProvider {\n const { client } = options;\n let chainId = options.chainId;\n const storageKey = options.storageKey || DEFAULT_STORAGE_KEY;\n\n const listeners = new Map<string, Set<Listener>>();\n\n const emit = (event: string, ...args: unknown[]) => {\n const set = listeners.get(event);\n if (!set) return;\n for (const listener of set) listener(...args);\n };\n\n const getStoredUser = (): StoredUser | null => {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as StoredUser;\n if (!parsed?.username || !parsed?.address) return null;\n return parsed;\n } catch {\n return null;\n }\n };\n\n const setStoredUser = (user: StoredUser) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(storageKey, JSON.stringify(user));\n };\n\n const clearStoredUser = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(storageKey);\n };\n\n const resolveAccountAddress = async (username: string): Promise<Address> => {\n const response = await fetch(\n `${client.getProviderUrl()}/api/users/${encodeURIComponent(username)}/account`,\n {\n headers: {\n \"x-client-id\": client.getClientId(),\n },\n }\n );\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to resolve account address\");\n }\n\n const data = await response.json();\n return data.address as Address;\n };\n\n const connect = async (): Promise<Address[]> => {\n const stored = getStoredUser();\n if (stored) {\n return [stored.address];\n }\n\n const result = await client.authWithModal();\n if (!result.success || !result.username) {\n throw new Error(result.error?.message || \"Authentication failed\");\n }\n\n const address = await resolveAccountAddress(result.username);\n setStoredUser({ username: result.username, address });\n emit(\"accountsChanged\", [address]);\n emit(\"connect\", { chainId: numberToHex(chainId) });\n return [address];\n };\n\n const disconnect = async () => {\n clearStoredUser();\n emit(\"accountsChanged\", []);\n emit(\"disconnect\");\n };\n\n const ensureUser = async (): Promise<StoredUser> => {\n const stored = getStoredUser();\n if (stored) return stored;\n const [address] = await connect();\n const username = getStoredUser()?.username;\n if (!username || !address) {\n throw new Error(\"Failed to resolve user session\");\n }\n return { username, address };\n };\n\n const parseChainId = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) return Number.parseInt(value, 16);\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n };\n\n const normalizeValue = (value: unknown): string | undefined => {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\") return Math.trunc(value).toString();\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) {\n try {\n return BigInt(value).toString();\n } catch {\n return \"0\";\n }\n }\n return value;\n }\n return undefined;\n };\n\n const normalizeCalls = (calls: unknown[]): IntentCall[] => {\n return calls.map((call) => {\n const c = call as Record<string, unknown>;\n return {\n to: c.to as Address,\n data: (c.data as Hex | undefined) || \"0x\",\n value: normalizeValue(c.value) || \"0\",\n label: c.label as string | undefined,\n sublabel: c.sublabel as string | undefined,\n };\n });\n };\n\n const decodeMessage = (value: string) => {\n if (!isHex(value)) return value;\n try {\n return hexToString(value as Hex);\n } catch {\n return value;\n }\n };\n\n const signMessage = async (message: string) => {\n const { username } = await ensureUser();\n const result = await client.signMessage({\n username,\n message,\n });\n if (!result.success || !result.signature) {\n throw new Error(result.error?.message || \"Signing failed\");\n }\n return encodeWebAuthnSignature(result.signature);\n };\n\n const signTypedData = async (typedData: unknown) => {\n const { username } = await ensureUser();\n const data =\n typeof typedData === \"string\" ? JSON.parse(typedData) : typedData;\n const result = await client.signTypedData({\n username,\n domain: (data as any).domain,\n types: (data as any).types,\n primaryType: (data as any).primaryType,\n message: (data as any).message,\n });\n if (!result.success || !result.signature) {\n throw new Error(result.error?.message || \"Signing failed\");\n }\n return encodeWebAuthnSignature(result.signature);\n };\n\n const resolveIntentPayload = async (payload: {\n username: string;\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n }) => {\n if (!options.signIntent) {\n return {\n username: payload.username,\n targetChain: payload.targetChain,\n calls: payload.calls,\n };\n }\n const signedIntent = await options.signIntent({\n username: payload.username,\n accountAddress: payload.accountAddress,\n targetChain: payload.targetChain,\n calls: payload.calls,\n });\n return { signedIntent };\n };\n\n const sendIntent = async (payload: {\n username: string;\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n }) => {\n const closeOn = (options.waitForHash ?? true)\n ? \"completed\"\n : \"preconfirmed\";\n const intentPayload = await resolveIntentPayload(payload);\n const result = await client.sendIntent({\n ...intentPayload,\n closeOn,\n waitForHash: options.waitForHash ?? true,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n });\n\n if (!result.success || !result.transactionHash) {\n throw new Error(result.error?.message || \"Transaction failed\");\n }\n\n return result.transactionHash;\n };\n\n const request = async ({ method, params }: ProviderRequest) => {\n switch (method) {\n case \"eth_chainId\":\n return numberToHex(chainId);\n case \"eth_accounts\": {\n const stored = getStoredUser();\n return stored ? [stored.address] : [];\n }\n case \"eth_requestAccounts\":\n return connect();\n case \"wallet_connect\":\n return connect();\n case \"wallet_disconnect\":\n await disconnect();\n return true;\n case \"wallet_switchEthereumChain\": {\n const [param] = (params as any[]) || [];\n const next = parseChainId(param?.chainId ?? param);\n if (!next) {\n throw new Error(\"Invalid chainId\");\n }\n chainId = next;\n emit(\"chainChanged\", numberToHex(chainId));\n return null;\n }\n case \"personal_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const first = paramList[0];\n const second = paramList[1];\n const message =\n typeof first === \"string\" && first.startsWith(\"0x\") && second\n ? typeof second === \"string\" && !second.startsWith(\"0x\")\n ? second\n : decodeMessage(first)\n : typeof first === \"string\"\n ? decodeMessage(first)\n : typeof second === \"string\"\n ? decodeMessage(second)\n : \"\";\n if (!message) throw new Error(\"Invalid personal_sign payload\");\n return signMessage(message);\n }\n case \"eth_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const message = typeof paramList[1] === \"string\" ? paramList[1] : \"\";\n if (!message) throw new Error(\"Invalid eth_sign payload\");\n return signMessage(decodeMessage(message));\n }\n case \"eth_signTypedData\":\n case \"eth_signTypedData_v4\": {\n const paramList = Array.isArray(params) ? params : [];\n const typedData = paramList[1] ?? paramList[0];\n return signTypedData(typedData);\n }\n case \"eth_sendTransaction\": {\n const paramList = Array.isArray(params) ? params : [];\n const tx = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(tx.chainId) ?? chainId;\n const calls = normalizeCalls([tx]);\n return sendIntent({\n username: user.username,\n accountAddress: user.address,\n targetChain,\n calls,\n });\n }\n case \"wallet_sendCalls\": {\n const paramList = Array.isArray(params) ? params : [];\n const payload = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(payload.chainId) ?? chainId;\n const calls = normalizeCalls((payload.calls as unknown[]) || []);\n if (!calls.length) throw new Error(\"No calls provided\");\n return sendIntent({\n username: user.username,\n accountAddress: user.address,\n targetChain,\n calls,\n });\n }\n case \"wallet_getCapabilities\": {\n const chainIds = getSupportedChainIds();\n const tokensByChain = Object.fromEntries(\n chainIds.map((id) => [id, getSupportedTokens(id)])\n );\n return {\n chains: chainIds,\n tokens: tokensByChain,\n };\n }\n default:\n throw new Error(`Unsupported method: ${method}`);\n }\n };\n\n return {\n request,\n on(event, listener) {\n const set = listeners.get(event) ?? new Set();\n set.add(listener);\n listeners.set(event, set);\n },\n removeListener(event, listener) {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) listeners.delete(event);\n },\n disconnect,\n };\n}\n","import type { Address, Chain } from \"viem\";\nimport { isAddress } from \"viem\";\nimport * as viemChains from \"viem/chains\";\nimport {\n getAllSupportedChainsAndTokens as getAllSupportedChainsAndTokensRaw,\n getSupportedTokens as getSupportedTokensRaw,\n getTokenAddress,\n getTokenDecimals,\n} from \"@rhinestone/sdk\";\n\nexport type TokenConfig = {\n symbol: string;\n address: Address;\n decimals: number;\n supportsMultichain?: boolean;\n [key: string]: unknown;\n};\n\nexport type ChainFilterOptions = {\n includeTestnets?: boolean;\n chainIds?: number[];\n};\n\nconst env: Record<string, string | undefined> =\n typeof process !== \"undefined\" ? process.env : {};\n\nconst ALL_VIEM_CHAINS = (Object.values(viemChains) as unknown[]).filter(\n (value): value is Chain =>\n typeof value === \"object\" && value !== null && \"id\" in value && \"name\" in value\n);\nconst VIEM_CHAIN_BY_ID = new Map<number, Chain>(\n ALL_VIEM_CHAINS.map((chain) => [chain.id, chain])\n);\nconst SUPPORTED_CHAIN_IDS = new Set(\n getAllSupportedChainsAndTokensRaw().map((entry) => entry.chainId)\n);\n\nfunction parseBool(value?: string): boolean | undefined {\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n return undefined;\n}\n\nfunction resolveIncludeTestnets(explicit?: boolean): boolean {\n if (explicit !== undefined) return explicit;\n const envValue =\n parseBool(env.NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS) ??\n parseBool(env.ORCHESTRATOR_USE_TESTNETS);\n return envValue ?? false;\n}\n\nfunction applyChainFilters(chainIds: number[], options?: ChainFilterOptions): number[] {\n const includeTestnets = resolveIncludeTestnets(options?.includeTestnets);\n const allowlist = options?.chainIds;\n let filtered = chainIds;\n\n if (!includeTestnets) {\n filtered = filtered.filter((chainId) => !isTestnet(chainId));\n }\n\n if (allowlist && allowlist.length > 0) {\n const allowed = new Set(allowlist);\n filtered = filtered.filter((chainId) => allowed.has(chainId));\n }\n\n return filtered;\n}\n\nexport function getSupportedChainIds(options?: ChainFilterOptions): number[] {\n return applyChainFilters(Array.from(SUPPORTED_CHAIN_IDS), options);\n}\n\nexport function getSupportedChains(options?: ChainFilterOptions): Chain[] {\n return getSupportedChainIds(options)\n .map((chainId) => VIEM_CHAIN_BY_ID.get(chainId))\n .filter((chain): chain is Chain => Boolean(chain));\n}\n\nexport function getAllSupportedChainsAndTokens(options?: ChainFilterOptions): Array<{\n chainId: number;\n tokens: TokenConfig[];\n}> {\n const allowed = new Set(getSupportedChainIds(options));\n return getAllSupportedChainsAndTokensRaw()\n .filter((entry) => allowed.has(entry.chainId))\n .map((entry) => ({\n chainId: entry.chainId,\n tokens: entry.tokens as TokenConfig[],\n }));\n}\n\nexport function getChainById(chainId: number): Chain {\n if (!SUPPORTED_CHAIN_IDS.has(chainId)) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n const chain = VIEM_CHAIN_BY_ID.get(chainId);\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n return chain;\n}\n\nexport function getChainName(chainId: number): string {\n try {\n return getChainById(chainId).name;\n } catch {\n return `Chain ${chainId}`;\n }\n}\n\nexport function getChainExplorerUrl(chainId: number): string | undefined {\n try {\n return getChainById(chainId).blockExplorers?.default?.url;\n } catch {\n return undefined;\n }\n}\n\nexport function getChainRpcUrl(chainId: number): string | undefined {\n try {\n const chain = getChainById(chainId);\n return chain.rpcUrls?.default?.http?.[0] || chain.rpcUrls?.public?.http?.[0];\n } catch {\n return undefined;\n }\n}\n\nexport function getSupportedTokens(chainId: number): TokenConfig[] {\n return getSupportedTokensRaw(chainId) as TokenConfig[];\n}\n\nexport function getSupportedTokenSymbols(chainId: number): string[] {\n return getSupportedTokens(chainId).map((token) => token.symbol);\n}\n\nexport function resolveTokenAddress(token: string, chainId: number): Address {\n if (isAddress(token)) {\n return token;\n }\n return getTokenAddress(token.toUpperCase() as never, chainId);\n}\n\nexport function isTestnet(chainId: number): boolean {\n try {\n return getChainById(chainId).testnet ?? false;\n } catch {\n return false;\n }\n}\n\nexport function getTokenSymbol(tokenAddress: Address, chainId: number): string {\n const token = getSupportedTokens(chainId).find(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n if (!token) {\n throw new Error(`Unsupported token: ${tokenAddress} on chain ${chainId}`);\n }\n return token.symbol;\n}\n\nexport function isTokenAddressSupported(tokenAddress: Address, chainId: number): boolean {\n try {\n return getSupportedTokens(chainId).some(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n } catch {\n return false;\n }\n}\n\nexport { getTokenAddress, getTokenDecimals };\n","import { encodeAbiParameters, keccak256 } from 'viem';\nimport type { Hex } from 'viem';\nimport type { WebAuthnSignature } from '../types';\nimport type { TransactionCall } from './types';\n\n/**\n * P-256 curve order (n)\n * Used for signature malleability normalization\n */\nconst P256_N = BigInt(\n '0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551'\n);\nconst P256_N_DIV_2 = P256_N / 2n;\n\n/**\n * WebAuthnAuth struct type for ABI encoding\n */\nconst WEBAUTHN_AUTH_TYPE = {\n type: 'tuple',\n components: [\n { type: 'bytes', name: 'authenticatorData' },\n { type: 'string', name: 'clientDataJSON' },\n { type: 'uint256', name: 'challengeIndex' },\n { type: 'uint256', name: 'typeIndex' },\n { type: 'uint256', name: 'r' },\n { type: 'uint256', name: 's' },\n ],\n} as const;\n\n/**\n * Encode a WebAuthn signature for ERC-1271 verification on-chain\n *\n * @param sig - The WebAuthn signature from the passkey\n * @returns ABI-encoded signature bytes\n */\nexport function encodeWebAuthnSignature(sig: WebAuthnSignature): Hex {\n // Normalize s to prevent signature malleability\n let s = BigInt(sig.s);\n if (s > P256_N_DIV_2) {\n s = P256_N - s;\n }\n\n return encodeAbiParameters([WEBAUTHN_AUTH_TYPE], [\n {\n authenticatorData: sig.authenticatorData as Hex,\n clientDataJSON: sig.clientDataJSON,\n challengeIndex: BigInt(sig.challengeIndex),\n typeIndex: BigInt(sig.typeIndex),\n r: BigInt(sig.r),\n s,\n },\n ]);\n}\n\n/**\n * Hash an array of transaction calls for signing\n *\n * @param calls - Array of transaction calls\n * @returns keccak256 hash of the encoded calls\n */\nexport function hashCalls(calls: TransactionCall[]): Hex {\n const encoded = encodeAbiParameters(\n [\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'to' },\n { type: 'bytes', name: 'data' },\n { type: 'uint256', name: 'value' },\n ],\n },\n ],\n [\n calls.map((c) => ({\n to: c.to,\n data: c.data || '0x',\n value: c.value || 0n,\n })),\n ]\n );\n return keccak256(encoded);\n}\n\n/**\n * Build transaction review display data from calls\n *\n * @param calls - Array of transaction calls\n * @returns TransactionDetails for the signing modal\n */\nexport function buildTransactionReview(calls: TransactionCall[]) {\n return {\n actions: calls.map((call, i) => ({\n type: 'custom' as const,\n label: call.label || `Contract Call ${i + 1}`,\n sublabel: call.sublabel || `To: ${call.to.slice(0, 10)}...${call.to.slice(-8)}`,\n amount: call.value ? `${call.value} wei` : undefined,\n })),\n };\n}\n"],"mappings":"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","names":["import_viem","import_viem","getAllSupportedChainsAndTokensRaw","getSupportedTokensRaw","import_viem","data","provider","chain"]}
1
+ {"version":3,"sources":["../src/wagmi.ts","../src/provider.ts","../src/registry.ts","../src/walletClient/utils.ts"],"sourcesContent":["import { createConnector, type Connector } from \"@wagmi/core\";\nimport {\n numberToHex,\n type Address,\n type Chain,\n type ProviderConnectInfo,\n} from \"viem\";\nimport { createPasskeyProvider, type PasskeyProvider } from \"./provider\";\nimport type { OneAuthClient } from \"./client\";\nimport type { IntentSigner } from \"./types\";\n\nexport type OneAuthConnectorOptions = {\n client: OneAuthClient;\n chainId?: number;\n storageKey?: string;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n signIntent?: IntentSigner;\n};\n\nexport function oneAuth(options: OneAuthConnectorOptions) {\n type Provider = PasskeyProvider;\n\n return createConnector<Provider>((wagmiConfig) => {\n const chains = (wagmiConfig.chains ?? []) as readonly [Chain, ...Chain[]];\n const initialChainId = options.chainId ?? chains[0]?.id;\n\n let provider: Provider | null = null;\n let accountsChanged: Connector[\"onAccountsChanged\"] | undefined;\n let chainChanged: Connector[\"onChainChanged\"] | undefined;\n let connect: Connector[\"onConnect\"] | undefined;\n let disconnect: Connector[\"onDisconnect\"] | undefined;\n\n return {\n id: \"1auth\",\n name: \"1auth Passkey\",\n type: \"wallet\",\n async connect<withCapabilities extends boolean = false>(\n { chainId, isReconnecting, withCapabilities }:\n | {\n chainId?: number;\n isReconnecting?: boolean;\n withCapabilities?: withCapabilities | boolean;\n }\n | undefined = {}\n ): Promise<{\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n }> {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n\n const provider = await this.getProvider({ chainId });\n let accounts: readonly Address[] = [];\n let currentChainId = await this.getChainId();\n\n if (isReconnecting) {\n accounts = await this.getAccounts().catch(() => []);\n }\n\n if (!accounts.length) {\n accounts = (await provider.request({\n method: \"wallet_connect\",\n })) as Address[];\n currentChainId = await this.getChainId();\n }\n\n if (chainId && currentChainId !== chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n currentChainId = await this.getChainId();\n }\n\n if (connect) {\n provider.removeListener(\"connect\", connect as never);\n connect = undefined;\n }\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n provider.on(\"accountsChanged\", accountsChanged as never);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n provider.on(\"chainChanged\", chainChanged as never);\n }\n if (!disconnect) {\n disconnect = this.onDisconnect.bind(this);\n provider.on(\"disconnect\", disconnect as never);\n }\n\n const response = withCapabilities\n ? {\n accounts: accounts.map((account) => ({\n address: account,\n capabilities: {},\n })),\n chainId: currentChainId,\n }\n : {\n accounts,\n chainId: currentChainId,\n };\n\n return response as unknown as {\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n };\n },\n async disconnect() {\n const provider = await this.getProvider();\n await provider.disconnect();\n if (chainChanged) {\n provider.removeListener(\"chainChanged\", chainChanged as never);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider.removeListener(\"disconnect\", disconnect as never);\n disconnect = undefined;\n }\n },\n async getAccounts() {\n const provider = await this.getProvider();\n return (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n },\n async getChainId() {\n const provider = await this.getProvider();\n const hexChainId = (await provider.request({\n method: \"eth_chainId\",\n })) as string;\n return Number.parseInt(hexChainId, 16);\n },\n async getProvider({ chainId } = {}) {\n if (!provider) {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n provider = createPasskeyProvider({\n client: options.client,\n chainId: initialChainId,\n storageKey: options.storageKey,\n waitForHash: options.waitForHash,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n signIntent: options.signIntent,\n });\n }\n if (chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n }\n return provider;\n },\n async setup() {\n const provider = await this.getProvider();\n if (!connect) {\n const onConnect = this.onConnect?.bind(this);\n if (onConnect) {\n connect = onConnect;\n provider.on(\"connect\", connect as never);\n }\n }\n },\n async isAuthorized() {\n try {\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n } catch {\n return false;\n }\n },\n async switchChain({ chainId }) {\n const chain = chains.find((chain) => chain.id === chainId);\n if (!chain) {\n throw new Error(\"Chain not configured\");\n }\n const provider = await this.getProvider();\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n return chain;\n },\n async onConnect(connectInfo: ProviderConnectInfo) {\n const accounts = await this.getAccounts();\n if (!accounts.length) return;\n const chainId = Number(connectInfo.chainId);\n wagmiConfig.emitter.emit(\"connect\", { accounts, chainId });\n },\n onAccountsChanged(accounts: string[]) {\n wagmiConfig.emitter.emit(\"change\", {\n accounts: accounts as Address[],\n });\n },\n onChainChanged(chainId: string) {\n wagmiConfig.emitter.emit(\"change\", {\n chainId: Number(chainId),\n });\n },\n onDisconnect(_error?: Error) {\n wagmiConfig.emitter.emit(\"disconnect\");\n },\n };\n });\n}\n","import {\n hexToString,\n isHex,\n numberToHex,\n type Address,\n type Hex,\n} from \"viem\";\nimport { OneAuthClient } from \"./client\";\nimport { getSupportedChainIds } from \"./registry\";\nimport type { CloseOnStatus, IntentCall, IntentSigner, IntentTokenRequest } from \"./types\";\nimport { encodeWebAuthnSignature } from \"./walletClient/utils\";\n\ntype ProviderRequest = {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n};\n\ntype Listener = (...args: unknown[]) => void;\n\ntype StoredUser = {\n username?: string;\n address: Address;\n};\n\nexport type OneAuthProvider = {\n request: (args: ProviderRequest) => Promise<unknown>;\n on: (event: string, listener: Listener) => void;\n removeListener: (event: string, listener: Listener) => void;\n disconnect: () => Promise<void>;\n};\n\n/** @deprecated Use OneAuthProvider instead */\nexport type PasskeyProvider = OneAuthProvider;\n\nexport type OneAuthProviderOptions = {\n client: OneAuthClient;\n chainId: number;\n storageKey?: string;\n /** When to close the dialog and return success. Defaults to \"preconfirmed\" */\n closeOn?: CloseOnStatus;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n signIntent?: IntentSigner;\n};\n\n/** @deprecated Use OneAuthProviderOptions instead */\nexport type PasskeyProviderOptions = OneAuthProviderOptions;\n\nconst DEFAULT_STORAGE_KEY = \"1auth-user\";\n\nexport function createOneAuthProvider(\n options: OneAuthProviderOptions\n): OneAuthProvider {\n const { client } = options;\n let chainId = options.chainId;\n const storageKey = options.storageKey || DEFAULT_STORAGE_KEY;\n\n const listeners = new Map<string, Set<Listener>>();\n\n const emit = (event: string, ...args: unknown[]) => {\n const set = listeners.get(event);\n if (!set) return;\n for (const listener of set) listener(...args);\n };\n\n const getStoredUser = (): StoredUser | null => {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as StoredUser;\n if (!parsed?.address) return null;\n return parsed;\n } catch {\n return null;\n }\n };\n\n const setStoredUser = (user: StoredUser) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(storageKey, JSON.stringify(user));\n };\n\n const clearStoredUser = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(storageKey);\n };\n\n const resolveAccountAddress = async (username: string): Promise<Address> => {\n const clientId = client.getClientId();\n const response = await fetch(\n `${client.getProviderUrl()}/api/users/${encodeURIComponent(username)}/account`,\n {\n headers: clientId ? { \"x-client-id\": clientId } : {},\n }\n );\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to resolve account address\");\n }\n\n const data = await response.json();\n return data.address as Address;\n };\n\n const connect = async (): Promise<Address[]> => {\n const stored = getStoredUser();\n if (stored) {\n return [stored.address];\n }\n\n // First try the lightweight connect modal\n const connectResult = await client.connectWithModal();\n\n let username: string | undefined;\n let address: Address | undefined;\n\n if (connectResult.success) {\n // Connection successful (user confirmed or auto-connected)\n username = connectResult.username;\n address = connectResult.address as Address | undefined;\n } else if (connectResult.action === \"switch\") {\n // User wants to switch account or no previous user - show auth modal\n const authResult = await client.authWithModal();\n if (!authResult.success) {\n throw new Error(authResult.error?.message || \"Authentication failed\");\n }\n username = authResult.username;\n address = authResult.address as Address | undefined;\n } else {\n // Connection was cancelled\n throw new Error(connectResult.error?.message || \"Connection cancelled\");\n }\n\n // Use address from result directly, or resolve from username\n if (!address && username) {\n address = await resolveAccountAddress(username);\n }\n if (!address) {\n throw new Error(\"No account address available\");\n }\n\n setStoredUser({ username, address });\n emit(\"accountsChanged\", [address]);\n emit(\"connect\", { chainId: numberToHex(chainId) });\n return [address];\n };\n\n const disconnect = async () => {\n clearStoredUser();\n emit(\"accountsChanged\", []);\n emit(\"disconnect\");\n };\n\n const ensureUser = async (): Promise<StoredUser> => {\n const stored = getStoredUser();\n if (stored) return stored;\n const [address] = await connect();\n if (!address) {\n throw new Error(\"Failed to resolve user session\");\n }\n const user = getStoredUser();\n return user || { address };\n };\n\n const parseChainId = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) return Number.parseInt(value, 16);\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n };\n\n const normalizeValue = (value: unknown): string | undefined => {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\") return Math.trunc(value).toString();\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) {\n try {\n return BigInt(value).toString();\n } catch {\n return \"0\";\n }\n }\n return value;\n }\n return undefined;\n };\n\n const normalizeCalls = (calls: unknown[]): IntentCall[] => {\n return calls.map((call) => {\n const c = call as Record<string, unknown>;\n return {\n to: c.to as Address,\n data: (c.data as Hex | undefined) || \"0x\",\n value: normalizeValue(c.value) || \"0\",\n label: c.label as string | undefined,\n sublabel: c.sublabel as string | undefined,\n };\n });\n };\n\n const normalizeTokenRequests = (\n requests: unknown\n ): IntentTokenRequest[] | undefined => {\n if (!Array.isArray(requests)) return undefined;\n return requests.map((r) => {\n const req = r as Record<string, unknown>;\n return {\n token: req.token as string,\n amount:\n typeof req.amount === \"bigint\"\n ? req.amount\n : BigInt(String(req.amount || \"0\")),\n };\n });\n };\n\n const decodeMessage = (value: string) => {\n if (!isHex(value)) return value;\n try {\n return hexToString(value as Hex);\n } catch {\n return value;\n }\n };\n\n const signMessage = async (message: string) => {\n const user = await ensureUser();\n if (!user.username && !user.address) {\n throw new Error(\"Username or address required for signing.\");\n }\n const result = await client.signMessage({\n username: user.username,\n accountAddress: user.address,\n message,\n });\n if (!result.success || !result.signature) {\n throw new Error(result.error?.message || \"Signing failed\");\n }\n return encodeWebAuthnSignature(result.signature);\n };\n\n const signTypedData = async (typedData: unknown) => {\n const user = await ensureUser();\n if (!user.username && !user.address) {\n throw new Error(\"Username or address required for signing.\");\n }\n const data =\n typeof typedData === \"string\" ? JSON.parse(typedData) : typedData;\n const result = await client.signTypedData({\n username: user.username,\n accountAddress: user.address,\n domain: (data as any).domain,\n types: (data as any).types,\n primaryType: (data as any).primaryType,\n message: (data as any).message,\n });\n if (!result.success || !result.signature) {\n throw new Error(result.error?.message || \"Signing failed\");\n }\n return encodeWebAuthnSignature(result.signature);\n };\n\n const resolveIntentPayload = async (payload: {\n username?: string;\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n tokenRequests?: IntentTokenRequest[];\n }) => {\n if (!options.signIntent) {\n return {\n username: payload.username,\n accountAddress: payload.accountAddress,\n targetChain: payload.targetChain,\n calls: payload.calls,\n tokenRequests: payload.tokenRequests,\n };\n }\n if (!payload.username) {\n throw new Error(\"Username required for signed intents. Set a username first.\");\n }\n const signedIntent = await options.signIntent({\n username: payload.username,\n accountAddress: payload.accountAddress,\n targetChain: payload.targetChain,\n calls: payload.calls,\n tokenRequests: payload.tokenRequests,\n });\n return { signedIntent };\n };\n\n const sendIntent = async (payload: {\n username?: string;\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n tokenRequests?: IntentTokenRequest[];\n sourceChainId?: number;\n }) => {\n // Use explicit closeOn if provided, otherwise default based on waitForHash\n const closeOn = options.closeOn ?? ((options.waitForHash ?? true) ? \"completed\" : \"preconfirmed\");\n const intentPayload = await resolveIntentPayload(payload);\n const result = await client.sendIntent({\n ...intentPayload,\n tokenRequests: payload.tokenRequests,\n sourceChainId: payload.sourceChainId,\n closeOn,\n waitForHash: options.waitForHash ?? true,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n });\n\n if (!result.success) {\n throw new Error(result.error?.message || \"Transaction failed\");\n }\n\n // Return intentId as callsId for EIP-5792 compatibility\n return result.intentId;\n };\n\n const request = async ({ method, params }: ProviderRequest) => {\n switch (method) {\n case \"eth_chainId\":\n return numberToHex(chainId);\n case \"eth_accounts\": {\n const stored = getStoredUser();\n return stored ? [stored.address] : [];\n }\n case \"eth_requestAccounts\":\n return connect();\n case \"wallet_connect\":\n return connect();\n case \"wallet_disconnect\":\n await disconnect();\n return true;\n case \"wallet_switchEthereumChain\": {\n const [param] = (params as any[]) || [];\n const next = parseChainId(param?.chainId ?? param);\n if (!next) {\n throw new Error(\"Invalid chainId\");\n }\n chainId = next;\n emit(\"chainChanged\", numberToHex(chainId));\n return null;\n }\n case \"personal_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const first = paramList[0];\n const second = paramList[1];\n const message =\n typeof first === \"string\" && first.startsWith(\"0x\") && second\n ? typeof second === \"string\" && !second.startsWith(\"0x\")\n ? second\n : decodeMessage(first)\n : typeof first === \"string\"\n ? decodeMessage(first)\n : typeof second === \"string\"\n ? decodeMessage(second)\n : \"\";\n if (!message) throw new Error(\"Invalid personal_sign payload\");\n return signMessage(message);\n }\n case \"eth_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const message = typeof paramList[1] === \"string\" ? paramList[1] : \"\";\n if (!message) throw new Error(\"Invalid eth_sign payload\");\n return signMessage(decodeMessage(message));\n }\n case \"eth_signTypedData\":\n case \"eth_signTypedData_v4\": {\n const paramList = Array.isArray(params) ? params : [];\n const typedData = paramList[1] ?? paramList[0];\n return signTypedData(typedData);\n }\n case \"eth_sendTransaction\": {\n const paramList = Array.isArray(params) ? params : [];\n const tx = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(tx.chainId) ?? chainId;\n const calls = normalizeCalls([tx]);\n const tokenRequests = normalizeTokenRequests(tx.tokenRequests);\n const txSourceChainId = parseChainId(tx.sourceChainId);\n return sendIntent({\n username: user.username,\n accountAddress: user.address,\n targetChain,\n calls,\n tokenRequests,\n sourceChainId: txSourceChainId,\n });\n }\n case \"wallet_sendCalls\": {\n const paramList = Array.isArray(params) ? params : [];\n const payload = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(payload.chainId) ?? chainId;\n const calls = normalizeCalls((payload.calls as unknown[]) || []);\n const tokenRequests = normalizeTokenRequests(payload.tokenRequests);\n const sourceChainId = parseChainId(payload.sourceChainId);\n if (!calls.length) throw new Error(\"No calls provided\");\n return sendIntent({\n username: user.username,\n accountAddress: user.address,\n targetChain,\n calls,\n tokenRequests,\n sourceChainId,\n });\n }\n case \"wallet_getCapabilities\": {\n const paramList = Array.isArray(params) ? params : [];\n // walletAddress is params[0] - we ignore since all accounts have same capabilities\n const requestedChains = paramList[1] as `0x${string}`[] | undefined;\n\n const chainIds = getSupportedChainIds();\n const capabilities: Record<`0x${string}`, Record<string, unknown>> = {};\n\n for (const chainId of chainIds) {\n const hexChainId = `0x${chainId.toString(16)}` as `0x${string}`;\n\n // Filter if specific chains requested\n if (requestedChains && !requestedChains.includes(hexChainId)) {\n continue;\n }\n\n capabilities[hexChainId] = {\n atomic: { status: \"supported\" },\n paymasterService: { supported: true },\n auxiliaryFunds: { supported: true },\n };\n }\n\n return capabilities;\n }\n case \"wallet_getAssets\": {\n const user = await ensureUser();\n if (!user.username) {\n throw new Error(\"Username required to fetch assets. Set a username first.\");\n }\n const clientId = client.getClientId();\n const response = await fetch(\n `${client.getProviderUrl()}/api/users/${encodeURIComponent(user.username)}/portfolio`,\n {\n headers: clientId ? { \"x-client-id\": clientId } : {},\n }\n );\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to get assets\");\n }\n return response.json();\n }\n case \"wallet_getCallsStatus\": {\n const paramList = Array.isArray(params) ? params : [];\n const callsId = paramList[0] as string;\n if (!callsId) {\n throw new Error(\"callsId is required\");\n }\n const statusClientId = client.getClientId();\n const response = await fetch(\n `${client.getProviderUrl()}/api/intent/status/${encodeURIComponent(callsId)}`,\n {\n headers: statusClientId ? { \"x-client-id\": statusClientId } : {},\n }\n );\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to get calls status\");\n }\n const data = await response.json();\n // Map intent status to EIP-5792 format\n const statusMap: Record<string, string> = {\n pending: \"PENDING\",\n preconfirmed: \"PENDING\",\n completed: \"CONFIRMED\",\n failed: \"CONFIRMED\",\n expired: \"CONFIRMED\",\n };\n return {\n status: statusMap[data.status] || \"PENDING\",\n receipts: data.transactionHash\n ? [\n {\n logs: [],\n status: data.status === \"completed\" ? \"0x1\" : \"0x0\",\n blockHash: data.blockHash,\n blockNumber: data.blockNumber,\n transactionHash: data.transactionHash,\n },\n ]\n : [],\n };\n }\n case \"wallet_getCallsHistory\": {\n const paramList = Array.isArray(params) ? params : [];\n const options = (paramList[0] || {}) as {\n limit?: number;\n offset?: number;\n status?: string;\n from?: string;\n to?: string;\n };\n\n const queryParams = new URLSearchParams();\n if (options.limit) queryParams.set(\"limit\", String(options.limit));\n if (options.offset) queryParams.set(\"offset\", String(options.offset));\n if (options.status) queryParams.set(\"status\", options.status);\n if (options.from) queryParams.set(\"from\", options.from);\n if (options.to) queryParams.set(\"to\", options.to);\n\n const url = `${client.getProviderUrl()}/api/intent/history${\n queryParams.toString() ? `?${queryParams}` : \"\"\n }`;\n\n const historyClientId = client.getClientId();\n const response = await fetch(url, {\n headers: historyClientId ? { \"x-client-id\": historyClientId } : {},\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to get calls history\");\n }\n\n const data = await response.json();\n\n // Map intent status to EIP-5792 format\n const statusMap: Record<string, string> = {\n pending: \"PENDING\",\n preconfirmed: \"PENDING\",\n completed: \"CONFIRMED\",\n failed: \"CONFIRMED\",\n expired: \"CONFIRMED\",\n };\n\n // intentId IS the orchestrator's ID (used as callsId in EIP-5792)\n return {\n calls: data.intents.map(\n (intent: {\n intentId: string;\n status: string;\n transactionHash?: string;\n targetChain: number;\n }) => ({\n callsId: intent.intentId, // intentId is the orchestrator's ID\n status: statusMap[intent.status] || \"PENDING\",\n receipts: intent.transactionHash\n ? [{ transactionHash: intent.transactionHash }]\n : [],\n chainId: `0x${intent.targetChain.toString(16)}`,\n })\n ),\n total: data.total,\n hasMore: data.hasMore,\n };\n }\n default:\n throw new Error(`Unsupported method: ${method}`);\n }\n };\n\n return {\n request,\n on(event, listener) {\n const set = listeners.get(event) ?? new Set();\n set.add(listener);\n listeners.set(event, set);\n },\n removeListener(event, listener) {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) listeners.delete(event);\n },\n disconnect,\n };\n}\n\n/** @deprecated Use createOneAuthProvider instead */\nexport const createPasskeyProvider = createOneAuthProvider;\n","import type { Address, Chain } from \"viem\";\nimport { isAddress } from \"viem\";\nimport * as viemChains from \"viem/chains\";\nimport {\n getAllSupportedChainsAndTokens as getAllSupportedChainsAndTokensRaw,\n getSupportedTokens as getSupportedTokensRaw,\n getTokenAddress,\n getTokenDecimals,\n} from \"@rhinestone/sdk\";\n\nexport type TokenConfig = {\n symbol: string;\n address: Address;\n decimals: number;\n supportsMultichain?: boolean;\n [key: string]: unknown;\n};\n\nexport type ChainFilterOptions = {\n includeTestnets?: boolean;\n chainIds?: number[];\n};\n\nconst env: Record<string, string | undefined> =\n typeof process !== \"undefined\" ? process.env : {};\n\n// Build a chain-ID-to-Chain map from viem, resolving collisions by\n// preferring non-testnet (mainnet) definitions. Viem has duplicate IDs\n// (e.g. zoraTestnet and hyperEvm both use 999) and Map last-write-wins\n// can pick the wrong one.\nconst VIEM_CHAIN_BY_ID = new Map<number, Chain>();\nfor (const value of Object.values(viemChains)) {\n if (typeof value !== \"object\" || value === null || !(\"id\" in value) || !(\"name\" in value)) continue;\n const chain = value as Chain;\n const existing = VIEM_CHAIN_BY_ID.get(chain.id);\n if (!existing || (existing.testnet && !chain.testnet)) {\n VIEM_CHAIN_BY_ID.set(chain.id, chain);\n }\n}\nconst SUPPORTED_CHAIN_IDS = new Set(\n getAllSupportedChainsAndTokensRaw().map((entry) => entry.chainId)\n);\n\nfunction parseBool(value?: string): boolean | undefined {\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n return undefined;\n}\n\nfunction resolveIncludeTestnets(explicit?: boolean): boolean {\n if (explicit !== undefined) return explicit;\n const envValue =\n parseBool(env.NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS) ??\n parseBool(env.ORCHESTRATOR_USE_TESTNETS);\n return envValue ?? false;\n}\n\nfunction applyChainFilters(chainIds: number[], options?: ChainFilterOptions): number[] {\n const includeTestnets = resolveIncludeTestnets(options?.includeTestnets);\n const allowlist = options?.chainIds;\n let filtered = chainIds;\n\n if (!includeTestnets) {\n filtered = filtered.filter((chainId) => !isTestnet(chainId));\n }\n\n if (allowlist && allowlist.length > 0) {\n const allowed = new Set(allowlist);\n filtered = filtered.filter((chainId) => allowed.has(chainId));\n }\n\n return filtered;\n}\n\nexport function getSupportedChainIds(options?: ChainFilterOptions): number[] {\n return applyChainFilters(Array.from(SUPPORTED_CHAIN_IDS), options);\n}\n\nexport function getSupportedChains(options?: ChainFilterOptions): Chain[] {\n return getSupportedChainIds(options)\n .map((chainId) => VIEM_CHAIN_BY_ID.get(chainId))\n .filter((chain): chain is Chain => Boolean(chain));\n}\n\nexport function getAllSupportedChainsAndTokens(options?: ChainFilterOptions): Array<{\n chainId: number;\n tokens: TokenConfig[];\n}> {\n const allowed = new Set(getSupportedChainIds(options));\n return getAllSupportedChainsAndTokensRaw()\n .filter((entry) => allowed.has(entry.chainId))\n .map((entry) => ({\n chainId: entry.chainId,\n tokens: entry.tokens as TokenConfig[],\n }));\n}\n\nexport function getChainById(chainId: number): Chain {\n if (!SUPPORTED_CHAIN_IDS.has(chainId)) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n const chain = VIEM_CHAIN_BY_ID.get(chainId);\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n return chain;\n}\n\nexport function getChainName(chainId: number): string {\n try {\n return getChainById(chainId).name;\n } catch {\n return `Chain ${chainId}`;\n }\n}\n\nexport function getChainExplorerUrl(chainId: number): string | undefined {\n try {\n return getChainById(chainId).blockExplorers?.default?.url;\n } catch {\n return undefined;\n }\n}\n\nexport function getChainRpcUrl(chainId: number): string | undefined {\n try {\n const chain = getChainById(chainId);\n return chain.rpcUrls?.default?.http?.[0] || chain.rpcUrls?.public?.http?.[0];\n } catch {\n return undefined;\n }\n}\n\nexport function getSupportedTokens(chainId: number): TokenConfig[] {\n return getSupportedTokensRaw(chainId) as TokenConfig[];\n}\n\nexport function getSupportedTokenSymbols(chainId: number): string[] {\n return getSupportedTokens(chainId).map((token) => token.symbol);\n}\n\nexport function resolveTokenAddress(token: string, chainId: number): Address {\n if (isAddress(token)) {\n return token;\n }\n // Case-insensitive lookup: find canonical symbol from registry, then resolve\n const match = getSupportedTokens(chainId).find(\n (t) => t.symbol.toUpperCase() === token.toUpperCase()\n );\n if (!match) {\n return getTokenAddress(token as never, chainId);\n }\n return match.address;\n}\n\nexport function isTestnet(chainId: number): boolean {\n try {\n return getChainById(chainId).testnet ?? false;\n } catch {\n return false;\n }\n}\n\nexport function getTokenSymbol(tokenAddress: Address, chainId: number): string {\n const token = getSupportedTokens(chainId).find(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n if (!token) {\n throw new Error(`Unsupported token: ${tokenAddress} on chain ${chainId}`);\n }\n return token.symbol;\n}\n\nexport function isTokenAddressSupported(tokenAddress: Address, chainId: number): boolean {\n try {\n return getSupportedTokens(chainId).some(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n } catch {\n return false;\n }\n}\n\nexport { getTokenAddress, getTokenDecimals };\n","import { encodeAbiParameters, keccak256 } from 'viem';\nimport type { Hex } from 'viem';\nimport type { WebAuthnSignature } from '../types';\nimport type { TransactionCall } from './types';\n\n/**\n * P-256 curve order (n)\n * Used for signature malleability normalization\n */\nconst P256_N = BigInt(\n '0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551'\n);\nconst P256_N_DIV_2 = P256_N / 2n;\n\n/**\n * WebAuthnAuth struct type for ABI encoding\n */\nconst WEBAUTHN_AUTH_TYPE = {\n type: 'tuple',\n components: [\n { type: 'bytes', name: 'authenticatorData' },\n { type: 'string', name: 'clientDataJSON' },\n { type: 'uint256', name: 'challengeIndex' },\n { type: 'uint256', name: 'typeIndex' },\n { type: 'uint256', name: 'r' },\n { type: 'uint256', name: 's' },\n ],\n} as const;\n\n/**\n * Encode a WebAuthn signature for ERC-1271 verification on-chain\n *\n * @param sig - The WebAuthn signature from the passkey\n * @returns ABI-encoded signature bytes\n */\nexport function encodeWebAuthnSignature(sig: WebAuthnSignature): Hex {\n // Normalize s to prevent signature malleability\n let s = BigInt(sig.s);\n if (s > P256_N_DIV_2) {\n s = P256_N - s;\n }\n\n return encodeAbiParameters([WEBAUTHN_AUTH_TYPE], [\n {\n authenticatorData: sig.authenticatorData as Hex,\n clientDataJSON: sig.clientDataJSON,\n challengeIndex: BigInt(sig.challengeIndex),\n typeIndex: BigInt(sig.typeIndex),\n r: BigInt(sig.r),\n s,\n },\n ]);\n}\n\n/**\n * Hash an array of transaction calls for signing\n *\n * @param calls - Array of transaction calls\n * @returns keccak256 hash of the encoded calls\n */\nexport function hashCalls(calls: TransactionCall[]): Hex {\n const encoded = encodeAbiParameters(\n [\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'to' },\n { type: 'bytes', name: 'data' },\n { type: 'uint256', name: 'value' },\n ],\n },\n ],\n [\n calls.map((c) => ({\n to: c.to,\n data: c.data || '0x',\n value: c.value || 0n,\n })),\n ]\n );\n return keccak256(encoded);\n}\n\n/**\n * Build transaction review display data from calls\n *\n * @param calls - Array of transaction calls\n * @returns TransactionDetails for the signing modal\n */\nexport function buildTransactionReview(calls: TransactionCall[]) {\n return {\n actions: calls.map((call, i) => ({\n type: 'custom' as const,\n label: call.label || `Contract Call ${i + 1}`,\n sublabel: call.sublabel || `To: ${call.to.slice(0, 10)}...${call.to.slice(-8)}`,\n amount: call.value ? `${call.value} wei` : undefined,\n })),\n };\n}\n"],"mappings":"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","names":["import_viem","import_viem","getAllSupportedChainsAndTokensRaw","import_viem","data","chainId","options","provider","chain"]}
package/dist/wagmi.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createPasskeyProvider
3
- } from "./chunk-U7KZ4XMQ.mjs";
3
+ } from "./chunk-X73ALCGW.mjs";
4
4
 
5
5
  // src/wagmi.ts
6
6
  import { createConnector } from "@wagmi/core";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rhinestone/1auth",
3
- "version": "0.1.1",
4
- "private": false,
3
+ "version": "0.4.0",
4
+ "description": "Passkey-based authentication SDK for Web3 applications",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
@@ -28,8 +28,21 @@
28
28
  }
29
29
  },
30
30
  "files": [
31
- "dist"
31
+ "dist",
32
+ "README.md"
32
33
  ],
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/rhinestonewtf/1auth.git",
37
+ "directory": "packages/sdk"
38
+ },
39
+ "homepage": "https://github.com/rhinestonewtf/1auth/tree/main/packages/sdk#readme",
40
+ "bugs": {
41
+ "url": "https://github.com/rhinestonewtf/1auth/issues"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
33
46
  "scripts": {
34
47
  "build": "tsup",
35
48
  "dev": "tsup --watch",
@@ -37,7 +50,7 @@
37
50
  "type-check": "tsc --noEmit"
38
51
  },
39
52
  "dependencies": {
40
- "@rhinestone/sdk": "^1.2.3"
53
+ "@rhinestone/sdk": "^1.2.13"
41
54
  },
42
55
  "peerDependencies": {
43
56
  "@wagmi/core": "^2.0.0",
@@ -50,8 +63,9 @@
50
63
  }
51
64
  },
52
65
  "devDependencies": {
53
- "@wagmi/core": "^2.0.0",
66
+ "@types/node": "^25.1.0",
54
67
  "@types/react": "^18.0.0",
68
+ "@wagmi/core": "^2.0.0",
55
69
  "react": "^18.0.0",
56
70
  "tsup": "^8.0.0",
57
71
  "typescript": "^5.0.0",