@meshconnect/uwc-bitcoin 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/adapter.d.ts CHANGED
@@ -32,7 +32,22 @@ export interface BitcoinTransportAdapter {
32
32
  * offers it (e.g. WalletConnect `sendTransfer`) implement it.
33
33
  */
34
34
  sendTransfer?(request: BitcoinSendTransferRequest): Promise<TransactionResult>;
35
- /** Release any session resources the adapter holds. Optional. */
36
- disconnect?(): Promise<void>;
35
+ /**
36
+ * Release the session. `revoked` reports whether the ORIGIN'S AUTHORIZATION
37
+ * was actually withdrawn at the wallet, not merely whether local state was
38
+ * cleared — callers that re-connect afterwards need that distinction, because
39
+ * revoking is destructive and a failed re-connect has nothing to fall back to.
40
+ *
41
+ * Transports that can only clear local state (OKX has no disconnect RPC)
42
+ * report `revoked: false`. Optional.
43
+ *
44
+ * `void` is still accepted so an adapter written against the previous
45
+ * signature keeps compiling; `BitcoinNamespace.disconnect` normalizes it to
46
+ * `{ revoked: false }` — the safe reading, since such an adapter cannot have
47
+ * revoked anything it never reported.
48
+ */
49
+ disconnect?(): Promise<{
50
+ revoked: boolean;
51
+ } | void>;
37
52
  }
38
53
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EAClB,MAAM,wBAAwB,CAAA;AAE/B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IAExC,6CAA6C;IAC7C,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAErE;;;;OAIG;IACH,QAAQ,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAE3D;;;;OAIG;IACH,YAAY,CAAC,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE9E,iEAAiE;IACjE,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EAClB,MAAM,wBAAwB,CAAA;AAE/B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IAExC,6CAA6C;IAC7C,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAErE;;;;OAIG;IACH,QAAQ,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAE3D;;;;OAIG;IACH,YAAY,CAAC,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE9E;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;CACpD"}
@@ -55,6 +55,8 @@ export declare class OkxBitcoinAdapter implements BitcoinTransportAdapter {
55
55
  getAccounts(): Promise<BitcoinAccount[]>;
56
56
  signMessage(params: BitcoinSignMessageParams): Promise<SignatureType>;
57
57
  signPsbt(request: BitcoinPsbtSignRequest): Promise<string>;
58
- disconnect(): Promise<void>;
58
+ disconnect(): Promise<{
59
+ revoked: boolean;
60
+ }>;
59
61
  }
60
62
  //# sourceMappingURL=okx.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"okx.d.ts","sourceRoot":"","sources":["../../src/adapters/okx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EAEtB,wBAAwB,EACxB,aAAa,EACd,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAQzD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACpC,6EAA6E;IAC7E,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAChC,+DAA+D;IAC/D,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/B,kDAAkD;IAClD,WAAW,CACT,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,OAAO,GAAG,eAAe,GAC/B,OAAO,CAAC,MAAM,CAAC,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CACN,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,YAAY,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAA;YACb,OAAO,EAAE,MAAM,CAAA;YACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;SACxB,EAAE,CAAA;KACJ,GACA,OAAO,CAAC,MAAM,CAAC,CAAA;IAClB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,IAAI,CAAA;IAC9D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,IAAI,CAAA;CAC3E;AAaD;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,uBAAuB;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAArC,YAA6B,QAAQ,EAAE,kBAAkB,EAAI;IAEvD,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAc7C;IAEK,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAc1E;IAEK,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B/D;IAED,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1B;CACF"}
