@prosopo/keyring 2.9.61 → 2.9.62

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 (55) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +2 -2
  2. package/.turbo/turbo-build$colon$tsc.log +11 -11
  3. package/.turbo/turbo-build.log +3 -3
  4. package/CHANGELOG.md +5 -0
  5. package/dist/accounts/getPair.test.d.ts +2 -0
  6. package/dist/accounts/getPair.test.d.ts.map +1 -0
  7. package/dist/accounts/getPair.test.js +86 -0
  8. package/dist/accounts/getPair.test.js.map +1 -0
  9. package/dist/accounts/mnemonic.test.d.ts +2 -0
  10. package/dist/accounts/mnemonic.test.d.ts.map +1 -0
  11. package/dist/accounts/mnemonic.test.js +64 -0
  12. package/dist/accounts/mnemonic.test.js.map +1 -0
  13. package/dist/accounts/testAccounts.test.d.ts +2 -0
  14. package/dist/accounts/testAccounts.test.d.ts.map +1 -0
  15. package/dist/accounts/testAccounts.test.js +66 -0
  16. package/dist/accounts/testAccounts.test.js.map +1 -0
  17. package/dist/keyring/keyring.test.d.ts +2 -0
  18. package/dist/keyring/keyring.test.d.ts.map +1 -0
  19. package/dist/keyring/keyring.test.js +239 -0
  20. package/dist/keyring/keyring.test.js.map +1 -0
  21. package/dist/keyring/pairs.test.d.ts +2 -0
  22. package/dist/keyring/pairs.test.d.ts.map +1 -0
  23. package/dist/keyring/pairs.test.js +84 -0
  24. package/dist/keyring/pairs.test.js.map +1 -0
  25. package/dist/keyring/testing.test.d.ts +2 -0
  26. package/dist/keyring/testing.test.d.ts.map +1 -0
  27. package/dist/keyring/testing.test.js +97 -0
  28. package/dist/keyring/testing.test.js.map +1 -0
  29. package/dist/keyring.test-d.d.ts +2 -0
  30. package/dist/keyring.test-d.d.ts.map +1 -0
  31. package/dist/keyring.test-d.js +66 -0
  32. package/dist/keyring.test-d.js.map +1 -0
  33. package/dist/pair/decode.spec.js +1 -1
  34. package/dist/pair/decode.spec.js.map +1 -1
  35. package/dist/pair/encode.spec.js +1 -1
  36. package/dist/pair/encode.spec.js.map +1 -1
  37. package/dist/pair/nobody.test.d.ts +2 -0
  38. package/dist/pair/nobody.test.d.ts.map +1 -0
  39. package/dist/pair/nobody.test.js +77 -0
  40. package/dist/pair/nobody.test.js.map +1 -0
  41. package/dist/pair/toJson.spec.js +1 -1
  42. package/dist/pair/toJson.spec.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/accounts/getPair.test.ts +142 -0
  45. package/src/accounts/mnemonic.test.ts +103 -0
  46. package/src/accounts/testAccounts.test.ts +100 -0
  47. package/src/keyring/keyring.test.ts +373 -0
  48. package/src/keyring/pairs.test.ts +133 -0
  49. package/src/keyring/testing.test.ts +146 -0
  50. package/src/keyring.test-d.ts +134 -0
  51. package/src/pair/decode.spec.ts +3 -1
  52. package/src/pair/encode.spec.ts +9 -3
  53. package/src/pair/nobody.test.ts +127 -0
  54. package/src/pair/toJson.spec.ts +18 -12
  55. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairs.test.d.ts","sourceRoot":"","sources":["../../src/keyring/pairs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import { decodeAddress, encodeAddress } from "@prosopo/util-crypto";
