@pezkuwi/keyring 14.0.7 → 14.0.10

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 (174) hide show
  1. package/build/LICENSE +201 -0
  2. package/build/README.md +17 -0
  3. package/{bundle-pezkuwi-keyring.js → build/bundle-pezkuwi-keyring.js} +1 -1
  4. package/build/bundle.js +7 -0
  5. package/build/cjs/bundle.d.ts +7 -0
  6. package/build/cjs/bundle.js +19 -0
  7. package/build/cjs/defaults.js +5 -0
  8. package/build/cjs/index.js +7 -0
  9. package/build/cjs/keyring.js +261 -0
  10. package/build/cjs/packageInfo.js +4 -0
  11. package/build/cjs/pair/decode.js +45 -0
  12. package/build/cjs/pair/defaults.js +15 -0
  13. package/build/cjs/pair/encode.js +22 -0
  14. package/build/cjs/pair/index.js +183 -0
  15. package/build/cjs/pair/nobody.js +43 -0
  16. package/build/cjs/pair/toJson.js +11 -0
  17. package/build/cjs/pair/types.js +2 -0
  18. package/build/cjs/pairs.js +28 -0
  19. package/build/cjs/testing.js +126 -0
  20. package/build/cjs/testingPairs.js +16 -0
  21. package/build/cjs/types.js +2 -0
  22. package/build/defaults.d.ts +2 -0
  23. package/build/defaults.js +2 -0
  24. package/build/index.d.ts +4 -0
  25. package/build/index.js +4 -0
  26. package/build/keyring.d.ts +145 -0
  27. package/build/keyring.js +257 -0
  28. package/build/package.json +294 -0
  29. package/build/packageDetect.d.ts +1 -0
  30. package/build/packageDetect.js +5 -0
  31. package/build/packageInfo.d.ts +6 -0
  32. package/build/packageInfo.js +1 -0
  33. package/build/pair/decode.d.ts +12 -0
  34. package/build/pair/decode.js +42 -0
  35. package/build/pair/defaults.d.ts +12 -0
  36. package/build/pair/defaults.js +12 -0
  37. package/build/pair/encode.d.ts +5 -0
  38. package/build/pair/encode.js +19 -0
  39. package/build/pair/index.d.ts +40 -0
  40. package/build/pair/index.js +180 -0
  41. package/build/pair/nobody.d.ts +2 -0
  42. package/build/pair/nobody.js +40 -0
  43. package/build/pair/toJson.d.ts +8 -0
  44. package/build/pair/toJson.js +8 -0
  45. package/build/pair/types.d.ts +5 -0
  46. package/build/pair/types.js +1 -0
  47. package/build/pairs.d.ts +8 -0
  48. package/build/pairs.js +24 -0
  49. package/build/testing.d.ts +20 -0
  50. package/build/testing.js +122 -0
  51. package/build/testingPairs.d.ts +25 -0
  52. package/build/testingPairs.js +13 -0
  53. package/build/types.d.ts +111 -0
  54. package/build/types.js +1 -0
  55. package/build-deno/README.md +17 -0
  56. package/build-deno/bundle.ts +10 -0
  57. package/build-deno/defaults.ts +4 -0
  58. package/build-deno/index.ts +8 -0
  59. package/build-deno/keyring.ts +305 -0
  60. package/build-deno/mod.ts +2 -0
  61. package/build-deno/packageDetect.ts +9 -0
  62. package/build-deno/packageInfo.ts +3 -0
  63. package/build-deno/pair/decode.ts +54 -0
  64. package/build-deno/pair/defaults.ts +18 -0
  65. package/build-deno/pair/encode.ts +28 -0
  66. package/build-deno/pair/index.ts +218 -0
  67. package/build-deno/pair/nobody.ts +58 -0
  68. package/build-deno/pair/toJson.ts +18 -0
  69. package/build-deno/pair/types.ts +6 -0
  70. package/build-deno/pairs.ts +39 -0
  71. package/build-deno/testing.ts +150 -0
  72. package/build-deno/testingPairs.ts +54 -0
  73. package/build-deno/types.ts +129 -0
  74. package/build-tsc-cjs/packageDetect.js +7 -0
  75. package/{cjs → build-tsc-cjs}/packageInfo.js +1 -1
  76. package/{packageInfo.js → build-tsc-esm/packageInfo.js} +1 -1
  77. package/package.json +9 -271
  78. package/src/bundle.ts +16 -0
  79. package/src/defaults.ts +8 -0
  80. package/src/index.spec.ts +609 -0
  81. package/src/index.ts +10 -0
  82. package/src/keyring.ts +307 -0
  83. package/src/mod.ts +4 -0
  84. package/src/packageDetect.ts +13 -0
  85. package/src/packageInfo.ts +6 -0
  86. package/src/pair/decode.spec.ts +26 -0
  87. package/src/pair/decode.ts +56 -0
  88. package/src/pair/defaults.ts +20 -0
  89. package/src/pair/encode.spec.ts +28 -0
  90. package/src/pair/encode.ts +30 -0
  91. package/src/pair/index.spec.ts +189 -0
  92. package/src/pair/index.ts +220 -0
  93. package/src/pair/nobody.ts +62 -0
  94. package/src/pair/toJson.spec.ts +42 -0
  95. package/src/pair/toJson.ts +20 -0
  96. package/src/pair/types.ts +8 -0
  97. package/src/pair/vrf.spec.ts +47 -0
  98. package/src/pairs.ts +41 -0
  99. package/src/suri.spec.ts +109 -0
  100. package/src/testing.ts +156 -0
  101. package/src/testingPairs.spec.ts +79 -0
  102. package/src/testingPairs.ts +56 -0
  103. package/src/types.ts +131 -0
  104. package/tsconfig.build.json +16 -0
  105. package/tsconfig.build.tsbuildinfo +1 -0
  106. package/tsconfig.spec.json +18 -0
  107. package/tsconfig.spec.tsbuildinfo +1 -0
  108. /package/{cjs → build}/bundle.d.ts +0 -0
  109. /package/{defaults.d.ts → build/cjs/defaults.d.ts} +0 -0
  110. /package/{index.d.ts → build/cjs/index.d.ts} +0 -0
  111. /package/{keyring.d.ts → build/cjs/keyring.d.ts} +0 -0
  112. /package/{cjs → build/cjs}/package.json +0 -0
  113. /package/{packageDetect.d.ts → build/cjs/packageDetect.d.ts} +0 -0
  114. /package/{cjs → build/cjs}/packageDetect.js +0 -0
  115. /package/{packageInfo.d.ts → build/cjs/packageInfo.d.ts} +0 -0
  116. /package/{pair → build/cjs/pair}/decode.d.ts +0 -0
  117. /package/{pair → build/cjs/pair}/defaults.d.ts +0 -0
  118. /package/{pair → build/cjs/pair}/encode.d.ts +0 -0
  119. /package/{pair → build/cjs/pair}/index.d.ts +0 -0
  120. /package/{pair → build/cjs/pair}/nobody.d.ts +0 -0
  121. /package/{pair → build/cjs/pair}/toJson.d.ts +0 -0
  122. /package/{pair → build/cjs/pair}/types.d.ts +0 -0
  123. /package/{pairs.d.ts → build/cjs/pairs.d.ts} +0 -0
  124. /package/{testing.d.ts → build/cjs/testing.d.ts} +0 -0
  125. /package/{testingPairs.d.ts → build/cjs/testingPairs.d.ts} +0 -0
  126. /package/{types.d.ts → build/cjs/types.d.ts} +0 -0
  127. /package/{bundle.d.ts → build-tsc/bundle.d.ts} +0 -0
  128. /package/{cjs → build-tsc}/defaults.d.ts +0 -0
  129. /package/{cjs → build-tsc}/index.d.ts +0 -0
  130. /package/{cjs → build-tsc}/keyring.d.ts +0 -0
  131. /package/{cjs → build-tsc}/packageDetect.d.ts +0 -0
  132. /package/{cjs → build-tsc}/packageInfo.d.ts +0 -0
  133. /package/{cjs → build-tsc}/pair/decode.d.ts +0 -0
  134. /package/{cjs → build-tsc}/pair/defaults.d.ts +0 -0
  135. /package/{cjs → build-tsc}/pair/encode.d.ts +0 -0
  136. /package/{cjs → build-tsc}/pair/index.d.ts +0 -0
  137. /package/{cjs → build-tsc}/pair/nobody.d.ts +0 -0
  138. /package/{cjs → build-tsc}/pair/toJson.d.ts +0 -0
  139. /package/{cjs → build-tsc}/pair/types.d.ts +0 -0
  140. /package/{cjs → build-tsc}/pairs.d.ts +0 -0
  141. /package/{cjs → build-tsc}/testing.d.ts +0 -0
  142. /package/{cjs → build-tsc}/testingPairs.d.ts +0 -0
  143. /package/{cjs → build-tsc}/types.d.ts +0 -0
  144. /package/{cjs → build-tsc-cjs}/bundle.js +0 -0
  145. /package/{cjs → build-tsc-cjs}/defaults.js +0 -0
  146. /package/{cjs → build-tsc-cjs}/index.js +0 -0
  147. /package/{cjs → build-tsc-cjs}/keyring.js +0 -0
  148. /package/{cjs → build-tsc-cjs}/pair/decode.js +0 -0
  149. /package/{cjs → build-tsc-cjs}/pair/defaults.js +0 -0
  150. /package/{cjs → build-tsc-cjs}/pair/encode.js +0 -0
  151. /package/{cjs → build-tsc-cjs}/pair/index.js +0 -0
  152. /package/{cjs → build-tsc-cjs}/pair/nobody.js +0 -0
  153. /package/{cjs → build-tsc-cjs}/pair/toJson.js +0 -0
  154. /package/{cjs → build-tsc-cjs}/pair/types.js +0 -0
  155. /package/{cjs → build-tsc-cjs}/pairs.js +0 -0
  156. /package/{cjs → build-tsc-cjs}/testing.js +0 -0
  157. /package/{cjs → build-tsc-cjs}/testingPairs.js +0 -0
  158. /package/{cjs → build-tsc-cjs}/types.js +0 -0
  159. /package/{bundle.js → build-tsc-esm/bundle.js} +0 -0
  160. /package/{defaults.js → build-tsc-esm/defaults.js} +0 -0
  161. /package/{index.js → build-tsc-esm/index.js} +0 -0
  162. /package/{keyring.js → build-tsc-esm/keyring.js} +0 -0
  163. /package/{packageDetect.js → build-tsc-esm/packageDetect.js} +0 -0
  164. /package/{pair → build-tsc-esm/pair}/decode.js +0 -0
  165. /package/{pair → build-tsc-esm/pair}/defaults.js +0 -0
  166. /package/{pair → build-tsc-esm/pair}/encode.js +0 -0
  167. /package/{pair → build-tsc-esm/pair}/index.js +0 -0
  168. /package/{pair → build-tsc-esm/pair}/nobody.js +0 -0
  169. /package/{pair → build-tsc-esm/pair}/toJson.js +0 -0
  170. /package/{pair → build-tsc-esm/pair}/types.js +0 -0
  171. /package/{pairs.js → build-tsc-esm/pairs.js} +0 -0
  172. /package/{testing.js → build-tsc-esm/testing.js} +0 -0
  173. /package/{testingPairs.js → build-tsc-esm/testingPairs.js} +0 -0
  174. /package/{types.js → build-tsc-esm/types.js} +0 -0
