@beclab/olaresid 0.1.1 → 0.1.2

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 (87) hide show
  1. package/CLI.md +1300 -0
  2. package/README.md +37 -31
  3. package/TAG.md +589 -0
  4. package/dist/abi/RootResolver2ABI.d.ts +54 -0
  5. package/dist/abi/RootResolver2ABI.d.ts.map +1 -0
  6. package/dist/abi/RootResolver2ABI.js +240 -0
  7. package/dist/abi/RootResolver2ABI.js.map +1 -0
  8. package/dist/business/index.d.ts +302 -0
  9. package/dist/business/index.d.ts.map +1 -0
  10. package/dist/business/index.js +1209 -0
  11. package/dist/business/index.js.map +1 -0
  12. package/dist/business/tag-context.d.ts +219 -0
  13. package/dist/business/tag-context.d.ts.map +1 -0
  14. package/dist/business/tag-context.js +537 -0
  15. package/dist/business/tag-context.js.map +1 -0
  16. package/dist/cli.js +2085 -39
  17. package/dist/cli.js.map +1 -1
  18. package/dist/debug.d.ts.map +1 -1
  19. package/dist/debug.js +14 -2
  20. package/dist/debug.js.map +1 -1
  21. package/dist/index.d.ts +50 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +229 -9
  24. package/dist/index.js.map +1 -1
  25. package/dist/utils/crypto-utils.d.ts +130 -0
  26. package/dist/utils/crypto-utils.d.ts.map +1 -0
  27. package/dist/utils/crypto-utils.js +402 -0
  28. package/dist/utils/crypto-utils.js.map +1 -0
  29. package/dist/utils/error-parser.d.ts +35 -0
  30. package/dist/utils/error-parser.d.ts.map +1 -0
  31. package/dist/utils/error-parser.js +202 -0
  32. package/dist/utils/error-parser.js.map +1 -0
  33. package/dist/utils/tag-abi-codec.d.ts +69 -0
  34. package/dist/utils/tag-abi-codec.d.ts.map +1 -0
  35. package/dist/utils/tag-abi-codec.js +144 -0
  36. package/dist/utils/tag-abi-codec.js.map +1 -0
  37. package/dist/utils/tag-type-builder.d.ts +158 -0
  38. package/dist/utils/tag-type-builder.d.ts.map +1 -0
  39. package/dist/utils/tag-type-builder.js +410 -0
  40. package/dist/utils/tag-type-builder.js.map +1 -0
  41. package/examples/crypto-utilities.ts +140 -0
  42. package/examples/domain-context.ts +80 -0
  43. package/examples/generate-mnemonic.ts +149 -0
  44. package/examples/index.ts +1 -1
  45. package/examples/ip.ts +171 -0
  46. package/examples/legacy.ts +10 -10
  47. package/examples/list-wallets.ts +81 -0
  48. package/examples/quasar-demo/.eslintrc.js +23 -0
  49. package/examples/quasar-demo/.quasar/app.js +43 -0
  50. package/examples/quasar-demo/.quasar/client-entry.js +38 -0
  51. package/examples/quasar-demo/.quasar/client-prefetch.js +130 -0
  52. package/examples/quasar-demo/.quasar/quasar-user-options.js +16 -0
  53. package/examples/quasar-demo/README.md +49 -0
  54. package/examples/quasar-demo/index.html +11 -0
  55. package/examples/quasar-demo/package-lock.json +6407 -0
  56. package/examples/quasar-demo/package.json +36 -0
  57. package/examples/quasar-demo/quasar.config.js +73 -0
  58. package/examples/quasar-demo/src/App.vue +13 -0
  59. package/examples/quasar-demo/src/css/app.scss +1 -0
  60. package/examples/quasar-demo/src/layouts/MainLayout.vue +21 -0
  61. package/examples/quasar-demo/src/pages/IndexPage.vue +905 -0
  62. package/examples/quasar-demo/src/router/index.ts +25 -0
  63. package/examples/quasar-demo/src/router/routes.ts +11 -0
  64. package/examples/quasar-demo/tsconfig.json +28 -0
  65. package/examples/register-subdomain.ts +152 -0
  66. package/examples/rsa-keypair.ts +148 -0
  67. package/examples/tag-builder.ts +235 -0
  68. package/examples/tag-management.ts +534 -0
  69. package/examples/tag-nested-tuple.ts +190 -0
  70. package/examples/tag-simple.ts +149 -0
  71. package/examples/tag-tagger.ts +217 -0
  72. package/examples/test-nested-tuple-conversion.ts +143 -0
  73. package/examples/test-type-bytes-parser.ts +70 -0
  74. package/examples/transfer-domain.ts +197 -0
  75. package/examples/wallet-management.ts +196 -0
  76. package/package.json +24 -15
  77. package/src/abi/RootResolver2ABI.ts +237 -0
  78. package/src/business/index.ts +1490 -0
  79. package/src/business/tag-context.ts +713 -0
  80. package/src/cli.ts +2755 -39
  81. package/src/debug.ts +17 -2
  82. package/src/index.ts +300 -14
  83. package/src/utils/crypto-utils.ts +459 -0
  84. package/src/utils/error-parser.ts +225 -0
  85. package/src/utils/tag-abi-codec.ts +158 -0
  86. package/src/utils/tag-type-builder.ts +469 -0
  87. package/tsconfig.json +1 -1
