@miden-sdk/miden-wallet-adapter-miden 0.17.3 → 0.17.5

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/AGENTS.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @miden-sdk/miden-wallet-adapter-miden - Agent Guide
2
2
 
3
- **Audience: AI coding agents** connecting an app to the Bread wallet browser
4
- extension.
3
+ **Audience: AI coding agents** connecting an app to the Bread wallet: the
4
+ browser extension on desktop, or the Bread app from a phone browser.
5
5
 
6
6
  This file ships inside the published package, so the copy at
7
7
  `node_modules/@miden-sdk/miden-wallet-adapter-miden/AGENTS.md` matches the
@@ -18,8 +18,9 @@ resolves with no extra install.
18
18
  ## What this package is
19
19
 
20
20
  One concrete adapter, `MidenWalletAdapter`, plus the `MidenWallet` interface
21
- it expects the extension to inject and a conformance suite for checking a
22
- provider against that interface.
21
+ it expects the extension to inject, `BREAD_OPEN_LINK_BASE` and
22
+ `getBreadOpenLink()` for handing a page to the Bread app, and a conformance
23
+ suite for checking a provider against that interface.
23
24
 
24
25
  ```ts
25
26
  import { MidenWalletAdapter } from "@miden-sdk/miden-wallet-adapter-miden";
@@ -30,7 +31,9 @@ export const wallets = [new MidenWalletAdapter({ appName: "My dApp" })];
30
31
  ```
31
32
 
32
33
  `MidenWalletName` is the branded name (`"Bread Wallet"`) the React providers
33
- and the wallet modal select on. `adapter.url` is the extension's Chrome Web
34
+ and the wallet modal select on. `adapter.url` follows `readyState`: while
35
+ `Loadable` it is the Open in Bread link for the current page,
36
+ `getBreadOpenLink()`; in every other state it is the extension's Chrome Web
34
37
  Store listing, which the providers open on a connect without it installed.
35
38
 
36
39
  ## How detection works
@@ -41,12 +44,40 @@ Detection runs immediately, once a second, on `DOMContentLoaded` and on
41
44
  before the extension injects starts at `NotDetected` and flips to `Installed`
42
45
  about a second later: render from `readyState`, not from a check at mount.
43
46
 
47
+ In a phone browser with nothing injected, the adapter starts at `Loadable`
48
+ instead. That covers an iPhone, iPad or iPod user agent, a Mac user agent with
49
+ more than one touch point (iPadOS asks for desktop sites by default) and an
50
+ Android one, in a browser with the User Activation API
51
+ (`navigator.userActivation`): the handoff needs to know a tap started it, so
52
+ without the API the adapter stays at `NotDetected`. Detection keeps running,
53
+ so it still moves to `Installed` when the wallet appears. The Bread app's own
54
+ browser is the exception: it defines `window.bread` before any page script
55
+ runs and injects the wallet later, so there the adapter starts at
56
+ `NotDetected` and waits for the wallet.
57
+
44
58
  An adapter constructed where `window` or `document` is undefined is
45
59
  `Unsupported` **permanently** - the constructor decides once and never starts
46
60
  detection. Under SSR, construct adapters in a browser-only module.
47
61
 
48
62
  ## Behavior specific to this adapter
49
63
 
64
+ **While `Loadable`, `openInBread()` opens the page in Bread.** It navigates
65
+ the current tab to `getBreadOpenLink()`: `BREAD_OPEN_LINK_BASE` with the page
66
+ URL percent-encoded in the fragment, `#url=`, which browsers never send to a
67
+ server. The Bread app claims that link on iOS and
68
+ Android and opens the page in its own browser, where the wallet is injected
69
+ and a normal connect follows. Without the app, a web page loads instead.
70
+ `connect()` hands off the same way while `Loadable`, and its promise resolves
71
+ without connecting or throwing. Both look for the wallet first: if it was
72
+ injected since the last poll, `openInBread()` moves to `Installed` and emits
73
+ `readyStateChange` instead of navigating, and `connect()` connects. The OS
74
+ hands the link to the app only for a navigation the user's tap started, so
75
+ call `openInBread()` synchronously from the click handler, with no `await`
76
+ before it. Without an active tap, such as a dApp's own `connect()` on page
77
+ load, it does nothing, and a second call within a second of a handoff is
78
+ ignored. In any other state `openInBread()` does nothing. The providers'
79
+ `autoConnect` waits for `Installed`, so it never hands off.
80
+
50
81
  **A resolved request with no transaction id is a failure.** The wallet reports
51
82
  success as soon as it accepts a transaction into its queue. If it hands back
52
83
  no id, nothing was submitted, and the adapter throws `WalletTransactionError`
@@ -64,6 +95,13 @@ survived a park and restore gets its account back, at the cost of an unlock
64
95
  prompt if the wallet locked meanwhile. A failed disconnect arrives as a
65
96
  `WalletDisconnectionError` on the `error` event while the promise resolves.
66
97
 
98
+ **Account changes propagate through the normal adapter lifecycle.** After a
99
+ connection, the adapter follows the injected wallet's `accountChange` event.
100
+ Switching to another granted account updates `address` and `publicKey` and
101
+ emits `connect` again, so React consumers refresh in place. Switching to an
102
+ account without a grant, or revoking the current grant, clears those fields
103
+ and emits `disconnect`. Calling `disconnect()` removes the subscription.
104
+
67
105
  ## Checking a provider
68
106
 
69
107
  `createAccount` is on the published `MidenWallet` interface, but no known
