@caict/bop-typescript-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +112 -0
  5. package/package.json +90 -0
  6. package/src/bop/bop-base/README.md +5 -0
  7. package/src/bop/bop-base/base.ts +366 -0
  8. package/src/bop/bop-base/index.ts +83 -0
  9. package/src/bop/bop-base/permit.ts +116 -0
  10. package/src/bop/bop-base/test/base.test.ts +867 -0
  11. package/src/bop/bop-base/test/index.test.ts +69 -0
  12. package/src/bop/bop-base/test/permit.test.ts +125 -0
  13. package/src/bop/bop-base/tsconfig.json +8 -0
  14. package/src/bop/bop-proto/README.md +2 -0
  15. package/src/bop/bop-proto/bop-ws.proto +266 -0
  16. package/src/bop/bop-proto/bop-ws.ts +4447 -0
  17. package/src/bop/bop-proto/bop.proto +898 -0
  18. package/src/bop/bop-proto/bop.ts +12890 -0
  19. package/src/bop/bop-proto/tsconfig.json +8 -0
  20. package/src/bop/bop-ws/index.ts +315 -0
  21. package/src/bop/bop-ws/sample/sample.ts +107 -0
  22. package/src/bop/bop-ws/tsconfig.json +8 -0
  23. package/src/bop/index.ts +14 -0
  24. package/src/bop-sdk/index.ts +22 -0
  25. package/src/bop-sdk/interface/abstract-service/abstract-account.ts +23 -0
  26. package/src/bop-sdk/interface/abstract-service/abstract-chain.ts +9 -0
  27. package/src/bop-sdk/interface/abstract-service/abstract-contract.ts +16 -0
  28. package/src/bop-sdk/interface/abstract-service/abstract-ledger.ts +15 -0
  29. package/src/bop-sdk/interface/abstract-service/abstract-provider.ts +13 -0
  30. package/src/bop-sdk/interface/abstract-service/abstract-signer.ts +133 -0
  31. package/src/bop-sdk/interface/abstract-service/abstract-transaction.ts +86 -0
  32. package/src/bop-sdk/interface/provider-ws.ts +10 -0
  33. package/src/bop-sdk/interface/provider.ts +22 -0
  34. package/src/bop-sdk/interface/service/3rd.ts +54 -0
  35. package/src/bop-sdk/interface/service/account.ts +86 -0
  36. package/src/bop-sdk/interface/service/chain.ts +27 -0
  37. package/src/bop-sdk/interface/service/contract.ts +51 -0
  38. package/src/bop-sdk/interface/service/helper.ts +426 -0
  39. package/src/bop-sdk/interface/service/ledger.ts +75 -0
  40. package/src/bop-sdk/interface/service/offline/check/index.js +138 -0
  41. package/src/bop-sdk/interface/service/offline/common/constant.js +6 -0
  42. package/src/bop-sdk/interface/service/offline/common/snowFlakeUtils.js +192 -0
  43. package/src/bop-sdk/interface/service/offline/common/util.js +511 -0
  44. package/src/bop-sdk/interface/service/offline/exception/customErrors.js +29 -0
  45. package/src/bop-sdk/interface/service/offline/exception/errors.js +90 -0
  46. package/src/bop-sdk/interface/service/offline/exception/index.js +5 -0
  47. package/src/bop-sdk/interface/service/offline/operation/accountCreateOperation.js +28 -0
  48. package/src/bop-sdk/interface/service/offline/operation/accountSetMetadataOperation.js +44 -0
  49. package/src/bop-sdk/interface/service/offline/operation/accountSetPrivilegeOperation.js +49 -0
  50. package/src/bop-sdk/interface/service/offline/operation/contractCreateOperation.js +43 -0
  51. package/src/bop-sdk/interface/service/offline/operation/contractInvokeOperation.js +42 -0
  52. package/src/bop-sdk/interface/service/offline/operation/contractInvokeRequestOperation.js +69 -0
  53. package/src/bop-sdk/interface/service/offline/operation/gasSendOperation.js +29 -0
  54. package/src/bop-sdk/interface/service/offline/operation/gasSendRequestOperation.js +61 -0
  55. package/src/bop-sdk/interface/service/offline/operation/index.js +20 -0
  56. package/src/bop-sdk/interface/service/offline/proto/chain_pb.js +12079 -0
  57. package/src/bop-sdk/interface/service/offline/proto/common_pb.js +2867 -0
  58. package/src/bop-sdk/interface/service/offline/transaction/index.js +988 -0
  59. package/src/bop-sdk/interface/service/offline/transaction/operations.js +188 -0
  60. package/src/bop-sdk/interface/service/offline/validate/account.js +152 -0
  61. package/src/bop-sdk/interface/service/offline/validate/contract.js +101 -0
  62. package/src/bop-sdk/interface/service/offline/validate/index.js +10 -0
  63. package/src/bop-sdk/interface/service/offline/validate/transaction.js +51 -0
  64. package/src/bop-sdk/interface/service/transaction.ts +731 -0
  65. package/src/bop-sdk/interface/signer.ts +46 -0
  66. package/src/bop-sdk/interface/test/3rd.test.ts +1571 -0
  67. package/src/bop-sdk/interface/test/account.test.ts +284 -0
  68. package/src/bop-sdk/interface/test/chain.test.ts +45 -0
  69. package/src/bop-sdk/interface/test/contract.test.ts +283 -0
  70. package/src/bop-sdk/interface/test/ledger.test.ts +166 -0
  71. package/src/bop-sdk/interface/test/provider.test.ts +407 -0
  72. package/src/bop-sdk/interface/test/signer.test.ts +105 -0
  73. package/src/bop-sdk/interface/test/transaction.test.ts +713 -0
  74. package/src/bop-sdk/proto/bop-sdk-common.proto +159 -0
  75. package/src/bop-sdk/proto/bop-sdk-common.ts +829 -0
  76. package/src/bop-sdk/proto/bop-sdk-interface.proto +581 -0
  77. package/src/bop-sdk/proto/bop-sdk-interface.ts +10839 -0
  78. package/src/bop-sdk/proto/bop-sdk-utils.proto +86 -0
  79. package/src/bop-sdk/proto/bop-sdk-utils.ts +1495 -0
  80. package/src/bop-sdk/utils/abi/abi-coder.ts +147 -0
  81. package/src/bop-sdk/utils/abi/address.ts +109 -0
  82. package/src/bop-sdk/utils/abi/bignumber.ts +403 -0
  83. package/src/bop-sdk/utils/abi/bytes.ts +565 -0
  84. package/src/bop-sdk/utils/abi/coders/abstract-coder.ts +239 -0
  85. package/src/bop-sdk/utils/abi/coders/address.ts +58 -0
  86. package/src/bop-sdk/utils/abi/coders/anonymous.ts +25 -0
  87. package/src/bop-sdk/utils/abi/coders/array.ts +275 -0
  88. package/src/bop-sdk/utils/abi/coders/boolean.ts +21 -0
  89. package/src/bop-sdk/utils/abi/coders/bytes.ts +36 -0
  90. package/src/bop-sdk/utils/abi/coders/fixed-bytes.ts +35 -0
  91. package/src/bop-sdk/utils/abi/coders/null.ts +25 -0
  92. package/src/bop-sdk/utils/abi/coders/number.ts +56 -0
  93. package/src/bop-sdk/utils/abi/coders/string.ts +24 -0
  94. package/src/bop-sdk/utils/abi/coders/tuple.ts +73 -0
  95. package/src/bop-sdk/utils/abi/constants/addresses.ts +1 -0
  96. package/src/bop-sdk/utils/abi/constants/bignumbers.ts +30 -0
  97. package/src/bop-sdk/utils/abi/constants/hashes.ts +2 -0
  98. package/src/bop-sdk/utils/abi/constants/index.ts +15 -0
  99. package/src/bop-sdk/utils/abi/constants/strings.ts +2 -0
  100. package/src/bop-sdk/utils/abi/fragments.ts +1243 -0
  101. package/src/bop-sdk/utils/abi/id.ts +6 -0
  102. package/src/bop-sdk/utils/abi/index.ts +46 -0
  103. package/src/bop-sdk/utils/abi/interface.ts +921 -0
  104. package/src/bop-sdk/utils/abi/keccak256.ts +9 -0
  105. package/src/bop-sdk/utils/abi/properties.ts +172 -0
  106. package/src/bop-sdk/utils/abi/strings/bytes32.ts +40 -0
  107. package/src/bop-sdk/utils/abi/strings/idna.ts +258 -0
  108. package/src/bop-sdk/utils/abi/strings/index.ts +28 -0
  109. package/src/bop-sdk/utils/abi/strings/utf8.ts +373 -0
  110. package/src/bop-sdk/utils/encryption-address.ts +501 -0
  111. package/src/bop-sdk/utils/encryption-crypto.ts +427 -0
  112. package/src/bop-sdk/utils/encryption-mnemonics.ts +120 -0
  113. package/src/bop-sdk/utils/index.ts +27 -0
  114. package/src/bop-sdk/utils/logger.ts +480 -0
  115. package/src/index.ts +35 -0