1
+ {"version":3,"file":"okx.d.ts","sourceRoot":"","sources":["../../src/adapters/okx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EAEtB,wBAAwB,EACxB,aAAa,EACd,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAQzD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACpC,6EAA6E;IAC7E,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAChC,+DAA+D;IAC/D,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/B,kDAAkD;IAClD,WAAW,CACT,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,OAAO,GAAG,eAAe,GAC/B,OAAO,CAAC,MAAM,CAAC,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CACN,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,YAAY,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAA;YACb,OAAO,EAAE,MAAM,CAAA;YACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;SACxB,EAAE,CAAA;KACJ,GACA,OAAO,CAAC,MAAM,CAAC,CAAA;IAClB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,IAAI,CAAA;IAC9D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,IAAI,CAAA;CAC3E;AAaD;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,uBAAuB;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAArC,YAA6B,QAAQ,EAAE,kBAAkB,EAAI;IAEvD,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAc7C;IAEK,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAc1E;IAEK,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B/D;IAED,UAAU,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAe1C;CACF"}
@@ -85,9 +85,20 @@ export class OkxBitcoinAdapter {
85
85
  return bytesToBase64(hexToBytes(signedHex));
86
86
  }
87
87
  disconnect() {
88
- // OKX's injected provider has no disconnect RPC; clearing session state is
89
- // the caller's job.
90
- return Promise.resolve();
88
+ // Deliberately does NOT revoke, even though `window.okxwallet.bitcoin` does
89
+ // expose a working `disconnect()` (verified: it clears the grant and the
90
+ // next `connect()` prompts). Revoking would be useless here — OKX's connect
91
+ // prompt is a connection approval, not an address picker, so it returns
92
+ // whatever address type the user has marked "Preferred". A pin naming a
93
+ // different type comes back identical after the revoke (burning a prompt for
94
+ // nothing), and a pin naming the preferred type already matched. OKX only
95
+ // ever exposes that one preferred address to a dapp.
96
+ //
97
+ // The real recovery is wallet-side: the user switches preferred address in
98
+ // OKX, which fires `accountsChanged` and reaches `onAccountsChanged` live.
99
+ // So report `revoked: false` — the caller keeps the connection and surfaces
100
+ // the mismatch rather than re-prompting.
101
+ return Promise.resolve({ revoked: false });
91
102
  }
92
103
  }
93
104
  //# sourceMappingURL=okx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"okx.js","sourceRoot":"","sources":["../../src/adapters/okx.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"okx.js","sourceRoot":"","sources":["../../src/adapters/okx.ts"],"names":[],"mappings":"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"}
@@ -43,12 +43,22 @@ interface BitcoinSignTransactionFeature {
43
43
  psbt: Uint8Array;
44
44
  }[]>;
45
45
  }
46
+ /**
47
+ * Revokes the origin's authorization — NOT merely a local session reset. The
48
+ * bitcoin-wallet-standard `disconnect` defaults to `revokeSession: true`, so
49
+ * after it resolves the wallet stops serving this origin's granted accounts
50
+ * and the next `bitcoin:connect` is a real prompt again.
51
+ */
52
+ interface BitcoinDisconnectFeature {
53
+ disconnect(): Promise<void>;
54
+ }
46
55
  /** The handle the injected transport passes in (a discovered `bitcoin:*` wallet). */