package/dist/adapter.d.ts CHANGED
@@ -45,14 +45,21 @@ export interface MidenWallet extends EventEmitter<MidenWalletEvents> {
45
45
  export interface MidenWindow extends Window {
46
46
  midenWallet?: MidenWallet;
47
47
  miden?: MidenWallet;
48
+ bread?: unknown;
48
49
  }
49
50
  export interface MidenWalletAdapterConfig {
50
51
  appName?: string;
51
52
  }
52
53
  export declare const MidenWalletName: WalletName<"Bread Wallet">;
54
+ export declare const BREAD_OPEN_LINK_BASE = "https://bread.miden.xyz/open";
55
+ /**
56
+ * Link that opens `pageUrl` in the Bread app. The app claims it as an iOS
57
+ * universal link and Android app link; without the app it loads a web page.
58
+ * The page URL travels in the fragment, which browsers never send to a server.
59
+ */
60
+ export declare function getBreadOpenLink(pageUrl?: string): string;
53
61
  export declare class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
54
62
  name: WalletName<"Bread Wallet">;
55
- url: string;
56
63
  icon: string;
57
64
  readonly supportedTransactionVersions: any;
58
65
  private _connecting;
@@ -60,14 +67,18 @@ export declare class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
60
67
  private _address;
61
68
  private _publicKey;
62
69
  private _privateDataPermission;
70
+ private readonly _handleAccountChange;
63
71
  private _readyState;
72
+ private _breadHandoffAt;
64
73
  constructor({ appName }?: MidenWalletAdapterConfig);
74
+ private detectWallet;
65
75
  get address(): string;
66
76
  get publicKey(): Uint8Array<ArrayBufferLike>;
67
77
  get privateDataPermission(): string;
68
78
  get connecting(): boolean;
69
79
  get readyState(): WalletReadyState;
70
80
  set readyState(readyState: WalletReadyState);
81
+ get url(): string;
71
82
  /**
72
83
  * The wallet reports "success" as soon as a transaction is ACCEPTED into its
73
84
  * queue, not when it lands on chain — so a resolved call with no `transactionId`
@@ -88,6 +99,14 @@ export declare class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
88
99
  requestConsumableNotes(): Promise<InputNoteDetails[]>;
89
100
  waitForTransaction(txId: string, timeout?: number): Promise<TransactionOutput>;
90
101
  createAccount(params?: CreateAccountParams): Promise<string>;
102
+ /**
103
+ * Opens the current page in the Bread app, from a tap handler while
104
+ * `readyState` is `Loadable`. If the wallet was injected since the last
105
+ * poll, moves to `Installed` and emits `readyStateChange` instead. In any
106
+ * other state it does nothing.
107
+ */
108
+ openInBread(): void;
109
+ private handOffToBread;
91
110
  connect(privateDataPermission: PrivateDataPermission, network: WalletAdapterNetwork, allowedPrivateData?: AllowedPrivateData): Promise<void>;
92
111
  disconnect(): Promise<void>;
93
112
  }
package/dist/adapter.js CHANGED
@@ -1,9 +1,25 @@
1
1
  import { Note } from "@miden-sdk/miden-sdk";
2
2
  import { BaseMessageSignerWalletAdapter, scopePollingDetectionStrategy, WalletConnectionError, WalletDisconnectionError, WalletNotConnectedError, WalletNotReadyError, WalletReadyState, PrivateDataPermission, TransactionType, WalletTransactionError, b64ToU8, } from "@miden-sdk/miden-wallet-adapter-base";
3
3
  export const MidenWalletName = "Bread Wallet";
4
+ export const BREAD_OPEN_LINK_BASE = "https://bread.miden.xyz/open";
5
+ /**
6
+ * Link that opens `pageUrl` in the Bread app. The app claims it as an iOS
7
+ * universal link and Android app link; without the app it loads a web page.
8
+ * The page URL travels in the fragment, which browsers never send to a server.
9
+ */
10
+ export function getBreadOpenLink(pageUrl = window.location.href) {
11
+ return `${BREAD_OPEN_LINK_BASE}#url=${encodeURIComponent(pageUrl)}`;
12
+ }
13
+ const BREAD_EXTENSION_URL = "https://chromewebstore.google.com/detail/Bread/coajhopfooegmaifelglfboehacldcbo";
14
+ const BREAD_HANDOFF_DEBOUNCE_MS = 1000;
15
+ function isMobileBrowser() {
16
+ const { userAgent, maxTouchPoints } = navigator;
17
+ return (/iPhone|iPad|iPod|Android/.test(userAgent) ||
18
+ // iPadOS asks for desktop sites by default and then sends a Mac user agent.
19
+ (userAgent.includes("Macintosh") && maxTouchPoints > 1));
20
+ }
4
21
  export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
5
22
  name = MidenWalletName;
6
- url = "https://chromewebstore.google.com/detail/Bread/coajhopfooegmaifelglfboehacldcbo";
7
23
  icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjExIiBoZWlnaHQ9IjIxNCIgdmlld0JveD0iMCAwIDIxMSAyMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xMDcuNDQgMC4xMjE3NjJDMTIxLjk5IC0wLjkwOTY1MiAxMzQuNzMzIDQuNjc0NjMgMTQ1LjE1NyAxNC40NzYxQzE4My41NjQgLTQuNjYzMDMgMjIyLjk2NSAzNS40NDAxIDIwNi4zNTIgNzMuOTk5MUMyMDQuNzcyIDEwMy4wMDcgMjA4LjUwNyAxMzQuMzIyIDIwNi4zOTUgMTYzLjA1NUMyMDUuNjAyIDE3My43OSAyMDAuMTgyIDE4Mi4yODUgMTkxLjkzNyAxODguODRDMTc5LjgyMiAxOTguNDY1IDE1Ny41MSAyMTEuNzUxIDE0Mi4wNTcgMjEyLjc1MkMxMDEuMzk4IDIxNS4zODggNTcuOTI2NCAyMTAuNjk1IDE2Ljk2ODkgMjEyLjc1MkM2LjQxMDYzIDIxMS45NjUgMS41NzA5MyAyMDUuNTE0IDAuODA4MDQ2IDE5NS4zN0MyLjc5NzY0IDE1NS44MzUgLTEuNzYxMzMgMTEzLjg0NiAwLjgwODA0NiA3NC41OTcyQzMuMjA2NTQgMzcuODgxMyA0MC4wNTY3IC0xLjcwMzA1IDc5LjA4NTcgMTIuNjUxM0M4Ni45MDk4IDUuNTcxNzggOTYuNzk2NyAwLjg3MjQzMSAxMDcuNDQ3IDAuMTE1NjUzTDEwNy40NCAwLjEyMTc2MlpNMTE2LjcxNyAxMjguNTk3QzEzNi45NDIgMTIzLjkyMiAxNDQuMDc3IDk5LjQ3OTMgMTM2LjUyMSA4MS42NTIzQzEzMC45MDcgNjguNDAyNiAxMTcuNDc0IDYxLjgxMTMgMTAzLjYyNiA2MC44ODM3Qzc5LjI3NDkgNTkuMjU0MiA1My4xMjk1IDYyLjE0NyAyOC41ODkxIDYwLjkxNDJDMTguNzAyMiA2Mi4zNDIzIDEwLjQ1MDkgNjcuOTY5MyA4Ljc2MDMzIDc4LjI4MzRMOS4xNzUzIDE5Ny4zNzhDMTAuNTA1OCAyMDAuOTQ5IDEzLjcyODIgMjAzLjgwNSAxNy42MDk3IDIwNC4xODlDNDcuNjE4NCAyMDIuNTIzIDgwLjAwMTEgMjA2LjQwNSAxMDkuNzI5IDIwNC4yMTRDMTQ2LjI2OCAyMDEuNTIyIDE1Ny4wMDkgMTUyLjU2NCAxMjcuNDk1IDEzMy4zNjNMMTE2LjcyMyAxMjguNTk3SDExNi43MTdaIiBmaWxsPSIjRTc3NTM3Ii8+CjxwYXRoIGQ9Ik0xMTYuNzE3IDEyOC41OTdDMTM2Ljk0MiAxMjMuOTIyIDE0NC4wNzcgOTkuNDc5MyAxMzYuNTIxIDgxLjY1MjNDMTMwLjkwNyA2OC40MDI2IDExNy40NzQgNjEuODExMyAxMDMuNjI2IDYwLjg4MzdDNzkuMjc0OSA1OS4yNTQyIDUzLjEyOTUgNjIuMTQ3IDI4LjU4OTEgNjAuOTE0MkMxOC43MDIyIDYyLjM0MjMgMTAuNDUwOSA2Ny45NjkzIDguNzYwMzMgNzguMjgzNEw5LjE3NTMgMTk3LjM3OEMxMC41MDU4IDIwMC45NDkgMTMuNzI4MiAyMDMuODA1IDE3LjYwOTcgMjA0LjE4OUM0Ny42MTg0IDIwMi41MjMgODAuMDAxMSAyMDYuNDA1IDEwOS43MjkgMjA0LjIxNEMxNDYuMjY4IDIwMS41MjIgMTU3LjAwOSAxNTIuNTY0IDEyNy40OTUgMTMzLjM2M0wxMTYuNzIzIDEyOC41OTdIMTE2LjcxN1oiIGZpbGw9IiNGRkZGRkYiLz4KPC9zdmc+Cg==";
