@ckb-ccc/core 0.0.5-alpha.8 → 0.0.7-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 (265) hide show
  1. package/dist/address/address.advanced.d.ts.map +1 -1
  2. package/dist/address/address.advanced.js +2 -5
  3. package/dist/address/index.d.ts +1 -1
  4. package/dist/address/index.d.ts.map +1 -1
  5. package/dist/address/index.js +2 -5
  6. package/dist/ckb/script.d.ts +43 -1
  7. package/dist/ckb/script.d.ts.map +1 -1
  8. package/dist/ckb/script.js +51 -0
  9. package/dist/ckb/transaction.d.ts +215 -27
  10. package/dist/ckb/transaction.d.ts.map +1 -1
  11. package/dist/ckb/transaction.js +472 -32
  12. package/dist/client/advanced.d.ts +2 -0
  13. package/dist/client/advanced.d.ts.map +1 -1
  14. package/dist/client/advanced.js +2 -0
  15. package/dist/client/client.advanced.d.ts +10 -0
  16. package/dist/client/client.advanced.d.ts.map +1 -0
  17. package/dist/client/client.advanced.js +80 -0
  18. package/dist/client/client.d.ts +50 -13
  19. package/dist/client/client.d.ts.map +1 -1
  20. package/dist/client/client.js +145 -15
  21. package/dist/client/clientPublicMainnet.advanced.d.ts +4 -2
  22. package/dist/client/clientPublicMainnet.advanced.d.ts.map +1 -1
  23. package/dist/client/clientPublicMainnet.advanced.js +103 -0
  24. package/dist/client/clientPublicMainnet.d.ts +4 -2
  25. package/dist/client/clientPublicMainnet.d.ts.map +1 -1
  26. package/dist/client/clientPublicMainnet.js +9 -1
  27. package/dist/client/clientPublicTestnet.advanced.d.ts +4 -2
  28. package/dist/client/clientPublicTestnet.advanced.d.ts.map +1 -1
  29. package/dist/client/clientPublicTestnet.advanced.js +155 -0
  30. package/dist/client/clientPublicTestnet.d.ts +4 -2
  31. package/dist/client/clientPublicTestnet.d.ts.map +1 -1
  32. package/dist/client/clientPublicTestnet.js +6 -1
  33. package/dist/client/clientTypes.advanced.d.ts +23 -0
  34. package/dist/client/clientTypes.advanced.d.ts.map +1 -0
  35. package/dist/client/clientTypes.advanced.js +4 -0
  36. package/dist/client/clientTypes.d.ts +22 -36
  37. package/dist/client/clientTypes.d.ts.map +1 -1
  38. package/dist/client/clientTypes.js +15 -12
  39. package/dist/client/jsonRpc/index.d.ts +3 -3
  40. package/dist/client/jsonRpc/index.d.ts.map +1 -1
  41. package/dist/client/jsonRpc/index.js +3 -3
  42. package/dist/client/jsonRpc/transformers.d.ts +5 -7
  43. package/dist/client/jsonRpc/transformers.d.ts.map +1 -1
  44. package/dist/client/jsonRpc/transformers.js +8 -6
  45. package/dist/hasher/index.d.ts +1 -1
  46. package/dist/hasher/index.d.ts.map +1 -1
  47. package/dist/hasher/index.js +4 -2
  48. package/dist/num/index.d.ts +12 -0
  49. package/dist/num/index.d.ts.map +1 -1
  50. package/dist/num/index.js +21 -0
  51. package/dist/signer/btc/signerBtc.d.ts.map +1 -1
  52. package/dist/signer/btc/signerBtc.js +6 -3
  53. package/dist/signer/btc/signerBtcPublicKeyReadonly.d.ts +0 -6
  54. package/dist/signer/btc/signerBtcPublicKeyReadonly.d.ts.map +1 -1
  55. package/dist/signer/btc/signerBtcPublicKeyReadonly.js +0 -8
  56. package/dist/signer/btc/verify.d.ts.map +1 -1
  57. package/dist/signer/btc/verify.js +5 -2
  58. package/dist/signer/ckb/signerCkbScriptReadonly.d.ts +0 -6
  59. package/dist/signer/ckb/signerCkbScriptReadonly.d.ts.map +1 -1
  60. package/dist/signer/ckb/signerCkbScriptReadonly.js +0 -8
  61. package/dist/signer/dummy/alwaysError.d.ts +0 -1
  62. package/dist/signer/dummy/alwaysError.d.ts.map +1 -1
  63. package/dist/signer/dummy/alwaysError.js +0 -3
  64. package/dist/signer/dummy/openLink.d.ts +0 -1
  65. package/dist/signer/dummy/openLink.d.ts.map +1 -1
  66. package/dist/signer/dummy/openLink.js +0 -3
  67. package/dist/signer/evm/signerEvm.d.ts.map +1 -1
  68. package/dist/signer/evm/signerEvm.js +7 -5
  69. package/dist/signer/evm/signerEvmAddressReadonly.d.ts +0 -6
  70. package/dist/signer/evm/signerEvmAddressReadonly.d.ts.map +1 -1
  71. package/dist/signer/evm/signerEvmAddressReadonly.js +0 -8
  72. package/dist/signer/index.d.ts +1 -0
  73. package/dist/signer/index.d.ts.map +1 -1
  74. package/dist/signer/index.js +1 -0
  75. package/dist/signer/nostr/index.d.ts +2 -0
  76. package/dist/signer/nostr/index.d.ts.map +1 -0
  77. package/dist/signer/nostr/index.js +1 -0
  78. package/dist/signer/nostr/signerNostr.d.ts +66 -0
  79. package/dist/signer/nostr/signerNostr.d.ts.map +1 -0
  80. package/dist/signer/nostr/signerNostr.js +85 -0
  81. package/dist/signer/nostr/verify.d.ts +5 -0
  82. package/dist/signer/nostr/verify.d.ts.map +1 -0
  83. package/dist/signer/nostr/verify.js +48 -0
  84. package/dist/signer/signer/index.d.ts +7 -12
  85. package/dist/signer/signer/index.d.ts.map +1 -1
  86. package/dist/signer/signer/index.js +11 -4
  87. package/dist/utils/index.d.ts +59 -0
  88. package/dist/utils/index.d.ts.map +1 -1
  89. package/dist/utils/index.js +17 -0
  90. package/dist.commonjs/address/address.advanced.d.ts +29 -24
  91. package/dist.commonjs/address/address.advanced.d.ts.map +1 -1
  92. package/dist.commonjs/address/address.advanced.js +115 -92
  93. package/dist.commonjs/address/advanced.d.ts +1 -1
  94. package/dist.commonjs/address/advanced.js +30 -14
  95. package/dist.commonjs/address/index.d.ts +51 -44
  96. package/dist.commonjs/address/index.d.ts.map +1 -1
  97. package/dist.commonjs/address/index.js +84 -68
  98. package/dist.commonjs/advanced.d.ts +1 -1
  99. package/dist.commonjs/advanced.js +47 -22
  100. package/dist.commonjs/advancedBarrel.d.ts +1 -1
  101. package/dist.commonjs/advancedBarrel.js +30 -14
  102. package/dist.commonjs/barrel.d.ts +1 -1
  103. package/dist.commonjs/barrel.js +30 -14
  104. package/dist.commonjs/bytes/advanced.d.ts +11 -2
  105. package/dist.commonjs/bytes/index.d.ts +9 -3
  106. package/dist.commonjs/bytes/index.js +28 -26
  107. package/dist.commonjs/ckb/advanced.d.ts +1 -1
  108. package/dist.commonjs/ckb/advanced.js +47 -22
  109. package/dist.commonjs/ckb/index.d.ts +1 -1
  110. package/dist.commonjs/ckb/index.js +30 -14
  111. package/dist.commonjs/ckb/molecule.advanced/generated.d.ts +420 -260
  112. package/dist.commonjs/ckb/molecule.advanced/generated.js +1536 -1332
  113. package/dist.commonjs/ckb/molecule.advanced/index.d.ts +3 -3
  114. package/dist.commonjs/ckb/molecule.advanced/index.js +34 -18
  115. package/dist.commonjs/ckb/script.advanced.d.ts +1 -1
  116. package/dist.commonjs/ckb/script.advanced.js +12 -9
  117. package/dist.commonjs/ckb/script.d.ts +123 -77
  118. package/dist.commonjs/ckb/script.d.ts.map +1 -1
  119. package/dist.commonjs/ckb/script.js +221 -126
  120. package/dist.commonjs/ckb/transaction.advanced.d.ts +1 -1
  121. package/dist.commonjs/ckb/transaction.advanced.js +4 -4
  122. package/dist.commonjs/ckb/transaction.d.ts +796 -533
  123. package/dist.commonjs/ckb/transaction.d.ts.map +1 -1
  124. package/dist.commonjs/ckb/transaction.js +1372 -702
  125. package/dist.commonjs/client/advanced.d.ts +3 -1
  126. package/dist.commonjs/client/advanced.d.ts.map +1 -1
  127. package/dist.commonjs/client/advanced.js +32 -14
  128. package/dist.commonjs/client/client.advanced.d.ts +27 -0
  129. package/dist.commonjs/client/client.advanced.d.ts.map +1 -0
  130. package/dist.commonjs/client/client.advanced.js +116 -0
  131. package/dist.commonjs/client/client.d.ts +118 -21
  132. package/dist.commonjs/client/client.d.ts.map +1 -1
  133. package/dist.commonjs/client/client.js +219 -55
  134. package/dist.commonjs/client/clientPublicMainnet.advanced.d.ts +9 -3
  135. package/dist.commonjs/client/clientPublicMainnet.advanced.d.ts.map +1 -1
  136. package/dist.commonjs/client/clientPublicMainnet.advanced.js +144 -24
  137. package/dist.commonjs/client/clientPublicMainnet.d.ts +9 -5
  138. package/dist.commonjs/client/clientPublicMainnet.d.ts.map +1 -1
  139. package/dist.commonjs/client/clientPublicMainnet.js +18 -8
  140. package/dist.commonjs/client/clientPublicTestnet.advanced.d.ts +8 -3
  141. package/dist.commonjs/client/clientPublicTestnet.advanced.d.ts.map +1 -1
  142. package/dist.commonjs/client/clientPublicTestnet.advanced.js +204 -24
  143. package/dist.commonjs/client/clientPublicTestnet.d.ts +9 -5
  144. package/dist.commonjs/client/clientPublicTestnet.d.ts.map +1 -1
  145. package/dist.commonjs/client/clientPublicTestnet.js +14 -9
  146. package/dist.commonjs/client/clientTypes.advanced.d.ts +23 -0
  147. package/dist.commonjs/client/clientTypes.advanced.d.ts.map +1 -0
  148. package/dist.commonjs/client/clientTypes.advanced.js +8 -0
  149. package/dist.commonjs/client/clientTypes.d.ts +57 -46
  150. package/dist.commonjs/client/clientTypes.d.ts.map +1 -1
  151. package/dist.commonjs/client/clientTypes.js +60 -22
  152. package/dist.commonjs/client/index.d.ts +1 -1
  153. package/dist.commonjs/client/index.js +30 -14
  154. package/dist.commonjs/client/jsonRpc/advanced.d.ts +1 -1
  155. package/dist.commonjs/client/jsonRpc/advanced.js +30 -14
  156. package/dist.commonjs/client/jsonRpc/index.d.ts +94 -75
  157. package/dist.commonjs/client/jsonRpc/index.d.ts.map +1 -1
  158. package/dist.commonjs/client/jsonRpc/index.js +135 -108
  159. package/dist.commonjs/client/jsonRpc/transformers.d.ts +76 -38
  160. package/dist.commonjs/client/jsonRpc/transformers.d.ts.map +1 -1
  161. package/dist.commonjs/client/jsonRpc/transformers.js +174 -150
  162. package/dist.commonjs/client/jsonRpc/types.d.ts +38 -38
  163. package/dist.commonjs/fixedPoint/index.d.ts +9 -3
  164. package/dist.commonjs/fixedPoint/index.js +26 -20
  165. package/dist.commonjs/fixedPoint/index.test.d.ts +1 -1
  166. package/dist.commonjs/fixedPoint/index.test.js +42 -36
  167. package/dist.commonjs/hasher/advanced.d.ts +1 -1
  168. package/dist.commonjs/hasher/index.d.ts +37 -37
  169. package/dist.commonjs/hasher/index.d.ts.map +1 -1
  170. package/dist.commonjs/hasher/index.js +55 -46
  171. package/dist.commonjs/hex/index.d.ts +1 -1
  172. package/dist.commonjs/hex/index.js +1 -1
  173. package/dist.commonjs/index.d.ts +1 -1
  174. package/dist.commonjs/index.js +47 -22
  175. package/dist.commonjs/num/index.d.ts +13 -1
  176. package/dist.commonjs/num/index.d.ts.map +1 -1
  177. package/dist.commonjs/num/index.js +53 -19
  178. package/dist.commonjs/signer/btc/index.d.ts +1 -1
  179. package/dist.commonjs/signer/btc/index.js +30 -14
  180. package/dist.commonjs/signer/btc/signerBtc.d.ts +47 -47
  181. package/dist.commonjs/signer/btc/signerBtc.d.ts.map +1 -1
  182. package/dist.commonjs/signer/btc/signerBtc.js +89 -63
  183. package/dist.commonjs/signer/btc/signerBtcPublicKeyReadonly.d.ts +45 -51
  184. package/dist.commonjs/signer/btc/signerBtcPublicKeyReadonly.d.ts.map +1 -1
  185. package/dist.commonjs/signer/btc/signerBtcPublicKeyReadonly.js +52 -60
  186. package/dist.commonjs/signer/btc/verify.d.ts +6 -2
  187. package/dist.commonjs/signer/btc/verify.d.ts.map +1 -1
  188. package/dist.commonjs/signer/btc/verify.js +13 -3
  189. package/dist.commonjs/signer/ckb/index.d.ts +1 -1
  190. package/dist.commonjs/signer/ckb/index.js +30 -14
  191. package/dist.commonjs/signer/ckb/signerCkbScriptReadonly.d.ts +45 -51
  192. package/dist.commonjs/signer/ckb/signerCkbScriptReadonly.d.ts.map +1 -1
  193. package/dist.commonjs/signer/ckb/signerCkbScriptReadonly.js +56 -64
  194. package/dist.commonjs/signer/ckb/verifyJoyId.d.ts +6 -2
  195. package/dist.commonjs/signer/ckb/verifyJoyId.js +11 -8
  196. package/dist.commonjs/signer/dummy/alwaysError.d.ts +4 -5
  197. package/dist.commonjs/signer/dummy/alwaysError.d.ts.map +1 -1
  198. package/dist.commonjs/signer/dummy/alwaysError.js +7 -10
  199. package/dist.commonjs/signer/dummy/dummy.d.ts +7 -7
  200. package/dist.commonjs/signer/dummy/dummy.js +16 -16
  201. package/dist.commonjs/signer/dummy/index.d.ts +1 -1
  202. package/dist.commonjs/signer/dummy/index.js +30 -14
  203. package/dist.commonjs/signer/dummy/openLink.d.ts +4 -5
  204. package/dist.commonjs/signer/dummy/openLink.d.ts.map +1 -1
  205. package/dist.commonjs/signer/dummy/openLink.js +7 -10
  206. package/dist.commonjs/signer/evm/index.d.ts +1 -1
  207. package/dist.commonjs/signer/evm/index.js +30 -14
  208. package/dist.commonjs/signer/evm/signerEvm.d.ts +42 -38
  209. package/dist.commonjs/signer/evm/signerEvm.d.ts.map +1 -1
  210. package/dist.commonjs/signer/evm/signerEvm.js +106 -69
  211. package/dist.commonjs/signer/evm/signerEvmAddressReadonly.d.ts +37 -43
  212. package/dist.commonjs/signer/evm/signerEvmAddressReadonly.d.ts.map +1 -1
  213. package/dist.commonjs/signer/evm/signerEvmAddressReadonly.js +42 -50
  214. package/dist.commonjs/signer/evm/verify.d.ts +6 -2
  215. package/dist.commonjs/signer/evm/verify.js +7 -2
  216. package/dist.commonjs/signer/index.d.ts +2 -1
  217. package/dist.commonjs/signer/index.d.ts.map +1 -1
  218. package/dist.commonjs/signer/index.js +31 -14
  219. package/dist.commonjs/signer/nostr/index.d.ts +2 -0
  220. package/dist.commonjs/signer/nostr/index.d.ts.map +1 -0
  221. package/dist.commonjs/signer/nostr/index.js +33 -0
  222. package/dist.commonjs/signer/nostr/signerNostr.d.ts +66 -0
  223. package/dist.commonjs/signer/nostr/signerNostr.d.ts.map +1 -0
  224. package/dist.commonjs/signer/nostr/signerNostr.js +118 -0
  225. package/dist.commonjs/signer/nostr/verify.d.ts +11 -0
  226. package/dist.commonjs/signer/nostr/verify.d.ts.map +1 -0
  227. package/dist.commonjs/signer/nostr/verify.js +64 -0
  228. package/dist.commonjs/signer/signer/index.d.ts +156 -155
  229. package/dist.commonjs/signer/signer/index.d.ts.map +1 -1
  230. package/dist.commonjs/signer/signer/index.js +209 -175
  231. package/dist.commonjs/utils/index.d.ts +95 -6
  232. package/dist.commonjs/utils/index.d.ts.map +1 -1
  233. package/dist.commonjs/utils/index.js +30 -6
  234. package/package.json +4 -3
  235. package/src/address/address.advanced.ts +2 -5
  236. package/src/address/index.ts +2 -5
  237. package/src/ckb/script.ts +62 -2
  238. package/src/ckb/transaction.ts +678 -58
  239. package/src/client/advanced.ts +2 -0
  240. package/src/client/client.advanced.ts +134 -0
  241. package/src/client/client.ts +236 -25
  242. package/src/client/clientPublicMainnet.advanced.ts +117 -2
  243. package/src/client/clientPublicMainnet.ts +14 -3
  244. package/src/client/clientPublicTestnet.advanced.ts +176 -2
  245. package/src/client/clientPublicTestnet.ts +9 -3
  246. package/src/client/clientTypes.advanced.ts +26 -0
  247. package/src/client/clientTypes.ts +41 -43
  248. package/src/client/jsonRpc/index.ts +4 -4
  249. package/src/client/jsonRpc/transformers.ts +13 -11
  250. package/src/hasher/index.ts +4 -2
  251. package/src/num/index.ts +22 -0
  252. package/src/signer/btc/signerBtc.ts +6 -8
  253. package/src/signer/btc/signerBtcPublicKeyReadonly.ts +0 -9
  254. package/src/signer/btc/verify.ts +6 -3
  255. package/src/signer/ckb/signerCkbScriptReadonly.ts +0 -9
  256. package/src/signer/dummy/alwaysError.ts +0 -4
  257. package/src/signer/dummy/openLink.ts +0 -4
  258. package/src/signer/evm/signerEvm.ts +11 -11
  259. package/src/signer/evm/signerEvmAddressReadonly.ts +0 -9
  260. package/src/signer/index.ts +1 -0
  261. package/src/signer/nostr/index.ts +1 -0
  262. package/src/signer/nostr/signerNostr.ts +135 -0
  263. package/src/signer/nostr/verify.ts +63 -0
  264. package/src/signer/signer/index.ts +15 -11
  265. package/src/utils/index.ts +108 -0