2
+ import { describe, expect, it } from "vitest";
3
+ import { nobody } from "../pair/nobody.js";
4
+ import { Pairs } from "./pairs.js";
5
+ const stubPair = (publicKey) => ({
6
+ ...nobody(),
7
+ address: encodeAddress(publicKey, 42),
8
+ addressRaw: publicKey,
9
+ publicKey,
10
+ });
11
+ const keyOf = (byte) => new Uint8Array(32).fill(byte);
12
+ describe("Pairs", () => {
13
+ it("returns the pair it was given, so callers can chain off add", () => {
14
+ const pairs = new Pairs();
15
+ const pair = stubPair(keyOf(1));
16
+ expect(pairs.add(pair)).toBe(pair);
17
+ });
18
+ it("starts empty", () => {
19
+ expect(new Pairs().all()).toEqual([]);
20
+ });
21
+ it("retrieves a pair by SS58 address, public key or raw bytes", () => {
22
+ const pairs = new Pairs();
23
+ const publicKey = keyOf(2);
24
+ const pair = pairs.add(stubPair(publicKey));
25
+ expect(pairs.get(pair.address)).toBe(pair);
26
+ expect(pairs.get(publicKey)).toBe(pair);
27
+ expect(pairs.get(encodeAddress(publicKey, 2))).toBe(pair);
28
+ });
29
+ it("keeps only the latest pair for a public key", () => {
30
+ const pairs = new Pairs();
31
+ const publicKey = keyOf(3);
32
+ pairs.add(stubPair(publicKey));
33
+ const second = stubPair(publicKey);
34
+ pairs.add(second);
35
+ expect(pairs.all()).toHaveLength(1);
36
+ expect(pairs.get(publicKey)).toBe(second);
37
+ });
38
+ it("keeps distinct public keys apart", () => {
39
+ const pairs = new Pairs();
40
+ const first = pairs.add(stubPair(keyOf(4)));
41
+ const second = pairs.add(stubPair(keyOf(5)));
42
+ expect(pairs.all()).toEqual([first, second]);
43
+ expect(pairs.get(first.address)).toBe(first);
44
+ expect(pairs.get(second.address)).toBe(second);
45
+ });
46
+ it("names the address it could not find, formatting bytes as hex", () => {
47
+ const pairs = new Pairs();
48
+ expect(() => pairs.get(keyOf(6))).toThrow(`Unable to retrieve keypair '0x${"06".repeat(32)}'`);
49
+ });
50
+ it("names the address verbatim when it was given as SS58", () => {
51
+ const address = encodeAddress(keyOf(7), 42);
52
+ expect(() => new Pairs().get(address)).toThrow(`Unable to retrieve keypair '${address}'`);
53
+ });
54
+ it("rejects an address that is not decodable at all", () => {
55
+ expect(() => new Pairs().get("not-an-address")).toThrow();
56
+ });
57
+ it("removes a pair, after which lookup throws again", () => {
58
+ const pairs = new Pairs();
59
+ const publicKey = keyOf(8);
60
+ pairs.add(stubPair(publicKey));
61
+ pairs.remove(publicKey);
62
+ expect(pairs.all()).toEqual([]);
63
+ expect(() => pairs.get(publicKey)).toThrow("Unable to retrieve keypair");
64
+ });
65
+ it("removes by any encoding of the same key", () => {
66
+ const pairs = new Pairs();
67
+ const publicKey = keyOf(9);
68
+ const pair = pairs.add(stubPair(publicKey));
69
+ pairs.remove(encodeAddress(publicKey, 2));
70
+ expect(pairs.all()).toEqual([]);
71
+ expect(pair.address).toBe(encodeAddress(publicKey, 42));
72
+ });
73
+ it("ignores removal of a key that was never added", () => {
74
+ const pairs = new Pairs();
75
+ const kept = pairs.add(stubPair(keyOf(10)));
76
+ expect(() => pairs.remove(keyOf(11))).not.toThrow();
77
+ expect(pairs.all()).toEqual([kept]);
78
+ });
79
+ it("decodes the address for the map key rather than trusting the string", () => {
80
+ const publicKey = keyOf(12);
81
+ expect(decodeAddress(encodeAddress(publicKey, 42)).toString()).toBe(decodeAddress(encodeAddress(publicKey, 2)).toString());
82
+ });
83
+ });
84
+ //# sourceMappingURL=pairs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairs.test.js","sourceRoot":"","sources":["../../src/keyring/pairs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=testing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.test.d.ts","sourceRoot":"","sources":["../../src/keyring/testing.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { u8aToHex } from "@polkadot/util";
2
+ import { describe, expect, it } from "vitest";
3
+ import { PAIRSSR25519, createTestKeyring } from "./testing.js";
4
+ import { createTestPairs } from "./testingPairs.js";
5
+ const SLOW = { timeout: 60000 };
6
+ describe("createTestKeyring", SLOW, () => {
7
+ it("adds a pair for every well-known dev account", () => {
8
+ expect(createTestKeyring().getPairs()).toHaveLength(PAIRSSR25519.length);
9
+ });
10
+ it("names each pair after its seed, lowercased with the path flattened", () => {
11
+ const names = createTestKeyring()
12
+ .getPairs()
13
+ .map((pair) => pair.meta.name);
14
+ expect(names).toEqual([
15
+ "alice",
16
+ "alice_stash",
17
+ "bob",
18
+ "bob_stash",
19
+ "charlie",
20
+ "dave",
21
+ "eve",
22
+ "ferdie",
23
+ ]);
24
+ });
25
+ it("marks every pair as a testing pair", () => {
26
+ for (const pair of createTestKeyring().getPairs()) {
27
+ expect(pair.meta.isTesting).toBe(true);
28
+ }
29
+ });
30
+ it("uses the hard-coded public keys, not derivation, by default", () => {
31
+ const keyring = createTestKeyring();
32
+ for (const { p } of PAIRSSR25519) {
33
+ expect(u8aToHex(keyring.getPair(p).publicKey)).toBe(p);
34
+ }
35
+ });
36
+ it("replaces lock with a no-op so the fixtures stay usable", () => {
37
+ const pair = createTestKeyring().getPairs()[0];
38
+ expect(pair).toBeDefined();
39
+ if (!pair)
40
+ return;
41
+ expect(() => pair.lock()).not.toThrow();
42
+ expect(pair.isLocked).toBe(false);
43
+ });
44
+ it("produces signable pairs", () => {
45
+ const pair = createTestKeyring().getPair(PAIRSSR25519[0]?.p ?? "0x");
46
+ const message = new TextEncoder().encode("hello");
47
+ expect(pair.verify(message, pair.sign(message), pair.publicKey)).toBe(true);
48
+ });
49
+ it("honours a requested ss58 format", () => {
50
+ const alice = PAIRSSR25519[0]?.p ?? "0x";
51
+ expect(createTestKeyring({ ss58Format: 42 }).getPair(alice).address).not.toBe(createTestKeyring({ ss58Format: 2 }).getPair(alice).address);
52
+ });
53
+ it("derives different keys when asked to, because the seeds are bare names", () => {
54
+ const derived = createTestKeyring({}, false);
55
+ expect(derived.getPairs()).toHaveLength(PAIRSSR25519.length);
56
+ for (const { p } of PAIRSSR25519) {
57
+ expect(() => derived.getPair(p)).toThrow("Unable to retrieve keypair");
58
+ }
59
+ });
60
+ it("rejects a keyring type it cannot support", () => {
61
+ expect(() => createTestKeyring({ type: "ed25519" })).toThrow("Expected a keyring type of either 'sr25519'");
62
+ });
63
+ });
64
+ describe("createTestPairs", SLOW, () => {
65
+ it("exposes every named pair plus nobody", () => {
66
+ const pairs = createTestPairs();
67
+ for (const name of [
68
+ "nobody",
69
+ "alice",
70
+ "alice_stash",
71
+ "bob",
72
+ "bob_stash",
73
+ "charlie",
74
+ "dave",
75
+ "eve",
76
+ "ferdie",
77
+ ]) {
78
+ expect(pairs[name], name).toBeDefined();
79
+ }
80
+ });
81
+ it("maps alice to the well-known Alice public key", () => {
82
+ expect(u8aToHex(createTestPairs().alice?.publicKey ?? new Uint8Array())).toBe(PAIRSSR25519[0]?.p);
83
+ });
84
+ it("includes nobody, which cannot verify anything", () => {
85
+ const nobodyPair = createTestPairs().nobody;
86
+ expect(nobodyPair).toBeDefined();
87
+ expect(nobodyPair?.isLocked).toBe(true);
88
+ expect(nobodyPair?.verify(new Uint8Array(1), new Uint8Array(64), nobodyPair.publicKey)).toBe(false);
89
+ });
90
+ it("returns independent maps so one test cannot poison another", () => {
91
+ const first = createTestPairs();
92
+ const second = createTestPairs();
93
+ expect(first).not.toBe(second);
94
+ expect(first.alice).not.toBe(second.alice);
95
+ });
96
+ });
97
+ //# sourceMappingURL=testing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.test.js","sourceRoot":"","sources":["../../src/keyring/testing.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEhC,QAAQ,CAAC,mBAAmB,EAAE,IAAI,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAG7E,MAAM,KAAK,GAAG,iBAAiB,EAAE;aAC/B,QAAQ,EAAE;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO;YACP,aAAa;YACb,KAAK;YACL,WAAW;YACX,SAAS;YACT,MAAM;YACN,KAAK;YACL,QAAQ;SACR,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAGjE,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QACzC,MAAM,CACL,iBAAiB,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAC5D,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAMjF,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7D,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACxE,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAC3D,6CAA6C,CAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI;YAClB,QAAQ;YACR,OAAO;YACP,aAAa;YACb,KAAK;YACL,WAAW;YACX,SAAS;YACT,MAAM;YACN,KAAK;YACL,QAAQ;SACR,EAAE,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACxD,MAAM,CACL,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,SAAS,IAAI,IAAI,UAAU,EAAE,CAAC,CAChE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACxD,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC,MAAM,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CACL,UAAU,EAAE,MAAM,CACjB,IAAI,UAAU,CAAC,CAAC,CAAC,EACjB,IAAI,UAAU,CAAC,EAAE,CAAC,EAClB,UAAU,CAAC,SAAS,CACpB,CACD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACrE,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=keyring.test-d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.test-d.d.ts","sourceRoot":"","sources":["../src/keyring.test-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { assertType, describe, expectTypeOf, it } from "vitest";
2
+ import { Keyring, generateMiniSecret, generateMnemonic, getDefaultProviders, getDefaultSiteKeys, getPair, } from "./index.js";
3
+ import { nobody } from "./pair/nobody.js";
4
+ describe("Keyring types", () => {
5
+ it("implements the shared KeyringInstance contract", () => {
6
+ expectTypeOf().toExtend();
7
+ });
8
+ it("returns KeyringPair from every add and create method", () => {
9
+ const keyring = new Keyring();
10
+ expectTypeOf(keyring.addFromUri("//Alice")).toEqualTypeOf();
11
+ expectTypeOf(keyring.addFromMnemonic("x")).toEqualTypeOf();
12
+ expectTypeOf(keyring.addFromSeed(new Uint8Array())).toEqualTypeOf();
13
+ expectTypeOf(keyring.addFromAddress("x")).toEqualTypeOf();
14
+ expectTypeOf(keyring.getPair("x")).toEqualTypeOf();
15
+ expectTypeOf(keyring.getPairs()).toEqualTypeOf();
16
+ expectTypeOf(keyring.publicKeys).toEqualTypeOf();
17
+ expectTypeOf(keyring.toJson("x")).toEqualTypeOf();
18
+ });
19
+ it("accepts an address as either a string or raw bytes", () => {
20
+ const keyring = new Keyring();
21
+ assertType(keyring.getPair("5abc"));
22
+ assertType(keyring.getPair(new Uint8Array(32)));
23
+ assertType(keyring.getPair(1));
24
+ });
25
+ it("rejects a keyring option object with an unknown key", () => {
26
+ new Keyring({ curve: "sr25519" });
27
+ });
28
+ it("has a readonly type", () => {
29
+ expectTypeOf().toEqualTypeOf();
30
+ });
31
+ });
32
+ describe("account helper types", () => {
33
+ it("returns a pair from getPair with every argument optional", () => {
34
+ expectTypeOf(getPair).returns.toEqualTypeOf();
35
+ assertType(getPair());
36
+ assertType(getPair("secret", "account", "sr25519", 42));
37
+ });
38
+ it("returns the mnemonic and address as a tuple", () => {
39
+ expectTypeOf(generateMnemonic).returns.resolves.toEqualTypeOf();
40
+ });
41
+ it("returns the mini secret as bytes paired with an address", () => {
42
+ expectTypeOf(generateMiniSecret).returns.resolves.toEqualTypeOf();
43
+ });
44
+ it("describes the dev fixtures with the shared account types", () => {
45
+ expectTypeOf(getDefaultSiteKeys()).toEqualTypeOf();
46
+ expectTypeOf(getDefaultProviders()).toEqualTypeOf();
47
+ });
48
+ it("returns a real KeyringPair for nobody", () => {
49
+ expectTypeOf(nobody()).toEqualTypeOf();
50
+ });
51
+ });
52
+ describe("test keyring map inference", () => {
53
+ it("defaults to the substrate map when no options are given", () => {
54
+ expectTypeOf().toEqualTypeOf();
55
+ expectTypeOf().toEqualTypeOf();
56
+ });
57
+ it("selects the ethereum map only for an ethereum keyring", () => {
58
+ expectTypeOf().toEqualTypeOf();
59
+ expectTypeOf().toEqualTypeOf();
60
+ });
61
+ it("indexes the map by arbitrary names, always yielding a pair", () => {
62
+ expectTypeOf().toEqualTypeOf();
63
+ expectTypeOf().toEqualTypeOf();
64
+ });
65
+ });
66
+ //# sourceMappingURL=keyring.test-d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.test-d.js","sourceRoot":"","sources":["../src/keyring.test-d.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ describe("decode", () => {
5
5
  it("fails when no data provided", () => {
6
6
  expect(() => keyring.alice.decodePkcs8()).toThrow(/(No encrypted data available|Password required)/);
7
7
  });