8
24
  supportedTransactionVersions = null;
9
25
  _connecting;
@@ -11,9 +27,28 @@ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
11
27
  _address;
12
28
  _publicKey;
13
29
  _privateDataPermission;
30
+ // Providers update these fields before emitting accountChange. Reuse the
31
+ // adapter's connect/disconnect events so every existing consumer refreshes.
32
+ _handleAccountChange = () => {
33
+ const wallet = this._wallet;
34
+ if (!wallet)
35
+ return;
36
+ if (!wallet.address) {
37
+ wallet.off("accountChange", this._handleAccountChange);
38
+ this._wallet = null;
39
+ this._address = null;
40
+ this._publicKey = null;
41
+ this.emit("disconnect");
42
+ return;
43
+ }
44
+ this._address = wallet.address;
45
+ this._publicKey = wallet.publicKey ?? null;
46
+ this.emit("connect", this._address);
47
+ };
14
48
  _readyState = typeof window === "undefined" || typeof document === "undefined"
15
49
  ? WalletReadyState.Unsupported
16
50
  : WalletReadyState.NotDetected;
51
+ _breadHandoffAt = 0;
17
52
  constructor({ appName = "sample" } = {}) {
18
53
  super();
19
54
  this._connecting = false;
@@ -22,16 +57,24 @@ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
22
57
  this._publicKey = null;
23
58
  this._privateDataPermission = PrivateDataPermission.UponRequest;
24
59
  if (this._readyState !== WalletReadyState.Unsupported) {
25
- scopePollingDetectionStrategy(() => {
26
- if (window?.midenWallet || window?.miden) {
27
- this._readyState = WalletReadyState.Installed;
28
- this.emit("readyStateChange", this._readyState);
29
- return true;
30
- }
31
- return false;
32
- });
60
+ // Bread's own browser defines window.bread before any page script runs
61
+ // and injects the wallet later, so a page there waits for the wallet. A
62
+ // browser without the User Activation API can't report the tap that the
63
+ // handoff needs.
64
+ if (isMobileBrowser() && !window.bread && navigator.userActivation)
65
+ this._readyState = WalletReadyState.Loadable;
66
+ scopePollingDetectionStrategy(() => this.detectWallet());
33
67
  }
34
68
  }
69
+ detectWallet() {
70
+ if (this._readyState === WalletReadyState.Installed)
71
+ return true;
72
+ if (!window.midenWallet && !window.miden)
73
+ return false;
74
+ this._readyState = WalletReadyState.Installed;
75
+ this.emit("readyStateChange", this._readyState);
76
+ return true;
77
+ }
35
78
  get address() {
36
79
  return this._address;
37
80
  }
@@ -50,6 +93,11 @@ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
50
93
  set readyState(readyState) {
51
94
  this._readyState = readyState;
52
95
  }