@@ -0,0 +1,609 @@
1
+ // Copyright 2017-2025 @pezkuwi/keyring authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /// <reference types="@pezkuwi/dev-test/globals.d.ts" />
5
+
6
+ import type { KeyringPair$Json } from './types.js';
7
+
8
+ import { hexToU8a, stringToU8a } from '@pezkuwi/util';
9
+ import { base64Decode, cryptoWaitReady, encodeAddress, mnemonicGenerate, randomAsU8a, setSS58Format } from '@pezkuwi/util-crypto';
10
+ import * as languages from '@pezkuwi/util-crypto/mnemonic/wordlists/index';
11
+
12
+ import { decodePair } from './pair/decode.js';
13
+ import Keyring from './index.js';
14
+
15
+ await cryptoWaitReady();
16
+
17
+ describe('keypair', (): void => {
18
+ describe('ed25519', (): void => {
19
+ const publicKeyOne = new Uint8Array([47, 140, 97, 41, 216, 22, 207, 81, 195, 116, 188, 127, 8, 195, 230, 62, 209, 86, 207, 120, 174, 251, 74, 101, 80, 217, 123, 135, 153, 121, 119, 238]);
20
+ const publicKeyTwo = new Uint8Array([215, 90, 152, 1, 130, 177, 10, 183, 213, 75, 254, 211, 201, 100, 7, 58, 14, 225, 114, 243, 218, 166, 35, 37, 175, 2, 26, 104, 247, 7, 81, 26]);
21
+ const seedOne = stringToU8a('12345678901234567890123456789012');
22
+ const seedTwo = hexToU8a('0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60');
23
+ let keyring: Keyring;
24
+
25
+ beforeEach((): void => {
26
+ keyring = new Keyring({ ss58Format: 42, type: 'ed25519' });
27
+
28
+ keyring.addFromSeed(seedOne, {});
29
+ });
30
+
31
+ it('adds the pair', (): void => {
32
+ expect(
33
+ keyring.addFromSeed(seedTwo, {}).publicKey
34
+ ).toEqual(publicKeyTwo);
35
+ });
36
+
37
+ it('creates via a dev seed', (): void => {
38
+ expect(
39
+ keyring.addFromUri('//Alice').address
40
+ ).toEqual('5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu');
41
+ });
42
+
43
+ it('creates a ed25519 pair via mnemonicToSeed', (): void => {
44
+ expect(
45
+ keyring.addFromUri(
46
+ 'seed sock milk update focus rotate barely fade car face mechanic mercy'
47
+ ).address
48
+ ).toEqual('5DkQP32jP4DVJLWWBRBoZF2tpWjqFrcrTBo6H5NcSk7MxKCC');
49
+ });
50
+
51
+ it('adds from a mnemonic, with correct ss58', (): void => {
52
+ // eslint-disable-next-line deprecation/deprecation
53
+ setSS58Format(20); // this would not be used
54
+ keyring.setSS58Format(2); // this would be used
55
+
56
+ const pair = keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card', {});
57
+
58
+ expect(pair.address).toEqual('HSLu2eci2GCfWkRimjjdTXKoFSDL3rBv5Ey2JWCBj68cVZj');
59
+ expect(encodeAddress(pair.publicKey)).toEqual('35cDYtPsdG1HUa2n2MaARgJyRz1WKMBZK1DL6c5cX7nugQh1');
60
+ });
61
+
62
+ it('allows publicKeys retrieval', (): void => {
63
+ keyring.addFromSeed(seedTwo, {});
64
+
65
+ expect(
66
+ keyring.getPublicKeys()
67
+ ).toEqual([publicKeyOne, publicKeyTwo]);
68
+ });
69
+
70
+ it('allows retrieval of a specific item', (): void => {
71
+ expect(
72
+ keyring.getPair(publicKeyOne).publicKey
73
+ ).toEqual(publicKeyOne);
74
+ });
75
+
76
+ it('allows adding from JSON', (): void => {
77
+ expect(
78
+ keyring.addFromJson(
79
+ JSON.parse('{"address":"5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua","encoded":"0xb4a14995d25ab609f3686e9fa45f1fb237cd833f33f00d4b12c51858ca070d96972e47d73aae5eeb0fc06f923826cf0943fdb02c2c2ee30ef52a7912663053940d1da4da66b3a3f520ae07422c1c94b2d95690fca9d1f4a997623bb2923a8833280e19e7f72c3c5cfa343974e60e2b3dc53b404fdaf330756daad5e4e3","encoding":{"content":"pkcs8","type":"xsalsa20-poly1305","version":"0"},"meta":{"isTesting":true,"name":"alice"}}') as KeyringPair$Json
80
+ ).publicKey
81
+ ).toEqual(
82
+ new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
83
+ );
84
+ });
85
+
86
+ it('signs and verifies', (): void => {
87
+ const MESSAGE = stringToU8a('this is a message');
88
+ const pair = keyring.getPair(publicKeyOne);
89
+ const signature = pair.sign(MESSAGE);
90
+
91
+ expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
92
+ expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
93
+ expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
94
+ });
95
+
96
+ it('signs and verifies (withType)', (): void => {
97
+ const MESSAGE = stringToU8a('this is a message');
98
+ const pair = keyring.getPair(publicKeyOne);
99
+ const signature = pair.sign(MESSAGE, { withType: true });
100
+
101
+ expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
102
+ expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
103
+ expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
104
+ });
105
+ });
106
+
107
+ describe('sr25519', (): void => {
108
+ const publicKeyOne = new Uint8Array([116, 28, 8, 160, 111, 65, 197, 150, 96, 143, 103, 116, 37, 155, 217, 4, 51, 4, 173, 250, 93, 62, 234, 98, 118, 11, 217, 190, 151, 99, 77, 99]);
109
+ const publicKeyTwo = hexToU8a('0x44a996beb1eef7bdcab976ab6d2ca26104834164ecf28fb375600576fcc6eb0f');
110
+ const seedOne = stringToU8a('12345678901234567890123456789012');
111
+ const seedTwo = hexToU8a('0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60');
112
+ let keyring: Keyring;
113
+
114
+ beforeEach((): void => {
115
+ keyring = new Keyring({ ss58Format: 42, type: 'sr25519' });
116
+
117
+ keyring.addFromSeed(seedOne, {});
118
+ });
119
+
120
+ it('creates with dev phrase when only path specified', (): void => {
121
+ expect(
122
+ keyring.createFromUri('//Alice').address
123
+ ).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
124
+ });
125
+
126
+ it('creates with integer derivations', (): void => {
127
+ // MAX_SAFE_INTEGER
128
+ expect(
129
+ keyring.createFromUri('//9007199254740991').address
130
+ ).toEqual('5CDsyNZyqxLpHnTvknr68anUcYoBFjZbFKiEJJf4prB75Uog');
131
+
132
+ // MAX_SAFE_INTEGER + extra digits
133
+ expect(
134
+ keyring.createFromUri('//900719925474099999').address
135
+ ).toEqual('5GHj2D7RG2m2DXYwGSDpXwuuxn53G987i7p2EQVDqP4NYu4q');
136
+ });
137
+
138
+ it('creates via dev seed (2-byte encoding)', (): void => {
139
+ keyring.setSS58Format(252);
140
+
141
+ expect(
142
+ keyring.addFromUri('//Alice').address
143
+ ).toEqual('xw8P6urbSAronL3zZFB7dg8p7LLSgKCUFDUgjohnf1iP434ic');
144
+ });
145
+
146
+ it('adds the pair', (): void => {
147
+ expect(
148
+ keyring.addFromSeed(seedTwo, {}).publicKey
149
+ ).toEqual(publicKeyTwo);
150
+ });
151
+
152
+ it('adds from a mnemonic', (): void => {
153
+ keyring.setSS58Format(2);
154
+
155
+ expect(
156
+ keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card', {}).address
157
+ ).toEqual('FSjXNRT2K1R5caeHLPD6WMrqYUpfGZB7ua8W89JFctZ1YqV');
158
+ });
159
+
160
+ it('allows publicKeys retrieval', (): void => {
161
+ keyring.addFromSeed(seedTwo, {});
162
+
163
+ expect(
164
+ keyring.getPublicKeys()
165
+ ).toEqual([publicKeyOne, publicKeyTwo]);
166
+ });
167
+
168
+ it('allows retrieval of a specific item', (): void => {
169
+ expect(
170
+ keyring.getPair(publicKeyOne).publicKey
171
+ ).toEqual(publicKeyOne);
172
+ });
173
+
174
+ it('allows adding from JSON', (): void => {
175
+ expect(
176
+ keyring.addFromJson(
177
+ JSON.parse('{"address":"5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua","encoded":"0xb4a14995d25ab609f3686e9fa45f1fb237cd833f33f00d4b12c51858ca070d96972e47d73aae5eeb0fc06f923826cf0943fdb02c2c2ee30ef52a7912663053940d1da4da66b3a3f520ae07422c1c94b2d95690fca9d1f4a997623bb2923a8833280e19e7f72c3c5cfa343974e60e2b3dc53b404fdaf330756daad5e4e3","encoding":{"content":"pkcs8","type":"xsalsa20-poly1305","version":"0"},"meta":{"isTesting":true,"name":"alice"}}') as KeyringPair$Json
178
+ ).publicKey
179
+ ).toEqual(
180
+ new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
181
+ );
182
+ });
183
+
184
+ it('signs and verifies', (): void => {
185
+ const MESSAGE = stringToU8a('this is a message');
186
+ const pair = keyring.getPair(publicKeyOne);
187
+ const signature = pair.sign(MESSAGE);
188
+
189
+ expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
190
+ expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
191
+ expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
192
+ });
193
+
194
+ it('signs and verifies (withType)', (): void => {
195
+ const MESSAGE = stringToU8a('this is a message');
196
+ const pair = keyring.getPair(publicKeyOne);
197
+ const signature = pair.sign(MESSAGE, { withType: true });
198
+
199
+ expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
200
+ expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
201
+ expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
202
+ });
203
+ });
204
+
205
+ describe('ecdsa', (): void => {
206
+ const seedOne = 'potato act energy ahead stone taxi receive fame gossip equip chest round';
207
+ const seedTwo = hexToU8a('0x3c74be003bd9a876be439949ccf2b292bd966c94959a689173b295b326cd6da7');
208
+ const publicKeyOne = hexToU8a('0x02c6b6c664db5ef505477bba1cf2f1789c98796b9bb5fa21abd0ac4589bed980e7');
209
+ const publicKeyTwo = hexToU8a('0x021da683b913fb28c979ba3e5f1881415cef4b1f58a5d05ed3610a2995e7b4943c');
210
+ const addressKeyOne = hexToU8a('0x0cfd0dd2c59a9987b9848919163931b6a42283ffd3d91e92c98b522525a7038f');
211
+ let keyring: Keyring;
212
+
213
+ beforeEach((): void => {
214
+ keyring = new Keyring({ ss58Format: 42, type: 'ecdsa' });
215
+
216
+ keyring.addFromMnemonic(seedOne, {});
217
+ });
218
+
219
+ it('creates with dev phrase when only path specified', (): void => {
220
+ expect(
221
+ keyring.createFromUri('//Alice').address
222
+ ).toEqual('5C7C2Z5sWbytvHpuLTvzKunnnRwQxft1jiqrLD5rhucQ5S9X');
223
+ });
224
+
225
+ it('adds the pair', (): void => {
226
+ expect(
227
+ keyring.addFromSeed(seedTwo, {}).publicKey
228
+ ).toEqual(publicKeyTwo);
229
+ });
230
+
231
+ it('adds from a mnemonic', (): void => {
232
+ keyring.setSS58Format(2);
233
+
234
+ expect(
235
+ keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card').address
236
+ ).toEqual('DrRE1KAcs4pCicX8yJPh7YxkLPQ2vXnCFSVRPQfx38KjEFe');
237
+ });
238
+
239
+ it('allows publicKeys retrieval', (): void => {
240
+ keyring.addFromSeed(seedTwo, {});
241
+
242
+ expect(
243
+ keyring.getPublicKeys()
244
+ ).toEqual([publicKeyOne, publicKeyTwo]);
245
+ });
246
+
247
+ it('allows retrieval of a specific item', (): void => {
248
+ expect(
249
+ keyring.getPair(addressKeyOne).publicKey
250
+ ).toEqual(publicKeyOne);
251
+ });
252
+
253
+ it('allows adding from JSON', (): void => {
254
+ expect(
255
+ keyring.addFromJson(
256
+ JSON.parse('{"address":"5DzMsaYFhmpRdErWrP6K6PD7UXzYoeETToSBUrZSvxasqWRz","encoded":"0xa192d39b42bc1601bf61df31039a554228593fadf870bc837b658a5114627aca199fff596260c95fe8994c66a47636cf0270aa08f402ba5541038753960d00e6c3af5e239ec58fb1eef3db7d6bc266f4853bdfe4ed17122d9092d879014d53980d2ee57f6f55a88c38836447d8645008e8815379626addc8f81f80cd49a2","encoding":{"content":"pkcs8","type":"xsalsa20-poly1305","version":"2"},"meta":{}}') as KeyringPair$Json
257
+ ).address
258
+ ).toEqual('5DzMsaYFhmpRdErWrP6K6PD7UXzYoeETToSBUrZSvxasqWRz');
259
+ });
260
+
261
+ it('allows creation from JSON', (): void => {
262
+ keyring.setSS58Format(2);
263
+ const pair = keyring.createFromJson(
264
+ JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}') as KeyringPair$Json
265
+ );
266
+
267
+ expect(pair.address).toEqual('DHL8HKFuTTR55JzzLmkJRCAfPBbuevKaT9cXikxbEV97Ko8');
268
+ expect(pair.publicKey).toEqual(hexToU8a('0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad'));
269
+ });
270
+
271
+ it('fails toJson() when password is incorrect', (): void => {
272
+ const pair = keyring.createFromJson(
273
+ JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}') as KeyringPair$Json
274
+ );
275
+
276
+ expect(
277
+ () => pair.toJson('invalid')
278
+ ).toThrow(/Unable to decode using the supplied passphrase/);
279
+ });
280
+
281
+ it('pass toJson() when password is correct', (): void => {
282
+ const pair = keyring.createFromJson(
283
+ JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}') as KeyringPair$Json
284
+ );
285
+
286
+ expect(
287
+ () => pair.toJson('testing')
288
+ ).not.toThrow();
289
+ });
290
+
291
+ it('encodes a pair toJSON (and decodes)', (): void => {
292
+ const pair = keyring.createFromUri('moral movie very draw assault whisper awful rebuild speed purity repeat card');
293
+ const json = pair.toJson('password');
294
+
295
+ expect(json.address).toEqual('0x03ddca309bd5fedd01f914d6fb76f23aa848a2a520802159215dba5085d7863619');
296
+ expect(json.encoding).toEqual({
297
+ content: ['pkcs8', 'ecdsa'],
298
+ type: ['scrypt', 'xsalsa20-poly1305'],
299
+ version: '3'
300
+ });
301
+
302
+ const newPair = keyring.createFromJson(json);
303
+
304
+ expect(newPair.publicKey).toEqual(pair.publicKey);
305
+ expect(
306
+ () => newPair.unlock('password')
307
+ ).not.toThrow();
308
+ });
309
+
310
+ it('signs and verifies', (): void => {
311
+ const MESSAGE = stringToU8a('this is a message');
312
+ const pair = keyring.getPair(addressKeyOne);
313
+ const signature = pair.sign(MESSAGE);
314
+
315
+ expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
316
+ expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
317
+ expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
318
+ });
319
+
320
+ it('signs and verifies (withType)', (): void => {
321
+ const MESSAGE = stringToU8a('this is a message');
322
+ const pair = keyring.getPair(addressKeyOne);
323
+ const signature = pair.sign(MESSAGE, { withType: true });
324
+
325
+ expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
326
+ expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
327
+ expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
328
+ });
329
+ });
330
+
331
+ describe('ethereum', (): void => {
332
+ // combine mnemonic with derivation path
333
+ const PHRASE = 'seed sock milk update focus rotate barely fade car face mechanic mercy' + '/m/44\'/60\'/0\'/0/0';
334
+ const PRIV_KEY_ONE = '0x070dc3117300011918e26b02176945cc15c3d548cf49fd8418d97f93af699e46';
335
+ const ETH_ADDRESS_ONE = '0x31ea8795EE32D782C8ff41a5C68Dcbf0F5B27f6d';
336
+ const ETH_ADDRESS_TWO = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
337
+
338
+ let keyring: Keyring;
339
+
340
+ beforeEach((): void => {
341
+ keyring = new Keyring({ type: 'ethereum' });
342
+ });
343
+
344
+ it('creates with dev phrase from the private key', (): void => {
345
+ const pair = keyring.addFromSeed(hexToU8a(PRIV_KEY_ONE));
346
+
347
+ expect(
348
+ pair.address
349
+ ).toEqual(ETH_ADDRESS_ONE);
350
+ });
351
+
352
+ it('creates with dev phrase from the private key in createFromUri', (): void => {
353
+ const pair = keyring.createFromUri(PRIV_KEY_ONE);
354
+
355
+ expect(
356
+ pair.address
357
+ ).toEqual(ETH_ADDRESS_ONE);
358
+ });
359
+
360
+ it('creates with dev phrase with derivation path specified', (): void => {
361
+ const pair = keyring.createFromUri(PHRASE);
362
+
363
+ expect(
364
+ pair.address
365
+ ).toEqual(ETH_ADDRESS_ONE);
366
+ });
367
+
368
+ it('creates with dev phrase with derivation path specified - addFromUri', (): void => {
369
+ expect(
370
+ keyring.addFromUri(PHRASE).address
371
+ ).toEqual(ETH_ADDRESS_ONE);
372
+ });
373
+
374
+ it('creates with dev phrase with derivation path specified - addFromUri with type', (): void => {
375
+ const keyringUntyped = new Keyring();
376
+
377
+ expect(
378
+ keyringUntyped.addFromUri(PHRASE, {}, 'ethereum').address
379
+ ).toEqual(ETH_ADDRESS_ONE);
380
+ });
381
+
382
+ it('encodes a pair toJSON (and decodes)', (): void => {
383
+ const pair = keyring.createFromUri(PHRASE);
384
+ const json = pair.toJson('password');
385
+
386
+ expect(json.address).toEqual('0x0381351b1b46d2602b0992bb5d5531f9c1696b0812feb2534b6884adc47e2e1d8b'); // this is the public key (different from address for ethereum)
387
+ expect(json.encoding).toEqual({
388
+ content: ['pkcs8', 'ethereum'],
389
+ type: ['scrypt', 'xsalsa20-poly1305'],
390
+ version: '3'
391
+ });
392
+
393
+ const newPair = keyring.createFromJson(json);
394
+
395
+ expect(newPair.publicKey).toEqual(pair.publicKey);
396
+ expect(
397
+ () => newPair.unlock('password')
398
+ ).not.toThrow();
399
+ });
400
+
401
+ it('encodes a pair toJSON and back', (): void => {
402
+ const pairOriginal = keyring.createFromUri(PHRASE);
403
+ const json = pairOriginal.toJson('password');
404
+ const pair = keyring.addFromJson(
405
+ json
406
+ );
407
+
408
+ expect(pair.address).toEqual(ETH_ADDRESS_ONE);
409
+
410
+ pair.decodePkcs8('password');
411
+
412
+ expect(pair.isLocked).toBe(false);
413
+ expect(pair.address).toBe(ETH_ADDRESS_ONE);
414
+ });
415
+
416
+ it('allows adding from JSON', (): void => {
417
+ const pair = keyring.addFromJson(
418
+ JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}') as KeyringPair$Json
419
+ );
420
+
421
+ expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
422
+ expect(pair.address).toEqual(ETH_ADDRESS_TWO);
423
+
424
+ pair.decodePkcs8('password');
425
+
426
+ expect(pair.isLocked).toBe(false);
427
+ expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
428
+ expect(pair.address).toBe(ETH_ADDRESS_TWO);
429
+ });
430
+
431
+ it('allows for signing/verification', (): void => {
432
+ const MESSAGE = stringToU8a('just some test message');
433
+ const signer = keyring.createFromUri(PHRASE);
434
+ const verifier = keyring.addFromJson(
435
+ JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}') as KeyringPair$Json
436
+ );
437
+
438
+ const signature = signer.sign(MESSAGE);
439
+ const dummyPublic = verifier.publicKey.slice();
440
+
441
+ dummyPublic[dummyPublic.length - 1] = 0;
442
+
443
+ expect(verifier.verify(MESSAGE, signature, signer.publicKey)).toBe(true);
444
+ expect(verifier.verify(MESSAGE, signature, dummyPublic)).toBe(false);
445
+ expect(verifier.verify(new Uint8Array(), signature, signer.publicKey)).toBe(false);
446
+ });
447
+
448
+ it('allows for signing/verification (withType)', (): void => {
449
+ const MESSAGE = stringToU8a('just some test message');
450
+ const signer = keyring.createFromUri(PHRASE);
451
+ const verifier = keyring.addFromJson(
452
+ JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}') as KeyringPair$Json
453
+ );
454
+
455
+ const signature = signer.sign(MESSAGE, { withType: true });
456
+ const dummyPublic = verifier.publicKey.slice();
457
+
458
+ dummyPublic[dummyPublic.length - 1] = 0;
459
+
460
+ expect(verifier.verify(MESSAGE, signature, signer.publicKey)).toBe(true);
461
+ expect(verifier.verify(MESSAGE, signature, dummyPublic)).toBe(false);
462
+ expect(verifier.verify(new Uint8Array(), signature, signer.publicKey)).toBe(false);
463
+ });
464
+ });
465
+
466
+ describe('raw pair add/create', (): void => {
467
+ const json = JSON.parse('{"address":"5PjeoaQzCoYbSi42aQRKB3Sx18StCaEAzCbGEEbWbZyfKS3H","encoded":"JQUl8ZpoXv2OMkL9TPylLmcIye2cYhaS9INICbFgZTsAgAAAAQAAAAgAAAAr/0hJOOzokIdBG71TstigLABX9D5xGD7L37ySxtjDrVRg26LL90jLQ47quT9o3bq6ppXMVL6USk7Q4p3WU66bojTFuCDyhpYRhNbUqU6s0rD3S4bhv9lG+pG9vQ4eD5PVQUvxdANmJpYuDg45nrTmsMC5AHGdFGkHW/LHnkmbFid1cvPYkdiBoef5CIEdoly512pxMupVxnJWF1NT","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"name":"hello"}}') as KeyringPair$Json;
468
+ const decoded = decodePair('1', base64Decode(json.encoded), json.encoding.type);
469
+ const keyring = new Keyring({ ss58Format: 44 });
470
+
471
+ it('creates a pair from a private/public combo', (): void => {
472
+ const pair = keyring.createFromPair(decoded, json.meta, 'sr25519');
473
+
474
+ expect(pair.address).toEqual('5PjeoaQzCoYbSi42aQRKB3Sx18StCaEAzCbGEEbWbZyfKS3H');
475
+ expect(pair.isLocked).toEqual(false);
476
+ expect(pair.meta.name).toEqual('hello');
477
+ });
478
+
479
+ it('adds a pair from a private/public combo', (): void => {
480
+ keyring.addFromPair(decoded, json.meta, 'sr25519');
481
+
482
+ const pair = keyring.getPairs()[0];
483
+
484
+ expect(pair.address).toEqual('5PjeoaQzCoYbSi42aQRKB3Sx18StCaEAzCbGEEbWbZyfKS3H');
485
+ expect(pair.isLocked).toEqual(false);
486
+ expect(pair.meta.name).toEqual('hello');
487
+ });
488
+ });
489
+
490
+ describe('util', (): void => {
491
+ let keyring: Keyring;
492
+
493
+ beforeEach((): void => {
494
+ keyring = new Keyring({ ss58Format: 42 });
495
+ });
496
+
497
+ it('can re-encode an address to Polkadot live', (): void => {
498
+ expect(
499
+ keyring.encodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', 0)
500
+ ).toEqual('15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5');
501
+ });
502
+
503
+ it('can re-encode an address to keyring default', (): void => {
504
+ expect(
505
+ keyring.encodeAddress('15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5')
506
+ ).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
507
+ });
508
+ });
509
+
510
+ describe('version 2 JSON', (): void => {
511
+ const PAIR = '{"address":"5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu","encoded":"0xee8f236e2ac3217ce689692a4afc612220dc77fddaed0482f8f95136a7c3e034cccfbc495410a6e9b2439904974ed1d207abeca536ff6985ceb78edeeb3dc343e561c184c488101af8811d1331430b4ccf0e96ef507132e5132964e8564232e7100d973c5bee7b231dd0c8ad5273f3501515a422c8d7ed9d20a73c0ed17c98ee4588e54844bb73052dcad81f7a1094613d63c162fec7446c88b1fae70e","encoding":{"content":["pkcs8","sr25519"],"type":"xsalsa20-poly1305","version":"2"},"meta":{"genesisHash":"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e","name":"json v2","tags":[],"whenCreated":1595243159596}}';
512
+ const PASS2 = 'versionTwo';
513
+ const PASS3 = 'versionThree';
514
+ let keyring: Keyring;
515
+
516
+ beforeEach((): void => {
517
+ keyring = new Keyring({ ss58Format: 42 });
518
+ });
519
+
520
+ it('can decode from a version 2 JSON file', (): void => {
521
+ const pair = keyring.addFromJson(JSON.parse(PAIR) as KeyringPair$Json);
522
+
523
+ pair.decodePkcs8(PASS2);
524
+
525
+ const json = pair.toJson(PASS3);
526
+
527
+ expect(pair.isLocked).toBe(false);
528
+ expect(pair.address).toBe('5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu');
529
+ expect(json.encoding).toEqual({
530
+ content: ['pkcs8', 'sr25519'],
531
+ type: ['scrypt', 'xsalsa20-poly1305'],
532
+ version: '3'
533
+ });
534
+
535
+ pair.decodePkcs8(PASS3);
536
+
537
+ expect(pair.address).toEqual('5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu');
538
+ });
539
+ });
540
+
541
+ describe('version 3 JSON (hex)', (): void => {
542
+ const PAIR = '{"address":"FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH","encoded":"0xcd238963070cc4d6806053ee1ac500c7add9c28732bb5d434a332f84a91d9be0008000000100000008000000cf630a1113941b350ddd06697e50399183162e5e9a0e893eafc7f5f4893a223dca5055706b9925b56fdb4304192143843da718e11717daf89cf4f4781f94fb443f61432f782d54280af9eec90bd3069c3cc2d957a42b7c18dc2e9497f623735518e0e49b58f8e4db2c09da3a45dbb935659d015fc94b946cba75b606a6ff7f4e823f6b049e2e6892026b49de02d6dbbd64646fe0933f537d9ea53a70be","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"version3","tags":[],"whenCreated":1595277797639}}';
543
+ const PASS3 = 'version3';
544
+ let keyring: Keyring;
545
+
546
+ beforeEach((): void => {
547
+ keyring = new Keyring({ ss58Format: 2 });
548
+ });
549
+
550
+ it('can decode from a version 3 JSON file', (): void => {
551
+ const pair = keyring.addFromJson(JSON.parse(PAIR) as KeyringPair$Json);
552
+
553
+ pair.decodePkcs8(PASS3);
554
+
555
+ expect(pair.isLocked).toBe(false);
556
+ expect(pair.address).toBe('FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH');
557
+ });
558
+ });
559
+
560
+ describe('version 3 JSON (base64)', (): void => {
561
+ const PAIR = '{"address":"FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH","encoded":"ILjSgYaGvq1zaCz/kx+aqfLaHBjLXz0Qsmr6RnkOVU4AgAAAAQAAAAgAAAB5R2hm5kgXyc0NQYFxvMU4zCdjB+ugs/ibEooqCvuudbaeKn3Ee47NkCqU1ecOJV+eeaVn4W4dRvIpj5kGmQOGsewR+MiQ/B0G9NFh7JXV0qcPlk2QMNW1/mbJrTO4miqL448BSkP7ZOhUV6HFUpMt3B9HwjiRLN8RORcFp0ID/Azs4Jl/xOpXNzbgQGIffWgCIKTxN9N1ku6tdlG4","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"version3","tags":[],"whenCreated":1595277797639,"whenEdited":1595278378596}}';
562
+ const PASS3 = 'version3';
563
+ let keyring: Keyring;
564
+
565
+ beforeEach((): void => {
566
+ keyring = new Keyring({ ss58Format: 2 });
567
+ });
568
+
569
+ it('can decode from a version 3 JSON file', (): void => {
570
+ const pair = keyring.addFromJson(JSON.parse(PAIR) as KeyringPair$Json);
571
+
572
+ pair.decodePkcs8(PASS3);
573
+
574
+ expect(pair.isLocked).toBe(false);
575
+ expect(pair.address).toBe('FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH');
576
+ });
577
+ });
578
+
579
+ describe('wordlist', (): void => {
580
+ it('creates keypair from different wordlists mnemonics', (): void => {
581
+ Object.keys(languages).forEach((language) => {
582
+ const mnemonic = mnemonicGenerate(12, languages[language as keyof typeof languages]);
583
+ const keyring = new Keyring({
584
+ type: 'ed25519'
585
+ });
586
+
587
+ expect(keyring.addFromMnemonic(
588
+ mnemonic,
589
+ {},
590
+ 'ed25519',
591
+ languages[language as keyof typeof languages]
592
+ )).toBeDefined();
593
+ });
594
+ });
595
+ it('cannot create from invalid wordlist', (): void => {
596
+ const mnemonic = mnemonicGenerate(12, languages.japanese);
597
+ const keyring = new Keyring({
598
+ type: 'ed25519'
599
+ });
600
+
601
+ expect(() => keyring.addFromMnemonic(
602
+ mnemonic,
603
+ {},
604
+ 'ed25519',
605
+ languages.english
606
+ )).toThrow('Invalid bip39 mnemonic specified');
607
+ });
608
+ });
609
+ });
package/src/index.ts ADDED
@@ -0,0 +1,10 @@
1
+ // Copyright 2017-2025 @pezkuwi/keyring authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import './packageDetect.js';
5
+
6
+ import { Keyring } from './bundle.js';
7
+
8
+ export * from './bundle.js';
9
+
10
+ export default Keyring;