@@ -21,15 +21,6 @@ export class SignerEvmAddressReadonly extends SignerEvm {
21
21
  this.address = hexFrom(address);
22
22
  }
23
23
 
24
- /**
25
- * Construct a new signer with the client replaced.
26
- *
27
- * @returns A promise that resolves the new Signer.
28
- */
29
- async replaceClient(client: Client): Promise<SignerEvmAddressReadonly> {
30
- return new SignerEvmAddressReadonly(client, this.address);
31
- }
32
-
33
24
  /**
34
25
  * Connects to the client. This implementation does nothing as the class is read-only.
35
26
  *
@@ -2,4 +2,5 @@ export * from "./btc";
2
2
  export * from "./ckb";
3
3
  export * from "./dummy";
4
4
  export * from "./evm";
5
+ export * from "./nostr";
5
6
  export * from "./signer";
@@ -0,0 +1 @@
1
+ export * from "./signerNostr";
@@ -0,0 +1,135 @@
1
+ import { bech32 } from "bech32";
2
+ import { Address } from "../../address";
3
+ import { BytesLike, bytesConcat, bytesFrom } from "../../bytes";
4
+ import { Transaction, TransactionLike, WitnessArgs } from "../../ckb";
5
+ import { KnownScript } from "../../client";
6
+ import { ckbHash } from "../../hasher";
7
+ import { Hex, hexFrom } from "../../hex";
8
+ import { Signer, SignerSignType, SignerType } from "../signer";
9
+ import { buildNostrEventFromMessage } from "./verify";
10
+
11
+ export interface NostrEvent {
12
+ id?: string;
13
+ pubkey?: string;
14
+ sig?: string;
15
+ created_at: number;
16
+ kind: number;
17
+ tags: string[][];
18
+ content: string;
19
+ }
20
+
21
+ export abstract class SignerNostr extends Signer {
22
+ static CKB_SIG_HASH_ALL_TAG = "ckb_sighash_all";
23
+ static CKB_UNLOCK_EVENT_KIND = 23334;
24
+ static CKB_UNLOCK_EVENT_CONTENT =
25
+ "Signing a CKB transaction\n\nIMPORTANT: Please verify the integrity and authenticity of connected Nostr client before signing this message\n";
26
+
27
+ get type(): SignerType {
28
+ return SignerType.Nostr;
29
+ }
30
+
31
+ get signType(): SignerSignType {
32
+ return SignerSignType.NostrEvent;
33
+ }
34
+
35
+ /**
36
+ * Gets the Nostr public key associated with the signer.
37
+ *
38
+ * @returns A promise that resolves to a string representing the Nostr public key.
39
+ */
40
+ abstract getNostrPublicKey(): Promise<Hex>;
41
+
42
+ /**
43
+ * Sign a nostr event.
44
+ *
45
+ * @returns A promise that resolves to the signed event.
46
+ */
47
+ abstract signNostrEvent(event: NostrEvent): Promise<Required<NostrEvent>>;
48
+
49
+ /**
50
+ * Sign a message.
51
+ *
52
+ * @returns A promise that resolves to the signature.
53
+ */
54
+ async signMessageRaw(message: string | BytesLike): Promise<Hex> {
55
+ return hexFrom(
56
+ (await this.signNostrEvent(buildNostrEventFromMessage(message))).sig,
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Gets the internal address, which is the EVM account in this case.
62
+ *
63
+ * @returns A promise that resolves to a string representing the internal address.
64
+ */
65
+ async getInternalAddress(): Promise<string> {
66
+ return bech32.encode(
67
+ "npub",
68
+ bech32.toWords(bytesFrom(await this.getNostrPublicKey())),
69
+ );
70
+ }
71
+
72
+ /**
73
+ * Gets an array of Address objects representing the known script addresses for the signer.
74
+ *
75
+ * @returns A promise that resolves to an array of Address objects.
76
+ */
77
+ async getAddressObjs(): Promise<Address[]> {
78
+ const publicKey = await this.getNostrPublicKey();
79
+ return [
80
+ await Address.fromKnownScript(
81
+ this.client,
82
+ KnownScript.NostrLock,
83
+ hexFrom(bytesConcat([0x00], ckbHash(publicKey).slice(0, 42))),
84
+ ),
85
+ ];
86
+ }
87
+
88
+ /**
89
+ * prepare a transaction before signing.
90
+ *
91
+ * @param txLike - The transaction to prepare, represented as a TransactionLike object.
92
+ * @returns A promise that resolves to the prepared Transaction object.
93
+ */
94
+ async prepareTransaction(txLike: TransactionLike): Promise<Transaction> {
95
+ const tx = Transaction.from(txLike);
96
+ const { script } = await this.getRecommendedAddressObj();
97
+ await tx.addCellDepsOfKnownScripts(this.client, KnownScript.NostrLock);
98
+ await tx.prepareSighashAllWitness(script, 572, this.client);
99
+ return tx;
100
+ }
101
+
102
+ /**
103
+ * Signs a transaction without modifying it.
104
+ *
105
+ * @param txLike - The transaction to sign, represented as a TransactionLike object.
106
+ * @returns A promise that resolves to a signed Transaction object.
107
+ */
108
+ async signOnlyTransaction(txLike: TransactionLike): Promise<Transaction> {
109
+ let tx = Transaction.from(txLike);
110
+ const { script } = await this.getRecommendedAddressObj();
111
+ const info = await tx.getSignHashInfo(script, this.client);
112
+ if (!info) {
113
+ return tx;
114
+ }
115
+
116
+ const signedEvent = bytesFrom(
117
+ JSON.stringify(
118
+ await this.signNostrEvent({
119
+ pubkey: (await this.getNostrPublicKey()).slice(2),
120
+ tags: [[SignerNostr.CKB_SIG_HASH_ALL_TAG, info.message.slice(2)]],
121
+ created_at: Math.floor(Date.now() / 1000),
122
+ kind: SignerNostr.CKB_UNLOCK_EVENT_KIND,
123
+ content: SignerNostr.CKB_UNLOCK_EVENT_CONTENT,
124
+ }),
125
+ ),
126
+ "utf8",
127
+ );
128
+
129
+ const witness = WitnessArgs.fromBytes(tx.witnesses[info.position]);
130
+ witness.lock = hexFrom(signedEvent);
131
+ tx.setWitnessArgsAt(info.position, witness);
132
+
133
+ return tx;
134
+ }
135
+ }
@@ -0,0 +1,63 @@
1
+ import { schnorr } from "@noble/curves/secp256k1";
2
+ import { sha256 } from "@noble/hashes/sha256";
3
+ import { bech32 } from "bech32";
4
+ import { BytesLike, bytesFrom } from "../../bytes";
5
+ import { hexFrom } from "../../hex";
6
+ import { NostrEvent } from "./signerNostr";
7
+
8
+ export function buildNostrEventFromMessage(
9
+ message: string | BytesLike,
10
+ ): NostrEvent {
11
+ if (typeof message === "string") {
12
+ try {
13
+ const event = JSON.parse(message);
14
+ if (
15
+ typeof event === "object" &&
16
+ typeof event.created_at === "number" &&
17
+ typeof event.kind === "number" &&
18
+ typeof event.content === "string" &&
19
+ Array.isArray(event.args) &&
20
+ (event.args as unknown[]).every(
21
+ (tag) =>
22
+ Array.isArray(tag) &&
23
+ (tag as unknown[]).every((v) => typeof v === "string"),
24
+ )
25
+ ) {
26
+ return event;
27
+ }
28
+ } catch (_) {}
29
+ }
30
+
31
+ return {
32
+ kind: 23335,
33
+ created_at: 0,
34
+ content: typeof message === "string" ? message : hexFrom(message),
35
+ tags: [],
36
+ };
37
+ }
38
+
39
+ export function verifyMessageNostrEvent(
40
+ message: string | BytesLike,
41
+ signature: string,
42
+ address: string,
43
+ ): boolean {
44
+ const { words } = bech32.decode(address);
45
+ const publicKey = hexFrom(bech32.fromWords(words)).slice(2);
46
+
47
+ const event = buildNostrEventFromMessage(message);
48
+ const serialized = JSON.stringify([
49
+ 0,
50
+ publicKey,
51
+ event.created_at,
52
+ event.kind,
53
+ event.tags,
54
+ event.content,
55
+ ]);
56
+ const eventHash = hexFrom(sha256(bytesFrom(serialized, "utf8")));
57
+
58
+ try {
59
+ return schnorr.verify(signature.slice(2), eventHash.slice(2), publicKey);
60
+ } catch (_) {
61
+ return false;
62
+ }
63
+ }
@@ -7,12 +7,14 @@ import { Num } from "../../num";
7
7
  import { verifyMessageBtcEcdsa } from "../btc";
8
8
  import { verifyMessageJoyId } from "../ckb/verifyJoyId";
9
9
  import { verifyMessageEvmPersonal } from "../evm/verify";
10
+ import { verifyMessageNostrEvent } from "../nostr/verify";
10
11
 
11
12
  export enum SignerSignType {
12
13
  Unknown = "Unknown",
13
14
  BtcEcdsa = "BtcEcdsa",
14
15
  EvmPersonal = "EvmPersonal",
15
16
  JoyId = "JoyId",
17
+ NostrEvent = "NostrEvent",
16
18
  }
17
19
 
18
20
  /**
@@ -22,6 +24,7 @@ export enum SignerType {
22
24
  EVM = "EVM",
23
25
  BTC = "BTC",
24
26
  CKB = "CKB",
27
+ Nostr = "Nostr",
25
28
  }
26
29
 
27
30
  export class Signature {
@@ -69,17 +72,25 @@ export abstract class Signer {
69
72
  signature.signature,
70
73
  signature.identity,
71
74
  );
75
+ case SignerSignType.NostrEvent:
76
+ return verifyMessageNostrEvent(
77
+ message,
78
+ signature.signature,
79
+ signature.identity,
80
+ );
72
81
  case SignerSignType.Unknown:
73
82
  throw new Error("Unknown signer sign type");
74
83
  }
75
84
  }
76
85
 
77
86
  /**
78
- * Construct a new signer with the client replaced.
79
- *
80
- * @returns A promise that resolves the new Signer.
87
+ * Replace the current client.
88
+ * returns false if the new client is invalid for this signer.
81
89
  */
82
- abstract replaceClient(client: Client): Promise<Signer>;
90
+ async replaceClient(client: Client): Promise<boolean> {
91
+ this.client_ = client;
92
+ return true;
93
+ }
83
94
 
84
95
  /**
85
96
  * Connects to the signer.
@@ -88,13 +99,6 @@ export abstract class Signer {
88
99
  */
89
100
  abstract connect(): Promise<void>;
90
101
 
91
- /**
92
- * Disconnects to the signer.
93
- *
94
- * @returns A promise that resolves when disconnected.
95
- */
96
- async disconnect(): Promise<void> {}
97
-
98
102
  /**
99
103
  * Check if the signer is connected.
100
104
  *
@@ -1,21 +1,70 @@
1
+ /**
2
+ * A type safe way to apply a transformer on a value if it's not empty.
3
+ *
4
+ * @param transformer - The transformer.
5
+ * @param value - The value to be transformed.
6
+ * @returns If the value is empty, it remains its type. Otherwise it will be transformed.
7
+ */
1
8
  export function apply<T, R>(
2
9
  transformer: (val: T) => R,
3
10
  value: undefined,
4
11
  ): undefined;
12
+ /**
13
+ * A type safe way to apply a transformer on a value if it's not empty.
14
+ *
15
+ * @param transformer - The transformer.
16
+ * @param value - The value to be transformed.
17
+ * @returns If the value is empty, it remains its type. Otherwise it will be transformed.
18
+ */
5
19
  export function apply<T, R>(transformer: (val: T) => R, value: null): null;
20
+ /**
21
+ * A type safe way to apply a transformer on a value if it's not empty.
22
+ *
23
+ * @param transformer - The transformer.
24
+ * @param value - The value to be transformed.
25
+ * @returns If the value is empty, it remains its type. Otherwise it will be transformed.
26
+ */
6
27
  export function apply<T, R>(transformer: (val: T) => R, value: T): R;
28
+ /**
29
+ * A type safe way to apply a transformer on a value if it's not empty.
30
+ *
31
+ * @param transformer - The transformer.
32
+ * @param value - The value to be transformed.
33
+ * @returns If the value is empty, it remains its type. Otherwise it will be transformed.
34
+ */
7
35
  export function apply<T, R>(
8
36
  transformer: (val: T) => R,
9
37
  value: T | undefined,
10
38
  ): R | undefined;
39
+ /**
40
+ * A type safe way to apply a transformer on a value if it's not empty.
41
+ *
42
+ * @param transformer - The transformer.
43
+ * @param value - The value to be transformed.
44
+ * @returns If the value is empty, it remains its type. Otherwise it will be transformed.
45
+ */
11
46
  export function apply<T, R>(
12
47
  transformer: (val: T) => R,
13
48
  value: T | null,
14
49
  ): R | null;
50
+ /**
51
+ * A type safe way to apply a transformer on a value if it's not empty.
52
+ *
53
+ * @param transformer - The transformer.
54
+ * @param value - The value to be transformed.
55
+ * @returns If the value is empty, it remains its type. Otherwise it will be transformed.
56
+ */
15
57
  export function apply<T, R>(
16
58
  transformer: (val: T) => R,
17
59
  value: undefined | null,
18
60
  ): undefined | null;
61
+ /**
62
+ * A type safe way to apply a transformer on a value if it's not empty.
63
+ *
64
+ * @param transformer - The transformer.
65
+ * @param value - The value to be transformed.
66
+ * @returns If the value is empty, it remains its type. Otherwise it will be transformed.
67
+ */
19
68
  export function apply<T, R>(
20
69
  transformer: (val: T) => R,
21
70
  value: T | undefined | null,
@@ -27,6 +76,65 @@ export function apply<T, R>(
27
76
  return transformer(value);
28
77
  }
29
78
 
79
+ /**
80
+ * Similar to Array.reduce, but the accumulator can returns Promise.
81
+ *
82
+ * @param values - The array to be reduced.
83
+ * @param accumulator - A callback to be called for each value. If it returns null, the previous result will be kept.
84
+ * @returns The accumulated result.
85
+ */
86
+ export async function reduceAsync<T, V>(
87
+ values: T[],
88
+ accumulator: (
89
+ a: T,
90
+ b: T,
91
+ ) => Promise<T | undefined | null | void> | T | undefined | null | void,
92
+ ): Promise<T>;
93
+ /**
94
+ * Similar to Array.reduce, but the accumulator can returns Promise.
95
+ *
96
+ * @param values - The array to be reduced.
97
+ * @param accumulator - A callback to be called for each value. If it returns null, the previous result will be kept.
98
+ * @param init - The initial value.
99
+ * @returns The accumulated result.
100
+ */
101
+ export async function reduceAsync<T, V>(
102
+ values: V[],
103
+ accumulator: (
104
+ a: T,
105
+ b: V,
106
+ i: number,
107
+ values: V[],
108
+ ) => Promise<T | undefined | null | void> | T | undefined | null | void,
109
+ init: T,
110
+ ): Promise<T>;
111
+ export async function reduceAsync<T, V>(
112
+ values: (V | T)[],
113
+ accumulator: (
114
+ a: T,
115
+ b: T | V,
116
+ i: number,
117
+ values: (V | T)[],
118
+ ) => Promise<T | undefined | null | void> | T | undefined | null | void,
119
+ init?: T,
120
+ ): Promise<T> {
121
+ if (init === undefined) {
122
+ if (values.length === 0) {
123
+ throw new TypeError("Reduce of empty array with no initial value");
124
+ }
125
+ init = values[0] as T;
126
+ values = values.slice(1);
127
+ }
128
+
129
+ return values.reduce(
130
+ (current: Promise<T>, b: T | V, i, array) =>
131
+ current.then((v) =>
132
+ Promise.resolve(accumulator(v, b, i, array)).then((r) => r ?? v),
133
+ ),
134
+ Promise.resolve(init),
135
+ );
136
+ }
137
+
30
138
  export function isWebview(userAgent: string): boolean {
31
139
  return /webview|wv|ip((?!.*Safari)|(?=.*like Safari))/i.test(userAgent);
32
140
  }