@asseteragmbh/wallet-connector 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -371,7 +371,11 @@ the pop-up it opened.
371
371
 
372
372
  ## Protocol summary
373
373
 
374
- 1. On a click, the partner opens `${walletUrl}/connect?origin=<partner origin>&v=1`.
374
+ 1. On a click, the partner opens
375
+ `${walletUrl}/connect?origin=<partner origin>&v=1[&signIn=<hint>][&chainId=<0x chain id>]`. `chainId` is an
376
+ EIP-155 chain id (the `0x`-prefixed hex form `eth_chainId` returns) that asks the pop-up to start on the
377
+ partner's current chain; if the wallet does not offer it, the pop-up stays on its own default and reports its
378
+ chain with a `chainChanged` event.
375
379
  2. The pop-up checks the claimed origin against its allow-list, then posts `ready` to `window.opener` with
376
380
  `targetOrigin` = that origin.
377
381
  3. The partner waits for `ready` from the wallet origin, then posts
@@ -108,11 +108,12 @@ function isOnboardCancelledMessage(value) {
108
108
  function isCaip2EvmChain(value) {
109
109
  return /^eip155:\d{1,32}$/.test(value);
110
110
  }
111
- function connectUrl(walletUrl, partnerOrigin, signIn) {
111
+ function connectUrl(walletUrl, partnerOrigin, signIn, chainId) {
112
112
  const url = new URL(CONNECT_PATH, walletUrl);
113
113
  url.searchParams.set("origin", partnerOrigin);
114
114
  url.searchParams.set("v", String(PROTOCOL_VERSION));
115
115
  if (signIn !== void 0) url.searchParams.set("signIn", signIn);
116
+ if (chainId !== void 0) url.searchParams.set("chainId", chainId);
116
117
  return url.toString();
117
118
  }
118
119
  function onboardUrl(walletUrl, partnerOrigin, options) {
@@ -135,5 +136,5 @@ function manageUrl(walletUrl, partnerOrigin, options = {}) {
135
136
  }
136
137
 
137
138
  export { CONNECT_PATH, HOLD_MAX_MS, MANAGE_PATH, MESSAGE_PREFIX, ONBOARD_PATH, PROTOCOL_VERSION, RpcErrorCode, SIGN_IN_HINTS, SUPPORTED_METHODS, connectUrl, isAccountsMessage, isCaip2EvmChain, isDisconnectMessage, isEventMessage, isHoldMessage, isOnboardCancelledMessage, isOnboardedMessage, isReadyMessage, isRequestMessage, isResponseMessage, isSecurityMessage, isSignInHint, isSupportedMethod, manageUrl, onboardUrl };
138
- //# sourceMappingURL=chunk-Z7QSH4N2.js.map
139
- //# sourceMappingURL=chunk-Z7QSH4N2.js.map
139
+ //# sourceMappingURL=chunk-2ZWSKZ3B.js.map
140
+ //# sourceMappingURL=chunk-2ZWSKZ3B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/protocol.ts"],"names":[],"mappings":"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","file":"chunk-2ZWSKZ3B.js","sourcesContent":["/**\n * The pop-up protocol between a partner page (the opener) and the Assetera Wallet (the pop-up) — ADR-0054 D3/D4.\n *\n * This file is the CONTRACT. The connector in this package speaks the opener side; AsseteraWalletFront's\n * `/connect` page speaks the pop-up side and imports these types from `@asseteragmbh/wallet-connector/protocol`.\n * Change it only in a backwards-compatible way, or bump `PROTOCOL_VERSION` and support both on the wallet side:\n * partner sites upgrade on their own schedule.\n *\n * ## The handshake\n *\n * 1. The partner opens\n * `${walletUrl}${CONNECT_PATH}?origin=<partner origin>&v=<version>[&signIn=<hint>][&chainId=<0x chain id>]`\n * from a user click.\n * 2. The pop-up checks the claimed origin against its allowlist (D4). If listed, it posts `ready` to\n * `window.opener` with `targetOrigin` = that origin. The browser delivers it ONLY if the opener really is\n * that origin, so a page cannot claim someone else's origin and still hear the answer.\n * 3. The opener waits for `ready` from the wallet origin, then sends `request`s with `targetOrigin` = the wallet\n * origin. The pop-up accepts a message only when `event.origin` is the allowed origin from step 2 AND\n * `event.source === window.opener`, and answers with `targetOrigin` = that origin. Nothing else is accepted.\n *\n * ## Sign-in hint\n *\n * A partner may tell the wallet how the client signed in at the partner, through the optional `signIn` URL\n * parameter (`SIGN_IN_HINTS`). The hint only names an identity provider: the wallet checks it against its own\n * list, may ignore it and then falls back to its own login page. The hint never carries a token, an identity or\n * any other credential.\n *\n * ## Lifetime\n *\n * The pop-up is not guaranteed to stay open. The wallet site may close the `/connect` pop-up after it connected\n * or answered a request. The provider keeps the last `accounts` and `chainId` it saw, so the partner page still\n * looks connected after the pop-up closes, and it opens the pop-up again on the next request from a user click.\n * A partner that needs the same pop-up across several requests of one flow can hold it open with `hold`, see\n * below. (ADR-0054, \"the wallet tab must stay open\", no longer holds.)\n *\n * ## Hold\n *\n * The partner may send `hold` to a `/connect` pop-up. `hold: true` asks the wallet to stay open between\n * requests of one multi-step flow. `hold: false` ends the hold.\n *\n * The wallet accepts `hold` only under the same rule as `request`: `event.origin` is the verified partner origin\n * AND `event.source === window.opener`.\n *\n * `hold: true` is idempotent. Each one, and each request, restarts the `HOLD_MAX_MS` cap.\n *\n * After `hold: false` (or after the cap), the normal idle close applies: the wallet may close itself a short\n * time after the last answered request when nothing is pending.\n *\n * A hold never keeps a request open and never answers anything. It only stops the idle close.\n *\n * The partner sends `hold: true` again after each `ready` of a new pop-up while its hold is active.\n *\n * `/onboard` and `/manage` ignore `hold`.\n *\n * ## Onboarding\n *\n * Onboarding is a second flow on the same wallet origin, for a partner that wants the client to get an Assetera\n * Wallet (a new one, or the one the client already has). The partner opens\n * `${walletUrl}${ONBOARD_PATH}?origin=<partner origin>&v=<version>&chain=<CAIP-2 chain id>[&add=1]` from a user\n * click. The pop-up checks the claimed origin against its partner list, signs the client in through SSO, runs the\n * wizard (accept the wallet terms, create the wallet) and then posts `onboarded` (or `onboard-cancelled`) to\n * `window.opener` with `targetOrigin` = the partner origin. `add=1` asks for one more wallet even when the client\n * already has one.\n *\n * After `onboarded` the pop-up STAYS OPEN and answers `request` messages for `personal_sign` by the onboarded\n * address (plus `eth_accounts` and `eth_chainId`), with the same `response` messages as `/connect`. That is how\n * the partner gets the ownership signature it needs to register the wallet with its own compliance service: the\n * wallet itself never calls a regulated service (ADR-0059 D3), and a second `window.open` after an asynchronous\n * step would be blocked by the browser. The partner closes the pop-up when it is done.\n *\n * The opener accepts messages only when `event.origin` is the wallet origin AND `event.source` is the pop-up\n * it opened. The wizard never returns a private key or a token, only the wallet address and signatures the\n * client approved.\n *\n * ## Manage\n *\n * The partner can open `${walletUrl}${MANAGE_PATH}?origin=<partner origin>&v=<version>[&lang=<locale>][&signIn=<hint>]`\n * from a user click, so the client can see and change the wallet accounts and the wallet security (passkeys,\n * authenticator app, recovery codes). The pop-up checks the claimed origin against its partner list, posts\n * `ready` to `window.opener` (the same message as `/connect`) and then posts `security` messages. It never\n * answers `request` messages.\n *\n * ## Account names\n *\n * While a pop-up is open it may also post `accounts` messages. Each entry names one account the client has\n * already shared with THIS partner, so the partner can show a name next to the address. The wallet never sends\n * an account the partner does not already know. A manage pop-up may send the message, and an onboarding pop-up\n * may send it after it reported the address. The message is only sent while a pop-up is open, never on request\n * of the partner. It carries no token and no other data.\n */\n\nexport const PROTOCOL_VERSION = 1 as const;\n\n/** The pop-up route on the wallet origin. */\nexport const CONNECT_PATH = \"/connect\";\n\n/** The onboarding wizard route on the wallet origin. */\nexport const ONBOARD_PATH = \"/onboard\";\n\n/** The manage wallet route on the wallet origin. */\nexport const MANAGE_PATH = \"/manage\";\n\n/** The identity providers a partner can name in the `signIn` hint. */\nexport const SIGN_IN_HINTS = [\"assetera-marketplace\"] as const;\n\n/** A named identity provider the wallet may use for a silent sign-in. */\nexport type SignInHint = (typeof SIGN_IN_HINTS)[number];\n\n/** True when `value` is one of {@link SIGN_IN_HINTS}. */\nexport function isSignInHint(value: unknown): value is SignInHint {\n return (SIGN_IN_HINTS as readonly unknown[]).includes(value);\n}\n\n/** Every message carries this prefix in `type`, so both sides can ignore unrelated `postMessage` traffic. */\nexport const MESSAGE_PREFIX = \"assetera-wallet:\" as const;\n\n/**\n * The most time the wallet keeps a held pop-up open since the last `hold: true` message or the last request.\n * After it, the normal idle close applies again, so a hold that is never released cannot keep the window open\n * forever. Five minutes.\n */\nexport const HOLD_MAX_MS = 300_000;\n\n/**\n * The EIP-1193 methods the pop-up answers (ADR-0054 D3). Anything else is refused with 4200. Read-only chain\n * calls (`eth_call`, `eth_getBalance`, …) do not go through the pop-up; wagmi sends them to its own transports.\n */\nexport const SUPPORTED_METHODS = [\n \"eth_requestAccounts\",\n \"eth_accounts\",\n \"eth_chainId\",\n \"wallet_switchEthereumChain\",\n \"personal_sign\",\n \"eth_signTypedData_v4\",\n \"eth_sendTransaction\",\n] as const;\n\nexport type SupportedMethod = (typeof SUPPORTED_METHODS)[number];\n\nexport function isSupportedMethod(method: string): method is SupportedMethod {\n return (SUPPORTED_METHODS as readonly string[]).includes(method);\n}\n\n/** EIP-1193 / EIP-1474 error codes the pop-up uses. */\nexport const RpcErrorCode = {\n /** The client rejected the request in the pop-up. */\n UserRejected: 4001,\n /** Not connected yet (no `eth_requestAccounts` approved in this pop-up). */\n Unauthorized: 4100,\n /** The method is not in SUPPORTED_METHODS. */\n UnsupportedMethod: 4200,\n /** The pop-up closed, or the wallet session ended. */\n Disconnected: 4900,\n /** `wallet_switchEthereumChain` to a chain the wallet does not offer. */\n UnrecognizedChain: 4902,\n /** Malformed params. */\n InvalidParams: -32602,\n /** Anything unexpected inside the wallet. */\n Internal: -32603,\n} as const;\n\nexport type RpcErrorCode = (typeof RpcErrorCode)[keyof typeof RpcErrorCode];\n\nexport interface RpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// --- pop-up → opener ---------------------------------------------------------------------------------\n\n/** The pop-up is loaded and accepts requests from this opener. */\nexport interface ReadyMessage {\n type: `${typeof MESSAGE_PREFIX}ready`;\n v: typeof PROTOCOL_VERSION;\n /** Shown to the partner for diagnostics only; the partner must not rely on it for anything. */\n walletVersion?: string;\n}\n\n/** The answer to one `request`, matched by `id`. Exactly one of `result` / `error`. */\nexport type ResponseMessage =\n | { type: `${typeof MESSAGE_PREFIX}response`; v: typeof PROTOCOL_VERSION; id: string; result: unknown }\n | { type: `${typeof MESSAGE_PREFIX}response`; v: typeof PROTOCOL_VERSION; id: string; error: RpcError };\n\n/** EIP-1193 provider events, forwarded to the partner. */\nexport type EventMessage =\n | {\n type: `${typeof MESSAGE_PREFIX}event`;\n v: typeof PROTOCOL_VERSION;\n event: \"accountsChanged\";\n data: `0x${string}`[];\n }\n | {\n type: `${typeof MESSAGE_PREFIX}event`;\n v: typeof PROTOCOL_VERSION;\n event: \"chainChanged\";\n data: `0x${string}`;\n }\n | {\n type: `${typeof MESSAGE_PREFIX}event`;\n v: typeof PROTOCOL_VERSION;\n event: \"disconnect\";\n data: RpcError;\n };\n\n/**\n * How well the client's Assetera Wallet is protected. The values are the ones the wallet site shows:\n *\n * - `add-factor`: there is no passkey and no authenticator app yet.\n * - `save-codes`: recovery codes exist, but the client has not confirmed saving them.\n * - `create-codes`: a factor exists, but there are no recovery codes.\n * - `protected`: a factor exists and the recovery codes are saved.\n * - `unknown`: the wallet could not read the state.\n */\nexport type WalletProtection = \"unknown\" | \"add-factor\" | \"save-codes\" | \"create-codes\" | \"protected\";\n\n/** The wallet security status sent by a manage (or connect) pop-up. */\nexport interface WalletSecurityStatus {\n /** Overall result, the same values the wallet site shows. */\n protection: WalletProtection;\n /** Passkeys registered for signing (Dynamic step-up), not sign-in factors. */\n passkeys: number;\n /** Authenticator apps (TOTP) registered for signing (Dynamic step-up). */\n authenticatorApps: number;\n}\n\n/**\n * The wallet reports the security status while a pop-up is open. The partner cannot ask for it. It never\n * carries a token, an identity or a credential.\n */\nexport interface SecurityMessage {\n type: `${typeof MESSAGE_PREFIX}security`;\n v: typeof PROTOCOL_VERSION;\n data: WalletSecurityStatus;\n}\n\n/** One account of the Assetera Wallet that the client already shared with this partner, with its name. */\nexport interface WalletAccountName {\n address: `0x${string}`;\n name: string;\n}\n\n/**\n * The wallet reports the names of the accounts the client already shared with this partner. The partner cannot\n * ask for it and the wallet never names an account the partner does not already know. It never carries a token\n * or any other data.\n */\nexport interface AccountsMessage {\n type: `${typeof MESSAGE_PREFIX}accounts`;\n v: typeof PROTOCOL_VERSION;\n data: WalletAccountName[];\n}\n\n/**\n * The onboarding wizard finished: the client accepted the wallet terms and has an Assetera Wallet on `chain`.\n * `created` is `true` when the wallet was created in this run, `false` when the wizard returned the client's\n * existing wallet. The wallet is not registered with any compliance service; that is the partner's step.\n */\nexport interface OnboardedMessage {\n type: `${typeof MESSAGE_PREFIX}onboarded`;\n v: typeof PROTOCOL_VERSION;\n address: `0x${string}`;\n chain: string;\n created: boolean;\n /**\n * @deprecated Sent by wallet versions that registered the wallet themselves (before ADR-0059). Ignored.\n */\n status?: \"approved\" | \"pending\";\n}\n\n/** The onboarding wizard did not produce a wallet. `message` is optional diagnostics for the partner. */\nexport interface OnboardCancelledMessage {\n type: `${typeof MESSAGE_PREFIX}onboard-cancelled`;\n v: typeof PROTOCOL_VERSION;\n reason: \"user\" | \"refused\" | \"error\";\n message?: string;\n}\n\nexport type WalletToPartnerMessage =\n | ReadyMessage\n | ResponseMessage\n | EventMessage\n | SecurityMessage\n | AccountsMessage\n | OnboardedMessage\n | OnboardCancelledMessage;\n\n// --- opener → pop-up ---------------------------------------------------------------------------------\n\nexport interface RequestMessage {\n type: `${typeof MESSAGE_PREFIX}request`;\n v: typeof PROTOCOL_VERSION;\n /** Unique per request within one connection; the response carries it back. */\n id: string;\n method: string;\n params?: unknown[] | Record<string, unknown>;\n}\n\n/** The partner disconnects (for example the user clicked \"Disconnect\" in the partner page). */\nexport interface DisconnectMessage {\n type: `${typeof MESSAGE_PREFIX}disconnect`;\n v: typeof PROTOCOL_VERSION;\n}\n\n/**\n * The partner asks the wallet to keep the pop-up open between requests of one multi-step flow, or to stop\n * holding it. The wallet accepts it only from the verified partner origin and only from `window.opener`.\n */\nexport interface HoldMessage {\n type: `${typeof MESSAGE_PREFIX}hold`;\n v: typeof PROTOCOL_VERSION;\n /** `true`: keep the pop-up open between requests. `false`: the hold ends. */\n hold: boolean;\n}\n\nexport type PartnerToWalletMessage = RequestMessage | DisconnectMessage | HoldMessage;\n\n// --- guards ------------------------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction hasType(value: unknown, suffix: string): value is Record<string, unknown> {\n return isRecord(value) && value.type === `${MESSAGE_PREFIX}${suffix}` && value.v === PROTOCOL_VERSION;\n}\n\nexport function isReadyMessage(value: unknown): value is ReadyMessage {\n return hasType(value, \"ready\");\n}\n\nexport function isResponseMessage(value: unknown): value is ResponseMessage {\n return (\n hasType(value, \"response\") &&\n typeof value.id === \"string\" &&\n (\"result\" in value || (isRecord(value.error) && typeof value.error.code === \"number\"))\n );\n}\n\nexport function isEventMessage(value: unknown): value is EventMessage {\n return (\n hasType(value, \"event\") &&\n (value.event === \"accountsChanged\" || value.event === \"chainChanged\" || value.event === \"disconnect\")\n );\n}\n\nconst WALLET_PROTECTIONS: readonly WalletProtection[] = [\n \"unknown\",\n \"add-factor\",\n \"save-codes\",\n \"create-codes\",\n \"protected\",\n];\n\n/** A factor count: a whole number, zero or more. */\nfunction isCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n}\n\n/** True for a `security` message with a known `protection` value and whole, non-negative factor counts. */\nexport function isSecurityMessage(value: unknown): value is SecurityMessage {\n if (!hasType(value, \"security\")) return false;\n const data = value.data;\n return (\n isRecord(data) &&\n typeof data.protection === \"string\" &&\n (WALLET_PROTECTIONS as readonly string[]).includes(data.protection) &&\n isCount(data.passkeys) &&\n isCount(data.authenticatorApps)\n );\n}\n\n/** The largest number of accounts one `accounts` message may carry. */\nconst MAX_ACCOUNT_NAMES = 50;\n\n/** True when `value` has a control character: C0, DEL or C1. */\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) return true;\n }\n return false;\n}\n\n/** A name: a string whose trimmed length is 1 to 64 and that has no control characters. */\nfunction isAccountName(value: unknown): value is string {\n if (typeof value !== \"string\") return false;\n if (hasControlCharacter(value)) return false;\n const trimmed = value.trim();\n return trimmed.length >= 1 && trimmed.length <= 64;\n}\n\n/** True for an `accounts` message with at most 50 named accounts. */\nexport function isAccountsMessage(value: unknown): value is AccountsMessage {\n if (!hasType(value, \"accounts\")) return false;\n const data = value.data;\n return (\n Array.isArray(data) &&\n data.length <= MAX_ACCOUNT_NAMES &&\n data.every(\n (entry: unknown) =>\n isRecord(entry) &&\n typeof entry.address === \"string\" &&\n EVM_ADDRESS_RE.test(entry.address) &&\n isAccountName(entry.name),\n )\n );\n}\n\nexport function isRequestMessage(value: unknown): value is RequestMessage {\n return hasType(value, \"request\") && typeof value.id === \"string\" && typeof value.method === \"string\";\n}\n\nexport function isDisconnectMessage(value: unknown): value is DisconnectMessage {\n return hasType(value, \"disconnect\");\n}\n\nexport function isHoldMessage(value: unknown): value is HoldMessage {\n return hasType(value, \"hold\") && typeof value.hold === \"boolean\";\n}\n\n/** `0x` followed by exactly 40 hexadecimal digits, the shape of an EVM address. */\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport function isOnboardedMessage(value: unknown): value is OnboardedMessage {\n return (\n hasType(value, \"onboarded\") &&\n typeof value.address === \"string\" &&\n EVM_ADDRESS_RE.test(value.address) &&\n typeof value.chain === \"string\" &&\n // `created` is new; an older wallet sent `status` instead and always created or reused a wallet.\n (typeof value.created === \"boolean\" || value.status === \"approved\" || value.status === \"pending\")\n );\n}\n\nexport function isOnboardCancelledMessage(value: unknown): value is OnboardCancelledMessage {\n return (\n hasType(value, \"onboard-cancelled\") &&\n (value.reason === \"user\" || value.reason === \"refused\" || value.reason === \"error\")\n );\n}\n\n/** A CAIP-2 EVM chain id, for example `eip155:80002` (Polygon Amoy) or `eip155:1` (mainnet). */\nexport function isCaip2EvmChain(value: string): boolean {\n return /^eip155:\\d{1,32}$/.test(value);\n}\n\n/**\n * The URL the partner opens. `partnerOrigin` is `window.location.origin` of the partner page. `signIn` adds the\n * optional sign-in hint; it is only a hint and the wallet may ignore it. `chainId` is an EIP-155 chain id (the\n * same 0x-prefixed hex form `eth_chainId` returns): the pop-up starts on this chain if it offers it; otherwise it\n * stays on its own default and reports its chain with a `chainChanged` event.\n */\nexport function connectUrl(\n walletUrl: string,\n partnerOrigin: string,\n signIn?: SignInHint,\n chainId?: string,\n): string {\n const url = new URL(CONNECT_PATH, walletUrl);\n url.searchParams.set(\"origin\", partnerOrigin);\n url.searchParams.set(\"v\", String(PROTOCOL_VERSION));\n if (signIn !== undefined) url.searchParams.set(\"signIn\", signIn);\n if (chainId !== undefined) url.searchParams.set(\"chainId\", chainId);\n return url.toString();\n}\n\n/**\n * The URL the partner opens for the onboarding wizard. `partnerOrigin` is `window.location.origin` of the\n * partner page; `chain` is the CAIP-2 chain id the new wallet should be created on; `locale` is passed as `lang`\n * when the partner wants a specific wizard language. `signIn` adds the optional sign-in hint; it is only a hint\n * and the wallet may ignore it.\n */\nexport function onboardUrl(\n walletUrl: string,\n partnerOrigin: string,\n options: { chain: string; locale?: string; add?: boolean; signIn?: SignInHint },\n): string {\n const url = new URL(ONBOARD_PATH, walletUrl);\n url.searchParams.set(\"origin\", partnerOrigin);\n url.searchParams.set(\"v\", String(PROTOCOL_VERSION));\n url.searchParams.set(\"chain\", options.chain);\n if (options.locale !== undefined) url.searchParams.set(\"lang\", options.locale);\n if (options.add) url.searchParams.set(\"add\", \"1\");\n if (options.signIn !== undefined) url.searchParams.set(\"signIn\", options.signIn);\n return url.toString();\n}\n\n/**\n * The URL the partner opens to manage the wallet. `partnerOrigin` is `window.location.origin` of the partner\n * page. `locale` is passed as `lang` when the partner wants a specific language. `signIn` adds the optional\n * sign-in hint; it is only a hint and the wallet may ignore it.\n */\nexport function manageUrl(\n walletUrl: string,\n partnerOrigin: string,\n options: { locale?: string; signIn?: SignInHint } = {},\n): string {\n const url = new URL(MANAGE_PATH, walletUrl);\n url.searchParams.set(\"origin\", partnerOrigin);\n url.searchParams.set(\"v\", String(PROTOCOL_VERSION));\n if (options.locale !== undefined) url.searchParams.set(\"lang\", options.locale);\n if (options.signIn !== undefined) url.searchParams.set(\"signIn\", options.signIn);\n return url.toString();\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { createAsseteraWalletProvider } from './chunk-2OK3FPAS.js';
1
+ import { createAsseteraWalletProvider } from './chunk-LCNGHBUB.js';
2
2
  import { createConnector, ChainNotConfiguredError } from '@wagmi/core';
3
3
  import { getAddress, numberToHex, UserRejectedRequestError } from 'viem';
4
4
 
@@ -126,5 +126,5 @@ function asseteraWallet(parameters) {
126
126
  }
127
127
 
128
128
  export { ASSETERA_WALLET_ICON, ASSETERA_WALLET_ID, ASSETERA_WALLET_NAME, ASSETERA_WALLET_TYPE, asseteraWallet };
129
- //# sourceMappingURL=chunk-4YVGTYYE.js.map
130
- //# sourceMappingURL=chunk-4YVGTYYE.js.map
129
+ //# sourceMappingURL=chunk-KF6S3FC7.js.map
130
+ //# sourceMappingURL=chunk-KF6S3FC7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/icon.ts","../src/wagmi.ts"],"names":[],"mappings":"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","file":"chunk-4YVGTYYE.js","sourcesContent":["/**\n * The wallet's mark as an inline data-URI, shared by the wagmi connector's `icon` and RainbowKit's `iconUrl`.\n *\n * It is intentionally tiny and dependency-free: a rounded dark square with a stylised \"A\". Keeping it as a\n * data URI means a partner app renders the wallet entry before its own bundle loads the wallet origin.\n */\nconst ICON_SVG =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\">' +\n '<rect width=\"128\" height=\"128\" rx=\"28\" fill=\"#1a1a2e\"/>' +\n '<path fill=\"#ffffff\" fill-rule=\"evenodd\" d=\"M64 24 100 104H80.5L73.6 86H54.4L47.5 104H28L64 24Z' +\n 'm-4.5 44.5h9L64 54.4 59.5 68.5Z\"/>' +\n \"</svg>\";\n\n/** `data:image/svg+xml,...` representation of the Assetera Wallet mark. */\nexport const ASSETERA_WALLET_ICON = `data:image/svg+xml,${encodeURIComponent(ICON_SVG)}`;\n","/**\n * wagmi v2 connector for the Assetera Wallet pop-up (ADR-0054 D3).\n *\n * Built with `createConnector` from `@wagmi/core`, following the structure of wagmi's own `injected` connector.\n * `@wagmi/core`, `viem` and wagmi are peer dependencies so a partner app keeps a single copy of them on the\n * page. The connector is intentionally thin: all protocol work lives in {@link createAsseteraWalletProvider}.\n */\nimport { ChainNotConfiguredError, createConnector, type Connector } from \"@wagmi/core\";\nimport { getAddress, numberToHex, UserRejectedRequestError } from \"viem\";\nimport { ASSETERA_WALLET_ICON } from \"./icon\";\nimport type { SignInHint } from \"./protocol\";\nimport { createAsseteraWalletProvider, type AsseteraWalletProvider } from \"./provider\";\n\n/** Stable connector id, used by wagmi for storage keys and RainbowKit for the wallet entry. */\nexport const ASSETERA_WALLET_ID = \"assetera-wallet\";\n/** Product name, exactly \"Assetera Wallet\". */\nexport const ASSETERA_WALLET_NAME = \"Assetera Wallet\";\n/** Connector `type` reported to wagmi. */\nexport const ASSETERA_WALLET_TYPE = \"asseteraWallet\";\n\n/** Parameters accepted by {@link asseteraWallet}. */\nexport interface AsseteraWalletParameters {\n /** Base URL of the wallet origin, e.g. `https://wallet.wallet-staging.assetera.com`. */\n walletUrl: string;\n /** Sign-in hint passed as `signIn`. Only a hint; the wallet may ignore it. */\n signIn?: SignInHint;\n}\n\n/**\n * Create the wagmi connector for the Assetera Wallet pop-up.\n *\n * `connect()` must be called from a user click: `eth_requestAccounts` opens the pop-up, and a pop-up cannot be\n * opened without transient user activation.\n */\nexport function asseteraWallet(parameters: AsseteraWalletParameters) {\n type Provider = AsseteraWalletProvider;\n\n let provider: Provider | undefined;\n let accountsChanged: Connector[\"onAccountsChanged\"] | undefined;\n let chainChanged: Connector[\"onChainChanged\"] | undefined;\n let disconnectHandler: Connector[\"onDisconnect\"] | undefined;\n\n function removeProviderListeners(activeProvider: Provider): void {\n if (accountsChanged) {\n activeProvider.removeListener(\"accountsChanged\", accountsChanged);\n accountsChanged = undefined;\n }\n if (chainChanged) {\n activeProvider.removeListener(\"chainChanged\", chainChanged);\n chainChanged = undefined;\n }\n if (disconnectHandler) {\n activeProvider.removeListener(\"disconnect\", disconnectHandler);\n disconnectHandler = undefined;\n }\n }\n\n return createConnector<Provider>((config) => ({\n id: ASSETERA_WALLET_ID,\n name: ASSETERA_WALLET_NAME,\n type: ASSETERA_WALLET_TYPE,\n icon: ASSETERA_WALLET_ICON,\n\n async connect({ chainId, withCapabilities } = {}) {\n const activeProvider = await this.getProvider();\n const requested = (await activeProvider.request({\n method: \"eth_requestAccounts\",\n })) as string[];\n const addresses = requested.map((account) => getAddress(account));\n\n // Forward the pop-up's own events into wagmi's emitter.\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n activeProvider.on(\"accountsChanged\", accountsChanged);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n activeProvider.on(\"chainChanged\", chainChanged);\n }\n if (!disconnectHandler) {\n disconnectHandler = this.onDisconnect.bind(this);\n activeProvider.on(\"disconnect\", disconnectHandler);\n }\n\n // Switch to the requested chain when the caller asked for one.\n let currentChainId = await this.getChainId();\n if (chainId && currentChainId !== chainId) {\n const chain = await this.switchChain!({ chainId }).catch((error) => {\n if (error?.code === UserRejectedRequestError.code) throw error;\n return { id: currentChainId };\n });\n currentChainId = chain?.id ?? currentChainId;\n }\n\n return {\n accounts: (withCapabilities\n ? addresses.map((address) => ({ address, capabilities: {} }))\n : addresses) as never,\n chainId: currentChainId,\n };\n },\n\n async disconnect() {\n if (!provider) return;\n removeProviderListeners(provider);\n provider.disconnect();\n },\n\n async getAccounts() {\n const activeProvider = await this.getProvider();\n const requested = (await activeProvider.request({ method: \"eth_accounts\" })) as string[];\n return requested.map((account) => getAddress(account));\n },\n\n async getChainId() {\n const activeProvider = await this.getProvider();\n return Number(await activeProvider.request({ method: \"eth_chainId\" }));\n },\n\n async getProvider() {\n // One provider per connector, created lazily so a partner that never connects pays nothing.\n if (!provider) {\n provider = createAsseteraWalletProvider({\n walletUrl: parameters.walletUrl,\n defaultChainId: config.chains[0].id,\n ...(parameters.signIn === undefined ? {} : { signIn: parameters.signIn }),\n });\n }\n return provider;\n },\n\n /**\n * Always `false`: opening the pop-up requires a user click, so there is nothing to reconnect to on page\n * load. Returning `true` would make wagmi attempt an automatic reconnect that the browser blocks; the\n * partner app must drive `connect()` from a click instead.\n */\n async isAuthorized() {\n return false;\n },\n\n async switchChain({ chainId }) {\n const chain = config.chains.find((candidate) => candidate.id === chainId);\n if (!chain) throw new ChainNotConfiguredError();\n const activeProvider = await this.getProvider();\n await activeProvider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n this.onChainChanged(numberToHex(chainId));\n return chain;\n },\n\n onAccountsChanged(accounts) {\n if (accounts.length === 0) this.onDisconnect();\n else\n config.emitter.emit(\"change\", {\n accounts: accounts.map((account) => getAddress(account)),\n });\n },\n\n onChainChanged(chain) {\n config.emitter.emit(\"change\", { chainId: Number(chain) });\n },\n\n onDisconnect() {\n config.emitter.emit(\"disconnect\");\n if (provider) removeProviderListeners(provider);\n },\n }));\n}\n"]}
1
+ {"version":3,"sources":["../src/icon.ts","../src/wagmi.ts"],"names":[],"mappings":"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","file":"chunk-KF6S3FC7.js","sourcesContent":["/**\n * The wallet's mark as an inline data-URI, shared by the wagmi connector's `icon` and RainbowKit's `iconUrl`.\n *\n * It is intentionally tiny and dependency-free: a rounded dark square with a stylised \"A\". Keeping it as a\n * data URI means a partner app renders the wallet entry before its own bundle loads the wallet origin.\n */\nconst ICON_SVG =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\">' +\n '<rect width=\"128\" height=\"128\" rx=\"28\" fill=\"#1a1a2e\"/>' +\n '<path fill=\"#ffffff\" fill-rule=\"evenodd\" d=\"M64 24 100 104H80.5L73.6 86H54.4L47.5 104H28L64 24Z' +\n 'm-4.5 44.5h9L64 54.4 59.5 68.5Z\"/>' +\n \"</svg>\";\n\n/** `data:image/svg+xml,...` representation of the Assetera Wallet mark. */\nexport const ASSETERA_WALLET_ICON = `data:image/svg+xml,${encodeURIComponent(ICON_SVG)}`;\n","/**\n * wagmi v2 connector for the Assetera Wallet pop-up (ADR-0054 D3).\n *\n * Built with `createConnector` from `@wagmi/core`, following the structure of wagmi's own `injected` connector.\n * `@wagmi/core`, `viem` and wagmi are peer dependencies so a partner app keeps a single copy of them on the\n * page. The connector is intentionally thin: all protocol work lives in {@link createAsseteraWalletProvider}.\n */\nimport { ChainNotConfiguredError, createConnector, type Connector } from \"@wagmi/core\";\nimport { getAddress, numberToHex, UserRejectedRequestError } from \"viem\";\nimport { ASSETERA_WALLET_ICON } from \"./icon\";\nimport type { SignInHint } from \"./protocol\";\nimport { createAsseteraWalletProvider, type AsseteraWalletProvider } from \"./provider\";\n\n/** Stable connector id, used by wagmi for storage keys and RainbowKit for the wallet entry. */\nexport const ASSETERA_WALLET_ID = \"assetera-wallet\";\n/** Product name, exactly \"Assetera Wallet\". */\nexport const ASSETERA_WALLET_NAME = \"Assetera Wallet\";\n/** Connector `type` reported to wagmi. */\nexport const ASSETERA_WALLET_TYPE = \"asseteraWallet\";\n\n/** Parameters accepted by {@link asseteraWallet}. */\nexport interface AsseteraWalletParameters {\n /** Base URL of the wallet origin, e.g. `https://wallet.wallet-staging.assetera.com`. */\n walletUrl: string;\n /** Sign-in hint passed as `signIn`. Only a hint; the wallet may ignore it. */\n signIn?: SignInHint;\n}\n\n/**\n * Create the wagmi connector for the Assetera Wallet pop-up.\n *\n * `connect()` must be called from a user click: `eth_requestAccounts` opens the pop-up, and a pop-up cannot be\n * opened without transient user activation.\n */\nexport function asseteraWallet(parameters: AsseteraWalletParameters) {\n type Provider = AsseteraWalletProvider;\n\n let provider: Provider | undefined;\n let accountsChanged: Connector[\"onAccountsChanged\"] | undefined;\n let chainChanged: Connector[\"onChainChanged\"] | undefined;\n let disconnectHandler: Connector[\"onDisconnect\"] | undefined;\n\n function removeProviderListeners(activeProvider: Provider): void {\n if (accountsChanged) {\n activeProvider.removeListener(\"accountsChanged\", accountsChanged);\n accountsChanged = undefined;\n }\n if (chainChanged) {\n activeProvider.removeListener(\"chainChanged\", chainChanged);\n chainChanged = undefined;\n }\n if (disconnectHandler) {\n activeProvider.removeListener(\"disconnect\", disconnectHandler);\n disconnectHandler = undefined;\n }\n }\n\n return createConnector<Provider>((config) => ({\n id: ASSETERA_WALLET_ID,\n name: ASSETERA_WALLET_NAME,\n type: ASSETERA_WALLET_TYPE,\n icon: ASSETERA_WALLET_ICON,\n\n async connect({ chainId, withCapabilities } = {}) {\n const activeProvider = await this.getProvider();\n const requested = (await activeProvider.request({\n method: \"eth_requestAccounts\",\n })) as string[];\n const addresses = requested.map((account) => getAddress(account));\n\n // Forward the pop-up's own events into wagmi's emitter.\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n activeProvider.on(\"accountsChanged\", accountsChanged);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n activeProvider.on(\"chainChanged\", chainChanged);\n }\n if (!disconnectHandler) {\n disconnectHandler = this.onDisconnect.bind(this);\n activeProvider.on(\"disconnect\", disconnectHandler);\n }\n\n // Switch to the requested chain when the caller asked for one.\n let currentChainId = await this.getChainId();\n if (chainId && currentChainId !== chainId) {\n const chain = await this.switchChain!({ chainId }).catch((error) => {\n if (error?.code === UserRejectedRequestError.code) throw error;\n return { id: currentChainId };\n });\n currentChainId = chain?.id ?? currentChainId;\n }\n\n return {\n accounts: (withCapabilities\n ? addresses.map((address) => ({ address, capabilities: {} }))\n : addresses) as never,\n chainId: currentChainId,\n };\n },\n\n async disconnect() {\n if (!provider) return;\n removeProviderListeners(provider);\n provider.disconnect();\n },\n\n async getAccounts() {\n const activeProvider = await this.getProvider();\n const requested = (await activeProvider.request({ method: \"eth_accounts\" })) as string[];\n return requested.map((account) => getAddress(account));\n },\n\n async getChainId() {\n const activeProvider = await this.getProvider();\n return Number(await activeProvider.request({ method: \"eth_chainId\" }));\n },\n\n async getProvider() {\n // One provider per connector, created lazily so a partner that never connects pays nothing.\n if (!provider) {\n provider = createAsseteraWalletProvider({\n walletUrl: parameters.walletUrl,\n defaultChainId: config.chains[0].id,\n ...(parameters.signIn === undefined ? {} : { signIn: parameters.signIn }),\n });\n }\n return provider;\n },\n\n /**\n * Always `false`: opening the pop-up requires a user click, so there is nothing to reconnect to on page\n * load. Returning `true` would make wagmi attempt an automatic reconnect that the browser blocks; the\n * partner app must drive `connect()` from a click instead.\n */\n async isAuthorized() {\n return false;\n },\n\n async switchChain({ chainId }) {\n const chain = config.chains.find((candidate) => candidate.id === chainId);\n if (!chain) throw new ChainNotConfiguredError();\n const activeProvider = await this.getProvider();\n await activeProvider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n this.onChainChanged(numberToHex(chainId));\n return chain;\n },\n\n onAccountsChanged(accounts) {\n if (accounts.length === 0) this.onDisconnect();\n else\n config.emitter.emit(\"change\", {\n accounts: accounts.map((account) => getAddress(account)),\n });\n },\n\n onChainChanged(chain) {\n config.emitter.emit(\"change\", { chainId: Number(chain) });\n },\n\n onDisconnect() {\n config.emitter.emit(\"disconnect\");\n if (provider) removeProviderListeners(provider);\n },\n }));\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { RpcErrorCode, isSupportedMethod, isReadyMessage, isResponseMessage, isSecurityMessage, isAccountsMessage, isEventMessage, PROTOCOL_VERSION, MESSAGE_PREFIX, connectUrl } from './chunk-Z7QSH4N2.js';
1
+ import { RpcErrorCode, isSupportedMethod, isReadyMessage, isResponseMessage, isSecurityMessage, isAccountsMessage, isEventMessage, PROTOCOL_VERSION, MESSAGE_PREFIX, connectUrl } from './chunk-2ZWSKZ3B.js';
2
2
 
3
3
  // src/provider.ts
4
4
  var ProviderRpcError = class extends Error {
@@ -154,7 +154,7 @@ function createAsseteraWalletProvider(options) {
154
154
  }
155
155
  if (typeof window === "undefined") return null;
156
156
  const opened = window.open(
157
- connectUrl(options.walletUrl, window.location.origin, options.signIn),
157
+ connectUrl(options.walletUrl, window.location.origin, options.signIn, currentChainId()),
158
158
  POPUP_NAME,
159
159
  popupFeatures
160
160
  );
@@ -394,5 +394,5 @@ function createAsseteraWalletProvider(options) {
394
394
  }
395
395
 
396
396
  export { ProviderRpcError, createAsseteraWalletProvider };
397
- //# sourceMappingURL=chunk-2OK3FPAS.js.map
398
- //# sourceMappingURL=chunk-2OK3FPAS.js.map
397
+ //# sourceMappingURL=chunk-LCNGHBUB.js.map
398
+ //# sourceMappingURL=chunk-LCNGHBUB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider.ts"],"names":["request","accounts","sequence","active"],"mappings":"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","file":"chunk-LCNGHBUB.js","sourcesContent":["/**\n * EIP-1193 provider for the Assetera Wallet pop-up — the opener side of the ADR-0054 D3/D4 protocol.\n *\n * The provider owns a single pop-up (`window.open(connectUrl(...), \"assetera-wallet\", ...)`) and speaks the\n * wire format defined in `./protocol`. It never touches Dynamic, React, wagmi or viem, so a partner can use it\n * on its own or through the wagmi / RainbowKit adapters in this package.\n */\nimport {\n MESSAGE_PREFIX,\n PROTOCOL_VERSION,\n RpcErrorCode,\n connectUrl,\n isAccountsMessage,\n isEventMessage,\n isReadyMessage,\n isResponseMessage,\n isSecurityMessage,\n isSupportedMethod,\n type AccountsMessage,\n type DisconnectMessage,\n type EventMessage,\n type HoldMessage,\n type RequestMessage,\n type ResponseMessage,\n type SecurityMessage,\n type SignInHint,\n type WalletAccountName,\n type WalletSecurityStatus,\n} from \"./protocol\";\n\n/** Arguments accepted by `request`, mirroring EIP-1193. */\nexport interface RequestArguments {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n}\n\n/** EIP-1193 provider events emitted by the pop-up, plus the wallet security status and account names. */\nexport type ProviderEvent =\n \"accountsChanged\" | \"chainChanged\" | \"connect\" | \"disconnect\" | \"assetera_security\" | \"assetera_accounts\";\n\n/**\n * Listener shape for EIP-1193 provider events. `never[]` accepts a listener with any concrete parameter list\n * (for example wagmi's `(accounts: string[]) => void`), while internal emission stays type-safe via a cast.\n */\nexport type ProviderListener = (...args: never[]) => void;\n\n/** The EIP-1193 surface returned by {@link createAsseteraWalletProvider}. */\nexport interface AsseteraWalletProvider {\n request(args: RequestArguments): Promise<unknown>;\n on(event: ProviderEvent, listener: ProviderListener): void;\n removeListener(event: ProviderEvent, listener: ProviderListener): void;\n disconnect(): void;\n /**\n * The last security status reported by a wallet pop-up, or `undefined` when none arrived yet. A closed pop-up\n * does not clear it.\n */\n lastSecurityStatus(): WalletSecurityStatus | undefined;\n /**\n * The last account names reported by a wallet pop-up, or `undefined` when none arrived yet. The returned list\n * is a copy. A closed pop-up does not clear it.\n */\n lastAccountNames(): WalletAccountName[] | undefined;\n /**\n * Open the pop-up NOW, inside the caller's click, for a signature that is sent later. Use it when the app must\n * wait for something (a firm quote, a fee) between the click and the signing request: without it, the request\n * would open the pop-up after an `await`, outside the click, and the browser would block it. A later\n * `request` reuses the pop-up. While no request has followed yet, the handle also holds the pop-up open (like\n * {@link holdPopup}), so a pop-up that is already counting down its idle close does not vanish during the\n * wait. The hold ends when the first request sent after this call settles (resolved or rejected), or on\n * `release()`, whichever comes first. Synchronous; it never throws.\n */\n prepareSigning(): PreparedSigning;\n /**\n * Open the pop-up NOW, inside the caller's click, and keep it open until `release()`.\n *\n * Use it when one user click starts several wallet requests with waits between them (approve a token, wait\n * for the approval to mine, sign the terms, send the transaction). The wallet normally closes the pop-up a\n * short time after the last answered request, and a request sent after that would open a new pop-up outside\n * a click, which the browser blocks. `holdPopup()` asks the wallet to keep the current pop-up open between\n * those requests. Call `release()` in a `finally` block.\n *\n * The hold is a request to the wallet, not a guarantee: an older wallet ignores the message, and the wallet\n * caps a hold at `HOLD_MAX_MS` (5 minutes) since the last hold or request. Keep a fallback for a closed\n * pop-up. Synchronous; it never throws.\n */\n holdPopup(): PopupHold;\n}\n\n/** The handle {@link AsseteraWalletProvider.prepareSigning} returns. */\nexport interface PreparedSigning {\n /** `false` when the browser blocked the pop-up. The caller should then ask for another click. */\n readonly opened: boolean;\n /**\n * Give the pop-up back when no request followed (the quote failed, the client cancelled). It ends the hold\n * this handle started and posts `hold: false` when no other hold is active. It closes the pop-up only when\n * THIS call opened it and no request was sent since; otherwise it does nothing. Safe to call more than once.\n */\n release(): void;\n}\n\n/** The handle {@link AsseteraWalletProvider.holdPopup} returns. */\nexport interface PopupHold {\n /** `false` when the browser blocked the pop-up. The caller should then ask for another click. */\n readonly opened: boolean;\n /**\n * End the hold. When no other hold is active the provider posts `hold: false` to the current pop-up. It\n * closes the pop-up only when this call opened it and no request was sent since; otherwise it does nothing.\n * Safe to call more than once.\n */\n release(): void;\n}\n\n/** Options for {@link createAsseteraWalletProvider}. */\nexport interface AsseteraWalletProviderOptions {\n /** Base URL of the wallet origin, e.g. `https://wallet.wallet-staging.assetera.com`. */\n walletUrl: string;\n /** Chain id used before the wallet reports one, and as the local `eth_chainId` fallback. */\n defaultChainId: number;\n /** `window.open` feature string. Defaults to `\"popup,width=420,height=720\"`. */\n popupFeatures?: string;\n /** Sign-in hint passed as `signIn`. Only a hint; the wallet may ignore it. */\n signIn?: SignInHint;\n}\n\n/**\n * EIP-1193 error carrying a JSON-RPC `code` (and optional `data`). This is what every rejected `request`\n * throws, so wagmi maps the wallet's `4001` / `4100` / `4200` / `4900` correctly.\n */\nexport class ProviderRpcError extends Error {\n readonly code: number;\n readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"ProviderRpcError\";\n this.code = code;\n this.data = data;\n }\n}\n\nconst DEFAULT_POPUP_FEATURES = \"popup,width=420,height=720\";\nconst POPUP_NAME = \"assetera-wallet\";\nconst CLOSE_POLL_MS = 500;\n\n/** Methods that show the user a signature / transaction prompt, so the pop-up should be focused first. */\nconst SIGNING_METHODS: ReadonlySet<string> = new Set([\n \"personal_sign\",\n \"eth_signTypedData_v4\",\n \"eth_sendTransaction\",\n]);\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n /** The value of `requestsSent` when this request was sent; orders it against `prepareSigning` holds. */\n sequence: number;\n}\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason: unknown) => void;\n}\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n // The `ready` deferred is rejected when the pop-up closes even if no request is waiting on it; mark the\n // promise as handled so that rejection is not reported as an unhandled promise rejection.\n void promise.catch(() => {});\n return { promise, resolve, reject };\n}\n\nfunction toHexChainId(chainId: number): string {\n return `0x${chainId.toString(16)}`;\n}\n\n/**\n * Create the EIP-1193 provider that talks to the Assetera Wallet pop-up.\n *\n * Call `request` from a user gesture: `eth_requestAccounts` opens the pop-up synchronously (before any\n * `await`) so the browser treats it as part of the click and does not block it.\n */\nexport function createAsseteraWalletProvider(options: AsseteraWalletProviderOptions): AsseteraWalletProvider {\n const { defaultChainId } = options;\n const walletOrigin = new URL(options.walletUrl).origin;\n const popupFeatures = options.popupFeatures ?? DEFAULT_POPUP_FEATURES;\n\n let popup: Window | null = null;\n /** Resolves when the *current* pop-up posts `ready`. Replaced when a new pop-up is opened. */\n let ready = createDeferred<void>();\n let accounts: string[] = [];\n let chainIdHex: string | null = null;\n /** Set when the wallet itself told us the session ended (as opposed to the user merely closing the tab). */\n let walletDisconnected = false;\n /** The last security status a pop-up reported; kept when the pop-up closes. */\n let lastSecurity: WalletSecurityStatus | undefined;\n /** The last account names a pop-up reported; kept when the pop-up closes. */\n let lastAccountNameList: WalletAccountName[] | undefined;\n const pending = new Map<string, PendingRequest>();\n const listeners = new Map<ProviderEvent, Set<(...args: unknown[]) => void>>();\n let closeTimer: ReturnType<typeof setInterval> | null = null;\n /** Counts the requests that need the pop-up, so `prepareSigning().release()` knows whether one followed. */\n let requestsSent = 0;\n /** True once the current pop-up posted `ready`. Reset when a new pop-up opens or the pop-up closes. */\n let popupReady = false;\n /** One token per active hold. A `Set`, so a double release or a `disconnect()` cannot make it negative. */\n const holds = new Set<symbol>();\n /** Hold tokens of `prepareSigning` handles, each with the `requestsSent` value when it was registered. */\n const preparedHolds = new Map<symbol, number>();\n\n function currentChainId(): string {\n return chainIdHex ?? toHexChainId(defaultChainId);\n }\n\n function blockedError(): ProviderRpcError {\n return new ProviderRpcError(\n RpcErrorCode.Disconnected,\n \"The Assetera Wallet pop-up was blocked by the browser. The pop-up must be opened from a user click \" +\n \"(for example a button press) and then the request retried.\",\n );\n }\n\n function disconnectedError(message = \"The Assetera Wallet pop-up was closed.\"): ProviderRpcError {\n return new ProviderRpcError(RpcErrorCode.Disconnected, message);\n }\n\n function emit(event: ProviderEvent, ...args: unknown[]): void {\n const set = listeners.get(event);\n if (!set) return;\n for (const listener of set) {\n try {\n listener(...args);\n } catch (error) {\n console.error(`[assetera-wallet] listener for \"${event}\" threw`, error);\n }\n }\n }\n\n function addListener(event: ProviderEvent, listener: ProviderListener): void {\n let set = listeners.get(event);\n if (!set) {\n set = new Set<(...args: unknown[]) => void>();\n listeners.set(event, set);\n }\n set.add(listener as (...args: unknown[]) => void);\n }\n\n function removeEventListener(event: ProviderEvent, listener: ProviderListener): void {\n listeners.get(event)?.delete(listener as (...args: unknown[]) => void);\n }\n\n /**\n * Tell the current pop-up whether to stay open between requests. Only a ready pop-up can receive the message;\n * a pop-up that is not ready yet gets it in the `ready` handler.\n */\n function postHold(hold: boolean): void {\n const active = popup;\n if (!active || active.closed || !popupReady) return;\n const message: HoldMessage = {\n type: `${MESSAGE_PREFIX}hold`,\n v: PROTOCOL_VERSION,\n hold,\n };\n active.postMessage(message, walletOrigin);\n }\n\n /** Register one hold token. A hold that starts the first hold asks the wallet to stay open. */\n function addHold(token: symbol): void {\n const wasEmpty = holds.size === 0;\n holds.add(token);\n if (wasEmpty) postHold(true);\n }\n\n /** Remove one hold token. Returns `true` when this ended the last hold. */\n function removeHold(token: symbol): boolean {\n if (!holds.delete(token)) return false;\n return holds.size === 0;\n }\n\n /**\n * A request settled. It ends every `prepareSigning` hold that was registered before that request was sent:\n * the pop-up may then idle-close normally again.\n */\n function endPreparedHolds(sequence: number): void {\n let emptied = false;\n for (const [token, registeredAt] of preparedHolds) {\n if (registeredAt >= sequence) continue;\n preparedHolds.delete(token);\n if (removeHold(token)) emptied = true;\n }\n if (emptied) postHold(false);\n }\n\n function stopClosePolling(): void {\n if (closeTimer !== null) {\n clearInterval(closeTimer);\n closeTimer = null;\n }\n }\n\n function startClosePolling(): void {\n if (closeTimer !== null) return;\n closeTimer = setInterval(() => {\n if (popup?.closed) handlePopupClosed();\n }, CLOSE_POLL_MS);\n }\n\n function rejectAllPending(error: ProviderRpcError): void {\n for (const request of pending.values()) {\n request.reject(error);\n endPreparedHolds(request.sequence);\n }\n pending.clear();\n }\n\n /**\n * The pop-up was closed by the user (or the wallet app).\n *\n * We deliberately KEEP `accounts` / `chainIdHex` cached: the dApp stays \"connected\" in React state and does\n * not flicker back to a disconnected UI. Because a pop-up cannot be reopened without a user gesture, the next\n * signing request reopens it from the caller's click. `disconnect` is only emitted when the close actually\n * interrupted work (a request was pending) or when the wallet itself announced the disconnect.\n */\n function handlePopupClosed(): void {\n const hadPending = pending.size > 0;\n stopClosePolling();\n const closedPopup = popup;\n popup = null;\n popupReady = false;\n const closedReady = ready;\n ready = createDeferred<void>();\n const error = disconnectedError();\n if (closedPopup) closedReady.reject(error);\n rejectAllPending(error);\n const shouldEmit = hadPending || walletDisconnected;\n walletDisconnected = false;\n if (shouldEmit) emit(\"disconnect\", error);\n }\n\n /**\n * Open the pop-up, or focus and reuse it when it is still around. Must stay synchronous (it is called before\n * any `await` in `request`) so it runs inside the caller's user activation.\n */\n function openPopup(): Window | null {\n if (popup && !popup.closed) {\n popup.focus();\n return popup;\n }\n if (typeof window === \"undefined\") return null;\n const opened = window.open(\n connectUrl(options.walletUrl, window.location.origin, options.signIn, currentChainId()),\n POPUP_NAME,\n popupFeatures,\n );\n if (!opened) return null;\n popup = opened;\n popupReady = false;\n ready = createDeferred<void>();\n walletDisconnected = false;\n startClosePolling();\n return opened;\n }\n\n function sendRequest(\n method: string,\n params: RequestArguments[\"params\"],\n sequence: number,\n ): Promise<unknown> {\n const active = popup;\n if (!active || active.closed) return Promise.reject(disconnectedError());\n const id = crypto.randomUUID();\n const message: RequestMessage = {\n type: `${MESSAGE_PREFIX}request`,\n v: PROTOCOL_VERSION,\n id,\n method,\n ...(params === undefined ? {} : { params }),\n };\n return new Promise<unknown>((resolve, reject) => {\n pending.set(id, { resolve, reject, sequence });\n active.postMessage(message, walletOrigin);\n });\n }\n\n function handleResponse(message: ResponseMessage): void {\n const request = pending.get(message.id);\n if (!request) return;\n pending.delete(message.id);\n endPreparedHolds(request.sequence);\n if (\"error\" in message) {\n request.reject(new ProviderRpcError(message.error.code, message.error.message, message.error.data));\n } else {\n request.resolve(message.result);\n }\n }\n\n function handleEventMessage(message: EventMessage): void {\n if (message.event === \"accountsChanged\") {\n accounts = [...message.data];\n emit(\"accountsChanged\", [...accounts]);\n return;\n }\n if (message.event === \"chainChanged\") {\n chainIdHex = message.data;\n emit(\"chainChanged\", chainIdHex);\n return;\n }\n walletDisconnected = true;\n emit(\"disconnect\", new ProviderRpcError(message.data.code, message.data.message, message.data.data));\n }\n\n function handleSecurityMessage(message: SecurityMessage): void {\n lastSecurity = {\n protection: message.data.protection,\n passkeys: message.data.passkeys,\n authenticatorApps: message.data.authenticatorApps,\n };\n emit(\"assetera_security\", lastSecurity);\n }\n\n /** A copy of a list of named accounts, so callers never get the provider's own list. */\n function copyAccountNames(accounts: readonly WalletAccountName[]): WalletAccountName[] {\n return accounts.map((account) => ({ address: account.address, name: account.name }));\n }\n\n function handleAccountsMessage(message: AccountsMessage): void {\n lastAccountNameList = copyAccountNames(message.data);\n emit(\"assetera_accounts\", copyAccountNames(lastAccountNameList));\n }\n\n function onWindowMessage(event: MessageEvent): void {\n if (event.origin !== walletOrigin) return;\n if (popup === null || (event.source as unknown) !== popup) return;\n const data: unknown = event.data;\n if (isReadyMessage(data)) {\n popupReady = true;\n // A re-opened pop-up needs the hold again; the message is idempotent.\n if (holds.size > 0) postHold(true);\n ready.resolve(undefined);\n return;\n }\n if (isResponseMessage(data)) {\n handleResponse(data);\n return;\n }\n if (isSecurityMessage(data)) {\n handleSecurityMessage(data);\n return;\n }\n if (isAccountsMessage(data)) {\n handleAccountsMessage(data);\n return;\n }\n if (isEventMessage(data)) handleEventMessage(data);\n }\n\n if (typeof window !== \"undefined\") window.addEventListener(\"message\", onWindowMessage);\n\n function request({ method, params }: RequestArguments): Promise<unknown> {\n if (typeof window === \"undefined\") {\n return Promise.reject(\n new ProviderRpcError(\n RpcErrorCode.Disconnected,\n \"The Assetera Wallet provider can only run in a browser.\",\n ),\n );\n }\n // Read-only chain calls go through wagmi's own transports; the pop-up refuses everything else.\n if (!isSupportedMethod(method)) {\n return Promise.reject(\n new ProviderRpcError(\n RpcErrorCode.UnsupportedMethod,\n `The Assetera Wallet pop-up does not support the method \"${method}\".`,\n ),\n );\n }\n // Answered locally, without a pop-up, so wagmi can read the connection before the user clicks.\n if (method === \"eth_accounts\") return Promise.resolve([...accounts]);\n if (method === \"eth_chainId\") return Promise.resolve(currentChainId());\n\n // Opening the pop-up MUST happen synchronously, before the first `await`, to stay in the click.\n if (method === \"eth_requestAccounts\") {\n requestsSent += 1;\n const sequence = requestsSent;\n const active = openPopup();\n if (!active) return Promise.reject(blockedError());\n return ready.promise\n .then(() => sendRequest(\"eth_requestAccounts\", params, sequence))\n .then((result) => {\n accounts = Array.isArray(result) ? (result as string[]) : [];\n emit(\"accountsChanged\", [...accounts]);\n emit(\"connect\", { chainId: currentChainId() });\n return [...accounts];\n });\n }\n\n // Every other supported method needs an approved connection.\n if (accounts.length === 0) {\n return Promise.reject(\n new ProviderRpcError(\n RpcErrorCode.Unauthorized,\n \"Connect to the Assetera Wallet first (eth_requestAccounts).\",\n ),\n );\n }\n requestsSent += 1;\n const sequence = requestsSent;\n const active = openPopup();\n if (!active) return Promise.reject(blockedError());\n if (SIGNING_METHODS.has(method)) active.focus();\n return ready.promise.then(() => sendRequest(method, params, sequence));\n }\n\n function disconnect(): void {\n const active = popup;\n if (active && !active.closed) {\n const message: DisconnectMessage = {\n type: `${MESSAGE_PREFIX}disconnect`,\n v: PROTOCOL_VERSION,\n };\n active.postMessage(message, walletOrigin);\n active.close();\n }\n stopClosePolling();\n popup = null;\n popupReady = false;\n // The pop-up is gone; a hold would only be needed by a new pop-up, and the caller will open one itself.\n holds.clear();\n preparedHolds.clear();\n const closedReady = ready;\n ready = createDeferred<void>();\n closedReady.reject(disconnectedError(\"Disconnected from the Assetera Wallet.\"));\n rejectAllPending(disconnectedError(\"Disconnected from the Assetera Wallet.\"));\n accounts = [];\n chainIdHex = null;\n walletDisconnected = false;\n emit(\"disconnect\", disconnectedError(\"Disconnected from the Assetera Wallet.\"));\n }\n\n function prepareSigning(): PreparedSigning {\n const existed = popup !== null && !popup.closed;\n const active = typeof window === \"undefined\" ? null : openPopup();\n if (!active) return { opened: false, release: () => {} };\n const sentAtPrepare = requestsSent;\n // The prepared handle holds the pop-up until its first request settles, or until `release()`.\n const token = Symbol(\"assetera-wallet-prepare\");\n preparedHolds.set(token, sentAtPrepare);\n addHold(token);\n let released = false;\n return {\n opened: true,\n release() {\n if (released) return;\n released = true;\n preparedHolds.delete(token);\n const emptied = removeHold(token);\n // Only a pop-up this call opened, still open, with nothing sent or waiting since, and no other hold.\n const canClose =\n emptied &&\n !existed &&\n popup === active &&\n !active.closed &&\n requestsSent === sentAtPrepare &&\n pending.size === 0;\n if (canClose) {\n active.close();\n handlePopupClosed();\n return;\n }\n if (emptied) postHold(false);\n },\n };\n }\n\n function holdPopup(): PopupHold {\n const existed = popup !== null && !popup.closed;\n const active = typeof window === \"undefined\" ? null : openPopup();\n if (!active) return { opened: false, release: () => {} };\n const token = Symbol(\"assetera-wallet-hold\");\n const sentAtHold = requestsSent;\n // Adding the first token sends `hold: true` now when the pop-up is ready, otherwise in the `ready` handler.\n addHold(token);\n let released = false;\n return {\n opened: true,\n release() {\n if (released) return;\n released = true;\n const emptied = removeHold(token);\n // Only a pop-up this call opened, still open, with nothing sent or waiting since, and no other hold.\n const canClose =\n emptied &&\n !existed &&\n popup === active &&\n !active.closed &&\n requestsSent === sentAtHold &&\n pending.size === 0;\n if (canClose) {\n active.close();\n handlePopupClosed();\n return;\n }\n if (emptied) postHold(false);\n },\n };\n }\n\n function on(event: ProviderEvent, listener: ProviderListener): void {\n addListener(event, listener);\n }\n\n function removeListener(event: ProviderEvent, listener: ProviderListener): void {\n removeEventListener(event, listener);\n }\n\n /** The last security status a pop-up reported, kept even after the pop-up closed. */\n function lastSecurityStatus(): WalletSecurityStatus | undefined {\n return lastSecurity;\n }\n\n /** The last account names a pop-up reported, kept even after the pop-up closed. */\n function lastAccountNames(): WalletAccountName[] | undefined {\n return lastAccountNameList === undefined ? undefined : copyAccountNames(lastAccountNameList);\n }\n\n return {\n request,\n on,\n removeListener,\n disconnect,\n lastSecurityStatus,\n lastAccountNames,\n prepareSigning,\n holdPopup,\n };\n}\n"]}
package/dist/index.cjs CHANGED
@@ -110,11 +110,12 @@ function isOnboardCancelledMessage(value) {
110
110
  function isCaip2EvmChain(value) {
111
111
  return /^eip155:\d{1,32}$/.test(value);
112
112
  }
113
- function connectUrl(walletUrl, partnerOrigin, signIn) {
113
+ function connectUrl(walletUrl, partnerOrigin, signIn, chainId) {
114
114
  const url = new URL(CONNECT_PATH, walletUrl);
115
115
  url.searchParams.set("origin", partnerOrigin);
116
116
  url.searchParams.set("v", String(PROTOCOL_VERSION));
117
117
  if (signIn !== void 0) url.searchParams.set("signIn", signIn);
118
+ if (chainId !== void 0) url.searchParams.set("chainId", chainId);
118
119
  return url.toString();
119
120
  }
120
121
  function onboardUrl(walletUrl, partnerOrigin, options) {
@@ -290,7 +291,7 @@ function createAsseteraWalletProvider(options) {
290
291
  }
291
292
  if (typeof window === "undefined") return null;
292
293
  const opened = window.open(
293
- connectUrl(options.walletUrl, window.location.origin, options.signIn),
294
+ connectUrl(options.walletUrl, window.location.origin, options.signIn, currentChainId()),
294
295
  POPUP_NAME,
295
296
  popupFeatures
296
297
  );