@ckb-ccc/okx 0.0.9-alpha.1 → 0.0.10-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,42 @@
1
1
  import { Nip07A } from "@ckb-ccc/nip07/advanced";
2
- export interface BitcoinProvider {
3
- connect(): Promise<{
2
+ import { UniSatA } from "@ckb-ccc/uni-sat/advanced";
3
+ export interface BitcoinProvider extends UniSatA.Provider {
4
+ connect?(): Promise<{
4
5
  address: string;
5
6
  publicKey: string;
6
7
  compressedPublicKey: string;
7
8
  }>;
8
- getSelectedAccount(): Promise<{
9
+ getSelectedAccount?(): Promise<{
9
10
  address: string;
10
11
  publicKey: string;
11
12
  compressedPublicKey: string;
12
13
  } | null>;
13
- signMessage(msg: string, type: "ecdsa" | "bip322-simple"): Promise<string>;
14
14
  }
15
15
  export interface NostrProvider extends Nip07A.Provider {
16
- selectedAccount: {
17
- address: string;
18
- publicKey: string;
19
- } | null;
16
+ connect?(): Promise<void>;
17
+ /**
18
+ * Adds an event listener to the provider.
19
+ */
20
+ on: NostrOnMethod;
21
+ /**
22
+ * Removes an event listener from the provider.
23
+ * @param eventName - The name of the event to remove the listener from.
24
+ * @param listener - The listener function to remove.
25
+ * @returns The provider instance.
26
+ */
27
+ removeListener(eventName: string, listener: (...args: unknown[]) => unknown): NostrProvider;
28
+ }
29
+ /**
30
+ * Interface representing a method to add event listeners to the provider.
31
+ * @interface
32
+ */
33
+ export interface NostrOnMethod {
34
+ /**
35
+ * Adds an event listener to the provider.
36
+ * @param eventName - The name of the event.
37
+ * @param listener - The listener function.
38
+ * @returns The provider instance.
39
+ */
40
+ (eventName: string, listener: (...args: unknown[]) => unknown): Promise<void>;
20
41
  }
21
42
  //# sourceMappingURL=advancedBarrel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"advancedBarrel.d.ts","sourceRoot":"","sources":["../src/advancedBarrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC,CAAC;IAEH,kBAAkB,IAAI,OAAO,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,GAAG,IAAI,CAAC,CAAC;IAEV,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,QAAQ;IACpD,eAAe,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChE"}
1
+ {"version":3,"file":"advancedBarrel.d.ts","sourceRoot":"","sources":["../src/advancedBarrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,QAAQ;IACvD,OAAO,CAAC,IAAI,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC,CAAC;IAEH,kBAAkB,CAAC,IAAI,OAAO,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,GAAG,IAAI,CAAC,CAAC;CACX;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,QAAQ;IACpD,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;OAEG;IACH,EAAE,EAAE,aAAa,CAAC;IAElB;;;;;OAKG;IACH,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GACxC,aAAa,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E"}
@@ -1,4 +1,4 @@
1
- import { ccc, Client } from "@ckb-ccc/core";
1
+ import { ccc } from "@ckb-ccc/core";
2
2
  import { BitcoinProvider } from "../advancedBarrel";
3
3
  /**
4
4
  * Class representing a Bitcoin signer that extends SignerBtc from @ckb-ccc/core.
@@ -14,16 +14,8 @@ export declare class BitcoinSigner extends ccc.SignerBtc {
14
14
  * @param {ccc.Client} client - The client instance.
15
15
  * @param {Provider} provider - The provider instance.
16
16
  */
17
- constructor(client: ccc.Client, providers: Record<string, BitcoinProvider>, preferredNetworks: ccc.NetworkPreference[]);
17
+ constructor(client: ccc.Client, providers: Record<string, BitcoinProvider>, preferredNetworks?: ccc.NetworkPreference[]);
18
18
  get provider(): BitcoinProvider;
19
- /**
20
- * Get account info if the signer is connected.
21
- * @returns Account information
22
- */
23
- assertConnection(): Promise<{
24
- address: string;
25
- publicKey: string;
26
- }>;
27
19
  /**
28
20
  * Gets the Bitcoin account address.
29
21
  * @returns {Promise<string>} A promise that resolves to the Bitcoin account address.
@@ -39,7 +31,7 @@ export declare class BitcoinSigner extends ccc.SignerBtc {
39
31
  * @returns {Promise<void>} A promise that resolves when the connection is established.
40
32
  */
41
33
  connect(): Promise<void>;
42
- replaceClient(client: Client): Promise<boolean>;
34
+ onReplaced(listener: () => void): () => void;
43
35
  /**
44
36
  * Checks if the signer is connected.
45
37
  * @returns {Promise<boolean>} A promise that resolves to true if connected, false otherwise.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/btc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,GAAG,CAAC,SAAS;aAU5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAVpC,OAAO,CAAC,OAAO,CAAgB;IAE/B;;;;OAIG;gBAED,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACzC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE;IAK7D,IAAI,QAAQ,IAAI,eAAe,CAwB9B;IAED;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAQzE;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAItC;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAIzC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAMvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/btc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,GAAG,CAAC,SAAS;aAU5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAVpC,OAAO,CAAC,OAAO,CAAgB;IAE/B;;;;OAIG;gBAED,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACzC,iBAAiB,GAAE,GAAG,CAAC,iBAAiB,EAWxD;IAKH,IAAI,QAAQ,IAAI,eAAe,CAwB9B;IAED;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAgBtC;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAYzC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAe5C;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAmBrC;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAMvE"}
package/dist/btc/index.js CHANGED
@@ -10,7 +10,18 @@ export class BitcoinSigner extends ccc.SignerBtc {
10
10
  * @param {ccc.Client} client - The client instance.
11
11
  * @param {Provider} provider - The provider instance.
12
12
  */
13
- constructor(client, providers, preferredNetworks) {
13
+ constructor(client, providers, preferredNetworks = [
14
+ {
15
+ addressPrefix: "ckb",
16
+ signerType: ccc.SignerType.BTC,
17
+ network: "btc",
18
+ },
19
+ {
20
+ addressPrefix: "ckt",
21
+ signerType: ccc.SignerType.BTC,
22
+ network: "btcTestnet",
23
+ },
24
+ ]) {
14
25
  super(client);
15
26
  this.providers = providers;
16
27
  this.preferredNetworks = preferredNetworks;
@@ -33,49 +44,82 @@ export class BitcoinSigner extends ccc.SignerBtc {
33
44
  }
34
45
  return provider;
35
46
  }
36
- /**
37
- * Get account info if the signer is connected.
38
- * @returns Account information
39
- */
40
- async assertConnection() {
41
- const account = await this.provider.getSelectedAccount();
42
- if (!account) {
43
- throw Error("Not connected");
44
- }
45
- return account;
46
- }
47
47
  /**
48
48
  * Gets the Bitcoin account address.
49
49
  * @returns {Promise<string>} A promise that resolves to the Bitcoin account address.
50
50
  */
51
51
  async getBtcAccount() {
52
- return (await this.assertConnection()).address;
52
+ if (this.provider.getSelectedAccount) {
53
+ const account = await this.provider.getSelectedAccount();
54
+ if (!account) {
55
+ throw Error("Not connected");
56
+ }
57
+ return account.address;
58
+ }
59
+ const address = (await this.provider.getAccounts())[0];
60
+ if (!address) {
61
+ throw Error("Not connected");
62
+ }
63
+ return address;
53
64
  }
54
65
  /**
55
66
  * Gets the Bitcoin public key.
56
67
  * @returns {Promise<ccc.Hex>} A promise that resolves to the Bitcoin public key.
57
68
  */
58
69
  async getBtcPublicKey() {
59
- return ccc.hexFrom((await this.assertConnection()).publicKey);
70
+ if (this.provider.getSelectedAccount) {
71
+ const account = await this.provider.getSelectedAccount();
72
+ if (!account) {
73
+ throw Error("Not connected");
74
+ }
75
+ return ccc.hexFrom(account.publicKey);
76
+ }
77
+ return ccc.hexFrom(await this.provider.getPublicKey());
60
78
  }
61
79
  /**
62
80
  * Connects to the provider by requesting accounts.
63
81
  * @returns {Promise<void>} A promise that resolves when the connection is established.
64
82
  */
65
83
  async connect() {
66
- await this.provider.connect();
84
+ if (this.provider.connect) {
85
+ await this.provider.connect();
86
+ return;
87
+ }
88
+ await this.provider.requestAccounts();
67
89
  }
68
- async replaceClient(client) {
69
- const res = await super.replaceClient(client);
70
- this.provider; // Check if the network is valid
71
- return res;
90
+ onReplaced(listener) {
91
+ const stop = [];
92
+ const replacer = async () => {
93
+ listener();
94
+ stop[0]?.();
95
+ };
96
+ stop.push(() => {
97
+ this.provider.removeListener("accountChanged", replacer);
98
+ });
99
+ this.provider.on("accountChanged", replacer);
100
+ return stop[0];
72
101
  }
73
102
  /**
74
103
  * Checks if the signer is connected.
75
104
  * @returns {Promise<boolean>} A promise that resolves to true if connected, false otherwise.
76
105
  */
77
106
  async isConnected() {
78
- return (await this.provider.getSelectedAccount()) !== null;
107
+ try {
108
+ this.provider;
109
+ }
110
+ catch (_) {
111
+ return false;
112
+ }
113
+ if (this.provider.getSelectedAccount) {
114
+ if ((await this.provider.getSelectedAccount()) === null) {
115
+ return false;
116
+ }
117
+ }
118
+ else if ((await this.provider.getAccounts()).length === 0) {
119
+ return false;
120
+ }
121
+ await this.connect();
122
+ return true;
79
123
  }
80
124
  /**
81
125
  * Signs a raw message with the Bitcoin account.
@@ -5,13 +5,14 @@ import { NostrProvider } from "../advancedBarrel";
5
5
  * @class
6
6
  * @extends {ccc.SignerBtc}
7
7
  */
8
- export declare class SignerNostr extends ccc.SignerNostr {
8
+ export declare class NostrSigner extends ccc.SignerNostr {
9
9
  readonly provider: NostrProvider;
10
+ private publicKeyCache?;
10
11
  constructor(client: ccc.Client, provider: NostrProvider);
11
- replaceClient(client: ccc.Client): Promise<boolean>;
12
12
  getNostrPublicKey(): Promise<ccc.Hex>;
13
13
  signNostrEvent(event: ccc.NostrEvent): Promise<Required<ccc.NostrEvent>>;
14
14
  connect(): Promise<void>;
15
+ onReplaced(listener: () => void): () => void;
15
16
  isConnected(): Promise<boolean>;
16
17
  }
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nostr/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,GAAG,CAAC,WAAW;aAG5B,QAAQ,EAAE,aAAa;gBADvC,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,QAAQ,EAAE,aAAa;IAKnC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAQrC,cAAc,CAClB,KAAK,EAAE,GAAG,CAAC,UAAU,GACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAI9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nostr/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,GAAG,CAAC,WAAW;aAK5B,QAAQ,EAAE,aAAa;IAJzC,OAAO,CAAC,cAAc,CAAC,CAA8B;gBAGnD,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,QAAQ,EAAE,aAAa;IAKnC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAOrC,cAAc,CAClB,KAAK,EAAE,GAAG,CAAC,UAAU,GACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAO9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAetC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
@@ -4,27 +4,40 @@ import { ccc } from "@ckb-ccc/core";
4
4
  * @class
5
5
  * @extends {ccc.SignerBtc}
6
6
  */
7
- export class SignerNostr extends ccc.SignerNostr {
7
+ export class NostrSigner extends ccc.SignerNostr {
8
8
  constructor(client, provider) {
9
9
  super(client);
10
10
  this.provider = provider;
11
- }
12
- async replaceClient(client) {
13
- return super.replaceClient(client);
11
+ this.publicKeyCache = undefined;
14
12
  }
15
13
  async getNostrPublicKey() {
16
- if (!this.provider.selectedAccount) {
17
- throw new Error("Not connected");
14
+ if (!this.publicKeyCache) {
15
+ this.publicKeyCache = this.provider.getPublicKey();
18
16
  }
19
- return ccc.hexFrom(this.provider.selectedAccount.publicKey);
17
+ return ccc.hexFrom(await this.publicKeyCache);
20
18
  }
21
19
  async signNostrEvent(event) {
22
- return this.provider.signEvent(event);
20
+ return this.provider.signEvent({
21
+ ...event,
22
+ pubkey: await this.publicKeyCache,
23
+ });
23
24
  }
24
25
  async connect() {
25
- await this.provider.getPublicKey();
26
+ await this.provider.connect?.(); // Help extension to switch network
27
+ }
28
+ onReplaced(listener) {
29
+ const stop = [];
30
+ const replacer = async () => {
31
+ listener();
32
+ stop[0]?.();
33
+ };
34
+ stop.push(() => {
35
+ this.provider.removeListener("accountChanged", replacer);
36
+ });
37
+ this.provider.on("accountChanged", replacer);
38
+ return stop[0];
26
39
  }
27
40
  async isConnected() {
28
- return this.provider.selectedAccount !== null;
41
+ return true;
29
42
  }
30
43
  }
@@ -1,5 +1,5 @@
1
1
  import { BitcoinSigner } from "./btc";
2
- import { SignerNostr } from "./nostr";
2
+ import { NostrSigner } from "./nostr";
3
3
  /**
4
4
  * Retrieves the OKX Bitcoin signer if available.
5
5
  * @param {ccc.Client} client - The client instance.
@@ -12,6 +12,6 @@ export function getOKXBitcoinSigner(client, preferredNetworks) {
12
12
  }
13
13
  return [
14
14
  new BitcoinSigner(client, windowRef.okxwallet, preferredNetworks),
15
- new SignerNostr(client, windowRef.okxwallet.nostr),
15
+ new NostrSigner(client, windowRef.okxwallet.nostr),
16
16
  ];
17
17
  }
@@ -1,21 +1,42 @@
1
1
  import { Nip07A } from "@ckb-ccc/nip07/advanced";
2
- export interface BitcoinProvider {
3
- connect(): Promise<{
2
+ import { UniSatA } from "@ckb-ccc/uni-sat/advanced";
3
+ export interface BitcoinProvider extends UniSatA.Provider {
4
+ connect?(): Promise<{
4
5
  address: string;
5
6
  publicKey: string;
6
7
  compressedPublicKey: string;
7
8
  }>;
8
- getSelectedAccount(): Promise<{
9
+ getSelectedAccount?(): Promise<{
9
10
  address: string;
10
11
  publicKey: string;
11
12
  compressedPublicKey: string;
12
13
  } | null>;
13
- signMessage(msg: string, type: "ecdsa" | "bip322-simple"): Promise<string>;
14
14
  }
15
15
  export interface NostrProvider extends Nip07A.Provider {
16
- selectedAccount: {
17
- address: string;
18
- publicKey: string;
19
- } | null;
16
+ connect?(): Promise<void>;
17
+ /**
18
+ * Adds an event listener to the provider.
19
+ */
20
+ on: NostrOnMethod;
21
+ /**
22
+ * Removes an event listener from the provider.
23
+ * @param eventName - The name of the event to remove the listener from.
24
+ * @param listener - The listener function to remove.
25
+ * @returns The provider instance.
26
+ */
27
+ removeListener(eventName: string, listener: (...args: unknown[]) => unknown): NostrProvider;
28
+ }
29
+ /**
30
+ * Interface representing a method to add event listeners to the provider.
31
+ * @interface
32
+ */
33
+ export interface NostrOnMethod {
34
+ /**
35
+ * Adds an event listener to the provider.
36
+ * @param eventName - The name of the event.
37
+ * @param listener - The listener function.
38
+ * @returns The provider instance.
39
+ */
40
+ (eventName: string, listener: (...args: unknown[]) => unknown): Promise<void>;
20
41
  }
21
42
  //# sourceMappingURL=advancedBarrel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"advancedBarrel.d.ts","sourceRoot":"","sources":["../src/advancedBarrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC,CAAC;IAEH,kBAAkB,IAAI,OAAO,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,GAAG,IAAI,CAAC,CAAC;IAEV,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,QAAQ;IACpD,eAAe,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChE"}
1
+ {"version":3,"file":"advancedBarrel.d.ts","sourceRoot":"","sources":["../src/advancedBarrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,QAAQ;IACvD,OAAO,CAAC,IAAI,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC,CAAC;IAEH,kBAAkB,CAAC,IAAI,OAAO,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,GAAG,IAAI,CAAC,CAAC;CACX;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,QAAQ;IACpD,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;OAEG;IACH,EAAE,EAAE,aAAa,CAAC;IAElB;;;;;OAKG;IACH,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GACxC,aAAa,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E"}
@@ -1,4 +1,4 @@
1
- import { ccc, Client } from "@ckb-ccc/core";
1
+ import { ccc } from "@ckb-ccc/core";
2
2
  import { BitcoinProvider } from "../advancedBarrel";
3
3
  /**
4
4
  * Class representing a Bitcoin signer that extends SignerBtc from @ckb-ccc/core.
@@ -14,16 +14,8 @@ export declare class BitcoinSigner extends ccc.SignerBtc {
14
14
  * @param {ccc.Client} client - The client instance.
15
15
  * @param {Provider} provider - The provider instance.
16
16
  */
17
- constructor(client: ccc.Client, providers: Record<string, BitcoinProvider>, preferredNetworks: ccc.NetworkPreference[]);
17
+ constructor(client: ccc.Client, providers: Record<string, BitcoinProvider>, preferredNetworks?: ccc.NetworkPreference[]);
18
18
  get provider(): BitcoinProvider;
19
- /**
20
- * Get account info if the signer is connected.
21
- * @returns Account information
22
- */
23
- assertConnection(): Promise<{
24
- address: string;
25
- publicKey: string;
26
- }>;
27
19
  /**
28
20
  * Gets the Bitcoin account address.
29
21
  * @returns {Promise<string>} A promise that resolves to the Bitcoin account address.
@@ -39,7 +31,7 @@ export declare class BitcoinSigner extends ccc.SignerBtc {
39
31
  * @returns {Promise<void>} A promise that resolves when the connection is established.
40
32
  */
41
33
  connect(): Promise<void>;
42
- replaceClient(client: Client): Promise<boolean>;
34
+ onReplaced(listener: () => void): () => void;
43
35
  /**
44
36
  * Checks if the signer is connected.
45
37
  * @returns {Promise<boolean>} A promise that resolves to true if connected, false otherwise.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/btc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,GAAG,CAAC,SAAS;aAU5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAVpC,OAAO,CAAC,OAAO,CAAgB;IAE/B;;;;OAIG;gBAED,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACzC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE;IAK7D,IAAI,QAAQ,IAAI,eAAe,CAwB9B;IAED;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAQzE;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAItC;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAIzC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAMvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/btc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,GAAG,CAAC,SAAS;aAU5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAVpC,OAAO,CAAC,OAAO,CAAgB;IAE/B;;;;OAIG;gBAED,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACzC,iBAAiB,GAAE,GAAG,CAAC,iBAAiB,EAWxD;IAKH,IAAI,QAAQ,IAAI,eAAe,CAwB9B;IAED;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAgBtC;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAYzC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAe5C;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAmBrC;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAMvE"}
@@ -13,7 +13,18 @@ class BitcoinSigner extends core_1.ccc.SignerBtc {
13
13
  * @param {ccc.Client} client - The client instance.
14
14
  * @param {Provider} provider - The provider instance.
15
15
  */
16
- constructor(client, providers, preferredNetworks) {
16
+ constructor(client, providers, preferredNetworks = [
17
+ {
18
+ addressPrefix: "ckb",
19
+ signerType: core_1.ccc.SignerType.BTC,
20
+ network: "btc",
21
+ },
22
+ {
23
+ addressPrefix: "ckt",
24
+ signerType: core_1.ccc.SignerType.BTC,
25
+ network: "btcTestnet",
26
+ },
27
+ ]) {
17
28
  super(client);
18
29
  this.providers = providers;
19
30
  this.preferredNetworks = preferredNetworks;
@@ -36,49 +47,82 @@ class BitcoinSigner extends core_1.ccc.SignerBtc {
36
47
  }
37
48
  return provider;
38
49
  }
39
- /**
40
- * Get account info if the signer is connected.
41
- * @returns Account information
42
- */
43
- async assertConnection() {
44
- const account = await this.provider.getSelectedAccount();
45
- if (!account) {
46
- throw Error("Not connected");
47
- }
48
- return account;
49
- }
50
50
  /**
51
51
  * Gets the Bitcoin account address.
52
52
  * @returns {Promise<string>} A promise that resolves to the Bitcoin account address.
53
53
  */
54
54
  async getBtcAccount() {
55
- return (await this.assertConnection()).address;
55
+ if (this.provider.getSelectedAccount) {
56
+ const account = await this.provider.getSelectedAccount();
57
+ if (!account) {
58
+ throw Error("Not connected");
59
+ }
60
+ return account.address;
61
+ }
62
+ const address = (await this.provider.getAccounts())[0];
63
+ if (!address) {
64
+ throw Error("Not connected");
65
+ }
66
+ return address;
56
67
  }
57
68
  /**
58
69
  * Gets the Bitcoin public key.
59
70
  * @returns {Promise<ccc.Hex>} A promise that resolves to the Bitcoin public key.
60
71
  */
61
72
  async getBtcPublicKey() {
62
- return core_1.ccc.hexFrom((await this.assertConnection()).publicKey);
73
+ if (this.provider.getSelectedAccount) {
74
+ const account = await this.provider.getSelectedAccount();
75
+ if (!account) {
76
+ throw Error("Not connected");
77
+ }
78
+ return core_1.ccc.hexFrom(account.publicKey);
79
+ }
80
+ return core_1.ccc.hexFrom(await this.provider.getPublicKey());
63
81
  }
64
82
  /**
65
83
  * Connects to the provider by requesting accounts.
66
84
  * @returns {Promise<void>} A promise that resolves when the connection is established.
67
85
  */
68
86
  async connect() {
69
- await this.provider.connect();
87
+ if (this.provider.connect) {
88
+ await this.provider.connect();
89
+ return;
90
+ }
91
+ await this.provider.requestAccounts();
70
92
  }
71
- async replaceClient(client) {
72
- const res = await super.replaceClient(client);
73
- this.provider; // Check if the network is valid
74
- return res;
93
+ onReplaced(listener) {
94
+ const stop = [];
95
+ const replacer = async () => {
96
+ listener();
97
+ stop[0]?.();
98
+ };
99
+ stop.push(() => {
100
+ this.provider.removeListener("accountChanged", replacer);
101
+ });
102
+ this.provider.on("accountChanged", replacer);
103
+ return stop[0];
75
104
  }
76
105
  /**
77
106
  * Checks if the signer is connected.
78
107
  * @returns {Promise<boolean>} A promise that resolves to true if connected, false otherwise.
79
108
  */
80
109
  async isConnected() {
81
- return (await this.provider.getSelectedAccount()) !== null;
110
+ try {
111
+ this.provider;
112
+ }
113
+ catch (_) {
114
+ return false;
115
+ }
116
+ if (this.provider.getSelectedAccount) {
117
+ if ((await this.provider.getSelectedAccount()) === null) {
118
+ return false;
119
+ }
120
+ }
121
+ else if ((await this.provider.getAccounts()).length === 0) {
122
+ return false;
123
+ }
124
+ await this.connect();
125
+ return true;
82
126
  }
83
127
  /**
84
128
  * Signs a raw message with the Bitcoin account.
@@ -5,13 +5,14 @@ import { NostrProvider } from "../advancedBarrel";
5
5
  * @class
6
6
  * @extends {ccc.SignerBtc}
7
7
  */
8
- export declare class SignerNostr extends ccc.SignerNostr {
8
+ export declare class NostrSigner extends ccc.SignerNostr {
9
9
  readonly provider: NostrProvider;
10
+ private publicKeyCache?;
10
11
  constructor(client: ccc.Client, provider: NostrProvider);
11
- replaceClient(client: ccc.Client): Promise<boolean>;
12
12
  getNostrPublicKey(): Promise<ccc.Hex>;
13
13
  signNostrEvent(event: ccc.NostrEvent): Promise<Required<ccc.NostrEvent>>;
14
14
  connect(): Promise<void>;
15
+ onReplaced(listener: () => void): () => void;
15
16
  isConnected(): Promise<boolean>;
16
17
  }
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nostr/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,GAAG,CAAC,WAAW;aAG5B,QAAQ,EAAE,aAAa;gBADvC,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,QAAQ,EAAE,aAAa;IAKnC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAQrC,cAAc,CAClB,KAAK,EAAE,GAAG,CAAC,UAAU,GACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAI9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nostr/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,GAAG,CAAC,WAAW;aAK5B,QAAQ,EAAE,aAAa;IAJzC,OAAO,CAAC,cAAc,CAAC,CAA8B;gBAGnD,MAAM,EAAE,GAAG,CAAC,MAAM,EACF,QAAQ,EAAE,aAAa;IAKnC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAOrC,cAAc,CAClB,KAAK,EAAE,GAAG,CAAC,UAAU,GACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAO9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAetC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
@@ -1,34 +1,47 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SignerNostr = void 0;
3
+ exports.NostrSigner = void 0;
4
4
  const core_1 = require("@ckb-ccc/core");
5
5
  /**
6
6
  * Class representing a Bitcoin signer that extends SignerBtc from @ckb-ccc/core.
7
7
  * @class
8
8
  * @extends {ccc.SignerBtc}
9
9
  */
10
- class SignerNostr extends core_1.ccc.SignerNostr {
10
+ class NostrSigner extends core_1.ccc.SignerNostr {
11
11
  constructor(client, provider) {
12
12
  super(client);
13
13
  this.provider = provider;
14
- }
15
- async replaceClient(client) {
16
- return super.replaceClient(client);
14
+ this.publicKeyCache = undefined;
17
15
  }
18
16
  async getNostrPublicKey() {
19
- if (!this.provider.selectedAccount) {
20
- throw new Error("Not connected");
17
+ if (!this.publicKeyCache) {
18
+ this.publicKeyCache = this.provider.getPublicKey();
21
19
  }
22
- return core_1.ccc.hexFrom(this.provider.selectedAccount.publicKey);
20
+ return core_1.ccc.hexFrom(await this.publicKeyCache);
23
21
  }
24
22
  async signNostrEvent(event) {
25
- return this.provider.signEvent(event);
23
+ return this.provider.signEvent({
24
+ ...event,
25
+ pubkey: await this.publicKeyCache,
26
+ });
26
27
  }
27
28
  async connect() {
28
- await this.provider.getPublicKey();
29
+ await this.provider.connect?.(); // Help extension to switch network
30
+ }
31
+ onReplaced(listener) {
32
+ const stop = [];
33
+ const replacer = async () => {
34
+ listener();
35
+ stop[0]?.();
36
+ };
37
+ stop.push(() => {
38
+ this.provider.removeListener("accountChanged", replacer);
39
+ });
40
+ this.provider.on("accountChanged", replacer);
41
+ return stop[0];
29
42
  }
30
43
  async isConnected() {
31
- return this.provider.selectedAccount !== null;
44
+ return true;
32
45
  }
33
46
  }
34
- exports.SignerNostr = SignerNostr;
47
+ exports.NostrSigner = NostrSigner;
@@ -15,7 +15,7 @@ function getOKXBitcoinSigner(client, preferredNetworks) {
15
15
  }
16
16
  return [
17
17
  new btc_1.BitcoinSigner(client, windowRef.okxwallet, preferredNetworks),
18
- new nostr_1.SignerNostr(client, windowRef.okxwallet.nostr),
18
+ new nostr_1.NostrSigner(client, windowRef.okxwallet.nostr),
19
19
  ];
20
20
  }
21
21
  exports.getOKXBitcoinSigner = getOKXBitcoinSigner;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckb-ccc/okx",
3
- "version": "0.0.9-alpha.1",
3
+ "version": "0.0.10-alpha.0",
4
4
  "description": "CCC - CKBer's Codebase. Common Chains Connector's support for OKX",
5
5
  "author": "Hanssen0 <hanssen0@hanssen0.com>",
6
6
  "license": "MIT",
@@ -42,8 +42,9 @@
42
42
  "access": "public"
43
43
  },
44
44
  "dependencies": {
45
- "@ckb-ccc/core": "0.0.9-alpha.1",
46
- "@ckb-ccc/nip07": "0.0.9-alpha.1"
45
+ "@ckb-ccc/core": "0.0.10-alpha.0",
46
+ "@ckb-ccc/nip07": "0.0.10-alpha.0",
47
+ "@ckb-ccc/uni-sat": "0.0.10-alpha.0"
47
48
  },
48
- "gitHead": "d708cbabd48a160d7608a0b86093b16f35451f79"
49
+ "gitHead": "8a4c789419f5e12e1f230cead213c59373834a1a"
49
50
  }
@@ -1,21 +1,50 @@
1
1
  import { Nip07A } from "@ckb-ccc/nip07/advanced";
2
+ import { UniSatA } from "@ckb-ccc/uni-sat/advanced";
2
3
 
3
- export interface BitcoinProvider {
4
- connect(): Promise<{
4
+ export interface BitcoinProvider extends UniSatA.Provider {
5
+ connect?(): Promise<{
5
6
  address: string;
6
7
  publicKey: string;
7
8
  compressedPublicKey: string;
8
9
  }>;
9
10
 
10
- getSelectedAccount(): Promise<{
11
+ getSelectedAccount?(): Promise<{
11
12
  address: string;
12
13
  publicKey: string;
13
14
  compressedPublicKey: string;
14
15
  } | null>;
15
-
16
- signMessage(msg: string, type: "ecdsa" | "bip322-simple"): Promise<string>;
17
16
  }
18
17
 
19
18
  export interface NostrProvider extends Nip07A.Provider {
20
- selectedAccount: { address: string; publicKey: string } | null;
19
+ connect?(): Promise<void>;
20
+
21
+ /**
22
+ * Adds an event listener to the provider.
23
+ */
24
+ on: NostrOnMethod;
25
+
26
+ /**
27
+ * Removes an event listener from the provider.
28
+ * @param eventName - The name of the event to remove the listener from.
29
+ * @param listener - The listener function to remove.
30
+ * @returns The provider instance.
31
+ */
32
+ removeListener(
33
+ eventName: string,
34
+ listener: (...args: unknown[]) => unknown,
35
+ ): NostrProvider;
36
+ }
37
+
38
+ /**
39
+ * Interface representing a method to add event listeners to the provider.
40
+ * @interface
41
+ */
42
+ export interface NostrOnMethod {
43
+ /**
44
+ * Adds an event listener to the provider.
45
+ * @param eventName - The name of the event.
46
+ * @param listener - The listener function.
47
+ * @returns The provider instance.
48
+ */
49
+ (eventName: string, listener: (...args: unknown[]) => unknown): Promise<void>;
21
50
  }
package/src/btc/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ccc, Client } from "@ckb-ccc/core";
1
+ import { ccc } from "@ckb-ccc/core";
2
2
  import { BitcoinProvider } from "../advancedBarrel";
3
3
 
4
4
  /**
@@ -17,7 +17,18 @@ export class BitcoinSigner extends ccc.SignerBtc {
17
17
  constructor(
18
18
  client: ccc.Client,
19
19
  public readonly providers: Record<string, BitcoinProvider>,
20
- private readonly preferredNetworks: ccc.NetworkPreference[],
20
+ private readonly preferredNetworks: ccc.NetworkPreference[] = [
21
+ {
22
+ addressPrefix: "ckb",
23
+ signerType: ccc.SignerType.BTC,
24
+ network: "btc",
25
+ },
26
+ {
27
+ addressPrefix: "ckt",
28
+ signerType: ccc.SignerType.BTC,
29
+ network: "btcTestnet",
30
+ },
31
+ ],
21
32
  ) {
22
33
  super(client);
23
34
  }
@@ -48,24 +59,24 @@ export class BitcoinSigner extends ccc.SignerBtc {
48
59
  return provider;
49
60
  }
50
61
 
51
- /**
52
- * Get account info if the signer is connected.
53
- * @returns Account information
54
- */
55
- async assertConnection(): Promise<{ address: string; publicKey: string }> {
56
- const account = await this.provider.getSelectedAccount();
57
- if (!account) {
58
- throw Error("Not connected");
59
- }
60
- return account;
61
- }
62
-
63
62
  /**
64
63
  * Gets the Bitcoin account address.
65
64
  * @returns {Promise<string>} A promise that resolves to the Bitcoin account address.
66
65
  */
67
66
  async getBtcAccount(): Promise<string> {
68
- return (await this.assertConnection()).address;
67
+ if (this.provider.getSelectedAccount) {
68
+ const account = await this.provider.getSelectedAccount();
69
+ if (!account) {
70
+ throw Error("Not connected");
71
+ }
72
+ return account.address;
73
+ }
74
+
75
+ const address = (await this.provider.getAccounts())[0];
76
+ if (!address) {
77
+ throw Error("Not connected");
78
+ }
79
+ return address;
69
80
  }
70
81
 
71
82
  /**
@@ -73,7 +84,15 @@ export class BitcoinSigner extends ccc.SignerBtc {
73
84
  * @returns {Promise<ccc.Hex>} A promise that resolves to the Bitcoin public key.
74
85
  */
75
86
  async getBtcPublicKey(): Promise<ccc.Hex> {
76
- return ccc.hexFrom((await this.assertConnection()).publicKey);
87
+ if (this.provider.getSelectedAccount) {
88
+ const account = await this.provider.getSelectedAccount();
89
+ if (!account) {
90
+ throw Error("Not connected");
91
+ }
92
+ return ccc.hexFrom(account.publicKey);
93
+ }
94
+
95
+ return ccc.hexFrom(await this.provider.getPublicKey());
77
96
  }
78
97
 
79
98
  /**
@@ -81,13 +100,26 @@ export class BitcoinSigner extends ccc.SignerBtc {
81
100
  * @returns {Promise<void>} A promise that resolves when the connection is established.
82
101
  */
83
102
  async connect(): Promise<void> {
84
- await this.provider.connect();
103
+ if (this.provider.connect) {
104
+ await this.provider.connect();
105
+ return;
106
+ }
107
+ await this.provider.requestAccounts();
85
108
  }
86
109
 
87
- async replaceClient(client: Client): Promise<boolean> {
88
- const res = await super.replaceClient(client);
89
- this.provider; // Check if the network is valid
90
- return res;
110
+ onReplaced(listener: () => void): () => void {
111
+ const stop: (() => void)[] = [];
112
+ const replacer = async () => {
113
+ listener();
114
+ stop[0]?.();
115
+ };
116
+ stop.push(() => {
117
+ this.provider.removeListener("accountChanged", replacer);
118
+ });
119
+
120
+ this.provider.on("accountChanged", replacer);
121
+
122
+ return stop[0];
91
123
  }
92
124
 
93
125
  /**
@@ -95,7 +127,22 @@ export class BitcoinSigner extends ccc.SignerBtc {
95
127
  * @returns {Promise<boolean>} A promise that resolves to true if connected, false otherwise.
96
128
  */
97
129
  async isConnected(): Promise<boolean> {
98
- return (await this.provider.getSelectedAccount()) !== null;
130
+ try {
131
+ this.provider;
132
+ } catch (_) {
133
+ return false;
134
+ }
135
+
136
+ if (this.provider.getSelectedAccount) {
137
+ if ((await this.provider.getSelectedAccount()) === null) {
138
+ return false;
139
+ }
140
+ } else if ((await this.provider.getAccounts()).length === 0) {
141
+ return false;
142
+ }
143
+
144
+ await this.connect();
145
+ return true;
99
146
  }
100
147
 
101
148
  /**
@@ -6,7 +6,9 @@ import { NostrProvider } from "../advancedBarrel";
6
6
  * @class
7
7
  * @extends {ccc.SignerBtc}
8
8
  */
9
- export class SignerNostr extends ccc.SignerNostr {
9
+ export class NostrSigner extends ccc.SignerNostr {
10
+ private publicKeyCache?: Promise<string> = undefined;
11
+
10
12
  constructor(
11
13
  client: ccc.Client,
12
14
  public readonly provider: NostrProvider,
@@ -14,29 +16,42 @@ export class SignerNostr extends ccc.SignerNostr {
14
16
  super(client);
15
17
  }
16
18
 
17
- async replaceClient(client: ccc.Client): Promise<boolean> {
18
- return super.replaceClient(client);
19
- }
20
-
21
19
  async getNostrPublicKey(): Promise<ccc.Hex> {
22
- if (!this.provider.selectedAccount) {
23
- throw new Error("Not connected");
20
+ if (!this.publicKeyCache) {
21
+ this.publicKeyCache = this.provider.getPublicKey();
24
22
  }
25
-
26
- return ccc.hexFrom(this.provider.selectedAccount.publicKey);
23
+ return ccc.hexFrom(await this.publicKeyCache);
27
24
  }
28
25
 
29
26
  async signNostrEvent(
30
27
  event: ccc.NostrEvent,
31
28
  ): Promise<Required<ccc.NostrEvent>> {
32
- return this.provider.signEvent(event);
29
+ return this.provider.signEvent({
30
+ ...event,
31
+ pubkey: await this.publicKeyCache,
32
+ });
33
33
  }
34
34
 
35
35
  async connect(): Promise<void> {
36
- await this.provider.getPublicKey();
36
+ await this.provider.connect?.(); // Help extension to switch network
37
+ }
38
+
39
+ onReplaced(listener: () => void): () => void {
40
+ const stop: (() => void)[] = [];
41
+ const replacer = async () => {
42
+ listener();
43
+ stop[0]?.();
44
+ };
45
+ stop.push(() => {
46
+ this.provider.removeListener("accountChanged", replacer);
47
+ });
48
+
49
+ this.provider.on("accountChanged", replacer);
50
+
51
+ return stop[0];
37
52
  }
38
53
 
39
54
  async isConnected(): Promise<boolean> {
40
- return this.provider.selectedAccount !== null;
55
+ return true;
41
56
  }
42
57
  }
@@ -1,7 +1,7 @@
1
1
  import { ccc } from "@ckb-ccc/core";
2
2
  import { BitcoinProvider, NostrProvider } from "./advancedBarrel";
3
3
  import { BitcoinSigner } from "./btc";
4
- import { SignerNostr } from "./nostr";
4
+ import { NostrSigner } from "./nostr";
5
5
 
6
6
  /**
7
7
  * Retrieves the OKX Bitcoin signer if available.
@@ -22,6 +22,6 @@ export function getOKXBitcoinSigner(
22
22
 
23
23
  return [
24
24
  new BitcoinSigner(client, windowRef.okxwallet, preferredNetworks),
25
- new SignerNostr(client, windowRef.okxwallet.nostr),
25
+ new NostrSigner(client, windowRef.okxwallet.nostr),
26
26
  ];
27
27
  }