@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.
- package/dist/advancedBarrel.d.ts +29 -8
- package/dist/advancedBarrel.d.ts.map +1 -1
- package/dist/btc/index.d.ts +3 -11
- package/dist/btc/index.d.ts.map +1 -1
- package/dist/btc/index.js +64 -20
- package/dist/nostr/index.d.ts +3 -2
- package/dist/nostr/index.d.ts.map +1 -1
- package/dist/nostr/index.js +23 -10
- package/dist/signersFactory.js +2 -2
- package/dist.commonjs/advancedBarrel.d.ts +29 -8
- package/dist.commonjs/advancedBarrel.d.ts.map +1 -1
- package/dist.commonjs/btc/index.d.ts +3 -11
- package/dist.commonjs/btc/index.d.ts.map +1 -1
- package/dist.commonjs/btc/index.js +64 -20
- package/dist.commonjs/nostr/index.d.ts +3 -2
- package/dist.commonjs/nostr/index.d.ts.map +1 -1
- package/dist.commonjs/nostr/index.js +25 -12
- package/dist.commonjs/signersFactory.js +1 -1
- package/package.json +5 -4
- package/src/advancedBarrel.ts +35 -6
- package/src/btc/index.ts +69 -22
- package/src/nostr/index.ts +27 -12
- package/src/signersFactory.ts +2 -2
package/dist/advancedBarrel.d.ts
CHANGED
|
@@ -1,21 +1,42 @@
|
|
|
1
1
|
import { Nip07A } from "@ckb-ccc/nip07/advanced";
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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;
|
|
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"}
|
package/dist/btc/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ccc
|
|
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
|
|
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
|
-
|
|
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.
|
package/dist/btc/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/btc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
+
if (this.provider.connect) {
|
|
85
|
+
await this.provider.connect();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
await this.provider.requestAccounts();
|
|
67
89
|
}
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
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.
|
package/dist/nostr/index.d.ts
CHANGED
|
@@ -5,13 +5,14 @@ import { NostrProvider } from "../advancedBarrel";
|
|
|
5
5
|
* @class
|
|
6
6
|
* @extends {ccc.SignerBtc}
|
|
7
7
|
*/
|
|
8
|
-
export declare class
|
|
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;
|
|
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"}
|
package/dist/nostr/index.js
CHANGED
|
@@ -4,27 +4,40 @@ import { ccc } from "@ckb-ccc/core";
|
|
|
4
4
|
* @class
|
|
5
5
|
* @extends {ccc.SignerBtc}
|
|
6
6
|
*/
|
|
7
|
-
export class
|
|
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.
|
|
17
|
-
|
|
14
|
+
if (!this.publicKeyCache) {
|
|
15
|
+
this.publicKeyCache = this.provider.getPublicKey();
|
|
18
16
|
}
|
|
19
|
-
return ccc.hexFrom(this.
|
|
17
|
+
return ccc.hexFrom(await this.publicKeyCache);
|
|
20
18
|
}
|
|
21
19
|
async signNostrEvent(event) {
|
|
22
|
-
return this.provider.signEvent(
|
|
20
|
+
return this.provider.signEvent({
|
|
21
|
+
...event,
|
|
22
|
+
pubkey: await this.publicKeyCache,
|
|
23
|
+
});
|
|
23
24
|
}
|
|
24
25
|
async connect() {
|
|
25
|
-
await this.provider.
|
|
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
|
|
41
|
+
return true;
|
|
29
42
|
}
|
|
30
43
|
}
|
package/dist/signersFactory.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BitcoinSigner } from "./btc";
|
|
2
|
-
import {
|
|
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
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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;
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
87
|
+
if (this.provider.connect) {
|
|
88
|
+
await this.provider.connect();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await this.provider.requestAccounts();
|
|
70
92
|
}
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
|
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;
|
|
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.
|
|
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
|
|
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.
|
|
20
|
-
|
|
17
|
+
if (!this.publicKeyCache) {
|
|
18
|
+
this.publicKeyCache = this.provider.getPublicKey();
|
|
21
19
|
}
|
|
22
|
-
return core_1.ccc.hexFrom(this.
|
|
20
|
+
return core_1.ccc.hexFrom(await this.publicKeyCache);
|
|
23
21
|
}
|
|
24
22
|
async signNostrEvent(event) {
|
|
25
|
-
return this.provider.signEvent(
|
|
23
|
+
return this.provider.signEvent({
|
|
24
|
+
...event,
|
|
25
|
+
pubkey: await this.publicKeyCache,
|
|
26
|
+
});
|
|
26
27
|
}
|
|
27
28
|
async connect() {
|
|
28
|
-
await this.provider.
|
|
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
|
|
44
|
+
return true;
|
|
32
45
|
}
|
|
33
46
|
}
|
|
34
|
-
exports.
|
|
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.
|
|
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.
|
|
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.
|
|
46
|
-
"@ckb-ccc/nip07": "0.0.
|
|
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": "
|
|
49
|
+
"gitHead": "8a4c789419f5e12e1f230cead213c59373834a1a"
|
|
49
50
|
}
|
package/src/advancedBarrel.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
+
if (this.provider.connect) {
|
|
104
|
+
await this.provider.connect();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
await this.provider.requestAccounts();
|
|
85
108
|
}
|
|
86
109
|
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
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
|
/**
|
package/src/nostr/index.ts
CHANGED
|
@@ -6,7 +6,9 @@ import { NostrProvider } from "../advancedBarrel";
|
|
|
6
6
|
* @class
|
|
7
7
|
* @extends {ccc.SignerBtc}
|
|
8
8
|
*/
|
|
9
|
-
export class
|
|
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.
|
|
23
|
-
|
|
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(
|
|
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.
|
|
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
|
|
55
|
+
return true;
|
|
41
56
|
}
|
|
42
57
|
}
|
package/src/signersFactory.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
25
|
+
new NostrSigner(client, windowRef.okxwallet.nostr),
|
|
26
26
|
];
|
|
27
27
|
}
|