@ckb-ccc/xverse 0.0.15-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.
Files changed (90) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +51 -0
  3. package/dist/advanced.d.ts +2 -0
  4. package/dist/advanced.d.ts.map +1 -0
  5. package/dist/advanced.js +1 -0
  6. package/dist/advancedBarrel.d.ts +2 -0
  7. package/dist/advancedBarrel.d.ts.map +1 -0
  8. package/dist/advancedBarrel.js +1 -0
  9. package/dist/barrel.d.ts +3 -0
  10. package/dist/barrel.d.ts.map +1 -0
  11. package/dist/barrel.js +2 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +1 -0
  15. package/dist/package.json +3 -0
  16. package/dist/sat-connect-core/advanced.d.ts +5 -0
  17. package/dist/sat-connect-core/advanced.d.ts.map +1 -0
  18. package/dist/sat-connect-core/advanced.js +4 -0
  19. package/dist/sat-connect-core/btcMethods.advanced.d.ts +280 -0
  20. package/dist/sat-connect-core/btcMethods.advanced.d.ts.map +1 -0
  21. package/dist/sat-connect-core/btcMethods.advanced.js +179 -0
  22. package/dist/sat-connect-core/provider.advanced.d.ts +48 -0
  23. package/dist/sat-connect-core/provider.advanced.d.ts.map +1 -0
  24. package/dist/sat-connect-core/provider.advanced.js +21 -0
  25. package/dist/sat-connect-core/requests.advanced.d.ts +21 -0
  26. package/dist/sat-connect-core/requests.advanced.d.ts.map +1 -0
  27. package/dist/sat-connect-core/requests.advanced.js +1 -0
  28. package/dist/sat-connect-core/types.advanced.d.ts +124 -0
  29. package/dist/sat-connect-core/types.advanced.d.ts.map +1 -0
  30. package/dist/sat-connect-core/types.advanced.js +79 -0
  31. package/dist/sat-connect-core/walletMethods.advanced.d.ts +36 -0
  32. package/dist/sat-connect-core/walletMethods.advanced.d.ts.map +1 -0
  33. package/dist/sat-connect-core/walletMethods.advanced.js +37 -0
  34. package/dist/signer.d.ts +47 -0
  35. package/dist/signer.d.ts.map +1 -0
  36. package/dist/signer.js +123 -0
  37. package/dist/signersFactory.d.ts +13 -0
  38. package/dist/signersFactory.d.ts.map +1 -0
  39. package/dist/signersFactory.js +30 -0
  40. package/dist.commonjs/advanced.d.ts +2 -0
  41. package/dist.commonjs/advanced.d.ts.map +1 -0
  42. package/dist.commonjs/advanced.js +27 -0
  43. package/dist.commonjs/advancedBarrel.d.ts +2 -0
  44. package/dist.commonjs/advancedBarrel.d.ts.map +1 -0
  45. package/dist.commonjs/advancedBarrel.js +17 -0
  46. package/dist.commonjs/barrel.d.ts +3 -0
  47. package/dist.commonjs/barrel.d.ts.map +1 -0
  48. package/dist.commonjs/barrel.js +18 -0
  49. package/dist.commonjs/index.d.ts +2 -0
  50. package/dist.commonjs/index.d.ts.map +1 -0
  51. package/dist.commonjs/index.js +27 -0
  52. package/dist.commonjs/package.json +3 -0
  53. package/dist.commonjs/sat-connect-core/advanced.d.ts +5 -0
  54. package/dist.commonjs/sat-connect-core/advanced.d.ts.map +1 -0
  55. package/dist.commonjs/sat-connect-core/advanced.js +20 -0
  56. package/dist.commonjs/sat-connect-core/btcMethods.advanced.d.ts +280 -0
  57. package/dist.commonjs/sat-connect-core/btcMethods.advanced.d.ts.map +1 -0
  58. package/dist.commonjs/sat-connect-core/btcMethods.advanced.js +205 -0
  59. package/dist.commonjs/sat-connect-core/provider.advanced.d.ts +48 -0
  60. package/dist.commonjs/sat-connect-core/provider.advanced.d.ts.map +1 -0
  61. package/dist.commonjs/sat-connect-core/provider.advanced.js +47 -0
  62. package/dist.commonjs/sat-connect-core/requests.advanced.d.ts +21 -0
  63. package/dist.commonjs/sat-connect-core/requests.advanced.d.ts.map +1 -0
  64. package/dist.commonjs/sat-connect-core/requests.advanced.js +2 -0
  65. package/dist.commonjs/sat-connect-core/types.advanced.d.ts +124 -0
  66. package/dist.commonjs/sat-connect-core/types.advanced.d.ts.map +1 -0
  67. package/dist.commonjs/sat-connect-core/types.advanced.js +105 -0
  68. package/dist.commonjs/sat-connect-core/walletMethods.advanced.d.ts +36 -0
  69. package/dist.commonjs/sat-connect-core/walletMethods.advanced.d.ts.map +1 -0
  70. package/dist.commonjs/sat-connect-core/walletMethods.advanced.js +63 -0
  71. package/dist.commonjs/signer.d.ts +47 -0
  72. package/dist.commonjs/signer.d.ts.map +1 -0
  73. package/dist.commonjs/signer.js +150 -0
  74. package/dist.commonjs/signersFactory.d.ts +13 -0
  75. package/dist.commonjs/signersFactory.d.ts.map +1 -0
  76. package/dist.commonjs/signersFactory.js +34 -0
  77. package/package.json +57 -0
  78. package/src/advanced.ts +1 -0
  79. package/src/advancedBarrel.ts +1 -0
  80. package/src/barrel.ts +2 -0
  81. package/src/index.ts +1 -0
  82. package/src/sat-connect-core/advanced.ts +4 -0
  83. package/src/sat-connect-core/btcMethods.advanced.ts +304 -0
  84. package/src/sat-connect-core/provider.advanced.ts +61 -0
  85. package/src/sat-connect-core/requests.advanced.ts +41 -0
  86. package/src/sat-connect-core/types.advanced.ts +159 -0
  87. package/src/sat-connect-core/walletMethods.advanced.ts +58 -0
  88. package/src/signer.ts +170 -0
  89. package/src/signersFactory.ts +50 -0
  90. package/typedoc.json +6 -0