96
+ get url() {
97
+ return this._readyState === WalletReadyState.Loadable
98
+ ? getBreadOpenLink()
99
+ : BREAD_EXTENSION_URL;
100
+ }
53
101
  /**
54
102
  * The wallet reports "success" as soon as a transaction is ACCEPTED into its
55
103
  * queue, not when it lands on chain — so a resolved call with no `transactionId`
@@ -278,6 +326,32 @@ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
278
326
  throw error;
279
327
  }
280
328
  }
329
+ /**
330
+ * Opens the current page in the Bread app, from a tap handler while
331
+ * `readyState` is `Loadable`. If the wallet was injected since the last
332
+ * poll, moves to `Installed` and emits `readyStateChange` instead. In any
333
+ * other state it does nothing.
334
+ */
335
+ openInBread() {
336
+ if (this._readyState !== WalletReadyState.Loadable)
337
+ return;
338
+ if (!this.detectWallet())
339
+ this.handOffToBread();
340
+ }
341
+ handOffToBread() {
342
+ // iOS and Android hand the link to Bread only for a navigation the user's
343
+ // tap started: this must run before connect() awaits anything, and is
344
+ // skipped without an active tap (a dApp's own connect() on load would just
345
+ // bounce to the fallback page on every visit). A double tap would navigate
346
+ // twice, hence the debounce.
347
+ if (!navigator.userActivation?.isActive)
348
+ return;
349
+ const now = Date.now();
350
+ if (now - this._breadHandoffAt < BREAD_HANDOFF_DEBOUNCE_MS)
351
+ return;
352
+ this._breadHandoffAt = now;
353
+ window.location.assign(getBreadOpenLink());
354
+ }
281
355
  async connect(privateDataPermission, network, allowedPrivateData) {
282
356
  try {
283
357
  // Guard only against a *concurrent* connect — NOT against being
@@ -298,6 +372,11 @@ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
298
372
  // to hand back the account.)
299
373
  if (this.connecting)
300
374
  return;
375
+ if (this._readyState === WalletReadyState.Loadable &&
376
+ !this.detectWallet()) {
377
+ this.handOffToBread();
378
+ return;
379
+ }
301
380
  if (this._readyState !== WalletReadyState.Installed)
302
381
  throw new WalletNotReadyError();
303
382
  this._connecting = true;
@@ -314,7 +393,9 @@ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
314
393
  catch (error) {
315
394
  throw new WalletConnectionError(error?.message, error);
316
395
  }
396
+ this._wallet?.off("accountChange", this._handleAccountChange);
317
397
  this._wallet = wallet;
398
+ wallet.on("accountChange", this._handleAccountChange);
318
399
  this._privateDataPermission = privateDataPermission;
319
400
  this.emit("connect", this._address);
320
401
  }
@@ -329,6 +410,7 @@ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
329
410
  async disconnect() {
330
411
  const wallet = this._wallet;
331
412
  if (wallet) {
413
+ wallet.off("accountChange", this._handleAccountChange);
332
414
  this._wallet = null;
333
415
  this._address = null;
334
416
  this._publicKey = null;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Note, type NoteFilterTypes } from \"@miden-sdk/miden-sdk\";\nimport {\n AllowedPrivateData,\n BaseMessageSignerWalletAdapter,\n EventEmitter,\n scopePollingDetectionStrategy,\n SignKind,\n WalletConnectionError,\n WalletDisconnectionError,\n WalletName,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletReadyState,\n PrivateDataPermission,\n WalletAdapterNetwork,\n MidenSendTransaction,\n MidenTransaction,\n MidenConsumeTransaction,\n TransactionType,\n WalletTransactionError,\n Asset,\n GuardianInfo,\n CreateAccountParams,\n InputNoteDetails,\n TransactionOutput,\n WalletTransactionOutput,\n b64ToU8,\n} from \"@miden-sdk/miden-wallet-adapter-base\";\n\nexport interface MidenWalletEvents {\n connect(...args: unknown[]): unknown;\n disconnect(...args: unknown[]): unknown;\n accountChange(...args: unknown[]): unknown;\n}\n\nexport interface MidenWallet extends EventEmitter<MidenWalletEvents> {\n address?: string;\n publicKey?: Uint8Array;\n requestSend(\n transaction: MidenSendTransaction\n ): Promise<{ transactionId?: string }>;\n requestConsume(\n transaction: MidenConsumeTransaction\n ): Promise<{ transactionId?: string }>;\n requestTransaction(\n transaction: MidenTransaction\n ): Promise<{ transactionId?: string }>;\n requestAssets(): Promise<{ assets: Asset[] }>;\n requestGuardianInfo(): Promise<{ guardianInfo: GuardianInfo }>;\n requestPrivateNotes(\n noteFilterType: NoteFilterTypes,\n noteIds?: string[]\n ): Promise<{\n privateNotes: InputNoteDetails[];\n }>;\n waitForTransaction(\n txId: string,\n timeout?: number\n ): Promise<WalletTransactionOutput>;\n signBytes(\n message: Uint8Array,\n kind: SignKind\n ): Promise<{ signature: Uint8Array }>;\n importPrivateNote(note: Uint8Array): Promise<{ noteId: string }>;\n requestConsumableNotes(): Promise<{ consumableNotes: InputNoteDetails[] }>;\n createAccount(params?: CreateAccountParams): Promise<{ accountId: string }>;\n connect(\n privateDataPermission: PrivateDataPermission,\n network: WalletAdapterNetwork,\n allowedPrivateData?: AllowedPrivateData\n ): Promise<void>;\n disconnect(): Promise<void>;\n}\n\nexport interface MidenWindow extends Window {\n midenWallet?: MidenWallet;\n miden?: MidenWallet;\n}\n\ndeclare const window: MidenWindow;\n\nexport interface MidenWalletAdapterConfig {\n appName?: string;\n}\n\nexport const MidenWalletName = \"Bread Wallet\" as WalletName<\"Bread Wallet\">;\n\nexport class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {\n name = MidenWalletName;\n url =\n \"https://chromewebstore.google.com/detail/Bread/coajhopfooegmaifelglfboehacldcbo\";\n icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjExIiBoZWlnaHQ9IjIxNCIgdmlld0JveD0iMCAwIDIxMSAyMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xMDcuNDQgMC4xMjE3NjJDMTIxLjk5IC0wLjkwOTY1MiAxMzQuNzMzIDQuNjc0NjMgMTQ1LjE1NyAxNC40NzYxQzE4My41NjQgLTQuNjYzMDMgMjIyLjk2NSAzNS40NDAxIDIwNi4zNTIgNzMuOTk5MUMyMDQuNzcyIDEwMy4wMDcgMjA4LjUwNyAxMzQuMzIyIDIwNi4zOTUgMTYzLjA1NUMyMDUuNjAyIDE3My43OSAyMDAuMTgyIDE4Mi4yODUgMTkxLjkzNyAxODguODRDMTc5LjgyMiAxOTguNDY1IDE1Ny41MSAyMTEuNzUxIDE0Mi4wNTcgMjEyLjc1MkMxMDEuMzk4IDIxNS4zODggNTcuOTI2NCAyMTAuNjk1IDE2Ljk2ODkgMjEyLjc1MkM2LjQxMDYzIDIxMS45NjUgMS41NzA5MyAyMDUuNTE0IDAuODA4MDQ2IDE5NS4zN0MyLjc5NzY0IDE1NS44MzUgLTEuNzYxMzMgMTEzLjg0NiAwLjgwODA0NiA3NC41OTcyQzMuMjA2NTQgMzcuODgxMyA0MC4wNTY3IC0xLjcwMzA1IDc5LjA4NTcgMTIuNjUxM0M4Ni45MDk4IDUuNTcxNzggOTYuNzk2NyAwLjg3MjQzMSAxMDcuNDQ3IDAuMTE1NjUzTDEwNy40NCAwLjEyMTc2MlpNMTE2LjcxNyAxMjguNTk3QzEzNi45NDIgMTIzLjkyMiAxNDQuMDc3IDk5LjQ3OTMgMTM2LjUyMSA4MS42NTIzQzEzMC45MDcgNjguNDAyNiAxMTcuNDc0IDYxLjgxMTMgMTAzLjYyNiA2MC44ODM3Qzc5LjI3NDkgNTkuMjU0MiA1My4xMjk1IDYyLjE0NyAyOC41ODkxIDYwLjkxNDJDMTguNzAyMiA2Mi4zNDIzIDEwLjQ1MDkgNjcuOTY5MyA4Ljc2MDMzIDc4LjI4MzRMOS4xNzUzIDE5Ny4zNzhDMTAuNTA1OCAyMDAuOTQ5IDEzLjcyODIgMjAzLjgwNSAxNy42MDk3IDIwNC4xODlDNDcuNjE4NCAyMDIuNTIzIDgwLjAwMTEgMjA2LjQwNSAxMDkuNzI5IDIwNC4yMTRDMTQ2LjI2OCAyMDEuNTIyIDE1Ny4wMDkgMTUyLjU2NCAxMjcuNDk1IDEzMy4zNjNMMTE2LjcyMyAxMjguNTk3SDExNi43MTdaIiBmaWxsPSIjRTc3NTM3Ii8+CjxwYXRoIGQ9Ik0xMTYuNzE3IDEyOC41OTdDMTM2Ljk0MiAxMjMuOTIyIDE0NC4wNzcgOTkuNDc5MyAxMzYuNTIxIDgxLjY1MjNDMTMwLjkwNyA2OC40MDI2IDExNy40NzQgNjEuODExMyAxMDMuNjI2IDYwLjg4MzdDNzkuMjc0OSA1OS4yNTQyIDUzLjEyOTUgNjIuMTQ3IDI4LjU4OTEgNjAuOTE0MkMxOC43MDIyIDYyLjM0MjMgMTAuNDUwOSA2Ny45NjkzIDguNzYwMzMgNzguMjgzNEw5LjE3NTMgMTk3LjM3OEMxMC41MDU4IDIwMC45NDkgMTMuNzI4MiAyMDMuODA1IDE3LjYwOTcgMjA0LjE4OUM0Ny42MTg0IDIwMi41MjMgODAuMDAxMSAyMDYuNDA1IDEwOS43MjkgMjA0LjIxNEMxNDYuMjY4IDIwMS41MjIgMTU3LjAwOSAxNTIuNTY0IDEyNy40OTUgMTMzLjM2M0wxMTYuNzIzIDEyOC41OTdIMTE2LjcxN1oiIGZpbGw9IiNGRkZGRkYiLz4KPC9zdmc+Cg==\";\n readonly supportedTransactionVersions = null;\n\n private _connecting: boolean;\n private _wallet: MidenWallet | null;\n private _address: string | null;\n private _publicKey: Uint8Array | null;\n private _privateDataPermission: string;\n private _readyState: WalletReadyState =\n typeof window === \"undefined\" || typeof document === \"undefined\"\n ? WalletReadyState.Unsupported\n : WalletReadyState.NotDetected;\n\n constructor({ appName = \"sample\" }: MidenWalletAdapterConfig = {}) {\n super();\n this._connecting = false;\n this._wallet = null;\n this._address = null;\n this._publicKey = null;\n this._privateDataPermission = PrivateDataPermission.UponRequest;\n\n if (this._readyState !== WalletReadyState.Unsupported) {\n scopePollingDetectionStrategy(() => {\n if (window?.midenWallet || window?.miden) {\n this._readyState = WalletReadyState.Installed;\n this.emit(\"readyStateChange\", this._readyState);\n return true;\n }\n return false;\n });\n }\n }\n\n get address() {\n return this._address;\n }\n\n get publicKey() {\n return this._publicKey;\n }\n\n get privateDataPermission() {\n return this._privateDataPermission;\n }\n\n get connecting() {\n return this._connecting;\n }\n\n get readyState() {\n return this._readyState;\n }\n\n set readyState(readyState) {\n this._readyState = readyState;\n }\n\n /**\n * The wallet reports \"success\" as soon as a transaction is ACCEPTED into its\n * queue, not when it lands on chain — so a resolved call with no `transactionId`\n * means the transaction was never submitted. Returning that as `undefined`\n * (the old `result.transactionId!` non-null assertion) made the dApp treat a\n * silent drop as success. Reject instead, so the dApp can surface it and\n * poll `waitForTransaction(txId)` for on-chain confirmation (0xMiden/wallet#314).\n */\n private requireTransactionId(result: { transactionId?: string }): string {\n if (!result?.transactionId) {\n throw new WalletTransactionError(\n \"The wallet returned no transaction id — the transaction was not submitted\"\n );\n }\n return result.transactionId;\n }\n\n async requestSend(transaction: MidenSendTransaction): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n let result: { transactionId?: string };\n try {\n result = await wallet.requestSend(transaction);\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n return this.requireTransactionId(result);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestConsume(transaction: MidenConsumeTransaction): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n let result: { transactionId?: string };\n try {\n result = await wallet.requestConsume(transaction);\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n return this.requireTransactionId(result);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestTransaction(transaction: MidenTransaction): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n let result: { transactionId?: string };\n try {\n // The wallet's generalized `requestTransaction` endpoint only accepts\n // a custom-transaction payload, so a `send`/`consume` transaction must\n // be routed to its dedicated endpoint — otherwise the wallet rejects\n // it with \"Invalid CustomTransaction payload\". Dispatching by `type`\n // here is what lets the typed `Transaction` / `TransactionType` API\n // (incl. `Transaction.createConsumeTransaction`) work for every type.\n switch (transaction.type) {\n case TransactionType.Send:\n result = await wallet.requestSend(\n transaction.payload as MidenSendTransaction\n );\n break;\n case TransactionType.Consume:\n result = await wallet.requestConsume(\n transaction.payload as MidenConsumeTransaction\n );\n break;\n default:\n // Custom transactions — and legacy callers that pass a bare\n // `CustomTransaction` payload — go through the generalized endpoint.\n result = await wallet.requestTransaction(transaction);\n break;\n }\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n return this.requireTransactionId(result);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestAssets(): Promise<Asset[]> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.requestAssets();\n return result.assets;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestGuardianInfo(): Promise<GuardianInfo> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.requestGuardianInfo();\n return result.guardianInfo;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestPrivateNotes(\n noteFilterType: NoteFilterTypes,\n noteIds?: string[]\n ): Promise<InputNoteDetails[]> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.requestPrivateNotes(\n noteFilterType,\n noteIds\n );\n return result.privateNotes;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async signBytes(message: Uint8Array, kind: SignKind): Promise<Uint8Array> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.signBytes(message, kind);\n return result.signature;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async importPrivateNote(note: Uint8Array): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n const result = await wallet.importPrivateNote(note);\n return result.noteId;\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestConsumableNotes(): Promise<InputNoteDetails[]> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n const result = await wallet.requestConsumableNotes();\n return result.consumableNotes;\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async waitForTransaction(\n txId: string,\n timeout?: number\n ): Promise<TransactionOutput> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n const result = await wallet.waitForTransaction(txId, timeout);\n if (\"errorMessage\" in result) {\n throw new WalletTransactionError(result.errorMessage);\n }\n const notes = result.outputNotes.map((serializedNote) => {\n const u8Arr = b64ToU8(serializedNote);\n return Note.deserialize(u8Arr);\n });\n return {\n txHash: result.txHash,\n outputNotes: notes,\n };\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async createAccount(params?: CreateAccountParams): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.createAccount(params);\n return result.accountId;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async connect(\n privateDataPermission: PrivateDataPermission,\n network: WalletAdapterNetwork,\n allowedPrivateData?: AllowedPrivateData\n ): Promise<void> {\n try {\n // Guard only against a *concurrent* connect — NOT against being\n // already connected. The in-app wallet browser preserves this\n // adapter's JS context across a park/restore (a dApp is minimized and\n // reopened without a page reload), so a re-opened dApp finds this\n // instance with `connected === true`. An early-return-when-connected\n // made a second connect() a silent no-op, so a re-mounted consumer\n // that re-subscribed to events never received its account back —\n // \"Connect Wallet works only once\" (0xMiden/wallet#470). Re-driving\n // the handshake below is cheap for the common case — the wallet\n // returns the current account for an existing permission without\n // re-prompting — and re-emits `connect`, so repeated connect() calls\n // repopulate the account instead of being suppressed by stale session\n // state. (If the wallet has since locked, the re-drive can surface an\n // unlock prompt where the old code was a silent no-op; that's the\n // intended trade-off — a locked wallet genuinely needs to be unlocked\n // to hand back the account.)\n if (this.connecting) return;\n if (this._readyState !== WalletReadyState.Installed)\n throw new WalletNotReadyError();\n\n this._connecting = true;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const wallet = window.midenWallet! || window.miden!;\n\n try {\n await wallet.connect(\n privateDataPermission,\n network,\n allowedPrivateData\n );\n if (!wallet.address) {\n throw new WalletConnectionError();\n }\n this._address = wallet.address;\n this._publicKey = wallet.publicKey!;\n } catch (error: any) {\n throw new WalletConnectionError(error?.message, error);\n }\n\n this._wallet = wallet;\n this._privateDataPermission = privateDataPermission;\n\n this.emit(\"connect\", this._address);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n } finally {\n this._connecting = false;\n }\n }\n\n async disconnect(): Promise<void> {\n const wallet = this._wallet;\n if (wallet) {\n this._wallet = null;\n this._address = null;\n this._publicKey = null;\n\n try {\n await wallet.disconnect();\n } catch (error: any) {\n this.emit(\"error\", new WalletDisconnectionError(error?.message, error));\n }\n }\n\n this.emit(\"disconnect\");\n }\n}\n"]}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Note, type NoteFilterTypes } from \"@miden-sdk/miden-sdk\";\nimport {\n AllowedPrivateData,\n BaseMessageSignerWalletAdapter,\n EventEmitter,\n scopePollingDetectionStrategy,\n SignKind,\n WalletConnectionError,\n WalletDisconnectionError,\n WalletName,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletReadyState,\n PrivateDataPermission,\n WalletAdapterNetwork,\n MidenSendTransaction,\n MidenTransaction,\n MidenConsumeTransaction,\n TransactionType,\n WalletTransactionError,\n Asset,\n GuardianInfo,\n CreateAccountParams,\n InputNoteDetails,\n TransactionOutput,\n WalletTransactionOutput,\n b64ToU8,\n} from \"@miden-sdk/miden-wallet-adapter-base\";\n\nexport interface MidenWalletEvents {\n connect(...args: unknown[]): unknown;\n disconnect(...args: unknown[]): unknown;\n accountChange(...args: unknown[]): unknown;\n}\n\nexport interface MidenWallet extends EventEmitter<MidenWalletEvents> {\n address?: string;\n publicKey?: Uint8Array;\n requestSend(\n transaction: MidenSendTransaction\n ): Promise<{ transactionId?: string }>;\n requestConsume(\n transaction: MidenConsumeTransaction\n ): Promise<{ transactionId?: string }>;\n requestTransaction(\n transaction: MidenTransaction\n ): Promise<{ transactionId?: string }>;\n requestAssets(): Promise<{ assets: Asset[] }>;\n requestGuardianInfo(): Promise<{ guardianInfo: GuardianInfo }>;\n requestPrivateNotes(\n noteFilterType: NoteFilterTypes,\n noteIds?: string[]\n ): Promise<{\n privateNotes: InputNoteDetails[];\n }>;\n waitForTransaction(\n txId: string,\n timeout?: number\n ): Promise<WalletTransactionOutput>;\n signBytes(\n message: Uint8Array,\n kind: SignKind\n ): Promise<{ signature: Uint8Array }>;\n importPrivateNote(note: Uint8Array): Promise<{ noteId: string }>;\n requestConsumableNotes(): Promise<{ consumableNotes: InputNoteDetails[] }>;\n createAccount(params?: CreateAccountParams): Promise<{ accountId: string }>;\n connect(\n privateDataPermission: PrivateDataPermission,\n network: WalletAdapterNetwork,\n allowedPrivateData?: AllowedPrivateData\n ): Promise<void>;\n disconnect(): Promise<void>;\n}\n\nexport interface MidenWindow extends Window {\n midenWallet?: MidenWallet;\n miden?: MidenWallet;\n bread?: unknown;\n}\n\ndeclare const window: MidenWindow;\n\nexport interface MidenWalletAdapterConfig {\n appName?: string;\n}\n\nexport const MidenWalletName = \"Bread Wallet\" as WalletName<\"Bread Wallet\">;\n\nexport const BREAD_OPEN_LINK_BASE = \"https://bread.miden.xyz/open\";\n\n/**\n * Link that opens `pageUrl` in the Bread app. The app claims it as an iOS\n * universal link and Android app link; without the app it loads a web page.\n * The page URL travels in the fragment, which browsers never send to a server.\n */\nexport function getBreadOpenLink(\n pageUrl: string = window.location.href\n): string {\n return `${BREAD_OPEN_LINK_BASE}#url=${encodeURIComponent(pageUrl)}`;\n}\n\nconst BREAD_EXTENSION_URL =\n \"https://chromewebstore.google.com/detail/Bread/coajhopfooegmaifelglfboehacldcbo\";\n\nconst BREAD_HANDOFF_DEBOUNCE_MS = 1000;\n\nfunction isMobileBrowser(): boolean {\n const { userAgent, maxTouchPoints } = navigator;\n return (\n /iPhone|iPad|iPod|Android/.test(userAgent) ||\n // iPadOS asks for desktop sites by default and then sends a Mac user agent.\n (userAgent.includes(\"Macintosh\") && maxTouchPoints > 1)\n );\n}\n\nexport class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {\n name = MidenWalletName;\n icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjExIiBoZWlnaHQ9IjIxNCIgdmlld0JveD0iMCAwIDIxMSAyMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xMDcuNDQgMC4xMjE3NjJDMTIxLjk5IC0wLjkwOTY1MiAxMzQuNzMzIDQuNjc0NjMgMTQ1LjE1NyAxNC40NzYxQzE4My41NjQgLTQuNjYzMDMgMjIyLjk2NSAzNS40NDAxIDIwNi4zNTIgNzMuOTk5MUMyMDQuNzcyIDEwMy4wMDcgMjA4LjUwNyAxMzQuMzIyIDIwNi4zOTUgMTYzLjA1NUMyMDUuNjAyIDE3My43OSAyMDAuMTgyIDE4Mi4yODUgMTkxLjkzNyAxODguODRDMTc5LjgyMiAxOTguNDY1IDE1Ny41MSAyMTEuNzUxIDE0Mi4wNTcgMjEyLjc1MkMxMDEuMzk4IDIxNS4zODggNTcuOTI2NCAyMTAuNjk1IDE2Ljk2ODkgMjEyLjc1MkM2LjQxMDYzIDIxMS45NjUgMS41NzA5MyAyMDUuNTE0IDAuODA4MDQ2IDE5NS4zN0MyLjc5NzY0IDE1NS44MzUgLTEuNzYxMzMgMTEzLjg0NiAwLjgwODA0NiA3NC41OTcyQzMuMjA2NTQgMzcuODgxMyA0MC4wNTY3IC0xLjcwMzA1IDc5LjA4NTcgMTIuNjUxM0M4Ni45MDk4IDUuNTcxNzggOTYuNzk2NyAwLjg3MjQzMSAxMDcuNDQ3IDAuMTE1NjUzTDEwNy40NCAwLjEyMTc2MlpNMTE2LjcxNyAxMjguNTk3QzEzNi45NDIgMTIzLjkyMiAxNDQuMDc3IDk5LjQ3OTMgMTM2LjUyMSA4MS42NTIzQzEzMC45MDcgNjguNDAyNiAxMTcuNDc0IDYxLjgxMTMgMTAzLjYyNiA2MC44ODM3Qzc5LjI3NDkgNTkuMjU0MiA1My4xMjk1IDYyLjE0NyAyOC41ODkxIDYwLjkxNDJDMTguNzAyMiA2Mi4zNDIzIDEwLjQ1MDkgNjcuOTY5MyA4Ljc2MDMzIDc4LjI4MzRMOS4xNzUzIDE5Ny4zNzhDMTAuNTA1OCAyMDAuOTQ5IDEzLjcyODIgMjAzLjgwNSAxNy42MDk3IDIwNC4xODlDNDcuNjE4NCAyMDIuNTIzIDgwLjAwMTEgMjA2LjQwNSAxMDkuNzI5IDIwNC4yMTRDMTQ2LjI2OCAyMDEuNTIyIDE1Ny4wMDkgMTUyLjU2NCAxMjcuNDk1IDEzMy4zNjNMMTE2LjcyMyAxMjguNTk3SDExNi43MTdaIiBmaWxsPSIjRTc3NTM3Ii8+CjxwYXRoIGQ9Ik0xMTYuNzE3IDEyOC41OTdDMTM2Ljk0MiAxMjMuOTIyIDE0NC4wNzcgOTkuNDc5MyAxMzYuNTIxIDgxLjY1MjNDMTMwLjkwNyA2OC40MDI2IDExNy40NzQgNjEuODExMyAxMDMuNjI2IDYwLjg4MzdDNzkuMjc0OSA1OS4yNTQyIDUzLjEyOTUgNjIuMTQ3IDI4LjU4OTEgNjAuOTE0MkMxOC43MDIyIDYyLjM0MjMgMTAuNDUwOSA2Ny45NjkzIDguNzYwMzMgNzguMjgzNEw5LjE3NTMgMTk3LjM3OEMxMC41MDU4IDIwMC45NDkgMTMuNzI4MiAyMDMuODA1IDE3LjYwOTcgMjA0LjE4OUM0Ny42MTg0IDIwMi41MjMgODAuMDAxMSAyMDYuNDA1IDEwOS43MjkgMjA0LjIxNEMxNDYuMjY4IDIwMS41MjIgMTU3LjAwOSAxNTIuNTY0IDEyNy40OTUgMTMzLjM2M0wxMTYuNzIzIDEyOC41OTdIMTE2LjcxN1oiIGZpbGw9IiNGRkZGRkYiLz4KPC9zdmc+Cg==\";\n readonly supportedTransactionVersions = null;\n\n private _connecting: boolean;\n private _wallet: MidenWallet | null;\n private _address: string | null;\n private _publicKey: Uint8Array | null;\n private _privateDataPermission: string;\n // Providers update these fields before emitting accountChange. Reuse the\n // adapter's connect/disconnect events so every existing consumer refreshes.\n private readonly _handleAccountChange = () => {\n const wallet = this._wallet;\n if (!wallet) return;\n\n if (!wallet.address) {\n wallet.off(\"accountChange\", this._handleAccountChange);\n this._wallet = null;\n this._address = null;\n this._publicKey = null;\n this.emit(\"disconnect\");\n return;\n }\n\n this._address = wallet.address;\n this._publicKey = wallet.publicKey ?? null;\n this.emit(\"connect\", this._address);\n };\n private _readyState: WalletReadyState =\n typeof window === \"undefined\" || typeof document === \"undefined\"\n ? WalletReadyState.Unsupported\n : WalletReadyState.NotDetected;\n private _breadHandoffAt = 0;\n\n constructor({ appName = \"sample\" }: MidenWalletAdapterConfig = {}) {\n super();\n this._connecting = false;\n this._wallet = null;\n this._address = null;\n this._publicKey = null;\n this._privateDataPermission = PrivateDataPermission.UponRequest;\n\n if (this._readyState !== WalletReadyState.Unsupported) {\n // Bread's own browser defines window.bread before any page script runs\n // and injects the wallet later, so a page there waits for the wallet. A\n // browser without the User Activation API can't report the tap that the\n // handoff needs.\n if (isMobileBrowser() && !window.bread && navigator.userActivation)\n this._readyState = WalletReadyState.Loadable;\n scopePollingDetectionStrategy(() => this.detectWallet());\n }\n }\n\n private detectWallet(): boolean {\n if (this._readyState === WalletReadyState.Installed) return true;\n if (!window.midenWallet && !window.miden) return false;\n this._readyState = WalletReadyState.Installed;\n this.emit(\"readyStateChange\", this._readyState);\n return true;\n }\n\n get address() {\n return this._address;\n }\n\n get publicKey() {\n return this._publicKey;\n }\n\n get privateDataPermission() {\n return this._privateDataPermission;\n }\n\n get connecting() {\n return this._connecting;\n }\n\n get readyState() {\n return this._readyState;\n }\n\n set readyState(readyState) {\n this._readyState = readyState;\n }\n\n get url() {\n return this._readyState === WalletReadyState.Loadable\n ? getBreadOpenLink()\n : BREAD_EXTENSION_URL;\n }\n\n /**\n * The wallet reports \"success\" as soon as a transaction is ACCEPTED into its\n * queue, not when it lands on chain — so a resolved call with no `transactionId`\n * means the transaction was never submitted. Returning that as `undefined`\n * (the old `result.transactionId!` non-null assertion) made the dApp treat a\n * silent drop as success. Reject instead, so the dApp can surface it and\n * poll `waitForTransaction(txId)` for on-chain confirmation (0xMiden/wallet#314).\n */\n private requireTransactionId(result: { transactionId?: string }): string {\n if (!result?.transactionId) {\n throw new WalletTransactionError(\n \"The wallet returned no transaction id — the transaction was not submitted\"\n );\n }\n return result.transactionId;\n }\n\n async requestSend(transaction: MidenSendTransaction): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n let result: { transactionId?: string };\n try {\n result = await wallet.requestSend(transaction);\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n return this.requireTransactionId(result);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestConsume(transaction: MidenConsumeTransaction): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n let result: { transactionId?: string };\n try {\n result = await wallet.requestConsume(transaction);\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n return this.requireTransactionId(result);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestTransaction(transaction: MidenTransaction): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n let result: { transactionId?: string };\n try {\n // The wallet's generalized `requestTransaction` endpoint only accepts\n // a custom-transaction payload, so a `send`/`consume` transaction must\n // be routed to its dedicated endpoint — otherwise the wallet rejects\n // it with \"Invalid CustomTransaction payload\". Dispatching by `type`\n // here is what lets the typed `Transaction` / `TransactionType` API\n // (incl. `Transaction.createConsumeTransaction`) work for every type.\n switch (transaction.type) {\n case TransactionType.Send:\n result = await wallet.requestSend(\n transaction.payload as MidenSendTransaction\n );\n break;\n case TransactionType.Consume:\n result = await wallet.requestConsume(\n transaction.payload as MidenConsumeTransaction\n );\n break;\n default:\n // Custom transactions — and legacy callers that pass a bare\n // `CustomTransaction` payload — go through the generalized endpoint.\n result = await wallet.requestTransaction(transaction);\n break;\n }\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n return this.requireTransactionId(result);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestAssets(): Promise<Asset[]> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.requestAssets();\n return result.assets;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestGuardianInfo(): Promise<GuardianInfo> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.requestGuardianInfo();\n return result.guardianInfo;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestPrivateNotes(\n noteFilterType: NoteFilterTypes,\n noteIds?: string[]\n ): Promise<InputNoteDetails[]> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.requestPrivateNotes(\n noteFilterType,\n noteIds\n );\n return result.privateNotes;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async signBytes(message: Uint8Array, kind: SignKind): Promise<Uint8Array> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.signBytes(message, kind);\n return result.signature;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async importPrivateNote(note: Uint8Array): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n const result = await wallet.importPrivateNote(note);\n return result.noteId;\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async requestConsumableNotes(): Promise<InputNoteDetails[]> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n const result = await wallet.requestConsumableNotes();\n return result.consumableNotes;\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async waitForTransaction(\n txId: string,\n timeout?: number\n ): Promise<TransactionOutput> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n const result = await wallet.waitForTransaction(txId, timeout);\n if (\"errorMessage\" in result) {\n throw new WalletTransactionError(result.errorMessage);\n }\n const notes = result.outputNotes.map((serializedNote) => {\n const u8Arr = b64ToU8(serializedNote);\n return Note.deserialize(u8Arr);\n });\n return {\n txHash: result.txHash,\n outputNotes: notes,\n };\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async createAccount(params?: CreateAccountParams): Promise<string> {\n try {\n const wallet = this._wallet;\n if (!wallet || !this.address) throw new WalletNotConnectedError();\n try {\n const result = await wallet.createAccount(params);\n return result.accountId;\n } catch (error: any) {\n throw new WalletTransactionError(error?.message, error);\n }\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n /**\n * Opens the current page in the Bread app, from a tap handler while\n * `readyState` is `Loadable`. If the wallet was injected since the last\n * poll, moves to `Installed` and emits `readyStateChange` instead. In any\n * other state it does nothing.\n */\n openInBread(): void {\n if (this._readyState !== WalletReadyState.Loadable) return;\n if (!this.detectWallet()) this.handOffToBread();\n }\n\n private handOffToBread(): void {\n // iOS and Android hand the link to Bread only for a navigation the user's\n // tap started: this must run before connect() awaits anything, and is\n // skipped without an active tap (a dApp's own connect() on load would just\n // bounce to the fallback page on every visit). A double tap would navigate\n // twice, hence the debounce.\n if (!navigator.userActivation?.isActive) return;\n const now = Date.now();\n if (now - this._breadHandoffAt < BREAD_HANDOFF_DEBOUNCE_MS) return;\n this._breadHandoffAt = now;\n window.location.assign(getBreadOpenLink());\n }\n\n async connect(\n privateDataPermission: PrivateDataPermission,\n network: WalletAdapterNetwork,\n allowedPrivateData?: AllowedPrivateData\n ): Promise<void> {\n try {\n // Guard only against a *concurrent* connect — NOT against being\n // already connected. The in-app wallet browser preserves this\n // adapter's JS context across a park/restore (a dApp is minimized and\n // reopened without a page reload), so a re-opened dApp finds this\n // instance with `connected === true`. An early-return-when-connected\n // made a second connect() a silent no-op, so a re-mounted consumer\n // that re-subscribed to events never received its account back —\n // \"Connect Wallet works only once\" (0xMiden/wallet#470). Re-driving\n // the handshake below is cheap for the common case — the wallet\n // returns the current account for an existing permission without\n // re-prompting — and re-emits `connect`, so repeated connect() calls\n // repopulate the account instead of being suppressed by stale session\n // state. (If the wallet has since locked, the re-drive can surface an\n // unlock prompt where the old code was a silent no-op; that's the\n // intended trade-off — a locked wallet genuinely needs to be unlocked\n // to hand back the account.)\n if (this.connecting) return;\n if (\n this._readyState === WalletReadyState.Loadable &&\n !this.detectWallet()\n ) {\n this.handOffToBread();\n return;\n }\n if (this._readyState !== WalletReadyState.Installed)\n throw new WalletNotReadyError();\n\n this._connecting = true;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const wallet = window.midenWallet! || window.miden!;\n\n try {\n await wallet.connect(\n privateDataPermission,\n network,\n allowedPrivateData\n );\n if (!wallet.address) {\n throw new WalletConnectionError();\n }\n this._address = wallet.address;\n this._publicKey = wallet.publicKey!;\n } catch (error: any) {\n throw new WalletConnectionError(error?.message, error);\n }\n\n this._wallet?.off(\"accountChange\", this._handleAccountChange);\n this._wallet = wallet;\n wallet.on(\"accountChange\", this._handleAccountChange);\n this._privateDataPermission = privateDataPermission;\n\n this.emit(\"connect\", this._address);\n } catch (error: any) {\n this.emit(\"error\", error);\n throw error;\n } finally {\n this._connecting = false;\n }\n }\n\n async disconnect(): Promise<void> {\n const wallet = this._wallet;\n if (wallet) {\n wallet.off(\"accountChange\", this._handleAccountChange);\n this._wallet = null;\n this._address = null;\n this._publicKey = null;\n\n try {\n await wallet.disconnect();\n } catch (error: any) {\n this.emit(\"error\", new WalletDisconnectionError(error?.message, error));\n }\n }\n\n this.emit(\"disconnect\");\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miden-sdk/miden-wallet-adapter-miden",
3
- "version": "0.17.3",
3
+ "version": "0.17.5",
4
4
  "description": "Miden wallet adapter for the Miden Wallet.",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -16,15 +16,15 @@
16
16
  "author": "Miden Contributors",
17
17
  "license": "MIT",
18
18
  "dependencies": {
19
- "@miden-sdk/miden-wallet-adapter-base": "0.17.3"
19
+ "@miden-sdk/miden-wallet-adapter-base": "0.17.5"
20
20
  },
21
21
  "devDependencies": {
22
22
  "jsdom": "^24.0.0",
23
23
  "vitest": "^1.0.0",
24
- "@miden-sdk/miden-sdk": "0.17.3"
24
+ "@miden-sdk/miden-sdk": "0.17.5"
25
25
  },
26
26
  "peerDependencies": {
27
- "@miden-sdk/miden-sdk": "^0.17.3",
27
+ "@miden-sdk/miden-sdk": "^0.17.5",
28
28
  "typescript": "^5.0.0"
29
29
  },
30
30
  "bugs": {