package/src/debug.ts CHANGED
@@ -18,14 +18,29 @@ class DebugLogger {
18
18
  }
19
19
 
20
20
  private parseConfig(): DebugConfig {
21
- // Check environment variables
21
+ // Check if running in Node.js environment
22
+ const isNode =
23
+ typeof process !== 'undefined' &&
24
+ process.versions &&
25
+ process.versions.node;
26
+
27
+ // Default config for browser
28
+ if (!isNode) {
29
+ return {
30
+ enabled: false,
31
+ level: 'debug',
32
+ prefix: '[DID-DEBUG]'
33
+ };
34
+ }
35
+
36
+ // Check environment variables (Node.js only)
22
37
  const envDebug =
23
38
  process.env.DEBUG === 'true' || process.env.DEBUG === '1';
24
39
  const envLevel =
25
40
  (process.env.DEBUG_LEVEL as DebugConfig['level']) || 'debug';
26
41
  const envPrefix = process.env.DEBUG_PREFIX || '[DID-DEBUG]';
27
42
 
28
- // Check command line arguments
43
+ // Check command line arguments (Node.js only)
29
44
  const args = process.argv;
30
45
  const hasDebugFlag = args.includes('--debug') || args.includes('-d');
31
46
  const hasVerboseFlag =
package/src/index.ts CHANGED
@@ -3,7 +3,62 @@ import DIDTag from './tag/index';
3
3
  import { ethers } from 'ethers';
4
4
  import DID_ABI from './abi/TerminusDIDABI';
5
5
  import RootResolverABI from './abi/RootResolverABI';
6
+ import RootResolver2ABI from './abi/RootResolver2ABI';
6
7
  import { debug } from './debug';
8
+ import { parseContractError } from './utils/error-parser';
9
+
10
+ import {
11
+ DomainContext,
12
+ DomainMetaInfo,
13
+ DomainInfo,
14
+ TagInfo,
15
+ TransactionResult,
16
+ RSAPublicKeyData,
17
+ DIDKeyData,
18
+ UserType,
19
+ createRsaKeyPair,
20
+ pemToDer,
21
+ derToPem,
22
+ ipv4ToBytes4,
23
+ bytes4ToIpv4,
24
+ generateMnemonic,
25
+ getEthereumAddressFromMnemonic,
26
+ getEVMPrivateKeyFromMnemonic,
27
+ getDIDFromMnemonic,
28
+ generateDIDKeyData,
29
+ deriveDIDFromMnemonic
30
+ } from './business';
31
+ import { TagContext } from './business/tag-context';
32
+
33
+ // Import Tag utilities
34
+ import { TagTypeBuilder } from './utils/tag-type-builder';
35
+ import { TagAbiCodec } from './utils/tag-abi-codec';
36
+
37
+ export type {
38
+ DomainInfo,
39
+ DomainMetaInfo,
40
+ TagInfo,
41
+ TransactionResult,
42
+ RSAPublicKeyData,
43
+ DIDKeyData
44
+ } from './business';
45
+
46
+ export {
47
+ UserType,
48
+ DomainContext,
49
+ TagContext,
50
+ createRsaKeyPair,
51
+ pemToDer,
52
+ derToPem,
53
+ ipv4ToBytes4,
54
+ bytes4ToIpv4,
55
+ generateMnemonic,
56
+ getEthereumAddressFromMnemonic,
57
+ getEVMPrivateKeyFromMnemonic,
58
+ getDIDFromMnemonic,
59
+ generateDIDKeyData,
60
+ deriveDIDFromMnemonic
61
+ } from './business';
7
62
 
8
63
  type Domain = PackageDomain.Domain;
9
64
 
@@ -14,26 +69,117 @@ export class DIDConsole implements DIDTag.ABITypeProviderHolder {
14
69
  contractDid: string;
15
70
  contractRootResolver: string;
16
71
  contractAbiType: string;
72
+ contractRootResolver2?: string;
73
+ supportSvcUrl?: string;
74
+
75
+ signer?: ethers.Signer;
17
76
 
18
77
  allDomainCache: Domain[] = [];
19
78
  treesCache: Domain[] = [];
20
79
 
80
+ // caching contract instances
81
+ private _contractDID?: ethers.Contract;
82
+ private _signerContractDID?: ethers.Contract;
83
+ private _contractRootResolver?: ethers.Contract;
84
+ private _signerContractRootResolver?: ethers.Contract;
85
+ private _contractRootResolver2?: ethers.Contract;
86
+ private _signerContractRootResolver2?: ethers.Contract;
87
+
88
+ private _provider?: ethers.JsonRpcProvider;
89
+
21
90
  constructor(
22
91
  rpcNode: string,
23
92
  contractDid: string,
24
93
  contractRootResolver: string,
25
- contractAbiType: string
94
+ contractAbiType: string,
95
+ contractRootResolver2?: string,
96
+ supportSvcUrl?: string
26
97
  ) {
27
98
  this.rpcNode = rpcNode;
28
99
  this.contractDid = contractDid;
29
100
  this.contractRootResolver = contractRootResolver;
30
101
  this.contractAbiType = contractAbiType;
102
+ this.contractRootResolver2 = contractRootResolver2;
103
+ this.supportSvcUrl = supportSvcUrl;
31
104
  }
32
105
 
33
- getProvider = () => new ethers.JsonRpcProvider(this.rpcNode);
106
+ getProvider = (): ethers.JsonRpcProvider => {
107
+ if (!this._provider) {
108
+ this._provider = new ethers.JsonRpcProvider(this.rpcNode);
109
+ }
110
+ return this._provider;
111
+ };
112
+
113
+ setSigner = async (
114
+ signerOrPrivateKeyOrMnemonic: ethers.Signer | string
115
+ ) => {
116
+ if (typeof signerOrPrivateKeyOrMnemonic === 'string') {
117
+ // Check if it's a mnemonic (12-24 words) or private key (0x... hex)
118
+ const trimmed = signerOrPrivateKeyOrMnemonic.trim();
119
+ const wordCount = trimmed.split(/\s+/).length;
120
+
121
+ // If it's 12-24 words, treat it as a mnemonic
122
+ if (wordCount >= 12 && wordCount <= 24) {
123
+ // Import and use the mnemonic conversion function
124
+ const { getEVMPrivateKeyFromMnemonic } = await import(
125
+ './utils/crypto-utils'
126
+ );
127
+ const privateKey = await getEVMPrivateKeyFromMnemonic(trimmed);
128
+ this.signer = new ethers.Wallet(privateKey, this.getProvider());
129
+ } else {
130
+ // Treat as private key
131
+ this.signer = new ethers.Wallet(
132
+ signerOrPrivateKeyOrMnemonic,
133
+ this.getProvider()
134
+ );
135
+ }
136
+ } else {
137
+ this.signer = signerOrPrivateKeyOrMnemonic;
138
+ }
139
+
140
+ // reset cached signer contracts
141
+ this._signerContractDID = undefined;
142
+ this._signerContractRootResolver = undefined;
143
+ this._signerContractRootResolver2 = undefined;
144
+ };
145
+
146
+ getSigner = (): ethers.Signer => {
147
+ if (!this.signer) {
148
+ throw new Error('No signer available.');
149
+ }
150
+ return this.signer;
151
+ };
152
+
153
+ clearSigner = () => {
154
+ this.signer = undefined;
34
155
 
35
- getContractDID = () =>
36
- new ethers.Contract(this.contractDid, DID_ABI.abi, this.getProvider());
156
+ // reset cached signer contracts
157
+ this._signerContractDID = undefined;
158
+ this._signerContractRootResolver = undefined;
159
+ this._signerContractRootResolver2 = undefined;
160
+ };
161
+
162
+ getContractDID = (): ethers.Contract => {
163
+ if (!this._contractDID) {
164
+ this._contractDID = new ethers.Contract(
165
+ this.contractDid,
166
+ DID_ABI.abi,
167
+ this.getProvider()
168
+ );
169
+ }
170
+ return this._contractDID;
171
+ };
172
+
173
+ getSignerContractDID = (): ethers.Contract => {
174
+ if (!this._signerContractDID) {
175
+ this._signerContractDID = new ethers.Contract(
176
+ this.contractDid,
177
+ DID_ABI.abi,
178
+ this.getSigner()
179
+ );
180
+ }
181
+ return this._signerContractDID;
182
+ };
37
183
 
38
184
  getContractDIDByPrivateKey = (privateKey: string) => {
39
185
  const wallet = new ethers.Wallet(privateKey, this.getProvider());
@@ -55,12 +201,57 @@ export class DIDConsole implements DIDTag.ABITypeProviderHolder {
55
201
  await provider.getSigner()
56
202
  );
57
203
 
58
- getContractRootResolver = () =>
59
- new ethers.Contract(
60
- this.contractRootResolver,
61
- RootResolverABI.abi,
62
- this.getProvider()
63
- );
204
+ getContractRootResolver = (): ethers.Contract => {
205
+ if (!this._contractRootResolver) {
206
+ this._contractRootResolver = new ethers.Contract(
207
+ this.contractRootResolver,
208
+ RootResolverABI.abi,
209
+ this.getProvider()
210
+ );
211
+ }
212
+ return this._contractRootResolver;
213
+ };
214
+
215
+ getSignerContractRootResolver = (): ethers.Contract => {
216
+ if (!this._signerContractRootResolver) {
217
+ this._signerContractRootResolver = new ethers.Contract(
218
+ this.contractRootResolver,
219
+ RootResolverABI.abi,
220
+ this.getSigner()
221
+ );
222
+ }
223
+ return this._signerContractRootResolver;
224
+ };
225
+
226
+ getContractRootResolver2 = (): ethers.Contract => {
227
+ if (!this.contractRootResolver2) {
228
+ throw new Error('No contractRootResolver2 provided.');
229
+ }
230
+
231
+ if (!this._contractRootResolver2) {
232
+ this._contractRootResolver2 = new ethers.Contract(
233
+ this.contractRootResolver2,
234
+ RootResolver2ABI.abi,
235
+ this.getProvider()
236
+ );
237
+ }
238
+ return this._contractRootResolver2;
239
+ };
240
+
241
+ getSignerContractRootResolver2 = (): ethers.Contract => {
242
+ if (!this.contractRootResolver2) {
243
+ throw new Error('No contractRootResolver2 provided.');
244
+ }
245
+
246
+ if (!this._signerContractRootResolver2) {
247
+ this._signerContractRootResolver2 = new ethers.Contract(
248
+ this.contractRootResolver2,
249
+ RootResolver2ABI.abi,
250
+ this.getSigner()
251
+ );
252
+ }
253
+ return this._signerContractRootResolver2;
254
+ };
64
255
 
65
256
  getSignerContractRootResolverByProvider = async (
66
257
  provider: ethers.JsonRpcApiProvider
@@ -252,6 +443,89 @@ export class DIDConsole implements DIDTag.ABITypeProviderHolder {
252
443
 
253
444
  resolve(datas);
254
445
  });
446
+
447
+ /**
448
+ * Uses a chain-style operation design pattern, returning the operation context for the specified domain
449
+ * For example: await console.domain('developer.olares.com').setRSAPublicKey(rsaKey);
450
+ */
451
+ domain(name: string): DomainContext {
452
+ return new DomainContext(name, this);
453
+ }
454
+
455
+ /**
456
+ * Set the operator address (super admin)
457
+ * Only the contract owner can call this method
458
+ */
459
+ async setOperator(newOperator: string): Promise<TransactionResult> {
460
+ try {
461
+ const contract = this.getSignerContractDID();
462
+ const tx = await contract.setOperator(newOperator);
463
+ const receipt = await tx.wait();
464
+
465
+ return {
466
+ success: true,
467
+ transactionHash: receipt.hash,
468
+ gasUsed: receipt.gasUsed,
469
+ blockNumber: receipt.blockNumber
470
+ };
471
+ } catch (error) {
472
+ const parsedError = parseContractError(error);
473
+
474
+ // Always throw network errors
475
+ if (parsedError.isNetworkError) {
476
+ throw new Error(`Network error: ${parsedError.message}`);
477
+ }
478
+
479
+ // Return friendly contract error
480
+ return {
481
+ success: false,
482
+ transactionHash: '',
483
+ error: parsedError.message
484
+ };
485
+ }
486
+ }
487
+
488
+ /**
489
+ * Get the current operator address (super admin)
490
+ * @returns The operator address
491
+ */
492
+ async getOperator(): Promise<string> {
493
+ try {
494
+ const contract = this.getContractDID();
495
+ return await contract.operator();
496
+ } catch (error) {
497
+ const parsedError = parseContractError(error);
498
+ throw new Error(parsedError.message);
499
+ }
500
+ }
501
+
502
+ /**
503
+ * Get contract owner address
504
+ * @returns The contract owner address
505
+ */
506
+ async getOwner(): Promise<string> {
507
+ try {
508
+ const contract = this.getContractDID();
509
+ return await contract.owner();
510
+ } catch (error) {
511
+ const parsedError = parseContractError(error);
512
+ throw new Error(parsedError.message);
513
+ }
514
+ }
515
+
516
+ /**
517
+ * Get total supply of domains
518
+ * @returns The total number of registered domains
519
+ */
520
+ async getTotalSupply(): Promise<bigint> {
521
+ try {
522
+ const contract = this.getContractDID();
523
+ return await contract.totalSupply();
524
+ } catch (error) {
525
+ const parsedError = parseContractError(error);
526
+ throw new Error(parsedError.message);
527
+ }
528
+ }
255
529
  }
256
530
 
257
531
  namespace OlaresID {
@@ -259,13 +533,17 @@ namespace OlaresID {
259
533
  rpcNode: string,
260
534
  contractDid: string,
261
535
  contractRootResolver: string,
262
- contractAbiType: string
536
+ contractAbiType: string,
537
+ contractRootResolver2?: string,
538
+ supportSvcUrl?: string
263
539
  ): DIDConsole => {
264
540
  return new DIDConsole(
265
541
  rpcNode,
266
542
  contractDid,
267
543
  contractRootResolver,
268
- contractAbiType
544
+ contractAbiType,
545
+ contractRootResolver2,
546
+ supportSvcUrl
269
547
  );
270
548
  };
271
549
 
@@ -274,7 +552,9 @@ namespace OlaresID {
274
552
  'https://optimism-rpc.publicnode.com',
275
553
  '0x5DA4Fa8E567d86e52Ef8Da860de1be8f54cae97D',
276
554
  '0xE2EABA0979277A90511F8873ae1e8cA26B54E740',
277
- '0x9ae3F16bD99294Af1784beB1a0A5C84bf2636365'
555
+ '0x9ae3F16bD99294Af1784beB1a0A5C84bf2636365',
556
+ '0x7e7961aB771cA942CE4DB6e79579e016a33Dc95B',
557
+ 'https://api.olares.com/did/support'
278
558
  );
279
559
  };
280
560
 
@@ -283,7 +563,9 @@ namespace OlaresID {
283
563
  'https://sepolia.optimism.io',
284
564
  '0xe2D7c3a9013960E04d4E9F5F9B63fff37eEd97A8',
285
565
  '0xeF727cb066Fee98F88Db84555830063b4A24ddfc',
286
- '0x7386fCBae6Ad4CCE1499d9153D99bc950B589718'
566
+ '0x7386fCBae6Ad4CCE1499d9153D99bc950B589718',
567
+ '0xcbC02aa08c77a374eC0D5A0403E108b7573d96e8',
568
+ 'https://api-test.olares.com/did/support'
287
569
  );
288
570
  };
289
571
 
@@ -299,4 +581,8 @@ namespace OlaresID {
299
581
  }
300
582
 
301
583
  export { debug } from './debug';
584
+
585
+ // Export Tag utilities outside namespace
586
+ export { TagTypeBuilder, TagAbiCodec };
587
+
302
588
  export default OlaresID;