package/src/signer.ts ADDED
@@ -0,0 +1,170 @@
1
+ import { ccc } from "@ckb-ccc/core";
2
+ import * as v from "valibot";
3
+ import {
4
+ Address,
5
+ AddressPurpose,
6
+ BtcProvider,
7
+ MessageSigningProtocols,
8
+ Requests,
9
+ Return,
10
+ RpcErrorCode,
11
+ RpcResponse,
12
+ rpcErrorResponseMessageSchema,
13
+ rpcSuccessResponseMessageSchema,
14
+ } from "./advancedBarrel.js";
15
+
16
+ async function checkResponse<T extends keyof Requests>(
17
+ response: Promise<RpcResponse<T>>,
18
+ ): Promise<Return<T>> {
19
+ const res = await response;
20
+ if (v.is(rpcErrorResponseMessageSchema, res)) {
21
+ throw res.error;
22
+ }
23
+
24
+ if (v.is(rpcSuccessResponseMessageSchema, res)) {
25
+ return res.result as Return<T>;
26
+ }
27
+
28
+ throw {
29
+ code: RpcErrorCode.INTERNAL_ERROR,
30
+ message: "Received unknown response from provider.",
31
+ data: res,
32
+ };
33
+ }
34
+
35
+ /**
36
+ * Class representing a Bitcoin signer that extends SignerBtc
37
+ * @public
38
+ */
39
+ export class Signer extends ccc.SignerBtc {
40
+ private addressCache: Promise<Address | undefined> | undefined;
41
+
42
+ /**
43
+ * Creates an instance of Signer.
44
+ * @param client - The client instance.
45
+ * @param provider - The provider instance.
46
+ */
47
+ constructor(
48
+ client: ccc.Client,
49
+ public readonly provider: BtcProvider,
50
+ private readonly preferredNetworks: ccc.NetworkPreference[] = [
51
+ {
52
+ addressPrefix: "ckb",
53
+ signerType: ccc.SignerType.BTC,
54
+ network: "btc",
55
+ },
56
+ {
57
+ addressPrefix: "ckt",
58
+ signerType: ccc.SignerType.BTC,
59
+ network: "btcTestnet",
60
+ },
61
+ ],
62
+ ) {
63
+ super(client);
64
+ }
65
+
66
+ async assertAddress(): Promise<Address> {
67
+ this.addressCache =
68
+ this.addressCache ??
69
+ (async () => {
70
+ if (!(await this.isConnected())) {
71
+ return;
72
+ }
73
+
74
+ return (
75
+ await checkResponse(
76
+ this.provider.request("getAddresses", {
77
+ purposes: [AddressPurpose.Payment],
78
+ }),
79
+ )
80
+ ).addresses[0];
81
+ })();
82
+ const address = await this.addressCache;
83
+
84
+ if (address) {
85
+ return address;
86
+ }
87
+ throw Error("Not connected");
88
+ }
89
+
90
+ /**
91
+ * Gets the Bitcoin account address.
92
+ * @returns A promise that resolves to the Bitcoin account address.
93
+ */
94
+ async getBtcAccount(): Promise<string> {
95
+ return (await this.assertAddress()).address;
96
+ }
97
+
98
+ /**
99
+ * Gets the Bitcoin public key.
100
+ * @returns A promise that resolves to the Bitcoin public key.
101
+ */
102
+ async getBtcPublicKey(): Promise<ccc.Hex> {
103
+ return ccc.hexFrom((await this.assertAddress()).publicKey);
104
+ }
105
+
106
+ /**
107
+ * Connects to the provider by requesting accounts.
108
+ * @returns A promise that resolves when the connection is established.
109
+ */
110
+ async connect(): Promise<void> {
111
+ if (await this.isConnected()) {
112
+ return;
113
+ }
114
+
115
+ await checkResponse(
116
+ this.provider.request("wallet_requestPermissions", undefined),
117
+ );
118
+ }
119
+
120
+ async disconnect(): Promise<void> {
121
+ this.addressCache = undefined;
122
+ }
123
+
124
+ onReplaced(listener: () => void): () => void {
125
+ const stop: (() => void)[] = [];
126
+ const replacer = async () => {
127
+ listener();
128
+ stop[0]?.();
129
+ };
130
+ stop.push(
131
+ this.provider.addListener("accountChange", replacer),
132
+ this.provider.addListener("networkChange", replacer),
133
+ );
134
+
135
+ return stop[0];
136
+ }
137
+
138
+ /**
139
+ * Checks if the signer is connected.
140
+ * @returns A promise that resolves to true if connected, false otherwise.
141
+ */
142
+ async isConnected(): Promise<boolean> {
143
+ try {
144
+ await checkResponse(this.provider.request("getBalance", undefined));
145
+ return true;
146
+ } catch (error) {
147
+ return false;
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Signs a raw message with the Bitcoin account.
153
+ * @param message - The message to sign.
154
+ * @returns A promise that resolves to the signed message.
155
+ */
156
+ async signMessageRaw(message: string | ccc.BytesLike): Promise<string> {
157
+ const challenge =
158
+ typeof message === "string" ? message : ccc.hexFrom(message).slice(2);
159
+
160
+ return (
161
+ await checkResponse(
162
+ this.provider.request("signMessage", {
163
+ message: challenge,
164
+ address: (await this.assertAddress()).address,
165
+ protocol: MessageSigningProtocols.ECDSA,
166
+ }),
167
+ )
168
+ ).signature;
169
+ }
170
+ }
@@ -0,0 +1,50 @@
1
+ import { ccc } from "@ckb-ccc/core";
2
+ import { BtcProvider, Provider } from "./advancedBarrel.js";
3
+ import { Signer } from "./signer.js";
4
+
5
+ function getProviderById(providerId: string) {
6
+ return providerId?.split(".").reduce((acc: any, part) => acc?.[part], window);
7
+ }
8
+
9
+ /**
10
+ * Retrieves the Xverse signer if available.
11
+ * @public
12
+ *
13
+ * @param client - The client instance.
14
+ * @returns All Xverse Signer instances
15
+ */
16
+ export function getXverseSigners(
17
+ client: ccc.Client,
18
+ preferredNetworks?: ccc.NetworkPreference[],
19
+ ): { wallet: ccc.Wallet; signerInfo: ccc.SignerInfo }[] {
20
+ const windowRef = window as {
21
+ BitcoinProvider?: BtcProvider;
22
+ XverseProviders?: {
23
+ BitcoinProvider?: BtcProvider;
24
+ };
25
+ btc_providers?: Provider[];
26
+ };
27
+
28
+ const signers = (() => {
29
+ if (windowRef.btc_providers) {
30
+ return windowRef.btc_providers.map((provider) => ({
31
+ wallet: {
32
+ name: provider.name,
33
+ icon: provider.icon,
34
+ },
35
+ signerInfo: {
36
+ name: "BTC",
37
+ signer: new Signer(
38
+ client,
39
+ getProviderById(provider.id),
40
+ preferredNetworks,
41
+ ),
42
+ },
43
+ }));
44
+ }
45
+
46
+ return [];
47
+ })();
48
+
49
+ return signers;
50
+ }
package/typedoc.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://typedoc.org/schema.json",
3
+ "entryPoints": ["./src/index.ts", "./src/advanced.ts"],
4
+ "extends": ["../../typedoc.base.json"],
5
+ "name": "@ckb-ccc xverse"
6
+ }