@ckb-ccc/core 1.3.1 → 1.5.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/CHANGELOG.md +16 -0
- package/dist/client/clientPublicMainnet.d.ts.map +1 -1
- package/dist/client/clientPublicMainnet.js +18 -2
- package/dist/client/clientPublicTestnet.d.ts.map +1 -1
- package/dist/client/clientPublicTestnet.js +13 -2
- package/dist/jsonRpc/requestor.d.ts +1 -0
- package/dist/jsonRpc/requestor.d.ts.map +1 -1
- package/dist/jsonRpc/requestor.js +4 -2
- package/dist/jsonRpc/transports/advanced.d.ts +1 -0
- package/dist/jsonRpc/transports/advanced.d.ts.map +1 -1
- package/dist/jsonRpc/transports/advanced.js +1 -0
- package/dist/jsonRpc/transports/fallback.d.ts +8 -0
- package/dist/jsonRpc/transports/fallback.d.ts.map +1 -0
- package/dist/jsonRpc/transports/fallback.js +22 -0
- package/dist/molecule/codec.d.ts.map +1 -1
- package/dist/molecule/codec.js +17 -8
- package/dist/signer/nostr/index.d.ts +1 -0
- package/dist/signer/nostr/index.d.ts.map +1 -1
- package/dist/signer/nostr/index.js +1 -0
- package/dist/signer/nostr/signerNostrPrivateKey.d.ts +12 -0
- package/dist/signer/nostr/signerNostrPrivateKey.d.ts.map +1 -0
- package/dist/signer/nostr/signerNostrPrivateKey.js +28 -0
- package/dist/signer/nostr/verify.d.ts +2 -1
- package/dist/signer/nostr/verify.d.ts.map +1 -1
- package/dist/signer/nostr/verify.js +12 -9
- package/dist.commonjs/client/clientPublicMainnet.d.ts.map +1 -1
- package/dist.commonjs/client/clientPublicMainnet.js +18 -2
- package/dist.commonjs/client/clientPublicTestnet.d.ts.map +1 -1
- package/dist.commonjs/client/clientPublicTestnet.js +13 -2
- package/dist.commonjs/jsonRpc/requestor.d.ts +1 -0
- package/dist.commonjs/jsonRpc/requestor.d.ts.map +1 -1
- package/dist.commonjs/jsonRpc/requestor.js +3 -1
- package/dist.commonjs/jsonRpc/transports/advanced.d.ts +1 -0
- package/dist.commonjs/jsonRpc/transports/advanced.d.ts.map +1 -1
- package/dist.commonjs/jsonRpc/transports/advanced.js +1 -0
- package/dist.commonjs/jsonRpc/transports/fallback.d.ts +8 -0
- package/dist.commonjs/jsonRpc/transports/fallback.d.ts.map +1 -0
- package/dist.commonjs/jsonRpc/transports/fallback.js +26 -0
- package/dist.commonjs/molecule/codec.d.ts.map +1 -1
- package/dist.commonjs/molecule/codec.js +17 -8
- package/dist.commonjs/signer/nostr/index.d.ts +1 -0
- package/dist.commonjs/signer/nostr/index.d.ts.map +1 -1
- package/dist.commonjs/signer/nostr/index.js +1 -0
- package/dist.commonjs/signer/nostr/signerNostrPrivateKey.d.ts +12 -0
- package/dist.commonjs/signer/nostr/signerNostrPrivateKey.d.ts.map +1 -0
- package/dist.commonjs/signer/nostr/signerNostrPrivateKey.js +32 -0
- package/dist.commonjs/signer/nostr/verify.d.ts +2 -1
- package/dist.commonjs/signer/nostr/verify.d.ts.map +1 -1
- package/dist.commonjs/signer/nostr/verify.js +13 -9
- package/package.json +1 -1
- package/src/client/clientPublicMainnet.ts +19 -2
- package/src/client/clientPublicTestnet.ts +14 -2
- package/src/jsonRpc/requestor.ts +10 -1
- package/src/jsonRpc/transports/advanced.ts +1 -0
- package/src/jsonRpc/transports/fallback.ts +27 -0
- package/src/molecule/codec.ts +29 -6
- package/src/signer/nostr/index.ts +1 -0
- package/src/signer/nostr/signerNostrPrivateKey.ts +37 -0
- package/src/signer/nostr/verify.ts +18 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @ckb-ccc/core
|
|
2
2
|
|
|
3
|
+
## 1.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#141](https://github.com/ckb-devrel/ccc/pull/141) [`28c211d`](https://github.com/ckb-devrel/ccc/commit/28c211d839a2d2305eca56e82ba7da144aa3df4a) Thanks [@Hanssen0](https://github.com/Hanssen0)! - feat(core): TransportFallback
|
|
8
|
+
|
|
9
|
+
## 1.4.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#140](https://github.com/ckb-devrel/ccc/pull/140) [`f429087`](https://github.com/ckb-devrel/ccc/commit/f4290874dfab3fe58844e5169673c5d47bda64e3) Thanks [@Hanssen0](https://github.com/Hanssen0)! - feat(core): SignerNostrPrivateKey
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [#138](https://github.com/ckb-devrel/ccc/pull/138) [`3fdb2c4`](https://github.com/ckb-devrel/ccc/commit/3fdb2c477d0b2766b231e436b8f396f047b02634) Thanks [@Hanssen0](https://github.com/Hanssen0)! - fix(core): codec should throw if byteLength mismatch
|
|
18
|
+
|
|
3
19
|
## 1.3.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;
|
|
1
|
+
{"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IA4BH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
|
|
@@ -7,10 +7,26 @@ import { ClientJsonRpc } from "./jsonRpc/index.js";
|
|
|
7
7
|
*/
|
|
8
8
|
export class ClientPublicMainnet extends ClientJsonRpc {
|
|
9
9
|
constructor(config) {
|
|
10
|
+
const hasWebSocket = typeof WebSocket !== "undefined";
|
|
10
11
|
super(config?.url ??
|
|
11
|
-
(
|
|
12
|
+
(hasWebSocket
|
|
12
13
|
? "wss://mainnet.ckb.dev/ws"
|
|
13
|
-
: "https://mainnet.ckb.dev/"),
|
|
14
|
+
: "https://mainnet.ckb.dev/"), {
|
|
15
|
+
...config,
|
|
16
|
+
fallbacks: config?.fallbacks ??
|
|
17
|
+
(hasWebSocket
|
|
18
|
+
? [
|
|
19
|
+
"wss://mainnet.ckb.dev/ws",
|
|
20
|
+
"https://mainnet.ckb.dev/",
|
|
21
|
+
"https://mainnet.ckbapp.dev/",
|
|
22
|
+
"https://rpc.ankr.com/nervos_ckb",
|
|
23
|
+
]
|
|
24
|
+
: [
|
|
25
|
+
"https://mainnet.ckb.dev/",
|
|
26
|
+
"https://mainnet.ckbapp.dev/",
|
|
27
|
+
"https://rpc.ankr.com/nervos_ckb",
|
|
28
|
+
]),
|
|
29
|
+
});
|
|
14
30
|
this.config = config;
|
|
15
31
|
}
|
|
16
32
|
get scripts() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;
|
|
1
|
+
{"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAuBH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
|
|
@@ -7,10 +7,21 @@ import { ClientJsonRpc } from "./jsonRpc/index.js";
|
|
|
7
7
|
*/
|
|
8
8
|
export class ClientPublicTestnet extends ClientJsonRpc {
|
|
9
9
|
constructor(config) {
|
|
10
|
+
const hasWebSocket = typeof WebSocket !== "undefined";
|
|
10
11
|
super(config?.url ??
|
|
11
|
-
(
|
|
12
|
+
(hasWebSocket
|
|
12
13
|
? "wss://testnet.ckb.dev/ws"
|
|
13
|
-
: "https://testnet.ckb.dev/"),
|
|
14
|
+
: "https://testnet.ckb.dev/"), {
|
|
15
|
+
...config,
|
|
16
|
+
fallbacks: config?.fallbacks ??
|
|
17
|
+
(hasWebSocket
|
|
18
|
+
? [
|
|
19
|
+
"wss://testnet.ckb.dev/ws",
|
|
20
|
+
"https://testnet.ckb.dev/",
|
|
21
|
+
"https://testnet.ckbapp.dev/",
|
|
22
|
+
]
|
|
23
|
+
: ["https://testnet.ckb.dev/", "https://testnet.ckbapp.dev/"]),
|
|
24
|
+
});
|
|
14
25
|
this.config = config;
|
|
15
26
|
}
|
|
16
27
|
get scripts() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,
|
|
1
|
+
{"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EAGV,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,qBAAa,gBAAgB;IAgBzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAjB3B,SAAgB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,OAAO,CAAC,EAAE,CAAK;IAEf;;;;;OAKG;gBAEgB,IAAI,EAAE,MAAM,EAC7B,MAAM,CAAC,EAAE,sBAAsB,EACd,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAanE;;;;OAIG;IAEH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;;;;OAQG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EAAE,EAEjB,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,EAEtD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,GACnC,OAAO,CAAC,OAAO,CAAC;IA6Bb,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B/D;;;;;;OAMG;IAEH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc;CAQ7D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { transportFromUri, } from "./transports/advanced.js";
|
|
1
|
+
import { TransportFallback, transportFromUri, } from "./transports/advanced.js";
|
|
2
2
|
/**
|
|
3
3
|
* Applies a transformation function to a value if the transformer is provided.
|
|
4
4
|
*
|
|
@@ -32,7 +32,9 @@ export class RequestorJsonRpc {
|
|
|
32
32
|
this.pending = [];
|
|
33
33
|
this.id = 0;
|
|
34
34
|
this.maxConcurrent = config?.maxConcurrent;
|
|
35
|
-
this.transport =
|
|
35
|
+
this.transport =
|
|
36
|
+
config?.transport ??
|
|
37
|
+
new TransportFallback(Array.from(new Set([url_, ...(config?.fallbacks ?? [])]).values(), (url) => transportFromUri(url, config)));
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
* Returns the URL of the JSON-RPC server.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { JsonRpcPayload, Transport } from "./transport.js";
|
|
2
|
+
export declare class TransportFallback implements Transport {
|
|
3
|
+
private readonly transports;
|
|
4
|
+
private i;
|
|
5
|
+
constructor(transports: Transport[]);
|
|
6
|
+
request(data: JsonRpcPayload): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,qBAAa,iBAAkB,YAAW,SAAS;IAIrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,CAAC,CAAK;gBAEe,UAAU,EAAE,SAAS,EAAE;IAE9C,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CAkBtD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class TransportFallback {
|
|
2
|
+
constructor(transports) {
|
|
3
|
+
this.transports = transports;
|
|
4
|
+
// Current transport index
|
|
5
|
+
this.i = 0;
|
|
6
|
+
}
|
|
7
|
+
async request(data) {
|
|
8
|
+
let triedCount = 0;
|
|
9
|
+
while (true) {
|
|
10
|
+
try {
|
|
11
|
+
return await this.transports[this.i % this.transports.length].request(data);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
triedCount += 1;
|
|
15
|
+
this.i += 1;
|
|
16
|
+
if (triedCount >= this.transports.length) {
|
|
17
|
+
throw err;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/molecule/codec.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EAIL,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,GAAG,EAIH,OAAO,EAER,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI;IACtD,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,KAAK,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AACF,qBAAa,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS;aAE7B,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,KAAK;aACvC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO;aACzC,UAAU,CAAC,EAAE,MAAM;gBAFnB,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,KAAK,EACvC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,EACzC,UAAU,CAAC,EAAE,MAAM,YAAA;IAGrC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE,EAC1C,MAAM,EACN,MAAM,EACN,UAAU,GACX,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/molecule/codec.ts"],"names":[],"mappings":"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"}
|
package/dist/molecule/codec.js
CHANGED
|
@@ -8,16 +8,25 @@ export class Codec {
|
|
|
8
8
|
this.byteLength = byteLength;
|
|
9
9
|
}
|
|
10
10
|
static from({ encode, decode, byteLength, }) {
|
|
11
|
-
return new Codec(
|
|
11
|
+
return new Codec((encodable) => {
|
|
12
|
+
const encoded = encode(encodable);
|
|
13
|
+
if (byteLength !== undefined && encoded.byteLength !== byteLength) {
|
|
14
|
+
throw new Error(`Codec.encode: expected byte length ${byteLength}, got ${encoded.byteLength}`);
|
|
15
|
+
}
|
|
16
|
+
return encoded;
|
|
17
|
+
}, (decodable) => {
|
|
18
|
+
const decodableBytes = bytesFrom(decodable);
|
|
19
|
+
if (byteLength !== undefined &&
|
|
20
|
+
decodableBytes.byteLength !== byteLength) {
|
|
21
|
+
throw new Error(`Codec.decode: expected byte length ${byteLength}, got ${decodableBytes.byteLength}`);
|
|
22
|
+
}
|
|
23
|
+
return decode(decodable);
|
|
24
|
+
}, byteLength);
|
|
12
25
|
}
|
|
13
26
|
map({ inMap, outMap, }) {
|
|
14
|
-
return Codec.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
decode: (buffer) => (outMap
|
|
18
|
-
? outMap(this.decode(buffer))
|
|
19
|
-
: this.decode(buffer)),
|
|
20
|
-
});
|
|
27
|
+
return new Codec((encodable) => this.encode((inMap ? inMap(encodable) : encodable)), (buffer) => (outMap
|
|
28
|
+
? outMap(this.decode(buffer))
|
|
29
|
+
: this.decode(buffer)), this.byteLength);
|
|
21
30
|
}
|
|
22
31
|
mapIn(map) {
|
|
23
32
|
return this.map({ inMap: map });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Client } from "../../client/index.js";
|
|
2
|
+
import { Hex, HexLike } from "../../hex/index.js";
|
|
3
|
+
import { NostrEvent, SignerNostr } from "./signerNostr.js";
|
|
4
|
+
export declare class SignerNostrPrivateKey extends SignerNostr {
|
|
5
|
+
private readonly privateKey;
|
|
6
|
+
constructor(client: Client, privateKey: HexLike);
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
isConnected(): Promise<boolean>;
|
|
9
|
+
getNostrPublicKey(): Promise<Hex>;
|
|
10
|
+
signNostrEvent(event: NostrEvent): Promise<Required<NostrEvent>>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=signerNostrPrivateKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signerNostrPrivateKey.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/signerNostrPrivateKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAW,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG3D,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;gBAErB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;IAKzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC;IAIjC,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;CAYvE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { schnorr } from "@noble/curves/secp256k1";
|
|
2
|
+
import { hexFrom } from "../../hex/index.js";
|
|
3
|
+
import { SignerNostr } from "./signerNostr.js";
|
|
4
|
+
import { nostrEventHash } from "./verify.js";
|
|
5
|
+
export class SignerNostrPrivateKey extends SignerNostr {
|
|
6
|
+
constructor(client, privateKey) {
|
|
7
|
+
super(client);
|
|
8
|
+
this.privateKey = hexFrom(privateKey);
|
|
9
|
+
}
|
|
10
|
+
async connect() { }
|
|
11
|
+
async isConnected() {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
async getNostrPublicKey() {
|
|
15
|
+
return hexFrom(schnorr.getPublicKey(this.privateKey.slice(2)));
|
|
16
|
+
}
|
|
17
|
+
async signNostrEvent(event) {
|
|
18
|
+
const pubkey = (await this.getNostrPublicKey()).slice(2);
|
|
19
|
+
const eventHash = nostrEventHash({ ...event, pubkey });
|
|
20
|
+
const signature = schnorr.sign(eventHash, this.privateKey.slice(2));
|
|
21
|
+
return {
|
|
22
|
+
...event,
|
|
23
|
+
id: hexFrom(eventHash).slice(2),
|
|
24
|
+
pubkey,
|
|
25
|
+
sig: hexFrom(signature).slice(2),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { BytesLike } from "../../bytes/index.js";
|
|
1
|
+
import { Bytes, BytesLike } from "../../bytes/index.js";
|
|
2
2
|
import { NostrEvent } from "./signerNostr.js";
|
|
3
3
|
/**
|
|
4
4
|
* @public
|
|
5
5
|
*/
|
|
6
6
|
export declare function buildNostrEventFromMessage(message: string | BytesLike): NostrEvent;
|
|
7
|
+
export declare function nostrEventHash(event: NostrEvent): Bytes;
|
|
7
8
|
export declare function verifyMessageNostrEvent(message: string | BytesLike, signature: string, address: string): boolean;
|
|
8
9
|
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/verify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/verify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,UAAU,CA4BZ;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAWvD;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAYT"}
|
|
@@ -15,8 +15,8 @@ export function buildNostrEventFromMessage(message) {
|
|
|
15
15
|
typeof event.created_at === "number" &&
|
|
16
16
|
typeof event.kind === "number" &&
|
|
17
17
|
typeof event.content === "string" &&
|
|
18
|
-
Array.isArray(event.
|
|
19
|
-
event.
|
|
18
|
+
Array.isArray(event.tags) &&
|
|
19
|
+
event.tags.every((tag) => Array.isArray(tag) &&
|
|
20
20
|
tag.every((v) => typeof v === "string"))) {
|
|
21
21
|
return event;
|
|
22
22
|
}
|
|
@@ -30,21 +30,24 @@ export function buildNostrEventFromMessage(message) {
|
|
|
30
30
|
tags: [],
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
export function
|
|
34
|
-
const { words } = bech32.decode(address);
|
|
35
|
-
const publicKey = hexFrom(bech32.fromWords(words)).slice(2);
|
|
36
|
-
const event = buildNostrEventFromMessage(message);
|
|
33
|
+
export function nostrEventHash(event) {
|
|
37
34
|
const serialized = JSON.stringify([
|
|
38
35
|
0,
|
|
39
|
-
|
|
36
|
+
event.pubkey,
|
|
40
37
|
event.created_at,
|
|
41
38
|
event.kind,
|
|
42
39
|
event.tags,
|
|
43
40
|
event.content,
|
|
44
41
|
]);
|
|
45
|
-
|
|
42
|
+
return sha256(bytesFrom(serialized, "utf8"));
|
|
43
|
+
}
|
|
44
|
+
export function verifyMessageNostrEvent(message, signature, address) {
|
|
45
|
+
const { words } = bech32.decode(address);
|
|
46
|
+
const publicKey = hexFrom(bech32.fromWords(words)).slice(2);
|
|
47
|
+
const event = buildNostrEventFromMessage(message);
|
|
48
|
+
const eventHash = nostrEventHash(event);
|
|
46
49
|
try {
|
|
47
|
-
return schnorr.verify(signature.slice(2), eventHash
|
|
50
|
+
return schnorr.verify(hexFrom(signature).slice(2), eventHash, publicKey);
|
|
48
51
|
}
|
|
49
52
|
catch (_) {
|
|
50
53
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;
|
|
1
|
+
{"version":3,"file":"clientPublicMainnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicMainnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IA4BH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
|
|
@@ -13,10 +13,26 @@ const index_js_1 = require("./jsonRpc/index.js");
|
|
|
13
13
|
*/
|
|
14
14
|
class ClientPublicMainnet extends index_js_1.ClientJsonRpc {
|
|
15
15
|
constructor(config) {
|
|
16
|
+
const hasWebSocket = typeof isomorphic_ws_1.default !== "undefined";
|
|
16
17
|
super(config?.url ??
|
|
17
|
-
(
|
|
18
|
+
(hasWebSocket
|
|
18
19
|
? "wss://mainnet.ckb.dev/ws"
|
|
19
|
-
: "https://mainnet.ckb.dev/"),
|
|
20
|
+
: "https://mainnet.ckb.dev/"), {
|
|
21
|
+
...config,
|
|
22
|
+
fallbacks: config?.fallbacks ??
|
|
23
|
+
(hasWebSocket
|
|
24
|
+
? [
|
|
25
|
+
"wss://mainnet.ckb.dev/ws",
|
|
26
|
+
"https://mainnet.ckb.dev/",
|
|
27
|
+
"https://mainnet.ckbapp.dev/",
|
|
28
|
+
"https://rpc.ankr.com/nervos_ckb",
|
|
29
|
+
]
|
|
30
|
+
: [
|
|
31
|
+
"https://mainnet.ckb.dev/",
|
|
32
|
+
"https://mainnet.ckbapp.dev/",
|
|
33
|
+
"https://rpc.ankr.com/nervos_ckb",
|
|
34
|
+
]),
|
|
35
|
+
});
|
|
20
36
|
this.config = config;
|
|
21
37
|
}
|
|
22
38
|
get scripts() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;
|
|
1
|
+
{"version":3,"file":"clientPublicTestnet.d.ts","sourceRoot":"","sources":["../../src/client/clientPublicTestnet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,GAAE,mBAAmB,GAAG;QAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;KAC3D,aAAA;IAuBH,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC,CAE7D;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/D"}
|
|
@@ -13,10 +13,21 @@ const index_js_1 = require("./jsonRpc/index.js");
|
|
|
13
13
|
*/
|
|
14
14
|
class ClientPublicTestnet extends index_js_1.ClientJsonRpc {
|
|
15
15
|
constructor(config) {
|
|
16
|
+
const hasWebSocket = typeof isomorphic_ws_1.default !== "undefined";
|
|
16
17
|
super(config?.url ??
|
|
17
|
-
(
|
|
18
|
+
(hasWebSocket
|
|
18
19
|
? "wss://testnet.ckb.dev/ws"
|
|
19
|
-
: "https://testnet.ckb.dev/"),
|
|
20
|
+
: "https://testnet.ckb.dev/"), {
|
|
21
|
+
...config,
|
|
22
|
+
fallbacks: config?.fallbacks ??
|
|
23
|
+
(hasWebSocket
|
|
24
|
+
? [
|
|
25
|
+
"wss://testnet.ckb.dev/ws",
|
|
26
|
+
"https://testnet.ckb.dev/",
|
|
27
|
+
"https://testnet.ckbapp.dev/",
|
|
28
|
+
]
|
|
29
|
+
: ["https://testnet.ckb.dev/", "https://testnet.ckbapp.dev/"]),
|
|
30
|
+
});
|
|
20
31
|
this.config = config;
|
|
21
32
|
}
|
|
22
33
|
get scripts() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,
|
|
1
|
+
{"version":3,"file":"requestor.d.ts","sourceRoot":"","sources":["../../src/jsonRpc/requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EAGV,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,qBAAa,gBAAgB;IAgBzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAjB3B,SAAgB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,OAAO,CAAC,EAAE,CAAK;IAEf;;;;;OAKG;gBAEgB,IAAI,EAAE,MAAM,EAC7B,MAAM,CAAC,EAAE,sBAAsB,EACd,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAanE;;;;OAIG;IAEH,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;;;;OAQG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EAAE,EAEjB,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,EAEtD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,GACnC,OAAO,CAAC,OAAO,CAAC;IA6Bb,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B/D;;;;;;OAMG;IAEH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc;CAQ7D"}
|
|
@@ -35,7 +35,9 @@ class RequestorJsonRpc {
|
|
|
35
35
|
this.pending = [];
|
|
36
36
|
this.id = 0;
|
|
37
37
|
this.maxConcurrent = config?.maxConcurrent;
|
|
38
|
-
this.transport =
|
|
38
|
+
this.transport =
|
|
39
|
+
config?.transport ??
|
|
40
|
+
new advanced_js_1.TransportFallback(Array.from(new Set([url_, ...(config?.fallbacks ?? [])]).values(), (url) => (0, advanced_js_1.transportFromUri)(url, config)));
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Returns the URL of the JSON-RPC server.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/advanced.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./factory.js"), exports);
|
|
18
|
+
__exportStar(require("./fallback.js"), exports);
|
|
18
19
|
__exportStar(require("./http.js"), exports);
|
|
19
20
|
__exportStar(require("./transport.js"), exports);
|
|
20
21
|
__exportStar(require("./webSocket.js"), exports);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { JsonRpcPayload, Transport } from "./transport.js";
|
|
2
|
+
export declare class TransportFallback implements Transport {
|
|
3
|
+
private readonly transports;
|
|
4
|
+
private i;
|
|
5
|
+
constructor(transports: Transport[]);
|
|
6
|
+
request(data: JsonRpcPayload): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/jsonRpc/transports/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,qBAAa,iBAAkB,YAAW,SAAS;IAIrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,CAAC,CAAK;gBAEe,UAAU,EAAE,SAAS,EAAE;IAE9C,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CAkBtD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransportFallback = void 0;
|
|
4
|
+
class TransportFallback {
|
|
5
|
+
constructor(transports) {
|
|
6
|
+
this.transports = transports;
|
|
7
|
+
// Current transport index
|
|
8
|
+
this.i = 0;
|
|
9
|
+
}
|
|
10
|
+
async request(data) {
|
|
11
|
+
let triedCount = 0;
|
|
12
|
+
while (true) {
|
|
13
|
+
try {
|
|
14
|
+
return await this.transports[this.i % this.transports.length].request(data);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
triedCount += 1;
|
|
18
|
+
this.i += 1;
|
|
19
|
+
if (triedCount >= this.transports.length) {
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.TransportFallback = TransportFallback;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/molecule/codec.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EAIL,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,GAAG,EAIH,OAAO,EAER,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI;IACtD,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,KAAK,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AACF,qBAAa,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS;aAE7B,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,KAAK;aACvC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO;aACzC,UAAU,CAAC,EAAE,MAAM;gBAFnB,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,KAAK,EACvC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,EACzC,UAAU,CAAC,EAAE,MAAM,YAAA;IAGrC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE,EAC1C,MAAM,EACN,MAAM,EACN,UAAU,GACX,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/molecule/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,16 +22,25 @@ class Codec {
|
|
|
22
22
|
this.byteLength = byteLength;
|
|
23
23
|
}
|
|
24
24
|
static from({ encode, decode, byteLength, }) {
|
|
25
|
-
return new Codec(
|
|
25
|
+
return new Codec((encodable) => {
|
|
26
|
+
const encoded = encode(encodable);
|
|
27
|
+
if (byteLength !== undefined && encoded.byteLength !== byteLength) {
|
|
28
|
+
throw new Error(`Codec.encode: expected byte length ${byteLength}, got ${encoded.byteLength}`);
|
|
29
|
+
}
|
|
30
|
+
return encoded;
|
|
31
|
+
}, (decodable) => {
|
|
32
|
+
const decodableBytes = (0, index_js_1.bytesFrom)(decodable);
|
|
33
|
+
if (byteLength !== undefined &&
|
|
34
|
+
decodableBytes.byteLength !== byteLength) {
|
|
35
|
+
throw new Error(`Codec.decode: expected byte length ${byteLength}, got ${decodableBytes.byteLength}`);
|
|
36
|
+
}
|
|
37
|
+
return decode(decodable);
|
|
38
|
+
}, byteLength);
|
|
26
39
|
}
|
|
27
40
|
map({ inMap, outMap, }) {
|
|
28
|
-
return Codec.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
decode: (buffer) => (outMap
|
|
32
|
-
? outMap(this.decode(buffer))
|
|
33
|
-
: this.decode(buffer)),
|
|
34
|
-
});
|
|
41
|
+
return new Codec((encodable) => this.encode((inMap ? inMap(encodable) : encodable)), (buffer) => (outMap
|
|
42
|
+
? outMap(this.decode(buffer))
|
|
43
|
+
: this.decode(buffer)), this.byteLength);
|
|
35
44
|
}
|
|
36
45
|
mapIn(map) {
|
|
37
46
|
return this.map({ inMap: map });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC"}
|
|
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./signerNostr.js"), exports);
|
|
18
|
+
__exportStar(require("./signerNostrPrivateKey.js"), exports);
|
|
18
19
|
__exportStar(require("./verify.js"), exports);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Client } from "../../client/index.js";
|
|
2
|
+
import { Hex, HexLike } from "../../hex/index.js";
|
|
3
|
+
import { NostrEvent, SignerNostr } from "./signerNostr.js";
|
|
4
|
+
export declare class SignerNostrPrivateKey extends SignerNostr {
|
|
5
|
+
private readonly privateKey;
|
|
6
|
+
constructor(client: Client, privateKey: HexLike);
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
isConnected(): Promise<boolean>;
|
|
9
|
+
getNostrPublicKey(): Promise<Hex>;
|
|
10
|
+
signNostrEvent(event: NostrEvent): Promise<Required<NostrEvent>>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=signerNostrPrivateKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signerNostrPrivateKey.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/signerNostrPrivateKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAW,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG3D,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;gBAErB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;IAKzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC;IAIjC,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;CAYvE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SignerNostrPrivateKey = void 0;
|
|
4
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
5
|
+
const index_js_1 = require("../../hex/index.js");
|
|
6
|
+
const signerNostr_js_1 = require("./signerNostr.js");
|
|
7
|
+
const verify_js_1 = require("./verify.js");
|
|
8
|
+
class SignerNostrPrivateKey extends signerNostr_js_1.SignerNostr {
|
|
9
|
+
constructor(client, privateKey) {
|
|
10
|
+
super(client);
|
|
11
|
+
this.privateKey = (0, index_js_1.hexFrom)(privateKey);
|
|
12
|
+
}
|
|
13
|
+
async connect() { }
|
|
14
|
+
async isConnected() {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
async getNostrPublicKey() {
|
|
18
|
+
return (0, index_js_1.hexFrom)(secp256k1_1.schnorr.getPublicKey(this.privateKey.slice(2)));
|
|
19
|
+
}
|
|
20
|
+
async signNostrEvent(event) {
|
|
21
|
+
const pubkey = (await this.getNostrPublicKey()).slice(2);
|
|
22
|
+
const eventHash = (0, verify_js_1.nostrEventHash)({ ...event, pubkey });
|
|
23
|
+
const signature = secp256k1_1.schnorr.sign(eventHash, this.privateKey.slice(2));
|
|
24
|
+
return {
|
|
25
|
+
...event,
|
|
26
|
+
id: (0, index_js_1.hexFrom)(eventHash).slice(2),
|
|
27
|
+
pubkey,
|
|
28
|
+
sig: (0, index_js_1.hexFrom)(signature).slice(2),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.SignerNostrPrivateKey = SignerNostrPrivateKey;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { BytesLike } from "../../bytes/index.js";
|
|
1
|
+
import { Bytes, BytesLike } from "../../bytes/index.js";
|
|
2
2
|
import { NostrEvent } from "./signerNostr.js";
|
|
3
3
|
/**
|
|
4
4
|
* @public
|
|
5
5
|
*/
|
|
6
6
|
export declare function buildNostrEventFromMessage(message: string | BytesLike): NostrEvent;
|
|
7
|
+
export declare function nostrEventHash(event: NostrEvent): Bytes;
|
|
7
8
|
export declare function verifyMessageNostrEvent(message: string | BytesLike, signature: string, address: string): boolean;
|
|
8
9
|
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/verify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/signer/nostr/verify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,UAAU,CA4BZ;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAWvD;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAYT"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildNostrEventFromMessage = buildNostrEventFromMessage;
|
|
4
|
+
exports.nostrEventHash = nostrEventHash;
|
|
4
5
|
exports.verifyMessageNostrEvent = verifyMessageNostrEvent;
|
|
5
6
|
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
6
7
|
const sha256_1 = require("@noble/hashes/sha256");
|
|
@@ -19,8 +20,8 @@ function buildNostrEventFromMessage(message) {
|
|
|
19
20
|
typeof event.created_at === "number" &&
|
|
20
21
|
typeof event.kind === "number" &&
|
|
21
22
|
typeof event.content === "string" &&
|
|
22
|
-
Array.isArray(event.
|
|
23
|
-
event.
|
|
23
|
+
Array.isArray(event.tags) &&
|
|
24
|
+
event.tags.every((tag) => Array.isArray(tag) &&
|
|
24
25
|
tag.every((v) => typeof v === "string"))) {
|
|
25
26
|
return event;
|
|
26
27
|
}
|
|
@@ -34,21 +35,24 @@ function buildNostrEventFromMessage(message) {
|
|
|
34
35
|
tags: [],
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
-
const { words } = bech32_1.bech32.decode(address);
|
|
39
|
-
const publicKey = (0, index_js_2.hexFrom)(bech32_1.bech32.fromWords(words)).slice(2);
|
|
40
|
-
const event = buildNostrEventFromMessage(message);
|
|
38
|
+
function nostrEventHash(event) {
|
|
41
39
|
const serialized = JSON.stringify([
|
|
42
40
|
0,
|
|
43
|
-
|
|
41
|
+
event.pubkey,
|
|
44
42
|
event.created_at,
|
|
45
43
|
event.kind,
|
|
46
44
|
event.tags,
|
|
47
45
|
event.content,
|
|
48
46
|
]);
|
|
49
|
-
|
|
47
|
+
return (0, sha256_1.sha256)((0, index_js_1.bytesFrom)(serialized, "utf8"));
|
|
48
|
+
}
|
|
49
|
+
function verifyMessageNostrEvent(message, signature, address) {
|
|
50
|
+
const { words } = bech32_1.bech32.decode(address);
|
|
51
|
+
const publicKey = (0, index_js_2.hexFrom)(bech32_1.bech32.fromWords(words)).slice(2);
|
|
52
|
+
const event = buildNostrEventFromMessage(message);
|
|
53
|
+
const eventHash = nostrEventHash(event);
|
|
50
54
|
try {
|
|
51
|
-
return secp256k1_1.schnorr.verify(signature.slice(2), eventHash
|
|
55
|
+
return secp256k1_1.schnorr.verify((0, index_js_2.hexFrom)(signature).slice(2), eventHash, publicKey);
|
|
52
56
|
}
|
|
53
57
|
catch (_) {
|
|
54
58
|
return false;
|
package/package.json
CHANGED
|
@@ -13,12 +13,29 @@ export class ClientPublicMainnet extends ClientJsonRpc {
|
|
|
13
13
|
scripts?: Record<KnownScript, ScriptInfoLike | undefined>;
|
|
14
14
|
},
|
|
15
15
|
) {
|
|
16
|
+
const hasWebSocket = typeof WebSocket !== "undefined";
|
|
16
17
|
super(
|
|
17
18
|
config?.url ??
|
|
18
|
-
(
|
|
19
|
+
(hasWebSocket
|
|
19
20
|
? "wss://mainnet.ckb.dev/ws"
|
|
20
21
|
: "https://mainnet.ckb.dev/"),
|
|
21
|
-
|
|
22
|
+
{
|
|
23
|
+
...config,
|
|
24
|
+
fallbacks:
|
|
25
|
+
config?.fallbacks ??
|
|
26
|
+
(hasWebSocket
|
|
27
|
+
? [
|
|
28
|
+
"wss://mainnet.ckb.dev/ws",
|
|
29
|
+
"https://mainnet.ckb.dev/",
|
|
30
|
+
"https://mainnet.ckbapp.dev/",
|
|
31
|
+
"https://rpc.ankr.com/nervos_ckb",
|
|
32
|
+
]
|
|
33
|
+
: [
|
|
34
|
+
"https://mainnet.ckb.dev/",
|
|
35
|
+
"https://mainnet.ckbapp.dev/",
|
|
36
|
+
"https://rpc.ankr.com/nervos_ckb",
|
|
37
|
+
]),
|
|
38
|
+
},
|
|
22
39
|
);
|
|
23
40
|
}
|
|
24
41
|
|
|
@@ -13,12 +13,24 @@ export class ClientPublicTestnet extends ClientJsonRpc {
|
|
|
13
13
|
scripts?: Record<KnownScript, ScriptInfoLike | undefined>;
|
|
14
14
|
},
|
|
15
15
|
) {
|
|
16
|
+
const hasWebSocket = typeof WebSocket !== "undefined";
|
|
16
17
|
super(
|
|
17
18
|
config?.url ??
|
|
18
|
-
(
|
|
19
|
+
(hasWebSocket
|
|
19
20
|
? "wss://testnet.ckb.dev/ws"
|
|
20
21
|
: "https://testnet.ckb.dev/"),
|
|
21
|
-
|
|
22
|
+
{
|
|
23
|
+
...config,
|
|
24
|
+
fallbacks:
|
|
25
|
+
config?.fallbacks ??
|
|
26
|
+
(hasWebSocket
|
|
27
|
+
? [
|
|
28
|
+
"wss://testnet.ckb.dev/ws",
|
|
29
|
+
"https://testnet.ckb.dev/",
|
|
30
|
+
"https://testnet.ckbapp.dev/",
|
|
31
|
+
]
|
|
32
|
+
: ["https://testnet.ckb.dev/", "https://testnet.ckbapp.dev/"]),
|
|
33
|
+
},
|
|
22
34
|
);
|
|
23
35
|
}
|
|
24
36
|
|
package/src/jsonRpc/requestor.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
JsonRpcPayload,
|
|
3
3
|
Transport,
|
|
4
|
+
TransportFallback,
|
|
4
5
|
transportFromUri,
|
|
5
6
|
} from "./transports/advanced.js";
|
|
6
7
|
|
|
@@ -25,6 +26,7 @@ function transform(value: unknown, transformer?: (i: unknown) => unknown) {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
export type RequestorJsonRpcConfig = {
|
|
29
|
+
fallbacks?: string[];
|
|
28
30
|
timeout?: number;
|
|
29
31
|
maxConcurrent?: number;
|
|
30
32
|
transport?: Transport;
|
|
@@ -51,7 +53,14 @@ export class RequestorJsonRpc {
|
|
|
51
53
|
private readonly onError?: (err: unknown) => Promise<void> | void,
|
|
52
54
|
) {
|
|
53
55
|
this.maxConcurrent = config?.maxConcurrent;
|
|
54
|
-
this.transport =
|
|
56
|
+
this.transport =
|
|
57
|
+
config?.transport ??
|
|
58
|
+
new TransportFallback(
|
|
59
|
+
Array.from(
|
|
60
|
+
new Set([url_, ...(config?.fallbacks ?? [])]).values(),
|
|
61
|
+
(url) => transportFromUri(url, config),
|
|
62
|
+
),
|
|
63
|
+
);
|
|
55
64
|
}
|
|
56
65
|
|
|
57
66
|
/**
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { JsonRpcPayload, Transport } from "./transport.js";
|
|
2
|
+
|
|
3
|
+
export class TransportFallback implements Transport {
|
|
4
|
+
// Current transport index
|
|
5
|
+
private i = 0;
|
|
6
|
+
|
|
7
|
+
constructor(private readonly transports: Transport[]) {}
|
|
8
|
+
|
|
9
|
+
async request(data: JsonRpcPayload): Promise<unknown> {
|
|
10
|
+
let triedCount = 0;
|
|
11
|
+
|
|
12
|
+
while (true) {
|
|
13
|
+
try {
|
|
14
|
+
return await this.transports[this.i % this.transports.length].request(
|
|
15
|
+
data,
|
|
16
|
+
);
|
|
17
|
+
} catch (err) {
|
|
18
|
+
triedCount += 1;
|
|
19
|
+
this.i += 1;
|
|
20
|
+
|
|
21
|
+
if (triedCount >= this.transports.length) {
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
package/src/molecule/codec.ts
CHANGED
|
@@ -33,7 +33,30 @@ export class Codec<Encodable, Decoded = Encodable> {
|
|
|
33
33
|
decode,
|
|
34
34
|
byteLength,
|
|
35
35
|
}: CodecLike<Encodable, Decoded>): Codec<Encodable, Decoded> {
|
|
36
|
-
return new Codec(
|
|
36
|
+
return new Codec(
|
|
37
|
+
(encodable: Encodable) => {
|
|
38
|
+
const encoded = encode(encodable);
|
|
39
|
+
if (byteLength !== undefined && encoded.byteLength !== byteLength) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`Codec.encode: expected byte length ${byteLength}, got ${encoded.byteLength}`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
return encoded;
|
|
45
|
+
},
|
|
46
|
+
(decodable) => {
|
|
47
|
+
const decodableBytes = bytesFrom(decodable);
|
|
48
|
+
if (
|
|
49
|
+
byteLength !== undefined &&
|
|
50
|
+
decodableBytes.byteLength !== byteLength
|
|
51
|
+
) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`Codec.decode: expected byte length ${byteLength}, got ${decodableBytes.byteLength}`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return decode(decodable);
|
|
57
|
+
},
|
|
58
|
+
byteLength,
|
|
59
|
+
);
|
|
37
60
|
}
|
|
38
61
|
|
|
39
62
|
map<NewEncodable = Encodable, NewDecoded = Decoded>({
|
|
@@ -43,15 +66,15 @@ export class Codec<Encodable, Decoded = Encodable> {
|
|
|
43
66
|
inMap?: (encodable: NewEncodable) => Encodable;
|
|
44
67
|
outMap?: (decoded: Decoded) => NewDecoded;
|
|
45
68
|
}): Codec<NewEncodable, NewDecoded> {
|
|
46
|
-
return Codec
|
|
47
|
-
|
|
48
|
-
encode: (encodable) =>
|
|
69
|
+
return new Codec(
|
|
70
|
+
(encodable) =>
|
|
49
71
|
this.encode((inMap ? inMap(encodable) : encodable) as Encodable),
|
|
50
|
-
|
|
72
|
+
(buffer) =>
|
|
51
73
|
(outMap
|
|
52
74
|
? outMap(this.decode(buffer))
|
|
53
75
|
: this.decode(buffer)) as NewDecoded,
|
|
54
|
-
|
|
76
|
+
this.byteLength,
|
|
77
|
+
);
|
|
55
78
|
}
|
|
56
79
|
|
|
57
80
|
mapIn<NewEncodable>(
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { schnorr } from "@noble/curves/secp256k1";
|
|
2
|
+
import { Client } from "../../client/index.js";
|
|
3
|
+
import { Hex, hexFrom, HexLike } from "../../hex/index.js";
|
|
4
|
+
import { NostrEvent, SignerNostr } from "./signerNostr.js";
|
|
5
|
+
import { nostrEventHash } from "./verify.js";
|
|
6
|
+
|
|
7
|
+
export class SignerNostrPrivateKey extends SignerNostr {
|
|
8
|
+
private readonly privateKey: Hex;
|
|
9
|
+
|
|
10
|
+
constructor(client: Client, privateKey: HexLike) {
|
|
11
|
+
super(client);
|
|
12
|
+
this.privateKey = hexFrom(privateKey);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async connect(): Promise<void> {}
|
|
16
|
+
|
|
17
|
+
async isConnected(): Promise<boolean> {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async getNostrPublicKey(): Promise<Hex> {
|
|
22
|
+
return hexFrom(schnorr.getPublicKey(this.privateKey.slice(2)));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async signNostrEvent(event: NostrEvent): Promise<Required<NostrEvent>> {
|
|
26
|
+
const pubkey = (await this.getNostrPublicKey()).slice(2);
|
|
27
|
+
const eventHash = nostrEventHash({ ...event, pubkey });
|
|
28
|
+
const signature = schnorr.sign(eventHash, this.privateKey.slice(2));
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
...event,
|
|
32
|
+
id: hexFrom(eventHash).slice(2),
|
|
33
|
+
pubkey,
|
|
34
|
+
sig: hexFrom(signature).slice(2),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { schnorr } from "@noble/curves/secp256k1";
|
|
2
2
|
import { sha256 } from "@noble/hashes/sha256";
|
|
3
3
|
import { bech32 } from "bech32";
|
|
4
|
-
import { BytesLike, bytesFrom } from "../../bytes/index.js";
|
|
4
|
+
import { Bytes, BytesLike, bytesFrom } from "../../bytes/index.js";
|
|
5
5
|
import { hexFrom } from "../../hex/index.js";
|
|
6
6
|
import { NostrEvent } from "./signerNostr.js";
|
|
7
7
|
|
|
@@ -20,8 +20,8 @@ export function buildNostrEventFromMessage(
|
|
|
20
20
|
typeof event.created_at === "number" &&
|
|
21
21
|
typeof event.kind === "number" &&
|
|
22
22
|
typeof event.content === "string" &&
|
|
23
|
-
Array.isArray(event.
|
|
24
|
-
(event.
|
|
23
|
+
Array.isArray(event.tags) &&
|
|
24
|
+
(event.tags as unknown[]).every(
|
|
25
25
|
(tag) =>
|
|
26
26
|
Array.isArray(tag) &&
|
|
27
27
|
(tag as unknown[]).every((v) => typeof v === "string"),
|
|
@@ -40,6 +40,19 @@ export function buildNostrEventFromMessage(
|
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
export function nostrEventHash(event: NostrEvent): Bytes {
|
|
44
|
+
const serialized = JSON.stringify([
|
|
45
|
+
0,
|
|
46
|
+
event.pubkey,
|
|
47
|
+
event.created_at,
|
|
48
|
+
event.kind,
|
|
49
|
+
event.tags,
|
|
50
|
+
event.content,
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
return sha256(bytesFrom(serialized, "utf8"));
|
|
54
|
+
}
|
|
55
|
+
|
|
43
56
|
export function verifyMessageNostrEvent(
|
|
44
57
|
message: string | BytesLike,
|
|
45
58
|
signature: string,
|
|
@@ -49,18 +62,10 @@ export function verifyMessageNostrEvent(
|
|
|
49
62
|
const publicKey = hexFrom(bech32.fromWords(words)).slice(2);
|
|
50
63
|
|
|
51
64
|
const event = buildNostrEventFromMessage(message);
|
|
52
|
-
const
|
|
53
|
-
0,
|
|
54
|
-
publicKey,
|
|
55
|
-
event.created_at,
|
|
56
|
-
event.kind,
|
|
57
|
-
event.tags,
|
|
58
|
-
event.content,
|
|
59
|
-
]);
|
|
60
|
-
const eventHash = hexFrom(sha256(bytesFrom(serialized, "utf8")));
|
|
65
|
+
const eventHash = nostrEventHash(event);
|
|
61
66
|
|
|
62
67
|
try {
|
|
63
|
-
return schnorr.verify(signature.slice(2), eventHash
|
|
68
|
+
return schnorr.verify(hexFrom(signature).slice(2), eventHash, publicKey);
|
|
64
69
|
} catch (_) {
|
|
65
70
|
return false;
|
|
66
71
|
}
|