47
56
  export interface WalletStandardBitcoinWallet {
48
57
  name: string;
49
58
  accounts: readonly WalletStandardBitcoinAccount[];
50
59
  features: Record<string, unknown> & {
51
60
  'bitcoin:connect'?: BitcoinConnectFeature;
61
+ 'bitcoin:disconnect'?: BitcoinDisconnectFeature;
52
62
  'bitcoin:signMessage'?: BitcoinSignMessageFeature;
53
63
  'bitcoin:signTransaction'?: BitcoinSignTransactionFeature;
54
64
  };
@@ -79,7 +89,20 @@ export declare class WalletStandardBitcoinAdapter implements BitcoinTransportAda
79
89
  getAccounts(): Promise<BitcoinAccount[]>;
80
90
  signMessage(params: BitcoinSignMessageParams): Promise<SignatureType>;
81
91
  signPsbt(request: BitcoinPsbtSignRequest): Promise<string>;
82
- disconnect(): Promise<void>;
92
+ /**
93
+ * Revoke the origin's authorization, then drop the local cache.
94
+ *
95
+ * Previously this ONLY cleared `this.accounts` and resolved — the wallet was
96
+ * never told. That made every caller's "disconnect" a silent no-op: the grant
97
+ * survived, so a subsequent `bitcoin:connect` replayed it and returned the
98
+ * same account. `revoked` reports whether the wallet actually acted, because
99
+ * revoking is destructive and callers must distinguish "grant is gone" from
100
+ * "nothing happened" (a wallet exposing no `bitcoin:disconnect` yields
101
+ * `false`, and the local cache clear alone cannot be relied on).
102
+ */
103
+ disconnect(): Promise<{
104
+ revoked: boolean;
105
+ }>;
83
106
  /** Look up the wallet-native account for an address, connecting first if needed. */
84
107
  private requireAccount;
85
108
  private unsupported;
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-standard.d.ts","sourceRoot":"","sources":["../../src/adapters/wallet-standard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACd,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAQzD;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,UAAU,CAAA;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CACjC;AAED,UAAU,qBAAqB;IAC7B,OAAO,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,CAAA;KACrC,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAA;KAAE,CAAC,CAAA;CAC1D;AAED,UAAU,yBAAyB;IACjC,WAAW,CAAC,KAAK,EAAE;QACjB,OAAO,EAAE,4BAA4B,CAAA;QACrC,OAAO,EAAE,UAAU,CAAA;QACnB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;KAC9B,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC,CAAA;CACpE;AAED,UAAU,6BAA6B;IACrC,eAAe,CAAC,KAAK,EAAE;QACrB,OAAO,EAAE,4BAA4B,CAAA;QACrC,IAAI,EAAE,UAAU,CAAA;QAChB,YAAY,CAAC,EAAE;YACb,OAAO,EAAE,4BAA4B,CAAA;YACrC,cAAc,EAAE,MAAM,EAAE,CAAA;YACxB,OAAO,CAAC,EAAE,MAAM,CAAA;SACjB,EAAE,CAAA;KACJ,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC,CAAA;CACpC;AAED,qFAAqF;AACrF,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,4BAA4B,EAAE,CAAA;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAClC,iBAAiB,CAAC,EAAE,qBAAqB,CAAA;QACzC,qBAAqB,CAAC,EAAE,yBAAyB,CAAA;QACjD,yBAAyB,CAAC,EAAE,6BAA6B,CAAA;KAC1D,CAAA;CACF;AAED;;;;;;;;;GASG;AACH,qBAAa,4BAA6B,YAAW,uBAAuB;IAaxE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB,OAAO,CAAC,QAAQ,CAAuD;IAEvE;;;;;;;;OAQG;IACH,YACmB,MAAM,EAAE,2BAA2B,EACpD,eAAe,CAAC,EAAE,SAAS,4BAA4B,EAAE,EAK1D;IAEK,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAa7C;IAEK,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkB1E;IAEK,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B/D;IAED,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAG1B;IAED,oFAAoF;YACtE,cAAc;IAoB5B,OAAO,CAAC,WAAW;CAMpB"}
1
+ {"version":3,"file":"wallet-standard.d.ts","sourceRoot":"","sources":["../../src/adapters/wallet-standard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACd,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAQzD;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,UAAU,CAAA;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CACjC;AAED,UAAU,qBAAqB;IAC7B,OAAO,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,CAAA;KACrC,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAA;KAAE,CAAC,CAAA;CAC1D;AAED,UAAU,yBAAyB;IACjC,WAAW,CAAC,KAAK,EAAE;QACjB,OAAO,EAAE,4BAA4B,CAAA;QACrC,OAAO,EAAE,UAAU,CAAA;QACnB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;KAC9B,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC,CAAA;CACpE;AAED,UAAU,6BAA6B;IACrC,eAAe,CAAC,KAAK,EAAE;QACrB,OAAO,EAAE,4BAA4B,CAAA;QACrC,IAAI,EAAE,UAAU,CAAA;QAChB,YAAY,CAAC,EAAE;YACb,OAAO,EAAE,4BAA4B,CAAA;YACrC,cAAc,EAAE,MAAM,EAAE,CAAA;YACxB,OAAO,CAAC,EAAE,MAAM,CAAA;SACjB,EAAE,CAAA;KACJ,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC,CAAA;CACpC;AAED;;;;;GAKG;AACH,UAAU,wBAAwB;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5B;AAED,qFAAqF;AACrF,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,4BAA4B,EAAE,CAAA;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAClC,iBAAiB,CAAC,EAAE,qBAAqB,CAAA;QACzC,oBAAoB,CAAC,EAAE,wBAAwB,CAAA;QAC/C,qBAAqB,CAAC,EAAE,yBAAyB,CAAA;QACjD,yBAAyB,CAAC,EAAE,6BAA6B,CAAA;KAC1D,CAAA;CACF;AAED;;;;;;;;;GASG;AACH,qBAAa,4BAA6B,YAAW,uBAAuB;IAaxE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB,OAAO,CAAC,QAAQ,CAAuD;IAEvE;;;;;;;;OAQG;IACH,YACmB,MAAM,EAAE,2BAA2B,EACpD,eAAe,CAAC,EAAE,SAAS,4BAA4B,EAAE,EAK1D;IAEK,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAa7C;IAEK,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkB1E;IAEK,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B/D;IAED;;;;;;;;;;OAUG;IACG,UAAU,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAShD;IAED,oFAAoF;YACtE,cAAc;IAoB5B,OAAO,CAAC,WAAW;CAMpB"}
@@ -86,9 +86,26 @@ export class WalletStandardBitcoinAdapter {
86
86
  }
87
87
  return bytesToBase64(result.psbt);
88
88
  }
89
- disconnect() {
89
+ /**
90
+ * Revoke the origin's authorization, then drop the local cache.
91
+ *
92
+ * Previously this ONLY cleared `this.accounts` and resolved — the wallet was
93
+ * never told. That made every caller's "disconnect" a silent no-op: the grant
94
+ * survived, so a subsequent `bitcoin:connect` replayed it and returned the
95
+ * same account. `revoked` reports whether the wallet actually acted, because
96
+ * revoking is destructive and callers must distinguish "grant is gone" from
97
+ * "nothing happened" (a wallet exposing no `bitcoin:disconnect` yields
98
+ * `false`, and the local cache clear alone cannot be relied on).
99
+ */
100
+ async disconnect() {
101
+ const feature = this.wallet.features['bitcoin:disconnect'];
102
+ let revoked = false;
103
+ if (feature) {
104
+ await feature.disconnect();
105
+ revoked = true;
106
+ }
90
107
  this.accounts = null;
91
- return Promise.resolve();
108
+ return { revoked };
92
109
  }
93
110
  /** Look up the wallet-native account for an address, connecting first if needed. */
94
111
  async requireAccount(address) {
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-standard.js","sourceRoot":"","sources":["../../src/adapters/wallet-standard.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACZ,MAAM,aAAa,CAAA;AAqDpB;;;;;;;;;GASG;AACH,MAAM,OAAO,4BAA4B;IAapB,MAAM;IAZjB,QAAQ,GAAmD,IAAI,CAAA;IAEvE;;;;;;;;OAQG;IACH,YACmB,MAAmC,EACpD,eAAyD;sBADxC,MAAM;QAGvB,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAA;QACjC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QACvD,6EAA6E;QAC7E,2DAA2D;QAC3D,IAAI,CAAC,QAAQ,GAAG,OAAO;YACrB,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YAC7D,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;QAExB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAgC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;QAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;QACvC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;YACzC,OAAO;YACP,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;YACpC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oBAAoB,CAAC;gBAC7B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,4DAA4D;aACtE,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;IACzE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAA+B;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAA;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QACpC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;YACvC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE,CAAC,CAAC;gBACvC,OAAO,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;gBACjD,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,CAAC,CAAC,CACJ;YACH,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;YAC7C,OAAO;YACP,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;YACjC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oBAAoB,CAAC;gBAC7B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,2DAA2D;aACrE,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,oFAAoF;IAC5E,KAAK,CAAC,cAAc,CAC1B,OAAe;QAEf,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QAC5C,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;YAC/C,yEAAyE;YACzE,mEAAmE;YACnE,yEAAyE;YACzE,iEAAiE;YACjE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,oBAAoB,CAAC;gBAC7B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,sDAAsD,OAAO,GAAG;aAC1E,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,OAAO,IAAI,oBAAoB,CAAC;YAC9B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,yDAAyD,MAAM,EAAE;SAC3E,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"wallet-standard.js","sourceRoot":"","sources":["../../src/adapters/wallet-standard.ts"],"names":[],"mappings":"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"}
@@ -55,7 +55,19 @@ export declare class BitcoinNamespace {
55
55
  */
56
56
  sendTransfer(request: BitcoinSendTransferRequest): Promise<TransactionResult>;
57
57
  /** Release any session resources the adapter holds. */
58
- disconnect(): Promise<void>;
58
+ /**
59
+ * Release the session. Returns whether the origin's authorization was
60
+ * actually revoked at the wallet, so a caller re-connecting for a fresh
61
+ * prompt can tell that nothing changed rather than assuming the grant is gone.
62
+ *
63
+ * Normalizes to `{ revoked: false }` for an adapter that implements no
64
+ * `disconnect` AND for one written against the older `Promise<void>`
65
+ * signature — neither reported a revoke, and assuming one would send the
66
+ * caller into its destructive-path error handling with the grant intact.
67
+ */
68
+ disconnect(): Promise<{
69
+ revoked: boolean;
70
+ }>;
59
71
  private unsupported;
60
72
  }
61
73
  //# sourceMappingURL=bitcoin-namespace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bitcoin-namespace.d.ts","sourceRoot":"","sources":["../src/bitcoin-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,SAAS,EACT,OAAO,EACP,aAAa,EACb,iBAAiB,EAClB,MAAM,wBAAwB,CAAA;AAG/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AAExD,2CAA2C;AAC3C,eAAO,MAAM,iBAAiB,EAAE,SAAoB,CAAA;AAEpD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAa3E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,YAAoB;IAEtC,YAA6B,OAAO,EAAE,uBAAuB,EAAI;IAEjE,mDAAmD;IACnD,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE7C;IAED,8DAA8D;IAC9D,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAEvC;IAED,6CAA6C;IAC7C,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAEpE;IAED;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/D;IAED;;;OAGG;IACG,YAAY,CAChB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAG5B;IAED,uDAAuD;IACjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAED,OAAO,CAAC,WAAW;CAMpB"}
1
+ {"version":3,"file":"bitcoin-namespace.d.ts","sourceRoot":"","sources":["../src/bitcoin-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,SAAS,EACT,OAAO,EACP,aAAa,EACb,iBAAiB,EAClB,MAAM,wBAAwB,CAAA;AAG/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AAExD,2CAA2C;AAC3C,eAAO,MAAM,iBAAiB,EAAE,SAAoB,CAAA;AAEpD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAa3E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,YAAoB;IAEtC,YAA6B,OAAO,EAAE,uBAAuB,EAAI;IAEjE,mDAAmD;IACnD,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE7C;IAED,8DAA8D;IAC9D,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAEvC;IAED,6CAA6C;IAC7C,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAEpE;IAED;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/D;IAED;;;OAGG;IACG,YAAY,CAChB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAG5B;IAED,uDAAuD;IACvD;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAGhD;IAED,OAAO,CAAC,WAAW;CAMpB"}
@@ -84,8 +84,19 @@ export class BitcoinNamespace {
84
84
  return this.adapter.sendTransfer(request);
85
85
  }
86
86
  /** Release any session resources the adapter holds. */
87
+ /**
88
+ * Release the session. Returns whether the origin's authorization was
89
+ * actually revoked at the wallet, so a caller re-connecting for a fresh
90
+ * prompt can tell that nothing changed rather than assuming the grant is gone.
91
+ *
92
+ * Normalizes to `{ revoked: false }` for an adapter that implements no
93
+ * `disconnect` AND for one written against the older `Promise<void>`
94
+ * signature — neither reported a revoke, and assuming one would send the
95
+ * caller into its destructive-path error handling with the grant intact.
96
+ */
87
97
  async disconnect() {
88
- await this.adapter.disconnect?.();
98
+ const result = await this.adapter.disconnect?.();
99
+ return result ?? { revoked: false };
89
100
  }
90
101
  unsupported(method) {
91
102
  return new WalletConnectorError({
@@ -1 +1 @@
1
- {"version":3,"file":"bitcoin-namespace.js","sourceRoot":"","sources":["../src/bitcoin-namespace.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAG7D,2CAA2C;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAc,QAAQ,CAAA;AAEpD;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,MAAc;IACnE,IAAI,OAAO,CAAC,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC5C,MAAM,IAAI,oBAAoB,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG,MAAM,wCAAwC,OAAO,CAAC,EAAE,GAAG;SACxE,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,EAAE,KAAK,cAAc,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,oBAAoB,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG,MAAM,+BAA+B,OAAO,CAAC,EAAE,8BAA8B,cAAc,CAAC,EAAE,iBAAiB;SAC5H,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAIE,OAAO;IAHpC,2CAA2C;IAClC,SAAS,GAAG,iBAAiB,CAAA;IAEtC,YAA6B,OAAgC;uBAAhC,OAAO;IAA4B,CAAC;IAEjE,mDAAmD;IACnD,sBAAsB,CAAC,OAAgB;QACrC,oBAAoB,CAAC,OAAO,EAAE,yCAAyC,CAAC,CAAA;IAC1E,CAAC;IAED,8DAA8D;IAC9D,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;IACnC,CAAC;IAED,6CAA6C;IAC7C,WAAW,CAAC,MAAgC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,OAA+B;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAChB,OAAmC;QAEnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY;YAAE,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;QACtE,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAA;IACnC,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,OAAO,IAAI,oBAAoB,CAAC;YAC9B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,oBAAoB,MAAM,0CAA0C;SAC9E,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"bitcoin-namespace.js","sourceRoot":"","sources":["../src/bitcoin-namespace.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAG7D,2CAA2C;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAc,QAAQ,CAAA;AAEpD;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,MAAc;IACnE,IAAI,OAAO,CAAC,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC5C,MAAM,IAAI,oBAAoB,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG,MAAM,wCAAwC,OAAO,CAAC,EAAE,GAAG;SACxE,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,EAAE,KAAK,cAAc,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,oBAAoB,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG,MAAM,+BAA+B,OAAO,CAAC,EAAE,8BAA8B,cAAc,CAAC,EAAE,iBAAiB;SAC5H,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAIE,OAAO;IAHpC,2CAA2C;IAClC,SAAS,GAAG,iBAAiB,CAAA;IAEtC,YAA6B,OAAgC;uBAAhC,OAAO;IAA4B,CAAC;IAEjE,mDAAmD;IACnD,sBAAsB,CAAC,OAAgB;QACrC,oBAAoB,CAAC,OAAO,EAAE,yCAAyC,CAAC,CAAA;IAC1E,CAAC;IAED,8DAA8D;IAC9D,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;IACnC,CAAC;IAED,6CAA6C;IAC7C,WAAW,CAAC,MAAgC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,OAA+B;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAChB,OAAmC;QAEnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY;YAAE,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;QACtE,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED,uDAAuD;IACvD;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAA;QAChD,OAAO,MAAM,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACrC,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,OAAO,IAAI,oBAAoB,CAAC;YAC9B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,oBAAoB,MAAM,0CAA0C;SAC9E,CAAC,CAAA;IACJ,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshconnect/uwc-bitcoin",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "Mesh-owned Bitcoin (bip122) namespace module for Universal Wallet Connector — network-specific logic (PSBT, address/network handling, mempool broadcast) with pluggable transport adapters (Wallet Standard bitcoin:* and WalletConnect bip122), consumed by the injected and walletConnect transport connectors",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,8 +16,8 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@meshconnect/uwc-constants": "0.7.7",
20
- "@meshconnect/uwc-types": "0.27.2"
19
+ "@meshconnect/uwc-constants": "0.7.9",
20
+ "@meshconnect/uwc-types": "0.28.1"
21
21
  },
22
22
  "devDependencies": {
23
23
  "typescript": "^7.0.2"
package/src/adapter.ts CHANGED
@@ -44,6 +44,19 @@ export interface BitcoinTransportAdapter {
44
44
  */
45
45
  sendTransfer?(request: BitcoinSendTransferRequest): Promise<TransactionResult>
46
46
 
47
- /** Release any session resources the adapter holds. Optional. */
48
- disconnect?(): Promise<void>
47
+ /**
48
+ * Release the session. `revoked` reports whether the ORIGIN'S AUTHORIZATION
49
+ * was actually withdrawn at the wallet, not merely whether local state was
50
+ * cleared — callers that re-connect afterwards need that distinction, because
51
+ * revoking is destructive and a failed re-connect has nothing to fall back to.
52
+ *
53
+ * Transports that can only clear local state (OKX has no disconnect RPC)
54
+ * report `revoked: false`. Optional.
55
+ *
56
+ * `void` is still accepted so an adapter written against the previous
57
+ * signature keeps compiling; `BitcoinNamespace.disconnect` normalizes it to
58
+ * `{ revoked: false }` — the safe reading, since such an adapter cannot have
59
+ * revoked anything it never reported.
60
+ */
61
+ disconnect?(): Promise<{ revoked: boolean } | void>
49
62
  }
@@ -150,10 +150,12 @@ describe('OkxBitcoinAdapter', () => {
150
150
  ).rejects.toBeInstanceOf(WalletConnectorError)
151
151
  })
152
152
 
153
- it('disconnect resolves (OKX has no disconnect RPC)', async () => {
153
+ // OKX has no disconnect RPC, so nothing is revoked at the wallet. Saying so
154
+ // explicitly stops a caller from re-connecting expecting a fresh prompt.
155
+ it('disconnect resolves with revoked:false (OKX has no disconnect RPC)', async () => {
154
156
  await expect(
155
157
  new OkxBitcoinAdapter(fakeProvider()).disconnect()
156
- ).resolves.toBeUndefined()
158
+ ).resolves.toEqual({ revoked: false })
157
159
  })
158
160
  })
159
161
 
@@ -147,9 +147,20 @@ export class OkxBitcoinAdapter implements BitcoinTransportAdapter {
147
147
  return bytesToBase64(hexToBytes(signedHex))
148
148
  }
149
149
 
150
- disconnect(): Promise<void> {
151
- // OKX's injected provider has no disconnect RPC; clearing session state is
152
- // the caller's job.
153
- return Promise.resolve()
150
+ disconnect(): Promise<{ revoked: boolean }> {
151
+ // Deliberately does NOT revoke, even though `window.okxwallet.bitcoin` does
152
+ // expose a working `disconnect()` (verified: it clears the grant and the
153
+ // next `connect()` prompts). Revoking would be useless here — OKX's connect
154
+ // prompt is a connection approval, not an address picker, so it returns
155
+ // whatever address type the user has marked "Preferred". A pin naming a
156
+ // different type comes back identical after the revoke (burning a prompt for
157
+ // nothing), and a pin naming the preferred type already matched. OKX only
158
+ // ever exposes that one preferred address to a dapp.
159
+ //
160
+ // The real recovery is wallet-side: the user switches preferred address in
161
+ // OKX, which fires `accountsChanged` and reaches `onAccountsChanged` live.
162
+ // So report `revoked: false` — the caller keeps the connection and surfaces
163
+ // the mismatch rather than re-prompting.
164
+ return Promise.resolve({ revoked: false })
154
165
  }
155
166
  }
@@ -40,6 +40,50 @@ const fakeWallet = (
40
40
  }
41
41
  })
42
42
 
43
+ describe('WalletStandardBitcoinAdapter — disconnect', () => {
44
+ // This previously only cleared the local cache and resolved, never telling
45
+ // the wallet — so every caller's "disconnect" was a silent no-op: the grant
46
+ // survived and the next `bitcoin:connect` replayed the same account.
47
+ it('calls the wallet bitcoin:disconnect and reports revoked:true', async () => {
48
+ const disconnect = vi.fn().mockResolvedValue(undefined)
49
+ const wallet = fakeWallet({ 'bitcoin:disconnect': { disconnect } })
50
+
51
+ await expect(
52
+ new WalletStandardBitcoinAdapter(wallet).disconnect()
53
+ ).resolves.toEqual({ revoked: true })
54
+ expect(disconnect).toHaveBeenCalledOnce()
55
+ })
56
+
57
+ it('reports revoked:false when the wallet exposes no bitcoin:disconnect', async () => {
58
+ await expect(
59
+ new WalletStandardBitcoinAdapter(fakeWallet()).disconnect()
60
+ ).resolves.toEqual({ revoked: false })
61
+ })
62
+
63
+ it('propagates a failing revoke instead of reporting success', async () => {
64
+ const disconnect = vi.fn().mockRejectedValue(new Error('wallet said no'))
65
+ const wallet = fakeWallet({ 'bitcoin:disconnect': { disconnect } })
66
+
67
+ await expect(
68
+ new WalletStandardBitcoinAdapter(wallet).disconnect()
69
+ ).rejects.toThrow('wallet said no')
70
+ })
71
+
72
+ it('drops the cached accounts so a later sign re-authorizes', async () => {
73
+ const wallet = fakeWallet({
74
+ 'bitcoin:disconnect': { disconnect: vi.fn().mockResolvedValue(undefined) }
75
+ })
76
+ const adapter = new WalletStandardBitcoinAdapter(wallet)
77
+
78
+ await adapter.getAccounts()
79
+ await adapter.disconnect()
80
+ await adapter.getAccounts()
81
+
82
+ // Two authorize calls: the cache must not survive the disconnect.
83
+ expect(wallet.features['bitcoin:connect']?.connect).toHaveBeenCalledTimes(2)
84
+ })
85
+ })
86
+
43
87
  describe('WalletStandardBitcoinAdapter', () => {
44
88
  it('getAccounts connects and maps accounts to hex publicKey', async () => {
45
89
  const wallet = fakeWallet()
@@ -53,12 +53,23 @@ interface BitcoinSignTransactionFeature {
53
53
  }): Promise<{ psbt: Uint8Array }[]>
54
54
  }
55
55
 
56
+ /**
57
+ * Revokes the origin's authorization — NOT merely a local session reset. The
58
+ * bitcoin-wallet-standard `disconnect` defaults to `revokeSession: true`, so
59
+ * after it resolves the wallet stops serving this origin's granted accounts
60
+ * and the next `bitcoin:connect` is a real prompt again.
61
+ */
62
+ interface BitcoinDisconnectFeature {
63
+ disconnect(): Promise<void>
64
+ }
65
+
56
66
  /** The handle the injected transport passes in (a discovered `bitcoin:*` wallet). */
57
67
  export interface WalletStandardBitcoinWallet {
58
68
  name: string
59
69
  accounts: readonly WalletStandardBitcoinAccount[]
60
70
  features: Record<string, unknown> & {
61
71
  'bitcoin:connect'?: BitcoinConnectFeature
72
+ 'bitcoin:disconnect'?: BitcoinDisconnectFeature
62
73
  'bitcoin:signMessage'?: BitcoinSignMessageFeature
63
74
  'bitcoin:signTransaction'?: BitcoinSignTransactionFeature
64
75
  }
@@ -159,9 +170,26 @@ export class WalletStandardBitcoinAdapter implements BitcoinTransportAdapter {
159
170
  return bytesToBase64(result.psbt)
160
171
  }
161
172
 
162
- disconnect(): Promise<void> {
173
+ /**
174
+ * Revoke the origin's authorization, then drop the local cache.
175
+ *
176
+ * Previously this ONLY cleared `this.accounts` and resolved — the wallet was
177
+ * never told. That made every caller's "disconnect" a silent no-op: the grant
178
+ * survived, so a subsequent `bitcoin:connect` replayed it and returned the
179
+ * same account. `revoked` reports whether the wallet actually acted, because
180
+ * revoking is destructive and callers must distinguish "grant is gone" from
181
+ * "nothing happened" (a wallet exposing no `bitcoin:disconnect` yields
182
+ * `false`, and the local cache clear alone cannot be relied on).
183
+ */
184
+ async disconnect(): Promise<{ revoked: boolean }> {
185
+ const feature = this.wallet.features['bitcoin:disconnect']
186
+ let revoked = false
187
+ if (feature) {
188
+ await feature.disconnect()
189
+ revoked = true
190
+ }
163
191
  this.accounts = null
164
- return Promise.resolve()
192
+ return { revoked }
165
193
  }
166
194
 
167
195
  /** Look up the wallet-native account for an address, connecting first if needed. */
@@ -164,18 +164,39 @@ describe('BitcoinNamespace', () => {
164
164
  expect(result).toBe(signature)
165
165
  })
166
166
 
167
- it('delegates disconnect and tolerates an adapter without one', async () => {
167
+ it('delegates disconnect and reports what the adapter revoked', async () => {
168
168
  const adapter = fakeAdapter()
169
- await new BitcoinNamespace(adapter).disconnect()
169
+ adapter.disconnect.mockResolvedValue({ revoked: true })
170
+ await expect(new BitcoinNamespace(adapter).disconnect()).resolves.toEqual({
171
+ revoked: true
172
+ })
170
173
  expect(adapter.disconnect).toHaveBeenCalledOnce()
174
+ })
171
175
 
176
+ // An adapter with no `disconnect` revoked nothing. Reporting `revoked: false`
177
+ // (rather than undefined) keeps callers from treating "no-op" as "grant is
178
+ // gone" and re-connecting for a prompt that will never appear.
179
+ // An adapter written against the previous `Promise<void>` signature still
180
+ // compiles and must not be read as having revoked anything — assuming a
181
+ // revoke would send the caller into destructive-path handling with the grant
182
+ // intact.
183
+ it('normalizes a legacy void-returning disconnect to revoked:false', async () => {
184
+ const adapter = fakeAdapter()
185
+ adapter.disconnect.mockResolvedValue(undefined)
186
+ await expect(new BitcoinNamespace(adapter).disconnect()).resolves.toEqual({
187
+ revoked: false
188
+ })
189
+ })
190
+
191
+ it('reports revoked:false when the adapter has no disconnect', async () => {
192
+ const adapter = fakeAdapter()
172
193
  const noDisconnect: BitcoinTransportAdapter = {
173
194
  getAccounts: adapter.getAccounts,
174
195
  signMessage: adapter.signMessage
175
196
  }
176
197
  await expect(
177
198
  new BitcoinNamespace(noDisconnect).disconnect()
178
- ).resolves.toBeUndefined()
199
+ ).resolves.toEqual({ revoked: false })
179
200
  })
180
201
 
181
202
  it('delegates signPsbt to the adapter', async () => {
@@ -102,8 +102,19 @@ export class BitcoinNamespace {
102
102
  }
103
103
 
104
104
  /** Release any session resources the adapter holds. */
105
- async disconnect(): Promise<void> {
106
- await this.adapter.disconnect?.()
105
+ /**
106
+ * Release the session. Returns whether the origin's authorization was
107
+ * actually revoked at the wallet, so a caller re-connecting for a fresh
108
+ * prompt can tell that nothing changed rather than assuming the grant is gone.
109
+ *
110
+ * Normalizes to `{ revoked: false }` for an adapter that implements no
111
+ * `disconnect` AND for one written against the older `Promise<void>`
112
+ * signature — neither reported a revoke, and assuming one would send the
113
+ * caller into its destructive-path error handling with the grant intact.
114
+ */
115
+ async disconnect(): Promise<{ revoked: boolean }> {
116
+ const result = await this.adapter.disconnect?.()
117
+ return result ?? { revoked: false }
107
118
  }
108
119
 
109
120
  private unsupported(method: string): WalletConnectorError {