8
- it("returns correct publicKey from encoded", () => {
8
+ it("returns correct publicKey from encoded", { timeout: 60000 }, () => {
9
9
  const PASS = "testing";
10
10
  expect(() => keyring.alice.decodePkcs8(PASS, keyring.alice.encodePkcs8(PASS))).not.toThrow();
11
11
  });
@@ -1 +1 @@
1
- {"version":3,"file":"decode.spec.js","sourceRoot":"","sources":["../../src/pair/decode.spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAE5D,QAAQ,CAAC,QAAQ,EAAE,GAAS,EAAE;IAC7B,EAAE,CAAC,6BAA6B,EAAE,GAAS,EAAE;QAC5C,MAAM,CAAC,GAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CACtD,iDAAiD,CACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAS,EAAE;QACvD,MAAM,IAAI,GAAG,SAAS,CAAC;QAEvB,MAAM,CAAC,GAAS,EAAE,CACjB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAChE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"decode.spec.js","sourceRoot":"","sources":["../../src/pair/decode.spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAE5D,QAAQ,CAAC,QAAQ,EAAE,GAAS,EAAE;IAC7B,EAAE,CAAC,6BAA6B,EAAE,GAAS,EAAE;QAC5C,MAAM,CAAC,GAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CACtD,iDAAiD,CACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAIH,EAAE,CAAC,wCAAwC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAS,EAAE;QAC3E,MAAM,IAAI,GAAG,SAAS,CAAC;QAEvB,MAAM,CAAC,GAAS,EAAE,CACjB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAChE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -9,7 +9,7 @@ describe("encode", () => {
9
9
  it("returns PKCS8 when no passphrase supplied", () => {
10
10
  expect(keyring.alice.encodePkcs8()).toHaveLength(DECODED_LENGTH);
11
11
  });
12
- it("returns encoded PKCS8 when passphrase supplied", () => {
12
+ it("returns encoded PKCS8 when passphrase supplied", { timeout: 60000 }, () => {
13
13
  expect(keyring.alice.encodePkcs8("testing")).toHaveLength(ENCODED_LENGTH);
14
14
  });
15
15
  });
@@ -1 +1 @@
1
- {"version":3,"file":"encode.spec.js","sourceRoot":"","sources":["../../src/pair/encode.spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3E,MAAM,cAAc,GACnB,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAC7D,MAAM,cAAc,GAAG,EAAE,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,CAAC;AAE1E,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAE5D,QAAQ,CAAC,QAAQ,EAAE,GAAS,EAAE;IAC7B,EAAE,CAAC,2CAA2C,EAAE,GAAS,EAAE;QAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAS,EAAE;QAC/D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"encode.spec.js","sourceRoot":"","sources":["../../src/pair/encode.spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3E,MAAM,cAAc,GACnB,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAC7D,MAAM,cAAc,GAAG,EAAE,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,CAAC;AAE1E,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAE5D,QAAQ,CAAC,QAAQ,EAAE,GAAS,EAAE;IAC7B,EAAE,CAAC,2CAA2C,EAAE,GAAS,EAAE;QAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAIH,EAAE,CACD,gDAAgD,EAChD,EAAE,OAAO,EAAE,KAAK,EAAE,EAClB,GAAS,EAAE;QACV,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC3E,CAAC,CACD,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nobody.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nobody.test.d.ts","sourceRoot":"","sources":["../../src/pair/nobody.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { encodeAddress } from "@prosopo/util-crypto";
2
+ import { describe, expect, it } from "vitest";
3
+ import { PAIR_DIV, PAIR_HDR, PUB_LENGTH, SALT_LENGTH, SEC_LENGTH, SEED_LENGTH, } from "./defaults.js";
4
+ import { nobody } from "./nobody.js";
5
+ describe("nobody", () => {
6
+ it("is the all-zero public key, encoded as the well-known address", () => {
7
+ const pair = nobody();
8
+ expect(pair.publicKey).toEqual(new Uint8Array(32));
9
+ expect(pair.address).toBe("5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM");
10
+ expect(pair.address).toBe(encodeAddress(pair.publicKey, 42));
11
+ });
12
+ it("is permanently locked", () => {
13
+ const pair = nobody();
14
+ expect(pair.isLocked).toBe(true);
15
+ pair.unlock("anything");
16
+ expect(pair.isLocked).toBe(true);
17
+ pair.lock();
18
+ expect(pair.isLocked).toBe(true);
19
+ });
20
+ it("never verifies a signature, whatever it is given", () => {
21
+ const pair = nobody();
22
+ expect(pair.verify(new Uint8Array(1), new Uint8Array(64), pair.publicKey)).toBe(false);
23
+ expect(pair.verify(new Uint8Array(0), pair.sign(new Uint8Array(1)), pair.publicKey)).toBe(false);
24
+ expect(pair.vrfVerify(new Uint8Array(1), new Uint8Array(96), pair.publicKey)).toBe(false);
25
+ });
26
+ it("never reports a JWT as valid", () => {
27
+ const result = nobody().jwtVerify(nobody().jwtIssue());
28
+ expect(result.isValid).toBe(false);
29
+ expect(result.error).toBe("JWT verification failed");
30
+ expect(result.publicKey).toEqual(new Uint8Array(32));
31
+ });
32
+ it("returns correctly sized but empty signatures", () => {
33
+ const pair = nobody();
34
+ expect(pair.sign(new Uint8Array(1))).toEqual(new Uint8Array(64));
35
+ expect(pair.vrfSign(new Uint8Array(1))).toEqual(new Uint8Array(96));
36
+ expect(pair.encodePkcs8()).toEqual(new Uint8Array(0));
37
+ });
38
+ it("derives to itself, so no chain of derivation can escape it", () => {
39
+ const pair = nobody();
40
+ expect(pair.derive("//anything")).toBe(pair);
41
+ expect(pair.derive("//a").derive("//b")).toBe(pair);
42
+ });
43
+ it("ignores attempts to change its meta", () => {
44
+ const pair = nobody();
45
+ pair.setMeta({ name: "somebody" });
46
+ expect(pair.meta.name).toBe("nobody");
47
+ expect(pair.meta.isTesting).toBe(true);
48
+ });
49
+ it("serialises to an unencrypted v0 json blob", () => {
50
+ const json = nobody().toJson();
51
+ expect(json.address).toBe(nobody().address);
52
+ expect(json.encoded).toBe("");
53
+ expect(json.encoding.version).toBe("0");
54
+ expect(json.encoding.type).toBe("none");
55
+ });
56
+ it("returns the same shared instance each call", () => {
57
+ expect(nobody()).toBe(nobody());
58
+ });
59
+ it("accepts pkcs8 decoding without throwing", () => {
60
+ expect(() => nobody().decodePkcs8("pass", new Uint8Array(1))).not.toThrow();
61
+ });
62
+ });
63
+ describe("pair defaults", () => {
64
+ it("declares the sr25519 key and seed lengths", () => {
65
+ expect(PUB_LENGTH).toBe(32);
66
+ expect(SEED_LENGTH).toBe(32);
67
+ expect(SALT_LENGTH).toBe(32);
68
+ expect(SEC_LENGTH).toBe(64);
69
+ });
70
+ it("declares the pkcs8 header and divider used by the encoder", () => {
71
+ expect(Array.from(PAIR_DIV)).toEqual([161, 35, 3, 33, 0]);
72
+ expect(Array.from(PAIR_HDR)).toEqual([
73
+ 48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32,
74
+ ]);
75
+ });
76
+ });
77
+ //# sourceMappingURL=nobody.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nobody.test.js","sourceRoot":"","sources":["../../src/pair/nobody.test.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ describe("toJson", () => {
17
17
  },
18
18
  });
19
19
  });
20
- it("creates an encoded output with passphrase", () => {
20
+ it("creates an encoded output with passphrase", { timeout: 60000 }, () => {
21
21
  const json = keyring.alice.toJson("testing");
22
22
  expect(json.encoded).toHaveLength(268);
23
23
  expect(json).toMatchObject({
@@ -1 +1 @@
1
- {"version":3,"file":"toJson.spec.js","sourceRoot":"","sources":["../../src/pair/toJson.spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAE5D,QAAQ,CAAC,QAAQ,EAAE,GAAS,EAAE;IAC7B,EAAE,CAAC,gDAAgD,EAAE,GAAS,EAAE;QAC/D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC;YAC5C,OAAO,EAAE,kDAAkD;YAC3D,OAAO,EACN,8JAA8J;YAC/J,QAAQ,EAAE;gBACT,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC7B,IAAI,EAAE,CAAC,MAAM,CAAC;gBACd,OAAO,EAAE,GAAG;aACZ;YACD,IAAI,EAAE;gBACL,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,OAAO;aACb;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAS,EAAE;QAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;YAC1B,OAAO,EAAE,kDAAkD;YAC3D,QAAQ,EAAE;gBACT,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC7B,IAAI,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC;gBACrC,OAAO,EAAE,GAAG;aACZ;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"toJson.spec.js","sourceRoot":"","sources":["../../src/pair/toJson.spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAE5D,QAAQ,CAAC,QAAQ,EAAE,GAAS,EAAE;IAC7B,EAAE,CAAC,gDAAgD,EAAE,GAAS,EAAE;QAC/D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC;YAC5C,OAAO,EAAE,kDAAkD;YAC3D,OAAO,EACN,8JAA8J;YAC/J,QAAQ,EAAE;gBACT,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC7B,IAAI,EAAE,CAAC,MAAM,CAAC;gBACd,OAAO,EAAE,GAAG;aACZ;YACD,IAAI,EAAE;gBACL,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,OAAO;aACb;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAIH,EAAE,CACD,2CAA2C,EAC3C,EAAE,OAAO,EAAE,KAAK,EAAE,EAClB,GAAS,EAAE;QACV,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;YAC1B,OAAO,EAAE,kDAAkD;YAC3D,QAAQ,EAAE;gBACT,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC7B,IAAI,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC;gBACrC,OAAO,EAAE,GAAG;aACZ;SACD,CAAC,CAAC;IACJ,CAAC,CACD,CAAC;AACH,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/keyring",
3
- "version": "2.9.61",
3
+ "version": "2.9.62",
4
4
  "description": "Keypair generator for Prosopo",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,142 @@
1
+ // Copyright 2021-2026 Prosopo (UK) Ltd.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ import { u8aToHex } from "@polkadot/util";
16
+ import type { KeyringPair$Json } from "@prosopo/types";
17
+ import { encodeAddress, sr25519FromSeed } from "@prosopo/util-crypto";
18
+ import { describe, expect, it } from "vitest";
19
+ import { DEV_PHRASE, Keyring } from "../keyring/index.js";
20
+ import { getPair } from "./getPair.js";
21
+
22
+ const SEED_32 = new Uint8Array(32).fill(7);
23
+ const SEED_HEX = u8aToHex(SEED_32);
24
+ const ALICE_PUBLIC =
25
+ "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d";
26
+
27
+ const pairJson = (
28
+ overrides: Partial<KeyringPair$Json> = {},
29
+ ): KeyringPair$Json => ({
30
+ address: encodeAddress(new Uint8Array(32).fill(8), 42),
31
+ encoded: "0x00",
32
+ encoding: { content: ["pkcs8", "sr25519"], type: ["none"], version: "3" },
33
+ meta: {},
34
+ ...overrides,
35
+ });
36
+
37
+ // Key derivation runs scrypt/pbkdf2 with production parameters and takes
38
+ // seconds per call, so these suites need more than the 10s default.
39
+ const SLOW = { timeout: 60000 };
40
+
41
+ describe("getPair secret handling", SLOW, () => {
42
+ it("derives from a mnemonic", () => {
43
+ expect(getPair(DEV_PHRASE).address).toBe(
44
+ new Keyring({ ss58Format: 42 }).addFromMnemonic(DEV_PHRASE).address,
45
+ );
46
+ });
47
+
48
+ it("derives from a hex seed", () => {
49
+ expect(u8aToHex(getPair(SEED_HEX).publicKey)).toBe(
50
+ u8aToHex(sr25519FromSeed(SEED_32).publicKey),
51
+ );
52
+ });
53
+
54
+ it("derives from a suri with a hard derivation path", () => {
55
+ expect(u8aToHex(getPair(`${DEV_PHRASE}//Alice`).publicKey)).toBe(
56
+ ALICE_PUBLIC,
57
+ );
58
+ });
59
+
60
+ it("prefers the mnemonic branch over the suri branch", () => {
61
+ // A bare valid mnemonic contains no "//", but the ordering matters if
62
+ // one is ever added: mnemonic validation must win so the derivation
63
+ // path is honoured rather than the whole string being padded.
64
+ const suri = `${DEV_PHRASE}//1`;
65
+ expect(getPair(suri).address).not.toBe(getPair(DEV_PHRASE).address);
66
+ });
67
+
68
+ it("parses a JSON string, taking the crypto type from its encoding", () => {
69
+ const pair = getPair(JSON.stringify(pairJson()));
70
+ expect(pair.type).toBe("sr25519");
71
+ expect(u8aToHex(pair.publicKey)).toBe(u8aToHex(new Uint8Array(32).fill(8)));
72
+ });
73
+
74
+ it("accepts a JSON object directly", () => {
75
+ expect(getPair(pairJson()).type).toBe("sr25519");
76
+ });
77
+
78
+ it("reports a missing secret when the string is neither key nor JSON", () => {
79
+ // The unparseable case funnels into the same error as a genuinely
80
+ // absent secret, so an operator sees one actionable message.
81
+ expect(() => getPair("this is not a secret")).toThrow();
82
+ });
83
+
84
+ it("reports a missing secret for JSON without an encoding block", () => {
85
+ expect(() => getPair('{"address":"x"}')).toThrow();
86
+ });
87
+
88
+ it("throws when neither a secret nor an account is given", () => {
89
+ expect(() => getPair()).toThrow();
90
+ });
91
+
92
+ it("throws when the secret is an empty string and no account is given", () => {
93
+ expect(() => getPair("")).toThrow();
94
+ });
95
+ });
96
+
97
+ describe("getPair account handling", SLOW, () => {
98
+ it("builds a watch-only pair from an address when no secret is given", () => {
99
+ const address = getPair(DEV_PHRASE).address;
100
+ const watchOnly = getPair(undefined, address);
101
+ expect(watchOnly.address).toBe(address);
102
+ expect(watchOnly.isLocked).toBe(true);
103
+ });
104
+
105
+ it("accepts a raw public key as the account", () => {
106
+ const pair = getPair(DEV_PHRASE);
107
+ expect(getPair(undefined, pair.publicKey).address).toBe(pair.address);
108
+ });
109
+
110
+ it("ignores the account once a secret is supplied", () => {
111
+ const other = getPair(`${DEV_PHRASE}//other`).address;
112
+ expect(getPair(DEV_PHRASE, other).address).toBe(
113
+ getPair(DEV_PHRASE).address,
114
+ );
115
+ });
116
+ });
117
+
118
+ describe("getPair defaults", SLOW, () => {
119
+ it("defaults to sr25519 and ss58 format 42", () => {
120
+ const pair = getPair(DEV_PHRASE);
121
+ expect(pair.type).toBe("sr25519");
122
+ expect(pair.address).toBe(encodeAddress(pair.publicKey, 42));
123
+ });
124
+
125
+ it("honours an explicit ss58 format", () => {
126
+ const pair = getPair(DEV_PHRASE, undefined, "sr25519", 2);
127
+ expect(pair.address).toBe(encodeAddress(pair.publicKey, 2));
128
+ });
129
+
130
+ it("rejects a pair type the keyring does not support", () => {
131
+ expect(() => getPair(DEV_PHRASE, undefined, "ed25519")).toThrow(
132
+ "Expected a keyring type of either 'sr25519'",
133
+ );
134
+ });
135
+
136
+ it("treats ss58 format 0 as unset, because it is falsy", () => {
137
+ // Documents a live quirk of the `||` defaulting: Polkadot's own
138
+ // format 0 cannot be requested and silently becomes 42.
139
+ const pair = getPair(DEV_PHRASE, undefined, "sr25519", 0);
140
+ expect(pair.address).toBe(encodeAddress(pair.publicKey, 42));
141
+ });
142
+ });