@miden-sdk/miden-wallet-adapter-miden 0.17.4 → 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 +43 -5
- package/dist/adapter.d.ts +20 -1
- package/dist/adapter.js +91 -9
- package/dist/adapter.js.map +1 -1
- package/package.json +4 -4
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
|
|
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
|
|
22
|
-
|
|
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`
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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;
|
package/dist/adapter.js.map
CHANGED
|
@@ -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
|
+
"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.
|
|
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.
|
|
24
|
+
"@miden-sdk/miden-sdk": "0.17.5"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@miden-sdk/miden-sdk": "^0.17.
|
|
27
|
+
"@miden-sdk/miden-sdk": "^0.17.5",
|
|
28
28
|
"typescript": "^5.0.0"
|
|
29
29
|
},
|
|
30
30
|
"bugs": {
|