@@ -0,0 +1,427 @@
1
+ import * as bifEncryption from "@caict/bif-encryption";
2
+ import {
3
+ CheckKeyResponse,
4
+ GetChildBidAndKeyPairResponse,
5
+ GetKeyResponse,
6
+ KeyType,
7
+ ChildAccountKeyInfo,
8
+ GetKeyTypeResponse,
9
+ } from "../proto/bop-sdk-utils";
10
+ import { SdkStatusCode } from "../proto/bop-sdk-common";
11
+
12
+ const keystore = require("@caict/bif-encryption/src/vendor/keystore");
13
+ const util = require("@caict/bif-encryption/src/common/util");
14
+ const sjcl = require("brdc-sjcl");
15
+
16
+ export class EncryptionCrypto {
17
+ constructor() {}
18
+
19
+ private remove0xPrefix(str: string): string {
20
+ if (str.startsWith("0x")) {
21
+ return str.substring(2);
22
+ }
23
+ return str;
24
+ }
25
+
26
+ private isHexadecimalString(str: string): boolean {
27
+ const hexRegex = /^[0-9a-fA-F]+$/;
28
+ return hexRegex.test(this.remove0xPrefix(str));
29
+ }
30
+
31
+ private isValidChainCode(str: string): boolean {
32
+ // 使用正则表达式来检查字符串是否仅包含数字和小写字母
33
+ const regex = /^[a-z0-9]{4}$/;
34
+ return regex.test(str);
35
+ }
36
+
37
+ public generateKeyStore(
38
+ encPrivateKey: string,
39
+ passwd: string,
40
+ ): GetKeyResponse {
41
+ try {
42
+ let result = bifEncryption.generateKeyStore(
43
+ encPrivateKey,
44
+ passwd,
45
+ ) as JSON;
46
+ const response: GetKeyResponse = {
47
+ errorCode: SdkStatusCode.SUCCESS,
48
+ errorDesc: "",
49
+ result: JSON.stringify(result),
50
+ };
51
+ return response;
52
+ } catch (error: any) {
53
+ // 根据不同的错误消息设置相应的错误码和错误描述,构建并返回对应的错误响应对象
54
+ let response: GetKeyResponse;
55
+ if (error.message === "invalid privatekey") {
56
+ response = {
57
+ errorCode: SdkStatusCode.INVALIDPRIVATEKEY,
58
+ errorDesc: error.message,
59
+ };
60
+ } else if (error.message === "invalid password") {
61
+ response = {
62
+ errorCode: SdkStatusCode.INVALIDPASSWD,
63
+ errorDesc: error.message,
64
+ };
65
+ } else {
66
+ response = {
67
+ errorCode: SdkStatusCode.UNRECOGNIZED,
68
+ errorDesc: error.message,
69
+ };
70
+ }
71
+ return response;
72
+ }
73
+ }
74
+
75
+ public setSkeyStore(encPrivateKey: string, passwd: string): GetKeyResponse {
76
+ try {
77
+ let result = bifEncryption.generateKeyStore(
78
+ encPrivateKey,
79
+ passwd,
80
+ ) as JSON;
81
+ const newObj: any = {};
82
+ for (const key in result) {
83
+ if (key !== "address") {
84
+ newObj[key] = result[key];
85
+ }
86
+ }
87
+ const response: GetKeyResponse = {
88
+ errorCode: SdkStatusCode.SUCCESS,
89
+ errorDesc: "",
90
+ result: JSON.stringify(newObj),
91
+ };
92
+ return response;
93
+ } catch (error: any) {
94
+ let response: GetKeyResponse;
95
+ if (error.message === "invalid privatekey") {
96
+ response = {
97
+ errorCode: SdkStatusCode.INVALIDPRIVATEKEY,
98
+ errorDesc: error.message,
99
+ };
100
+ } else if (error.message === "invalid password") {
101
+ response = {
102
+ errorCode: SdkStatusCode.INVALIDPASSWD,
103
+ errorDesc: error.message,
104
+ };
105
+ } else {
106
+ response = {
107
+ errorCode: SdkStatusCode.UNRECOGNIZED,
108
+ errorDesc: error.message,
109
+ };
110
+ }
111
+ return response;
112
+ }
113
+ }
114
+
115
+ private decipherKeyStoreForVersion(keystoreContent, password) {
116
+ let regular = /[u4e00-u9fa5]/;
117
+ try {
118
+ if (typeof keystoreContent === "string") {
119
+ keystoreContent = JSON.parse(keystoreContent);
120
+ }
121
+ } catch (e) {
122
+ throw new Error("invalid keystoreContent");
123
+ }
124
+ if (!util._isString(password) || !regular.test(password)) {
125
+ throw new Error("invalid password");
126
+ }
127
+ let rawKeyResult = keystore.decrypt(keystoreContent, password);
128
+ let privateKey =
129
+ rawKeyResult.privateKey === null ? "" : rawKeyResult.privateKey;
130
+ if (privateKey == "") {
131
+ throw new Error("The password was wrong");
132
+ }
133
+ if (rawKeyResult.version === 3) {
134
+ let chainType = keystoreContent.address.substring(8, 10);
135
+ let rowPrivateKey = rawKeyResult.privateKey;
136
+ chainType = chainType === "ef" ? 0x65 : 0x7a;
137
+ privateKey = bifEncryption.getEncPrivateKeyByRaw(
138
+ Array.from(sjcl.codec.bytes.fromBits(rowPrivateKey)),
139
+ chainType,
140
+ );
141
+ }
142
+ const accountObj = bifEncryption.privateKeyManagerByKey(privateKey);
143
+ if (
144
+ accountObj.encAddress !== keystoreContent.address ||
145
+ keystoreContent.address === undefined
146
+ ) {
147
+ throw new Error("Keystore address invalid");
148
+ }
149
+ return privateKey;
150
+ }
151
+
152
+ public decipherKeyStore(
153
+ keyStoreJson: string,
154
+ passwd: string,
155
+ ): GetKeyResponse {
156
+ try {
157
+ let result = this.decipherKeyStoreForVersion(
158
+ keyStoreJson,
159
+ passwd,
160
+ ) as string;
161
+ const response: GetKeyResponse = {
162
+ errorCode: SdkStatusCode.SUCCESS,
163
+ errorDesc: "",
164
+ result: result,
165
+ };
166
+ return response;
167
+ } catch (error: any) {
168
+ let response: GetKeyResponse;
169
+ if (error.message === "invalid password") {
170
+ response = {
171
+ errorCode: SdkStatusCode.INVALIDPASSWD,
172
+ errorDesc: error.message,
173
+ };
174
+ } else if (error.message === "The password was wrong") {
175
+ response = {
176
+ errorCode: SdkStatusCode.ERRORPASSWD,
177
+ errorDesc: error.message,
178
+ };
179
+ } else if (
180
+ error.message === "invalid keystoreContent" ||
181
+ error.message === "Keystore address invalid"
182
+ ) {
183
+ response = {
184
+ errorCode: SdkStatusCode.INVALIDKEYSTORE,
185
+ errorDesc: error.message,
186
+ };
187
+ } else if (error.message === "invalid privateKey") {
188
+ response = {
189
+ errorCode: SdkStatusCode.INVALIDKEYSTORE,
190
+ errorDesc: "Keystore generate invalid privateKey",
191
+ };
192
+ } else if (error.errorMessage === "The password is incorrect") {
193
+ response = {
194
+ errorCode: SdkStatusCode.ERRORPASSWD,
195
+ errorDesc: "The password was wrong",
196
+ };
197
+ } else {
198
+ response = {
199
+ errorCode: SdkStatusCode.UNRECOGNIZED,
200
+ errorDesc: "unknow error",
201
+ };
202
+ }
203
+ return response;
204
+ }
205
+ }
206
+
207
+ public generateChild(
208
+ encPrivateKey: string,
209
+ chainCode: string,
210
+ serviceType: string,
211
+ index: number,
212
+ ): GetChildBidAndKeyPairResponse {
213
+ try {
214
+ if (!bifEncryption.isPrivateKey(encPrivateKey)) {
215
+ const response: GetChildBidAndKeyPairResponse = {
216
+ errorCode: SdkStatusCode.INVALIDPRIVATEKEY,
217
+ errorDesc: "invalid privateKey",
218
+ };
219
+ return response;
220
+ }
221
+
222
+ if (!this.isValidChainCode(chainCode) || chainCode === "") {
223
+ const response: GetChildBidAndKeyPairResponse = {
224
+ errorCode: SdkStatusCode.INVALIDCHAINCODE,
225
+ errorDesc: "invalid chain code",
226
+ };
227
+ return response;
228
+ }
229
+
230
+ if (serviceType === "") {
231
+ const response: GetChildBidAndKeyPairResponse = {
232
+ errorCode: SdkStatusCode.INVALIDSERVICETYPE,
233
+ errorDesc: "invalid service type",
234
+ };
235
+ return response;
236
+ }
237
+
238
+ if (index < 0 || index > 1024) {
239
+ const response: GetChildBidAndKeyPairResponse = {
240
+ errorCode: SdkStatusCode.INVALIDINDEXVALUE,
241
+ errorDesc: "invalid index value",
242
+ };
243
+ return response;
244
+ }
245
+
246
+ let accountInfo = bifEncryption.generateChild(
247
+ encPrivateKey,
248
+ chainCode !== undefined ? chainCode : "",
249
+ serviceType !== undefined ? serviceType : "",
250
+ index !== undefined ? index : 0,
251
+ ) as ChildAccountKeyInfo;
252
+ const response: GetChildBidAndKeyPairResponse = {
253
+ errorCode: SdkStatusCode.SUCCESS,
254
+ errorDesc: "",
255
+ result: {
256
+ privateKey: accountInfo.privateKey,
257
+ publicKey: accountInfo.publicKey,
258
+ address: accountInfo.address,
259
+ path: accountInfo.path,
260
+ },
261
+ };
262
+ return response;
263
+ } catch (error: any) {
264
+ const response: GetChildBidAndKeyPairResponse = {
265
+ errorCode: SdkStatusCode.INVALIDPRIVATEKEY,
266
+ errorDesc: error.message,
267
+ };
268
+ return response;
269
+ }
270
+ }
271
+
272
+ public sign(encPrivateKey: string, message: string): GetKeyResponse {
273
+ try {
274
+ if (!this.isHexadecimalString(message)) {
275
+ throw new Error("invalid message");
276
+ }
277
+
278
+ let signature = bifEncryption.sign(
279
+ this.remove0xPrefix(message),
280
+ encPrivateKey,
281
+ ) as string;
282
+ const response: GetKeyResponse = {
283
+ errorCode: SdkStatusCode.SUCCESS,
284
+ errorDesc: "",
285
+ result: signature,
286
+ };
287
+ return response;
288
+ } catch (error: any) {
289
+ let response: GetKeyResponse;
290
+ if (error.message === "invalid privateKey") {
291
+ response = {
292
+ errorCode: SdkStatusCode.INVALIDPRIVATEKEY,
293
+ errorDesc: error.message,
294
+ };
295
+ } else if (error.message === "invalid message") {
296
+ response = {
297
+ errorCode: SdkStatusCode.INVALIDMESSAGE,
298
+ errorDesc: error.message,
299
+ };
300
+ } else {
301
+ response = {
302
+ errorCode: SdkStatusCode.UNRECOGNIZED,
303
+ errorDesc: error.message,
304
+ };
305
+ }
306
+ return response;
307
+ }
308
+ }
309
+
310
+ public verify(
311
+ encPublicKey: string,
312
+ message: string,
313
+ signature: string,
314
+ ): CheckKeyResponse {
315
+ try {
316
+ if (!this.isHexadecimalString(message)) {
317
+ throw new Error("invalid message");
318
+ }
319
+
320
+ if (!this.isHexadecimalString(signature)) {
321
+ throw new Error("invalid signature");
322
+ }
323
+
324
+ let res = bifEncryption.verify(
325
+ this.remove0xPrefix(message),
326
+ this.remove0xPrefix(signature),
327
+ encPublicKey,
328
+ ) as boolean;
329
+ const response: CheckKeyResponse = {
330
+ errorCode: SdkStatusCode.SUCCESS,
331
+ errorDesc: "",
332
+ result: res,
333
+ };
334
+ return response;
335
+ } catch (error: any) {
336
+ let response: CheckKeyResponse;
337
+ if (error.message === "invalid publicKey") {
338
+ response = {
339
+ errorCode: SdkStatusCode.INVALIDPUBLICKEY,
340
+ errorDesc: error.message,
341
+ };
342
+ } else if (error.message === "invalid message") {
343
+ response = {
344
+ errorCode: SdkStatusCode.INVALIDMESSAGE,
345
+ errorDesc: error.message,
346
+ };
347
+ } else if (error.message === "invalid signature") {
348
+ response = {
349
+ errorCode: SdkStatusCode.INVALIDSIGNATURE,
350
+ errorDesc: error.message,
351
+ };
352
+ } else {
353
+ response = {
354
+ errorCode: SdkStatusCode.UNRECOGNIZED,
355
+ errorDesc: error.message,
356
+ };
357
+ }
358
+ return response;
359
+ }
360
+ }
361
+
362
+ public getCryptoTypeFromPrivKey(encPrivateKey: string): GetKeyTypeResponse {
363
+ try {
364
+ if (!bifEncryption.isPrivateKey(encPrivateKey)) {
365
+ throw new Error("invalid encPrivateKey");
366
+ }
367
+
368
+ let res = bifEncryption.getCryptoTypeFromPrivKey(encPrivateKey) as number;
369
+ if (res !== 0x65 && res !== 0x7a) {
370
+ throw new Error("invalid encPrivateKey");
371
+ }
372
+ const response: GetKeyTypeResponse = {
373
+ errorCode: SdkStatusCode.SUCCESS,
374
+ errorDesc: "",
375
+ result: res === 0x65 ? KeyType.ED25519 : KeyType.SM2,
376
+ };
377
+ return response;
378
+ } catch (error: any) {
379
+ let response: GetKeyTypeResponse;
380
+ if (error.message === "invalid encPrivateKey") {
381
+ response = {
382
+ errorCode: SdkStatusCode.INVALIDPRIVATEKEY,
383
+ errorDesc: error.message,
384
+ };
385
+ } else {
386
+ response = {
387
+ errorCode: SdkStatusCode.UNRECOGNIZED,
388
+ errorDesc: error.message,
389
+ };
390
+ }
391
+ return response;
392
+ }
393
+ }
394
+
395
+ public getCryptoTypeFromPubKey(encPublicKey: string): GetKeyTypeResponse {
396
+ try {
397
+ if (!bifEncryption.isPublicKey(encPublicKey)) {
398
+ throw new Error("invalid encPublicKey");
399
+ }
400
+
401
+ let res = bifEncryption.getCryptoTypeFromPubKey(encPublicKey) as number;
402
+ if (res !== 0x65 && res !== 0x7a) {
403
+ throw new Error("invalid encPublicKey");
404
+ }
405
+ const response: GetKeyTypeResponse = {
406
+ errorCode: SdkStatusCode.SUCCESS,
407
+ errorDesc: "",
408
+ result: res === 0x65 ? KeyType.ED25519 : KeyType.SM2,
409
+ };
410
+ return response;
411
+ } catch (error: any) {
412
+ let response: GetKeyTypeResponse;
413
+ if (error.message === "invalid encPublicKey") {
414
+ response = {
415
+ errorCode: SdkStatusCode.INVALIDPUBLICKEY,
416
+ errorDesc: error.message,
417
+ };
418
+ } else {
419
+ response = {
420
+ errorCode: SdkStatusCode.UNRECOGNIZED,
421
+ errorDesc: error.message,
422
+ };
423
+ }
424
+ return response;
425
+ }
426
+ }
427
+ }
@@ -0,0 +1,120 @@
1
+ import * as bifEncryption from "@caict/bif-encryption";
2
+ import { GetKeyResponse, KeyType } from "../proto/bop-sdk-utils";
3
+ import { SdkStatusCode } from "../proto/bop-sdk-common";
4
+
5
+ export class EncryptionMnemonics {
6
+ constructor() {}
7
+
8
+ private remove0xPrefix(str: string): string {
9
+ if (str.startsWith("0x")) {
10
+ return str.substring(2);
11
+ }
12
+ return str;
13
+ }
14
+
15
+ public generateMnemonicCode(
16
+ type: KeyType,
17
+ entropy: string,
18
+ language: "chinese" | "english",
19
+ ): GetKeyResponse {
20
+ try {
21
+ if (type !== KeyType.ED25519 && type !== KeyType.SM2) {
22
+ throw new Error("unsupport key type");
23
+ }
24
+ let hdPaths: string;
25
+ if (type === KeyType.ED25519) {
26
+ hdPaths = "m/44'/2022'/0'/0'/0'";
27
+ } else {
28
+ hdPaths = "m/44'/2022'/0'/0/0";
29
+ }
30
+
31
+ let res = bifEncryption.generateMnemonicCode(
32
+ this.remove0xPrefix(entropy),
33
+ language,
34
+ hdPaths,
35
+ ) as string;
36
+ const response: GetKeyResponse = {
37
+ errorCode: SdkStatusCode.SUCCESS,
38
+ errorDesc: "",
39
+ result: res,
40
+ };
41
+ return response;
42
+ } catch (error: any) {
43
+ let response: GetKeyResponse;
44
+ if (
45
+ error.message === "Invalid entropy" ||
46
+ error.message === "invalid entropy"
47
+ ) {
48
+ response = {
49
+ errorCode: SdkStatusCode.INVALIDENTROPY,
50
+ errorDesc: "invalid entropy",
51
+ };
52
+ } else {
53
+ response = {
54
+ errorCode: SdkStatusCode.UNRECOGNIZED,
55
+ errorDesc: error.message,
56
+ };
57
+ }
58
+ return response;
59
+ }
60
+ }
61
+
62
+ public privKeyFromMCodeAndCrypto(
63
+ type: KeyType,
64
+ mnemonics: string,
65
+ ): GetKeyResponse {
66
+ try {
67
+ if (type !== KeyType.ED25519 && type !== KeyType.SM2) {
68
+ throw new Error("unsupport key type");
69
+ }
70
+ let hdPaths: string;
71
+ if (type === KeyType.ED25519) {
72
+ hdPaths = "m/44'/2022'/0'/0'/0'";
73
+ } else {
74
+ hdPaths = "m/44'/2022'/0'/0/0";
75
+ }
76
+
77
+ let privateKey = bifEncryption.privKeyFromMCodeAndCrypto(
78
+ type === KeyType.ED25519 ? 0x65 : 0x7a,
79
+ mnemonics,
80
+ hdPaths,
81
+ ) as string;
82
+ const response: GetKeyResponse = {
83
+ errorCode: SdkStatusCode.SUCCESS,
84
+ errorDesc: "",
85
+ result: privateKey,
86
+ };
87
+ return response;
88
+ } catch (error: any) {
89
+ let response: GetKeyResponse;
90
+ if (
91
+ error.message ===
92
+ "The size of mnemonicCodes must be bigger than or equal to 0"
93
+ ) {
94
+ response = {
95
+ errorCode: SdkStatusCode.INVALIDMNEMONICS,
96
+ errorDesc: error.message,
97
+ };
98
+ } else if (
99
+ error.message ===
100
+ "The size of hdPaths must be bigger than or equal to 0"
101
+ ) {
102
+ response = {
103
+ errorCode: SdkStatusCode.INVALIDMNEMONICS,
104
+ errorDesc: error.message,
105
+ };
106
+ } else if (error.message === "unsupport key type") {
107
+ response = {
108
+ errorCode: SdkStatusCode.UNSUPPORTKEYTYPE,
109
+ errorDesc: error.message,
110
+ };
111
+ } else {
112
+ response = {
113
+ errorCode: SdkStatusCode.UNRECOGNIZED,
114
+ errorDesc: error.message,
115
+ };
116
+ }
117
+ return response;
118
+ }
119
+ }
120
+ }
@@ -0,0 +1,27 @@
1
+ import { EncryptionAddress } from "./encryption-address";
2
+ import { EncryptionCrypto } from "./encryption-crypto";
3
+ import { EncryptionMnemonics } from "./encryption-mnemonics";
4
+ import { AbiCoder, defaultAbiCoder, Interface } from "./abi";
5
+
6
+ class DefaultUtils {
7
+ public address: EncryptionAddress;
8
+ public crypto: EncryptionCrypto;
9
+ public mnemonics: EncryptionMnemonics;
10
+ public abi: AbiCoder;
11
+ constructor() {
12
+ this.address = new EncryptionAddress();
13
+ this.crypto = new EncryptionCrypto();
14
+ this.mnemonics = new EncryptionMnemonics();
15
+ this.abi = defaultAbiCoder;
16
+ }
17
+ }
18
+
19
+ export const defaultUtils = new DefaultUtils();
20
+
21
+ export {
22
+ AbiCoder,
23
+ Interface,
24
+ EncryptionAddress,
25
+ EncryptionCrypto,
26
+ EncryptionMnemonics,
27
+ };