@rhinestone/1auth 0.6.9 → 0.7.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/chunk-GUAI55LL.mjs +179 -0
- package/dist/chunk-GUAI55LL.mjs.map +1 -0
- package/dist/{chunk-VZYHCFEH.mjs → chunk-THKG3FAG.mjs} +4 -177
- package/dist/chunk-THKG3FAG.mjs.map +1 -0
- package/dist/{client-BNluVe4_.d.ts → client-B_CzDa_I.d.ts} +57 -10
- package/dist/{client-CLCdahyj.d.mts → client-F4DnFM8d.d.mts} +57 -10
- package/dist/headless.d.mts +24 -5
- package/dist/headless.d.ts +24 -5
- package/dist/headless.js +142 -2
- package/dist/headless.js.map +1 -1
- package/dist/headless.mjs +103 -1
- package/dist/headless.mjs.map +1 -1
- package/dist/index.d.mts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +314 -124
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +318 -126
- package/dist/index.mjs.map +1 -1
- package/dist/{provider-BgD9PeDX.d.ts → provider-Cd7Ip5L-.d.ts} +2 -2
- package/dist/{provider-hxHGb6SX.d.mts → provider-IvYXPMpk.d.mts} +2 -2
- package/dist/react.d.mts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/server.d.mts +2 -2
- package/dist/server.d.ts +2 -2
- package/dist/{types-1BMD1PSH.d.mts → types-U_dwxbtS.d.mts} +63 -0
- package/dist/{types-1BMD1PSH.d.ts → types-U_dwxbtS.d.ts} +63 -0
- package/dist/{verify-CZe-m_Vf.d.ts → verify-BLgZzwmJ.d.ts} +1 -1
- package/dist/{verify-D3FaLeAi.d.mts → verify-C8-a5c3K.d.mts} +1 -1
- package/dist/wagmi.d.mts +3 -3
- package/dist/wagmi.d.ts +3 -3
- package/dist/wagmi.mjs +2 -1
- package/dist/wagmi.mjs.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-VZYHCFEH.mjs.map +0 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// src/registry.ts
|
|
2
|
+
import { isAddress } from "viem";
|
|
3
|
+
import * as viemChains from "viem/chains";
|
|
4
|
+
import { chainRegistry } from "@rhinestone/shared-configs";
|
|
5
|
+
var env = typeof process !== "undefined" ? process.env : {};
|
|
6
|
+
var VIEM_CHAIN_BY_ID = /* @__PURE__ */ new Map();
|
|
7
|
+
for (const value of Object.values(viemChains)) {
|
|
8
|
+
if (typeof value !== "object" || value === null || !("id" in value) || !("name" in value)) continue;
|
|
9
|
+
const chain = value;
|
|
10
|
+
const existing = VIEM_CHAIN_BY_ID.get(chain.id);
|
|
11
|
+
if (!existing || existing.testnet && !chain.testnet) {
|
|
12
|
+
VIEM_CHAIN_BY_ID.set(chain.id, chain);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function isEvmRegistryEntry(entry) {
|
|
16
|
+
return entry?.vmType === "evm";
|
|
17
|
+
}
|
|
18
|
+
function getEvmRegistryEntry(chainId) {
|
|
19
|
+
const entry = chainRegistry[String(chainId)];
|
|
20
|
+
return isEvmRegistryEntry(entry) ? entry : void 0;
|
|
21
|
+
}
|
|
22
|
+
var REGISTRY_CHAIN_IDS = Object.entries(chainRegistry).filter(([, entry]) => isEvmRegistryEntry(entry)).map(([id]) => Number(id));
|
|
23
|
+
var SUPPORTED_CHAIN_IDS = new Set(REGISTRY_CHAIN_IDS);
|
|
24
|
+
function tokensForChain(chainId) {
|
|
25
|
+
const entry = getEvmRegistryEntry(chainId);
|
|
26
|
+
if (!entry) return [];
|
|
27
|
+
return entry.tokens.map((token) => ({
|
|
28
|
+
symbol: token.symbol,
|
|
29
|
+
address: token.address,
|
|
30
|
+
decimals: token.decimals
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
function isAddressInput(value) {
|
|
34
|
+
return isAddress(value, { strict: false });
|
|
35
|
+
}
|
|
36
|
+
function parseBool(value) {
|
|
37
|
+
if (value === "true" || value === "1") return true;
|
|
38
|
+
if (value === "false" || value === "0") return false;
|
|
39
|
+
return void 0;
|
|
40
|
+
}
|
|
41
|
+
function resolveIncludeTestnets(explicit) {
|
|
42
|
+
if (explicit !== void 0) return explicit;
|
|
43
|
+
const envValue = parseBool(env.NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS) ?? parseBool(env.ORCHESTRATOR_USE_TESTNETS);
|
|
44
|
+
return envValue ?? false;
|
|
45
|
+
}
|
|
46
|
+
function applyChainFilters(chainIds, options) {
|
|
47
|
+
const includeTestnets = resolveIncludeTestnets(options?.includeTestnets);
|
|
48
|
+
const allowlist = options?.chainIds;
|
|
49
|
+
let filtered = chainIds;
|
|
50
|
+
if (!includeTestnets) {
|
|
51
|
+
filtered = filtered.filter((chainId) => !isTestnet(chainId));
|
|
52
|
+
}
|
|
53
|
+
if (allowlist) {
|
|
54
|
+
const allowed = new Set(allowlist);
|
|
55
|
+
filtered = filtered.filter((chainId) => allowed.has(chainId));
|
|
56
|
+
}
|
|
57
|
+
return filtered;
|
|
58
|
+
}
|
|
59
|
+
function getSupportedChainIds(options) {
|
|
60
|
+
return applyChainFilters(REGISTRY_CHAIN_IDS, options);
|
|
61
|
+
}
|
|
62
|
+
function getSupportedChains(options) {
|
|
63
|
+
return getSupportedChainIds(options).map((chainId) => VIEM_CHAIN_BY_ID.get(chainId)).filter((chain) => Boolean(chain));
|
|
64
|
+
}
|
|
65
|
+
function getAllSupportedChainsAndTokens(options) {
|
|
66
|
+
return getSupportedChainIds(options).map((chainId) => ({
|
|
67
|
+
chainId,
|
|
68
|
+
tokens: tokensForChain(chainId)
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
function getChainById(chainId) {
|
|
72
|
+
if (!SUPPORTED_CHAIN_IDS.has(chainId)) {
|
|
73
|
+
throw new Error(`Unsupported chain ID: ${chainId}`);
|
|
74
|
+
}
|
|
75
|
+
const chain = VIEM_CHAIN_BY_ID.get(chainId);
|
|
76
|
+
if (!chain) {
|
|
77
|
+
throw new Error(`Unsupported chain ID: ${chainId}`);
|
|
78
|
+
}
|
|
79
|
+
return chain;
|
|
80
|
+
}
|
|
81
|
+
function getChainName(chainId) {
|
|
82
|
+
try {
|
|
83
|
+
return getChainById(chainId).name;
|
|
84
|
+
} catch {
|
|
85
|
+
return `Chain ${chainId}`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function getChainExplorerUrl(chainId) {
|
|
89
|
+
try {
|
|
90
|
+
return getChainById(chainId).blockExplorers?.default?.url;
|
|
91
|
+
} catch {
|
|
92
|
+
return void 0;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function getChainRpcUrl(chainId) {
|
|
96
|
+
try {
|
|
97
|
+
const chain = getChainById(chainId);
|
|
98
|
+
return chain.rpcUrls?.default?.http?.[0] || chain.rpcUrls?.public?.http?.[0];
|
|
99
|
+
} catch {
|
|
100
|
+
return void 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function getSupportedTokens(chainId) {
|
|
104
|
+
return tokensForChain(chainId);
|
|
105
|
+
}
|
|
106
|
+
function getSupportedTokenSymbols(chainId) {
|
|
107
|
+
return getSupportedTokens(chainId).map((token) => token.symbol);
|
|
108
|
+
}
|
|
109
|
+
function getTokenAddress(symbolOrAddress, chainId) {
|
|
110
|
+
if (isAddressInput(symbolOrAddress)) {
|
|
111
|
+
return symbolOrAddress;
|
|
112
|
+
}
|
|
113
|
+
const match = getSupportedTokens(chainId).find(
|
|
114
|
+
(t) => t.symbol.toUpperCase() === symbolOrAddress.toUpperCase()
|
|
115
|
+
);
|
|
116
|
+
if (!match) {
|
|
117
|
+
throw new Error(`Unsupported token "${symbolOrAddress}" on chain ${chainId}`);
|
|
118
|
+
}
|
|
119
|
+
return match.address;
|
|
120
|
+
}
|
|
121
|
+
function getTokenDecimals(symbolOrAddress, chainId) {
|
|
122
|
+
const match = getSupportedTokens(chainId).find(
|
|
123
|
+
(t) => isAddressInput(symbolOrAddress) ? t.address.toLowerCase() === symbolOrAddress.toLowerCase() : t.symbol.toUpperCase() === symbolOrAddress.toUpperCase()
|
|
124
|
+
);
|
|
125
|
+
if (!match && isAddressInput(symbolOrAddress) && SUPPORTED_CHAIN_IDS.has(chainId)) {
|
|
126
|
+
return 18;
|
|
127
|
+
}
|
|
128
|
+
if (!match) {
|
|
129
|
+
throw new Error(`Unsupported token "${symbolOrAddress}" on chain ${chainId}`);
|
|
130
|
+
}
|
|
131
|
+
return match.decimals;
|
|
132
|
+
}
|
|
133
|
+
function resolveTokenAddress(token, chainId) {
|
|
134
|
+
if (isAddressInput(token)) {
|
|
135
|
+
return token;
|
|
136
|
+
}
|
|
137
|
+
return getTokenAddress(token, chainId);
|
|
138
|
+
}
|
|
139
|
+
function isTestnet(chainId) {
|
|
140
|
+
try {
|
|
141
|
+
return getChainById(chainId).testnet ?? false;
|
|
142
|
+
} catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function getTokenSymbol(tokenAddress, chainId) {
|
|
147
|
+
const token = getSupportedTokens(chainId).find(
|
|
148
|
+
(entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()
|
|
149
|
+
);
|
|
150
|
+
if (token) {
|
|
151
|
+
return token.symbol;
|
|
152
|
+
}
|
|
153
|
+
if (!SUPPORTED_CHAIN_IDS.has(chainId)) {
|
|
154
|
+
throw new Error(`Unsupported chain ID: ${chainId}`);
|
|
155
|
+
}
|
|
156
|
+
return "Token";
|
|
157
|
+
}
|
|
158
|
+
function isTokenAddressSupported(tokenAddress, chainId) {
|
|
159
|
+
return isAddressInput(tokenAddress) && SUPPORTED_CHAIN_IDS.has(chainId);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export {
|
|
163
|
+
getSupportedChainIds,
|
|
164
|
+
getSupportedChains,
|
|
165
|
+
getAllSupportedChainsAndTokens,
|
|
166
|
+
getChainById,
|
|
167
|
+
getChainName,
|
|
168
|
+
getChainExplorerUrl,
|
|
169
|
+
getChainRpcUrl,
|
|
170
|
+
getSupportedTokens,
|
|
171
|
+
getSupportedTokenSymbols,
|
|
172
|
+
getTokenAddress,
|
|
173
|
+
getTokenDecimals,
|
|
174
|
+
resolveTokenAddress,
|
|
175
|
+
isTestnet,
|
|
176
|
+
getTokenSymbol,
|
|
177
|
+
isTokenAddressSupported
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=chunk-GUAI55LL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry.ts"],"sourcesContent":["/**\n * @file Chain and token registry for the 1auth SDK.\n *\n * Wraps `@rhinestone/shared-configs` chain/token data and combines it with\n * viem's chain definitions to expose a filtered, testnet-aware registry.\n * Consumers can look up supported chains and tokens, resolve token addresses\n * by symbol, and retrieve chain metadata such as explorer URLs and default RPC\n * endpoints.\n *\n * Testnet inclusion is controlled by the `includeTestnets` option on each\n * function or, as a project-wide default, by the environment variables\n * `NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS` or `ORCHESTRATOR_USE_TESTNETS`.\n */\n\nimport type { Address, Chain } from \"viem\";\nimport { isAddress } from \"viem\";\nimport * as viemChains from \"viem/chains\";\nimport { chainRegistry } from \"@rhinestone/shared-configs\";\n\nexport type TokenConfig = {\n symbol: string;\n address: Address;\n decimals: number;\n};\n\nexport type ChainFilterOptions = {\n includeTestnets?: boolean;\n chainIds?: number[];\n};\n\ntype ChainRegistryEntry = (typeof chainRegistry)[keyof typeof chainRegistry];\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 preferring\n// mainnet definitions over testnets. viem exports duplicate numeric IDs (e.g.\n// zoraTestnet and hyperEvm both use 999); a naive Map would silently keep\n// whichever entry happens to appear last in iteration order, which may be the\n// testnet. The loop below only overwrites an existing entry when the incoming\n// chain is NOT a testnet and the existing one IS, ensuring the production chain\n// always wins while still falling back to a testnet entry when no mainnet\n// definition exists for a given ID.\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}\n\nfunction isEvmRegistryEntry(\n entry: ChainRegistryEntry | undefined,\n): entry is ChainRegistryEntry & { vmType: \"evm\" } {\n return entry?.vmType === \"evm\";\n}\n\nfunction getEvmRegistryEntry(\n chainId: number,\n): (ChainRegistryEntry & { vmType: \"evm\" }) | undefined {\n const entry = chainRegistry[String(chainId) as keyof typeof chainRegistry];\n return isEvmRegistryEntry(entry) ? entry : undefined;\n}\n\n// The shared-configs registry includes non-EVM chains (Solana, Tron). Filter\n// to EVM entries before exposing supported chains — downstream consumers\n// (viem clients, wallet_getCapabilities, RPC proxy) only handle eip155 chains.\nconst REGISTRY_CHAIN_IDS = Object.entries(chainRegistry)\n .filter(([, entry]) => isEvmRegistryEntry(entry))\n .map(([id]) => Number(id));\nconst SUPPORTED_CHAIN_IDS = new Set(REGISTRY_CHAIN_IDS);\n\nfunction tokensForChain(chainId: number): TokenConfig[] {\n const entry = getEvmRegistryEntry(chainId);\n if (!entry) return [];\n return entry.tokens.map((token) => ({\n symbol: token.symbol,\n address: token.address as Address,\n decimals: token.decimals,\n }));\n}\n\n/** Treat any 20-byte hex string as an address; checksum casing is optional for user inputs. */\nfunction isAddressInput(value: string): value is Address {\n return isAddress(value, { strict: false });\n}\n\n/**\n * Parse a string environment variable into a boolean, returning `undefined`\n * when the value is absent or not a recognised truthy/falsy literal.\n *\n * Accepted truthy values: `\"true\"`, `\"1\"`.\n * Accepted falsy values: `\"false\"`, `\"0\"`.\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\n/**\n * Determine whether testnet chains should be included in registry results.\n *\n * Precedence (highest to lowest):\n * 1. `explicit` argument — a caller-supplied boolean always wins.\n * 2. `NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS` env var — checked first so\n * Next.js browser bundles (which only expose `NEXT_PUBLIC_*` variables)\n * can configure testnet mode without a server-side env var.\n * 3. `ORCHESTRATOR_USE_TESTNETS` env var — server-side / Node.js fallback.\n * 4. Defaults to `false` (testnets excluded) when none of the above is set.\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) {\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(REGISTRY_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 return getSupportedChainIds(options).map((chainId) => ({\n chainId,\n tokens: tokensForChain(chainId),\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 tokensForChain(chainId);\n}\n\nexport function getSupportedTokenSymbols(chainId: number): string[] {\n return getSupportedTokens(chainId).map((token) => token.symbol);\n}\n\nexport function getTokenAddress(symbolOrAddress: string, chainId: number): Address {\n if (isAddressInput(symbolOrAddress)) {\n return symbolOrAddress;\n }\n const match = getSupportedTokens(chainId).find(\n (t) => t.symbol.toUpperCase() === symbolOrAddress.toUpperCase()\n );\n if (!match) {\n throw new Error(`Unsupported token \"${symbolOrAddress}\" on chain ${chainId}`);\n }\n return match.address;\n}\n\nexport function getTokenDecimals(symbolOrAddress: string, chainId: number): number {\n const match = getSupportedTokens(chainId).find(\n (t) =>\n isAddressInput(symbolOrAddress)\n ? t.address.toLowerCase() === symbolOrAddress.toLowerCase()\n : t.symbol.toUpperCase() === symbolOrAddress.toUpperCase()\n );\n if (!match && isAddressInput(symbolOrAddress) && SUPPORTED_CHAIN_IDS.has(chainId)) {\n return 18;\n }\n if (!match) {\n throw new Error(`Unsupported token \"${symbolOrAddress}\" on chain ${chainId}`);\n }\n return match.decimals;\n}\n\nexport function resolveTokenAddress(token: string, chainId: number): Address {\n if (isAddressInput(token)) {\n return token;\n }\n return getTokenAddress(token, 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 return token.symbol;\n }\n if (!SUPPORTED_CHAIN_IDS.has(chainId)) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n return \"Token\";\n}\n\nexport function isTokenAddressSupported(tokenAddress: Address, chainId: number): boolean {\n return isAddressInput(tokenAddress) && SUPPORTED_CHAIN_IDS.has(chainId);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,168 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getSupportedChainIds
|
|
3
|
+
} from "./chunk-GUAI55LL.mjs";
|
|
1
4
|
import {
|
|
2
5
|
encodeWebAuthnSignature
|
|
3
6
|
} from "./chunk-N6KE5CII.mjs";
|
|
4
7
|
|
|
5
|
-
// src/registry.ts
|
|
6
|
-
import { isAddress } from "viem";
|
|
7
|
-
import * as viemChains from "viem/chains";
|
|
8
|
-
import { chainRegistry } from "@rhinestone/shared-configs";
|
|
9
|
-
var env = typeof process !== "undefined" ? process.env : {};
|
|
10
|
-
var VIEM_CHAIN_BY_ID = /* @__PURE__ */ new Map();
|
|
11
|
-
for (const value of Object.values(viemChains)) {
|
|
12
|
-
if (typeof value !== "object" || value === null || !("id" in value) || !("name" in value)) continue;
|
|
13
|
-
const chain = value;
|
|
14
|
-
const existing = VIEM_CHAIN_BY_ID.get(chain.id);
|
|
15
|
-
if (!existing || existing.testnet && !chain.testnet) {
|
|
16
|
-
VIEM_CHAIN_BY_ID.set(chain.id, chain);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
function isEvmRegistryEntry(entry) {
|
|
20
|
-
return entry?.vmType === "evm";
|
|
21
|
-
}
|
|
22
|
-
function getEvmRegistryEntry(chainId) {
|
|
23
|
-
const entry = chainRegistry[String(chainId)];
|
|
24
|
-
return isEvmRegistryEntry(entry) ? entry : void 0;
|
|
25
|
-
}
|
|
26
|
-
var REGISTRY_CHAIN_IDS = Object.entries(chainRegistry).filter(([, entry]) => isEvmRegistryEntry(entry)).map(([id]) => Number(id));
|
|
27
|
-
var SUPPORTED_CHAIN_IDS = new Set(REGISTRY_CHAIN_IDS);
|
|
28
|
-
function tokensForChain(chainId) {
|
|
29
|
-
const entry = getEvmRegistryEntry(chainId);
|
|
30
|
-
if (!entry) return [];
|
|
31
|
-
return entry.tokens.map((token) => ({
|
|
32
|
-
symbol: token.symbol,
|
|
33
|
-
address: token.address,
|
|
34
|
-
decimals: token.decimals
|
|
35
|
-
}));
|
|
36
|
-
}
|
|
37
|
-
function isAddressInput(value) {
|
|
38
|
-
return isAddress(value, { strict: false });
|
|
39
|
-
}
|
|
40
|
-
function parseBool(value) {
|
|
41
|
-
if (value === "true" || value === "1") return true;
|
|
42
|
-
if (value === "false" || value === "0") return false;
|
|
43
|
-
return void 0;
|
|
44
|
-
}
|
|
45
|
-
function resolveIncludeTestnets(explicit) {
|
|
46
|
-
if (explicit !== void 0) return explicit;
|
|
47
|
-
const envValue = parseBool(env.NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS) ?? parseBool(env.ORCHESTRATOR_USE_TESTNETS);
|
|
48
|
-
return envValue ?? false;
|
|
49
|
-
}
|
|
50
|
-
function applyChainFilters(chainIds, options) {
|
|
51
|
-
const includeTestnets = resolveIncludeTestnets(options?.includeTestnets);
|
|
52
|
-
const allowlist = options?.chainIds;
|
|
53
|
-
let filtered = chainIds;
|
|
54
|
-
if (!includeTestnets) {
|
|
55
|
-
filtered = filtered.filter((chainId) => !isTestnet(chainId));
|
|
56
|
-
}
|
|
57
|
-
if (allowlist) {
|
|
58
|
-
const allowed = new Set(allowlist);
|
|
59
|
-
filtered = filtered.filter((chainId) => allowed.has(chainId));
|
|
60
|
-
}
|
|
61
|
-
return filtered;
|
|
62
|
-
}
|
|
63
|
-
function getSupportedChainIds(options) {
|
|
64
|
-
return applyChainFilters(REGISTRY_CHAIN_IDS, options);
|
|
65
|
-
}
|
|
66
|
-
function getSupportedChains(options) {
|
|
67
|
-
return getSupportedChainIds(options).map((chainId) => VIEM_CHAIN_BY_ID.get(chainId)).filter((chain) => Boolean(chain));
|
|
68
|
-
}
|
|
69
|
-
function getAllSupportedChainsAndTokens(options) {
|
|
70
|
-
return getSupportedChainIds(options).map((chainId) => ({
|
|
71
|
-
chainId,
|
|
72
|
-
tokens: tokensForChain(chainId)
|
|
73
|
-
}));
|
|
74
|
-
}
|
|
75
|
-
function getChainById(chainId) {
|
|
76
|
-
if (!SUPPORTED_CHAIN_IDS.has(chainId)) {
|
|
77
|
-
throw new Error(`Unsupported chain ID: ${chainId}`);
|
|
78
|
-
}
|
|
79
|
-
const chain = VIEM_CHAIN_BY_ID.get(chainId);
|
|
80
|
-
if (!chain) {
|
|
81
|
-
throw new Error(`Unsupported chain ID: ${chainId}`);
|
|
82
|
-
}
|
|
83
|
-
return chain;
|
|
84
|
-
}
|
|
85
|
-
function getChainName(chainId) {
|
|
86
|
-
try {
|
|
87
|
-
return getChainById(chainId).name;
|
|
88
|
-
} catch {
|
|
89
|
-
return `Chain ${chainId}`;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function getChainExplorerUrl(chainId) {
|
|
93
|
-
try {
|
|
94
|
-
return getChainById(chainId).blockExplorers?.default?.url;
|
|
95
|
-
} catch {
|
|
96
|
-
return void 0;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
function getChainRpcUrl(chainId) {
|
|
100
|
-
try {
|
|
101
|
-
const chain = getChainById(chainId);
|
|
102
|
-
return chain.rpcUrls?.default?.http?.[0] || chain.rpcUrls?.public?.http?.[0];
|
|
103
|
-
} catch {
|
|
104
|
-
return void 0;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function getSupportedTokens(chainId) {
|
|
108
|
-
return tokensForChain(chainId);
|
|
109
|
-
}
|
|
110
|
-
function getSupportedTokenSymbols(chainId) {
|
|
111
|
-
return getSupportedTokens(chainId).map((token) => token.symbol);
|
|
112
|
-
}
|
|
113
|
-
function getTokenAddress(symbolOrAddress, chainId) {
|
|
114
|
-
if (isAddressInput(symbolOrAddress)) {
|
|
115
|
-
return symbolOrAddress;
|
|
116
|
-
}
|
|
117
|
-
const match = getSupportedTokens(chainId).find(
|
|
118
|
-
(t) => t.symbol.toUpperCase() === symbolOrAddress.toUpperCase()
|
|
119
|
-
);
|
|
120
|
-
if (!match) {
|
|
121
|
-
throw new Error(`Unsupported token "${symbolOrAddress}" on chain ${chainId}`);
|
|
122
|
-
}
|
|
123
|
-
return match.address;
|
|
124
|
-
}
|
|
125
|
-
function getTokenDecimals(symbolOrAddress, chainId) {
|
|
126
|
-
const match = getSupportedTokens(chainId).find(
|
|
127
|
-
(t) => isAddressInput(symbolOrAddress) ? t.address.toLowerCase() === symbolOrAddress.toLowerCase() : t.symbol.toUpperCase() === symbolOrAddress.toUpperCase()
|
|
128
|
-
);
|
|
129
|
-
if (!match && isAddressInput(symbolOrAddress) && SUPPORTED_CHAIN_IDS.has(chainId)) {
|
|
130
|
-
return 18;
|
|
131
|
-
}
|
|
132
|
-
if (!match) {
|
|
133
|
-
throw new Error(`Unsupported token "${symbolOrAddress}" on chain ${chainId}`);
|
|
134
|
-
}
|
|
135
|
-
return match.decimals;
|
|
136
|
-
}
|
|
137
|
-
function resolveTokenAddress(token, chainId) {
|
|
138
|
-
if (isAddressInput(token)) {
|
|
139
|
-
return token;
|
|
140
|
-
}
|
|
141
|
-
return getTokenAddress(token, chainId);
|
|
142
|
-
}
|
|
143
|
-
function isTestnet(chainId) {
|
|
144
|
-
try {
|
|
145
|
-
return getChainById(chainId).testnet ?? false;
|
|
146
|
-
} catch {
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
function getTokenSymbol(tokenAddress, chainId) {
|
|
151
|
-
const token = getSupportedTokens(chainId).find(
|
|
152
|
-
(entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()
|
|
153
|
-
);
|
|
154
|
-
if (token) {
|
|
155
|
-
return token.symbol;
|
|
156
|
-
}
|
|
157
|
-
if (!SUPPORTED_CHAIN_IDS.has(chainId)) {
|
|
158
|
-
throw new Error(`Unsupported chain ID: ${chainId}`);
|
|
159
|
-
}
|
|
160
|
-
return "Token";
|
|
161
|
-
}
|
|
162
|
-
function isTokenAddressSupported(tokenAddress, chainId) {
|
|
163
|
-
return isAddressInput(tokenAddress) && SUPPORTED_CHAIN_IDS.has(chainId);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
8
|
// src/provider.ts
|
|
167
9
|
import {
|
|
168
10
|
hexToString,
|
|
@@ -682,21 +524,6 @@ function createOneAuthProvider(options) {
|
|
|
682
524
|
}
|
|
683
525
|
|
|
684
526
|
export {
|
|
685
|
-
getSupportedChainIds,
|
|
686
|
-
getSupportedChains,
|
|
687
|
-
getAllSupportedChainsAndTokens,
|
|
688
|
-
getChainById,
|
|
689
|
-
getChainName,
|
|
690
|
-
getChainExplorerUrl,
|
|
691
|
-
getChainRpcUrl,
|
|
692
|
-
getSupportedTokens,
|
|
693
|
-
getSupportedTokenSymbols,
|
|
694
|
-
getTokenAddress,
|
|
695
|
-
getTokenDecimals,
|
|
696
|
-
resolveTokenAddress,
|
|
697
|
-
isTestnet,
|
|
698
|
-
getTokenSymbol,
|
|
699
|
-
isTokenAddressSupported,
|
|
700
527
|
createOneAuthProvider
|
|
701
528
|
};
|
|
702
|
-
//# sourceMappingURL=chunk-
|
|
529
|
+
//# sourceMappingURL=chunk-THKG3FAG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider.ts"],"sourcesContent":["/**\n * EIP-1193 JSON-RPC provider factory for the 1auth passkey authentication system.\n *\n * Creates a browser-side provider object that implements the EIP-1193 standard so any\n * Ethereum library (ethers, viem, wagmi) can use 1auth passkey signing and cross-chain\n * intent execution without modification. All transaction signing is delegated to the\n * passkey service rather than holding private keys in the browser.\n *\n * Supported RPC methods:\n * - eth_chainId, eth_accounts, eth_requestAccounts\n * - personal_sign, eth_sign, eth_signTypedData, eth_signTypedData_v4\n * - eth_sendTransaction\n * - wallet_connect, wallet_disconnect, wallet_switchEthereumChain\n * - wallet_sendCalls, wallet_getCallsStatus, wallet_getCallsHistory (EIP-5792)\n * - wallet_getCapabilities, wallet_getAssets\n *\n * @module\n */\n\nimport {\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, IntentTokenRequest, SignerType } 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 /** Absent = legacy passkey user; populated on new sessions. */\n signerType?: SignerType;\n /** Wagmi connector id for EOA sessions. Iframe-side lookup uses this. */\n connectorId?: string;\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\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};\n\nconst DEFAULT_STORAGE_KEY = \"1auth-user\";\n\n/**\n * Creates an EIP-1193 compatible JSON-RPC provider backed by 1auth passkey authentication.\n *\n * The returned provider object can be used anywhere a standard Ethereum provider is\n * accepted (e.g. passed to `createWalletClient` in viem, used as `window.ethereum`, or\n * supplied to ethers.js `BrowserProvider`). Connection state (address + username) is\n * persisted in `localStorage` under the configured `storageKey`.\n *\n * @param options - Provider configuration\n * @param options.client - Configured `OneAuthClient` instance used to open auth/sign dialogs\n * @param options.chainId - Default chain ID the provider reports via `eth_chainId`\n * @param options.storageKey - localStorage key for persisting the connected user.\n * Defaults to `\"1auth-user\"`. Override to support multiple concurrent connections.\n * @param options.closeOn - Controls when the signing dialog closes and shows the \"Done\" button.\n * `\"preconfirmed\"` (default) closes as soon as the intent is confirmed by the orchestrator.\n * The `waitForHash` option independently controls whether the SDK continues polling for\n * a transaction hash after the dialog closes.\n * @param options.waitForHash - When true, polls the intent status until a transaction hash\n * is available before resolving `eth_sendTransaction` / `wallet_sendCalls`. Defaults to true.\n * @param options.hashTimeoutMs - Maximum milliseconds to wait for a transaction hash.\n * Passed directly to the passkey service intent submission.\n * @param options.hashIntervalMs - Polling interval in milliseconds when waiting for a hash.\n * Passed directly to the passkey service intent submission.\n * @returns An EIP-1193 provider with `request`, `on`, `removeListener`, and `disconnect`.\n *\n * @example\n * ```typescript\n * import { OneAuthClient } from \"@rhinestone/1auth\";\n * import { createOneAuthProvider } from \"@rhinestone/1auth\";\n *\n * const client = new OneAuthClient({ clientId: \"my-app\" });\n * const provider = createOneAuthProvider({ client, chainId: 8453 }); // Base\n *\n * // Use with viem\n * import { createWalletClient, custom } from \"viem\";\n * import { base } from \"viem/chains\";\n * const walletClient = createWalletClient({ chain: base, transport: custom(provider) });\n *\n * // Standard EIP-1193 usage\n * const accounts = await provider.request({ method: \"eth_requestAccounts\" });\n * provider.on(\"accountsChanged\", (accounts) => console.log(accounts));\n * ```\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 /**\n * Dispatches an event to all registered listeners for the given event name.\n *\n * @param event - EIP-1193 event name (e.g. \"accountsChanged\", \"chainChanged\")\n * @param args - Arguments forwarded to each listener callback\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 /**\n * Reads the connected user from localStorage.\n *\n * Returns null in non-browser environments (SSR) and when no user has been\n * persisted yet, or when the stored value is malformed.\n *\n * @returns The stored user object, or null if unavailable\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 /**\n * Persists the connected user to localStorage.\n *\n * No-ops in non-browser (SSR) environments.\n *\n * @param user - User object with at minimum an `address` field\n */\n const setStoredUser = (user: StoredUser) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(storageKey, JSON.stringify(user));\n };\n\n /**\n * Removes the connected user from localStorage, effectively logging them out\n * from the provider's perspective.\n *\n * No-ops in non-browser (SSR) environments.\n */\n const clearStoredUser = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(storageKey);\n };\n\n /**\n * Fetches the smart account address for a given username from the passkey service.\n *\n * Called as a fallback when the auth/connect modal returns a username but no address\n * (e.g. during first-time sign-up where the account address is computed server-side).\n *\n * @param username - The 1auth username to look up\n * @returns The EVM address of the user's smart account\n * @throws If the HTTP request fails or the service returns an error\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 /**\n * Connects the user by returning a cached address or opening the auth flow.\n *\n * Returns the dapp-side cached address immediately when present. Otherwise\n * opens the auth modal (`/dialog/auth`) directly — the iframe-side\n * returning-user UX lives inside that flow now. On success the address is\n * stored in localStorage and `accountsChanged` / `connect` events are emitted.\n *\n * @returns Array containing the single connected account address\n * @throws If the user cancels or authentication fails\n */\n const connect = async (): Promise<Address[]> => {\n const stored = getStoredUser();\n if (stored) {\n return [stored.address];\n }\n\n const authResult = await client.authWithModal();\n if (!authResult.success) {\n throw new Error(authResult.error?.message || \"Authentication failed\");\n }\n const username = authResult.user?.username;\n let address = authResult.user?.address;\n const signerType = authResult.signerType;\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, signerType });\n emit(\"accountsChanged\", [address]);\n emit(\"connect\", { chainId: numberToHex(chainId) });\n return [address];\n };\n\n /**\n * Disconnects the current user by clearing persisted state and emitting events.\n *\n * Emits `accountsChanged` with an empty array and `disconnect` so that consumers\n * (e.g. wagmi) can update their state accordingly.\n */\n const disconnect = async () => {\n clearStoredUser();\n emit(\"accountsChanged\", []);\n emit(\"disconnect\");\n };\n\n /**\n * Returns the currently connected user, triggering the connect flow if needed.\n *\n * Used internally by methods that require an authenticated session (e.g. signing,\n * sending transactions) to guarantee a user is available before proceeding.\n *\n * @returns The stored user object with at minimum an `address` field\n * @throws If connecting fails and no address can be resolved\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 /**\n * Read an optional wallet_getAssets account address override from RPC params.\n */\n const getAssetsAccountAddress = (\n assetsParams?: unknown[] | Record<string, unknown>,\n ): string | undefined => {\n const raw = Array.isArray(assetsParams) ? assetsParams[0] : assetsParams;\n if (typeof raw === \"string\" && raw.trim()) return raw.trim();\n if (!raw || typeof raw !== \"object\") return undefined;\n\n const request = raw as Record<string, unknown>;\n const candidates = [\n request.accountAddress,\n request.address,\n ];\n for (const candidate of candidates) {\n if (typeof candidate === \"string\" && candidate.trim()) {\n return candidate.trim();\n }\n }\n return undefined;\n };\n\n /**\n * Parses a chain ID value that may arrive as a hex string, decimal string, or number.\n *\n * Handles both `\"0x1\"` (hex) and `\"1\"` / `1` (decimal) representations that are\n * commonly mixed across different wallet_switchEthereumChain implementations.\n *\n * @param value - The raw chain ID value from RPC params\n * @returns The numeric chain ID, or undefined if the value cannot be parsed\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 /**\n * Normalizes a transaction value to a decimal string expected by the intent service.\n *\n * Handles the various formats callers may provide: `bigint`, `number`, hex strings\n * (e.g. `\"0x38d7ea4c68000\"`), or plain decimal strings. Returns undefined for null\n * or unsupported types, allowing callers to fall back to `\"0\"`.\n *\n * @param value - Raw value from an RPC transaction param\n * @returns Decimal string representation, or undefined if the input is not usable\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 return BigInt(value).toString();\n }\n return value;\n }\n return undefined;\n };\n\n /**\n * Converts raw EIP-1193 call objects into the strongly-typed `IntentCall` format\n * expected by the passkey service.\n *\n * Fills in missing `data` with `\"0x\"` and missing `value` with `\"0\"` so the\n * intent service never receives undefined fields.\n *\n * @param calls - Raw call objects from `wallet_sendCalls` or `eth_sendTransaction` params\n * @returns Array of normalized `IntentCall` objects\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 icon: c.icon as string | undefined,\n abi: c.abi as readonly unknown[] | undefined,\n };\n });\n };\n\n /**\n * Converts raw token request objects into the typed `IntentTokenRequest` format.\n *\n * Token requests allow callers to specify which tokens and amounts should be sourced\n * when funding a cross-chain intent (e.g. \"bridge 10 USDC from Optimism to Base\").\n * Accepts bigint or string/numeric amounts and normalizes them to bigint.\n *\n * @param requests - Raw token request array from RPC params, or a non-array value\n * @returns Array of typed token requests, or undefined if input is not an array\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 /**\n * Decodes a message that may be hex-encoded into a human-readable string.\n *\n * Some signers (e.g. MetaMask) encode plain-text messages as hex before passing them\n * to `personal_sign`. This helper reverses that encoding so users see the original\n * text in the signing dialog rather than a raw hex string.\n *\n * @param value - A plain string or hex-encoded string (`\"0x...\"`)\n * @returns The decoded UTF-8 string, or the original value if decoding fails\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 /**\n * Forwards a raw EIP-1193 request to the iframe at `/dialog/sign-eoa`, which\n * delegates to the active wagmi connector. The wallet's own prompt is the\n * review screen — no in-dialog review step for EOA sessions.\n */\n const forwardToWallet = async (\n method: string,\n params?: unknown[] | Record<string, unknown>,\n expectedAddress?: Address,\n ): Promise<unknown> => {\n const result = await client.requestWithWallet({\n method,\n params,\n expectedAddress,\n });\n if (!result.success) {\n const err = new Error(result.error.message);\n (err as Error & { code?: string }).code = result.error.code;\n throw err;\n }\n return result.result;\n };\n\n /**\n * EIP-1193 methods forwarded verbatim to the EOA connector. All other methods\n * (eth_accounts, eth_chainId, wallet_connect, wallet_disconnect,\n * wallet_switchEthereumChain, wallet_getCapabilities/Assets) are handled\n * locally against the stored session even for EOA sessions.\n */\n const EOA_FORWARDED_METHODS = new Set([\n \"personal_sign\",\n \"eth_sign\",\n \"eth_signTypedData\",\n \"eth_signTypedData_v3\",\n \"eth_signTypedData_v4\",\n \"eth_sendTransaction\",\n \"wallet_sendCalls\",\n \"wallet_getCallsStatus\",\n ]);\n\n /**\n * Signs an arbitrary string message via the passkey service.\n *\n * Ensures a user session exists before delegating to `OneAuthClient.signMessage`.\n * The raw WebAuthn signature components are ABI-encoded for ERC-1271 on-chain\n * verification before being returned.\n *\n * @param message - Plain-text message to sign\n * @returns ABI-encoded WebAuthn signature as a hex string\n * @throws If no user session is available or the signing dialog is cancelled\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 || undefined,\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 /**\n * Signs EIP-712 typed data via the passkey service.\n *\n * Accepts either a parsed typed-data object or a JSON string (as some libraries\n * serialize the payload before passing it through the provider). The raw WebAuthn\n * signature is ABI-encoded for ERC-1271 on-chain verification.\n *\n * @param typedData - EIP-712 typed data object or its JSON string representation\n * @returns ABI-encoded WebAuthn signature as a hex string\n * @throws If no user session is available or the signing dialog is cancelled\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 || undefined,\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 /**\n * Extracts the fields required by `OneAuthClient.sendIntent` from a richer payload.\n *\n * This thin wrapper makes it explicit which fields travel to the intent service and\n * which are local concerns (e.g. `sourceChainId` is handled at the call site).\n *\n * @param payload - Full intent payload including user identity and transaction data\n * @returns Subset of fields forwarded to the intent service\n */\n const resolveIntentPayload = (payload: {\n username?: string;\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n tokenRequests?: IntentTokenRequest[];\n }) => ({\n username: payload.username,\n accountAddress: payload.accountAddress,\n targetChain: payload.targetChain,\n calls: payload.calls,\n tokenRequests: payload.tokenRequests,\n });\n\n /**\n * Submits a cross-chain intent through the passkey service and returns the intent ID.\n *\n * Opens the signing dialog, waits for user confirmation, then polls the orchestrator\n * until a transaction hash is available (controlled by `waitForHash` and the timeout\n * options). The returned intent ID is used as the `callsId` in EIP-5792 responses.\n *\n * The dialog closes based on `closeOn` (defaults to `\"preconfirmed\"`). The `waitForHash`\n * option independently polls for a transaction hash after the dialog closes.\n *\n * @param payload - Intent details including target chain, calls, token requests, and\n * an optional `sourceChainId` for cross-chain bridging\n * @returns The orchestrator intent ID string\n * @throws If the user rejects the signing dialog or the intent fails\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 const intentPayload = resolveIntentPayload(payload);\n const result = await client.sendIntent({\n ...intentPayload,\n tokenRequests: payload.tokenRequests,\n sourceChainId: payload.sourceChainId,\n closeOn: options.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 accountMismatchError = (): Error & { code?: string } => {\n const err = new Error(\n \"Requested signer does not match the active wallet connection.\",\n ) as Error & { code?: string };\n err.code = \"ACCOUNT_MISMATCH\";\n return err;\n };\n\n const sameAddress = (a: unknown, b: string): boolean =>\n typeof a === \"string\" && a.toLowerCase() === b.toLowerCase();\n\n /**\n * Some wallets (MetaMask, Rabby) reject `eth_sendTransaction` /\n * `wallet_sendCalls` / `personal_sign` / `eth_signTypedData_v4` when the\n * signer address is missing. The dapp doesn't know the EOA address, so the\n * SDK fills it in from the stored session.\n *\n * If the caller supplies a `from` (or address arg) that differs from the\n * connected EOA, we throw `ACCOUNT_MISMATCH` rather than letting the\n * caller's value win. A dapp asking the wallet to sign on behalf of a\n * different account than the user connected is a trust-boundary violation\n * — the user reviewed and approved exactly one address, not whatever the\n * dapp later substitutes.\n */\n const injectEoaSigner = (\n method: string,\n params: unknown[] | Record<string, unknown> | undefined,\n address: Address,\n ): unknown[] | Record<string, unknown> | undefined => {\n const list = Array.isArray(params) ? params.slice() : params;\n if (!Array.isArray(list)) return params;\n\n if (method === \"eth_sendTransaction\") {\n const first = (list[0] || {}) as Record<string, unknown>;\n if (first.from !== undefined && !sameAddress(first.from, address)) {\n throw accountMismatchError();\n }\n list[0] = { ...first, from: address };\n return list;\n }\n if (method === \"wallet_sendCalls\") {\n const first = (list[0] || {}) as Record<string, unknown>;\n if (first.from !== undefined && !sameAddress(first.from, address)) {\n throw accountMismatchError();\n }\n // EIP-5792 lets each call carry its own `from`. Validate every one —\n // a single mismatched call would otherwise sneak through unchecked.\n const calls = first.calls;\n if (Array.isArray(calls)) {\n for (const call of calls) {\n if (!call || typeof call !== \"object\") continue;\n const callFrom = (call as Record<string, unknown>).from;\n if (callFrom !== undefined && !sameAddress(callFrom, address)) {\n throw accountMismatchError();\n }\n }\n }\n list[0] = { ...first, from: address };\n return list;\n }\n if (method === \"personal_sign\") {\n // personal_sign(message, address) — fill address if absent.\n if (list[1] !== undefined && !sameAddress(list[1], address)) {\n throw accountMismatchError();\n }\n if (list[0] && list[1] === undefined) list[1] = address;\n return list;\n }\n if (\n method === \"eth_sign\" ||\n method === \"eth_signTypedData\" ||\n method === \"eth_signTypedData_v3\" ||\n method === \"eth_signTypedData_v4\"\n ) {\n // signTypedData(address, typedData) — fill address if absent.\n if (list[0] !== undefined && !sameAddress(list[0], address)) {\n throw accountMismatchError();\n }\n if (list[0] === undefined && list[1] !== undefined) list[0] = address;\n return list;\n }\n return list;\n };\n\n const request = async ({ method, params }: ProviderRequest) => {\n // For sign/tx methods, resolve the user first — this opens the auth modal\n // on the very first call so we know the signerType before deciding\n // between the passkey path and forwarding to the wagmi connector. Local-\n // only methods (eth_accounts, eth_chainId, wallet_switchEthereumChain,\n // etc.) fall through to the switch below and read stored state directly.\n if (EOA_FORWARDED_METHODS.has(method)) {\n const user = await ensureUser();\n if (user.signerType === \"eoa\") {\n return forwardToWallet(\n method,\n injectEoaSigner(method, params, user.address),\n user.address,\n );\n }\n }\n\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 const stored = getStoredUser();\n if (stored?.signerType === \"eoa\") {\n await forwardToWallet(method, params, stored.address);\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 // personal_sign param order varies: some callers send [message, address],\n // others send [hexEncodedMessage, address]. When the first param is hex and\n // the second is a non-hex string we treat the second as the plain message\n // (MetaMask-style). Otherwise we always decode the first param.\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 || undefined,\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 || undefined,\n accountAddress: user.address,\n targetChain,\n calls,\n tokenRequests,\n sourceChainId,\n });\n }\n case \"wallet_getCapabilities\": {\n const stored = getStoredUser();\n if (stored?.signerType === \"eoa\") {\n return {};\n }\n\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 // All supported chains advertise atomic batching, gasless transactions via\n // paymasters, and cross-chain auxiliary funds (EIP-5792 capability keys).\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 explicitAccountAddress = getAssetsAccountAddress(params);\n const user = explicitAccountAddress ? null : await ensureUser();\n // The portfolio endpoint resolves identifiers via resolveUserWhere,\n // and the current SDK account model is address-first. Explicit params\n // let app-level verified sessions query balances without relying on\n // the provider's localStorage cache, while connected EIP-1193 consumers\n // still work with no params.\n const accountAddress = explicitAccountAddress || user?.address;\n if (!accountAddress) {\n throw new Error(\"wallet_getAssets requires accountAddress or a connected account\");\n }\n return client.getAssets({ accountAddress: accountAddress as Address });\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 status strings.\n // Both \"failed\" and \"expired\" map to \"CONFIRMED\" because EIP-5792 uses receipts\n // (and a 0x0 status code) to communicate failure — there is no \"FAILED\" state.\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 // 0x1 = success, 0x0 = reverted/failed — mirrors EVM receipt status\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"],"mappings":"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","names":["data","request","chainId","options"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { P as PasskeyProviderConfig, S as SponsorshipConfig, aa as ThemeConfig, a6 as GetAssetsOptions, a9 as AssetsResponse, v as AuthWithModalOptions, A as AuthResult, L as LoginWithModalOptions, w as CreateAccountWithModalOptions, y as ConnectResult, ad as CheckConsentOptions, ae as CheckConsentResult, af as RequestConsentOptions, ag as RequestConsentResult, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, z as AuthenticateOptions, B as AuthenticateResult, m as SigningRequestOptions, n as SigningResult, Y as SendIntentOptions, i as SendIntentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, a3 as IntentHistoryOptions, a5 as IntentHistoryResult, F as SignMessageOptions, G as SignMessageResult, J as SignTypedDataOptions, K as SignTypedDataResult, E as EmbedOptions, t as PasskeyCredential } from './types-
|
|
1
|
+
import { P as PasskeyProviderConfig, S as SponsorshipConfig, aa as ThemeConfig, a6 as GetAssetsOptions, a9 as AssetsResponse, v as AuthWithModalOptions, A as AuthResult, L as LoginWithModalOptions, w as CreateAccountWithModalOptions, y as ConnectResult, ad as CheckConsentOptions, ae as CheckConsentResult, af as RequestConsentOptions, ag as RequestConsentResult, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, z as AuthenticateOptions, B as AuthenticateResult, m as SigningRequestOptions, n as SigningResult, Y as SendIntentOptions, i as SendIntentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, a3 as IntentHistoryOptions, a5 as IntentHistoryResult, F as SignMessageOptions, G as SignMessageResult, J as SignTypedDataOptions, K as SignTypedDataResult, E as EmbedOptions, t as PasskeyCredential } from './types-U_dwxbtS.js';
|
|
2
2
|
|
|
3
3
|
declare class OneAuthClient {
|
|
4
4
|
private config;
|
|
5
5
|
private theme;
|
|
6
6
|
private sponsorship;
|
|
7
7
|
private eoaDialogState;
|
|
8
|
+
private prewarmState;
|
|
8
9
|
private eoaSerialQueue;
|
|
9
10
|
/**
|
|
10
11
|
* Create a new OneAuthClient.
|
|
@@ -586,6 +587,52 @@ declare class OneAuthClient {
|
|
|
586
587
|
* @param url - Any URL whose origin should be preconnected to.
|
|
587
588
|
*/
|
|
588
589
|
private injectPreconnect;
|
|
590
|
+
/**
|
|
591
|
+
* Warm the dialog ahead of the first user interaction.
|
|
592
|
+
*
|
|
593
|
+
* `preconnect` (run in the constructor) only warms DNS/TLS. This goes
|
|
594
|
+
* further: it loads the dialog into a hidden, off-screen iframe so the
|
|
595
|
+
* browser downloads and parses the dialog HTML + JS bundle and the font, and
|
|
596
|
+
* keeps the cross-origin connection alive. When the user later opens a real
|
|
597
|
+
* auth/sign dialog, the fresh iframe serves those bytes from cache over the
|
|
598
|
+
* warm connection and paints far sooner — so the SDK preload overlay is shown
|
|
599
|
+
* only briefly (or imperceptibly) instead of covering a full cold load.
|
|
600
|
+
*
|
|
601
|
+
* It loads a dedicated `/dialog/warm` route, NOT a real flow route. That
|
|
602
|
+
* matters for two reasons:
|
|
603
|
+
* - **No side effects.** The real `/dialog/auth` route runs the signup
|
|
604
|
+
* flow on mount (identity probe → `POST /api/auth/register?step=start`),
|
|
605
|
+
* which writes an `AuthChallenge` row and counts against the register
|
|
606
|
+
* rate limiter. Warming must never create backend auth state for a user
|
|
607
|
+
* who hasn't acted, so the warm route renders nothing and runs no flow.
|
|
608
|
+
* - **No message cross-talk.** The warm route posts no `PASSKEY_READY` /
|
|
609
|
+
* `PASSKEY_RENDERED`, so a slow warm can never satisfy a visible modal's
|
|
610
|
+
* readiness listener and drive it to `PASSKEY_INIT` at the wrong moment.
|
|
611
|
+
* The warm route still pulls the shared Next.js framework + main + dialog
|
|
612
|
+
* layout chunks (the bulk of every flow's bundle), so the real open is fast.
|
|
613
|
+
*
|
|
614
|
+
* Best called on a *likely-intent* signal — `pointerenter`/`focus` of your
|
|
615
|
+
* "Sign in" / "Pay" button — rather than on page load, so visitors who never
|
|
616
|
+
* authenticate don't pay for a cross-origin iframe. Pass `prewarm: true` in
|
|
617
|
+
* the client config to have the SDK schedule this once on an idle callback.
|
|
618
|
+
*
|
|
619
|
+
* Idempotent: repeated calls return the same in-flight/settled promise.
|
|
620
|
+
* Resolves `true` once the hidden iframe's document has loaded, `false` on
|
|
621
|
+
* timeout or failure. Never throws and never blocks a real dialog open — a
|
|
622
|
+
* failed prewarm just means the next open does a normal (cold) load.
|
|
623
|
+
*
|
|
624
|
+
* @returns Whether the dialog became warm.
|
|
625
|
+
*/
|
|
626
|
+
prewarm(): Promise<boolean>;
|
|
627
|
+
/**
|
|
628
|
+
* Tear down the hidden prewarm iframe created by {@link prewarm}.
|
|
629
|
+
*
|
|
630
|
+
* The HTTP cache that prewarm populated survives teardown, so a subsequent
|
|
631
|
+
* open is still bundle-warm; this only releases the parked frame (and its
|
|
632
|
+
* keep-alive connection). Call it when auth is no longer likely on the
|
|
633
|
+
* current view. Safe to call when nothing is warmed.
|
|
634
|
+
*/
|
|
635
|
+
destroyPrewarm(): void;
|
|
589
636
|
/**
|
|
590
637
|
* Wait for the dialog iframe to signal ready, but defer sending `PASSKEY_INIT`
|
|
591
638
|
* until the caller decides the time is right.
|
|
@@ -894,17 +941,17 @@ declare class OneAuthClient {
|
|
|
894
941
|
/**
|
|
895
942
|
* Create and open a full-viewport `<dialog>` containing a passkey iframe.
|
|
896
943
|
*
|
|
897
|
-
* The SDK owns
|
|
898
|
-
*
|
|
899
|
-
*
|
|
900
|
-
*
|
|
944
|
+
* The SDK owns the browser `<dialog>` plus a minimal generic preload shell
|
|
945
|
+
* that appears immediately on click. The passkey iframe owns all branded and
|
|
946
|
+
* origin-specific UI (TitleBar, trust icon, action cards); the shell is
|
|
947
|
+
* removed as soon as the iframe reports that its centered card has painted.
|
|
901
948
|
*
|
|
902
949
|
* Lifecycle:
|
|
903
|
-
* 1. A themed
|
|
904
|
-
* iframe loads
|
|
905
|
-
*
|
|
906
|
-
* 2. When the iframe sends `PASSKEY_RENDERED`, the overlay
|
|
907
|
-
* the iframe becomes fully visible.
|
|
950
|
+
* 1. A themed generic preload shell is injected and shown immediately
|
|
951
|
+
* while the iframe loads. It intentionally contains no TitleBar or
|
|
952
|
+
* origin chrome so that UI has a single implementation in apps/passkey.
|
|
953
|
+
* 2. When the iframe sends `PASSKEY_RENDERED`, the overlay is removed and
|
|
954
|
+
* the iframe becomes fully visible in the same frame.
|
|
908
955
|
* 3. The returned `cleanup` function tears down all event listeners,
|
|
909
956
|
* disconnects the MutationObserver, closes the `<dialog>`, and removes
|
|
910
957
|
* it from the DOM. It is idempotent — safe to call multiple times.
|