@beclab/olaresid 0.1.13 → 0.2.1

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 (182) hide show
  1. package/CLI-TREE.md +107 -0
  2. package/CLI.md +122 -1340
  3. package/README.md +30 -12
  4. package/SDK-TREE.md +151 -0
  5. package/TAG.md +95 -41
  6. package/config.json +6 -4
  7. package/dist/abi/TerminusDIDQueryABI.d.ts +397 -0
  8. package/dist/abi/TerminusDIDQueryABI.d.ts.map +1 -0
  9. package/dist/abi/TerminusDIDQueryABI.js +519 -0
  10. package/dist/abi/TerminusDIDQueryABI.js.map +1 -0
  11. package/dist/business/index.d.ts.map +1 -1
  12. package/dist/business/index.js +9 -23
  13. package/dist/business/index.js.map +1 -1
  14. package/dist/business/tag-context.d.ts +1 -0
  15. package/dist/business/tag-context.d.ts.map +1 -1
  16. package/dist/business/tag-context.js +13 -7
  17. package/dist/business/tag-context.js.map +1 -1
  18. package/dist/cli.js +177 -76
  19. package/dist/cli.js.map +1 -1
  20. package/dist/config/index.d.ts +16 -4
  21. package/dist/config/index.d.ts.map +1 -1
  22. package/dist/config/index.js +28 -14
  23. package/dist/config/index.js.map +1 -1
  24. package/dist/domain/core.d.ts +65 -0
  25. package/dist/domain/core.d.ts.map +1 -0
  26. package/dist/domain/core.js +317 -0
  27. package/dist/domain/core.js.map +1 -0
  28. package/dist/domain/index.d.ts +104 -57
  29. package/dist/domain/index.d.ts.map +1 -1
  30. package/dist/domain/index.js +188 -428
  31. package/dist/domain/index.js.map +1 -1
  32. package/dist/domain/types.d.ts +56 -0
  33. package/dist/domain/types.d.ts.map +1 -0
  34. package/dist/domain/types.js +3 -0
  35. package/dist/domain/types.js.map +1 -0
  36. package/dist/index.d.ts +81 -23
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +158 -143
  39. package/dist/index.js.map +1 -1
  40. package/dist/utils/crypto-utils.d.ts +110 -0
  41. package/dist/utils/crypto-utils.d.ts.map +1 -1
  42. package/dist/utils/crypto-utils.js +127 -8
  43. package/dist/utils/crypto-utils.js.map +1 -1
  44. package/dist/utils/error-parser.d.ts.map +1 -1
  45. package/dist/utils/error-parser.js +2 -1
  46. package/dist/utils/error-parser.js.map +1 -1
  47. package/dist/utils/event-parser.d.ts +161 -0
  48. package/dist/utils/event-parser.d.ts.map +1 -0
  49. package/dist/utils/event-parser.js +140 -0
  50. package/dist/utils/event-parser.js.map +1 -0
  51. package/dist/utils/tag-type-builder.d.ts +43 -0
  52. package/dist/utils/tag-type-builder.d.ts.map +1 -1
  53. package/dist/utils/tag-type-builder.js +122 -0
  54. package/dist/utils/tag-type-builder.js.map +1 -1
  55. package/dist/utils/tag-type-parser.d.ts +70 -0
  56. package/dist/utils/tag-type-parser.d.ts.map +1 -0
  57. package/dist/utils/tag-type-parser.js +190 -0
  58. package/dist/utils/tag-type-parser.js.map +1 -0
  59. package/examples/create-with-rpc-demo.ts +142 -0
  60. package/examples/fetch-all-flat-demo.ts +159 -0
  61. package/examples/fetch-by-indices-demo.ts +235 -0
  62. package/examples/fetch-domain-demo.ts +137 -0
  63. package/examples/fetch-domains-demo.ts +221 -0
  64. package/examples/frontend-demo/index.html +2 -2
  65. package/examples/frontend-demo/package-lock.json +4 -1
  66. package/examples/index.ts +3 -5
  67. package/jest.config.js +25 -0
  68. package/package.json +6 -2
  69. package/src/abi/TerminusDIDQueryABI.ts +516 -0
  70. package/src/business/index.ts +9 -33
  71. package/src/business/tag-context.ts +35 -7
  72. package/src/cli.ts +253 -90
  73. package/src/config/index.ts +34 -19
  74. package/src/domain/core.ts +382 -0
  75. package/src/domain/index.ts +271 -641
  76. package/src/domain/types.ts +59 -0
  77. package/src/index.ts +230 -207
  78. package/src/utils/crypto-utils.ts +205 -2
  79. package/src/utils/error-parser.ts +2 -1
  80. package/src/utils/event-parser.ts +353 -0
  81. package/src/utils/tag-type-builder.ts +138 -0
  82. package/src/utils/tag-type-parser.ts +246 -0
  83. package/tests/unit/crypto-utils.test.ts +338 -0
  84. package/tests/unit/ed25519-jwk.test.ts +201 -0
  85. package/tests/unit/event-parser.test.ts +690 -0
  86. package/tests/unit/generate-mnemonic.test.ts +268 -0
  87. package/tests/unit/olares-id-format.test.ts +321 -0
  88. package/tests/unit/tag-type-parser.test.ts +802 -0
  89. package/tests/unit/tag-types.test.ts +821 -0
  90. package/tests/unit/version.test.ts +14 -0
  91. package/tsconfig.json +3 -2
  92. package/dist/abi/ABITypeABI.d.ts +0 -88
  93. package/dist/abi/ABITypeABI.d.ts.map +0 -1
  94. package/dist/abi/ABITypeABI.js +0 -382
  95. package/dist/abi/ABITypeABI.js.map +0 -1
  96. package/dist/abi/RegistryABI.d.ts +0 -77
  97. package/dist/abi/RegistryABI.d.ts.map +0 -1
  98. package/dist/abi/RegistryABI.js +0 -462
  99. package/dist/abi/RegistryABI.js.map +0 -1
  100. package/dist/tag/address.d.ts +0 -11
  101. package/dist/tag/address.d.ts.map +0 -1
  102. package/dist/tag/address.js +0 -44
  103. package/dist/tag/address.js.map +0 -1
  104. package/dist/tag/array.d.ts +0 -14
  105. package/dist/tag/array.d.ts.map +0 -1
  106. package/dist/tag/array.js +0 -72
  107. package/dist/tag/array.js.map +0 -1
  108. package/dist/tag/bool.d.ts +0 -11
  109. package/dist/tag/bool.d.ts.map +0 -1
  110. package/dist/tag/bool.js +0 -43
  111. package/dist/tag/bool.js.map +0 -1
  112. package/dist/tag/bytes.d.ts +0 -11
  113. package/dist/tag/bytes.d.ts.map +0 -1
  114. package/dist/tag/bytes.js +0 -37
  115. package/dist/tag/bytes.js.map +0 -1
  116. package/dist/tag/flarray.d.ts +0 -15
  117. package/dist/tag/flarray.d.ts.map +0 -1
  118. package/dist/tag/flarray.js +0 -81
  119. package/dist/tag/flarray.js.map +0 -1
  120. package/dist/tag/flbytes.d.ts +0 -11
  121. package/dist/tag/flbytes.d.ts.map +0 -1
  122. package/dist/tag/flbytes.js +0 -47
  123. package/dist/tag/flbytes.js.map +0 -1
  124. package/dist/tag/index.d.ts +0 -32
  125. package/dist/tag/index.d.ts.map +0 -1
  126. package/dist/tag/index.js +0 -121
  127. package/dist/tag/index.js.map +0 -1
  128. package/dist/tag/int.d.ts +0 -12
  129. package/dist/tag/int.d.ts.map +0 -1
  130. package/dist/tag/int.js +0 -49
  131. package/dist/tag/int.js.map +0 -1
  132. package/dist/tag/string.d.ts +0 -11
  133. package/dist/tag/string.d.ts.map +0 -1
  134. package/dist/tag/string.js +0 -37
  135. package/dist/tag/string.js.map +0 -1
  136. package/dist/tag/tag.d.ts +0 -67
  137. package/dist/tag/tag.d.ts.map +0 -1
  138. package/dist/tag/tag.js +0 -157
  139. package/dist/tag/tag.js.map +0 -1
  140. package/dist/tag/tuple.d.ts +0 -17
  141. package/dist/tag/tuple.d.ts.map +0 -1
  142. package/dist/tag/tuple.js +0 -162
  143. package/dist/tag/tuple.js.map +0 -1
  144. package/dist/tag/uint.d.ts +0 -12
  145. package/dist/tag/uint.d.ts.map +0 -1
  146. package/dist/tag/uint.js +0 -49
  147. package/dist/tag/uint.js.map +0 -1
  148. package/dist/test/did.d.ts +0 -2
  149. package/dist/test/did.d.ts.map +0 -1
  150. package/dist/test/did.js +0 -177
  151. package/dist/test/did.js.map +0 -1
  152. package/dist/utils/tag-abi-codec.d.ts +0 -69
  153. package/dist/utils/tag-abi-codec.d.ts.map +0 -1
  154. package/dist/utils/tag-abi-codec.js +0 -144
  155. package/dist/utils/tag-abi-codec.js.map +0 -1
  156. package/examples/crypto-utilities.ts +0 -140
  157. package/examples/ed25519-jwk.ts +0 -73
  158. package/examples/generate-mnemonic.ts +0 -149
  159. package/examples/legacy.ts +0 -33
  160. package/examples/olares-id-format.ts +0 -197
  161. package/examples/tag-builder.ts +0 -235
  162. package/examples/tag-nested-tuple.ts +0 -190
  163. package/examples/tag-simple.ts +0 -149
  164. package/examples/tag-tagger.ts +0 -217
  165. package/examples/test-nested-tuple-conversion.ts +0 -143
  166. package/examples/test-type-bytes-parser.ts +0 -70
  167. package/src/abi/ABITypeABI.ts +0 -379
  168. package/src/abi/RegistryABI.ts +0 -459
  169. package/src/tag/address.ts +0 -48
  170. package/src/tag/array.ts +0 -80
  171. package/src/tag/bool.ts +0 -43
  172. package/src/tag/bytes.ts +0 -38
  173. package/src/tag/flarray.ts +0 -99
  174. package/src/tag/flbytes.ts +0 -48
  175. package/src/tag/index.ts +0 -170
  176. package/src/tag/int.ts +0 -51
  177. package/src/tag/string.ts +0 -38
  178. package/src/tag/tag.ts +0 -229
  179. package/src/tag/tuple.ts +0 -193
  180. package/src/tag/uint.ts +0 -51
  181. package/src/test/did.ts +0 -346
  182. package/src/utils/tag-abi-codec.ts +0 -158
package/dist/cli.js CHANGED
@@ -65,7 +65,8 @@ function parseArgs() {
65
65
  'is-owner',
66
66
  'transfer',
67
67
  'fetch',
68
- 'fetch-domain'
68
+ 'fetch-domain',
69
+ 'fetch-all'
69
70
  ];
70
71
  for (let i = 0; i < args.length; i++) {
71
72
  const arg = args[i];
@@ -79,6 +80,9 @@ function parseArgs() {
79
80
  else if (arg === '--network' || arg === '-n') {
80
81
  options.network = args[++i] || 'mainnet';
81
82
  }
83
+ else if (arg === '--from') {
84
+ options.from = args[++i];
85
+ }
82
86
  else if (arg === '--rpc') {
83
87
  options.rpc = args[++i];
84
88
  }
@@ -138,6 +142,18 @@ function parseArgs() {
138
142
  }
139
143
  return { command, subCommand, domain, value, options };
140
144
  }
145
+ function normalizeTagFromDomain(from, toDomain) {
146
+ if (!from) {
147
+ return toDomain;
148
+ }
149
+ const normalized = from.trim().toLowerCase();
150
+ if (normalized === 'root' ||
151
+ normalized === ':root' ||
152
+ normalized === '""') {
153
+ return '';
154
+ }
155
+ return (0, olares_id_1.normalizeToDomain)(from);
156
+ }
141
157
  function showHelp() {
142
158
  console.log(`
143
159
  DID CLI Tool v${CLI_VERSION}
@@ -191,15 +207,18 @@ COMMANDS:
191
207
  Define a new tag type (requires PRIVATE_KEY_OR_MNEMONIC)
192
208
  Supported types: string, uint8, uint256, int8, int256, bool, address, bytes, bytes32
193
209
  Array types: string[], uint8[], etc.
194
- tag set <domain> <tag-name> <value>
210
+ tag set <domain> <tag-name> <value> [--from <domain|root>]
195
211
  Set tag value (requires PRIVATE_KEY_OR_MNEMONIC)
196
- Value can be a string or JSON for arrays/objects
197
- tag get <domain> <tag-name>
212
+ Value can be a string or JSON for arrays/objects
213
+ --from specifies where tag type is defined (default: same as <domain>)
214
+ tag get <domain> <tag-name> [--from <domain|root>]
198
215
  Get tag value (read-only)
199
- tag remove <domain> <tag-name>
216
+ tag remove <domain> <tag-name> [--from <domain|root>]
200
217
  Remove tag value (requires PRIVATE_KEY_OR_MNEMONIC)
201
- tag list <domain> List all tags with values for domain (read-only)
202
- tag list-defined <domain> List all defined tag types for domain (read-only)
218
+ tag list <domain> [--from <domain|root>]
219
+ List all tags with values for domain (read-only)
220
+ tag list-defined [domain] List all tag types defined by the domain (read-only)
221
+ Omit domain to query tag types defined by root
203
222
  tag set-tagger <domain> <tag-name> <address>
204
223
  Set tagger address for a tag (requires PRIVATE_KEY_OR_MNEMONIC)
205
224
  tag get-tagger <domain> <tag-name>
@@ -222,7 +241,8 @@ COMMANDS:
222
241
  config set <key> <value> [--network <network>]
223
242
  Set configuration value (default network: mainnet)
224
243
  Keys: rpc, contractDid, contractRootResolver,
225
- contractAbiType, contractRootResolver2, supportSvcUrl
244
+ contractAbiType, contractRootResolver2,
245
+ supportSvcUrl, queryContract
226
246
 
227
247
  Crypto Utility Commands:
228
248
  crypto generate Generate a new mnemonic phrase (--words option)
@@ -242,12 +262,13 @@ COMMANDS:
242
262
 
243
263
  Legacy Commands:
244
264
  fetch <domain> Fetch domain information (alias: fetch-domain)
245
- fetch-all Fetch all domains from contract
246
- config Show network configurations
265
+ fetch-all Fetch all domains from contract and save to JSON file
266
+ Use --output to specify file path (default: domains-<network>-<date>.json)
247
267
  help Show this help message
248
268
 
249
269
  OPTIONS:
250
270
  -n, --network <network> Network to use (sepolia|mainnet) [default: mainnet]
271
+ --from <domain|root> Tag source domain for tag set/get/remove/list (default: target domain)
251
272
  --rpc <url> Custom RPC endpoint URL
252
273
  --contract-did <address> Custom DID contract address
253
274
  --contract-resolver <address> Custom RootResolver contract address
@@ -293,7 +314,6 @@ EXAMPLES:
293
314
  # Subdomain management (auto-generate mnemonic for subdomain owner)
294
315
  export PRIVATE_KEY_OR_MNEMONIC=0xYOUR_PRIVATE_KEY
295
316
  did-cli subdomain register parent.com child
296
- did-cli subdomain register parent.com child --words 24
297
317
 
298
318
  # Subdomain management (use existing mnemonic for subdomain owner)
299
319
  export SUBDOMAIN_OWNER_MNEMONIC="your twelve word mnemonic here"
@@ -305,7 +325,6 @@ EXAMPLES:
305
325
  # Transfer domain ownership (auto-generate mnemonic for new owner)
306
326
  export PRIVATE_KEY_OR_MNEMONIC=0xYOUR_PRIVATE_KEY
307
327
  did-cli transfer example.com
308
- did-cli transfer example.com --words 24
309
328
 
310
329
  # Transfer domain ownership (use existing mnemonic for new owner)
311
330
  export TO_MNEMONIC="your twelve word mnemonic here"
@@ -313,7 +332,7 @@ EXAMPLES:
313
332
 
314
333
  # Crypto utilities
315
334
  did-cli crypto generate --words 12
316
- did-cli crypto generate --words 24 --output ./custom-path.txt
335
+ did-cli crypto generate --output ./custom-path.txt
317
336
  export PRIVATE_KEY_OR_MNEMONIC="your twelve word mnemonic here"
318
337
  did-cli crypto address
319
338
  did-cli crypto did
@@ -384,8 +403,15 @@ EXAMPLES:
384
403
  did-cli config list # List all networks
385
404
  did-cli config set rpc https://optimism.llamarpc.com # Set mainnet RPC
386
405
  did-cli config set contractDid 0x1234... --network sepolia # Set sepolia contract
406
+ did-cli config set queryContract 0x637197... --network sepolia # Set query contract
387
407
  did-cli config set rpc https://my-rpc.com --network custom_net # Create new network
388
408
 
409
+ # Fetch all domains
410
+ did-cli fetch-all # Fetch all mainnet domains (auto-named file)
411
+ did-cli fetch-all --network sepolia # Fetch all sepolia domains
412
+ did-cli fetch-all --output ./my-domains.json # Custom output file path
413
+ did-cli fetch-all --network sepolia --verbose # With progress details
414
+
389
415
  # Utilities
390
416
  did-cli convert pem-to-der ./public-key.pem
391
417
  did-cli convert ip-to-bytes 192.168.1.1
@@ -413,27 +439,12 @@ async function fetchDomain(domain, options) {
413
439
  debug_1.debug.enable();
414
440
  debug_1.debug.setLevel(options.debugLevel);
415
441
  }
416
- // Get network configuration
417
- const config = (0, config_1.getNetworkConfig)(options.network);
418
- if (!config) {
419
- console.error(`āŒ Unknown network: ${options.network}`);
420
- console.error('Available networks:', (0, config_1.getAvailableNetworks)().join(', '));
421
- process.exit(1);
422
- }
423
- // Command line parameters take priority
424
- const finalConfig = {
425
- rpc: options.rpc || config.rpc,
426
- contractDid: options.contractDid || config.contractDid,
427
- contractRootResolver: options.contractResolver || config.contractRootResolver,
428
- contractAbiType: options.contractAbi || config.contractAbiType
429
- };
430
442
  if (debug_1.debug.isEnabled()) {
431
443
  debug_1.debug.info(`šŸ” Fetching domain: ${domain}`);
432
444
  debug_1.debug.info(`🌐 Network: ${options.network}`);
433
- debug_1.debug.info('Using configuration:', finalConfig);
434
445
  }
435
- // Create DID console instance
436
- const olaresId = index_1.default.createConsole(finalConfig.rpc, finalConfig.contractDid, finalConfig.contractRootResolver, finalConfig.contractAbiType);
446
+ // Use getConsole helper to create console instance
447
+ const olaresId = getConsole(options);
437
448
  // Fetch domain data
438
449
  const domainData = await olaresId.fetchDomain(domain);
439
450
  if (!domainData) {
@@ -450,6 +461,70 @@ async function fetchDomain(domain, options) {
450
461
  process.exit(1);
451
462
  }
452
463
  }
464
+ async function fetchAll(options) {
465
+ try {
466
+ // Set debug options
467
+ if (options.verbose || options.debug) {
468
+ debug_1.debug.enable();
469
+ debug_1.debug.setLevel(options.debugLevel);
470
+ }
471
+ if (debug_1.debug.isEnabled()) {
472
+ debug_1.debug.info('šŸ” Fetching all domains');
473
+ debug_1.debug.info(`🌐 Network: ${options.network}`);
474
+ }
475
+ // Use getConsole helper to create console instance
476
+ const olaresId = getConsole(options);
477
+ // Check if query contract is configured
478
+ if (!olaresId.queryContractAddress) {
479
+ console.error('āŒ Query contract address not configured for this network');
480
+ console.error(` Use: did-cli config set queryContract <address> --network ${options.network}`);
481
+ process.exit(1);
482
+ }
483
+ console.log('šŸ“” Fetching all domains from contract...');
484
+ console.log(` Network: ${options.network}`);
485
+ console.log(` Query Contract: ${olaresId.queryContractAddress}`);
486
+ console.log();
487
+ let totalDomains = 0;
488
+ const startTime = Date.now();
489
+ // Fetch all domains with progress
490
+ const domains = await olaresId.fetchAllFlat({
491
+ batchSize: 100,
492
+ onProgress: (current, total) => {
493
+ totalDomains = total;
494
+ const percent = ((current / total) * 100).toFixed(1);
495
+ process.stdout.write(`\rā³ Progress: ${current}/${total} (${percent}%)`);
496
+ }
497
+ });
498
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
499
+ process.stdout.write('\r' + ' '.repeat(50) + '\r'); // Clear progress line
500
+ console.log(`āœ… Fetched ${totalDomains} domains in ${elapsed}s`);
501
+ console.log();
502
+ // Determine output file path
503
+ const timestamp = new Date()
504
+ .toISOString()
505
+ .replace(/[:.]/g, '-')
506
+ .split('T')[0];
507
+ const defaultFilename = `domains-${options.network}-${timestamp}.json`;
508
+ const outputPath = options.output || path.join(process.cwd(), defaultFilename);
509
+ // Save to file
510
+ const jsonContent = JSON.stringify(domains, null, 2);
511
+ fs.writeFileSync(outputPath, jsonContent, 'utf-8');
512
+ console.log(`šŸ’¾ Saved to: ${outputPath}`);
513
+ console.log(` File size: ${(jsonContent.length / 1024).toFixed(2)} KB`);
514
+ console.log(` Total domains: ${domains.length}`);
515
+ if (debug_1.debug.isEnabled()) {
516
+ debug_1.debug.info('Fetch all completed successfully');
517
+ debug_1.debug.info(`Output file: ${outputPath}`);
518
+ }
519
+ }
520
+ catch (error) {
521
+ console.error('āŒ Error fetching all domains:', error instanceof Error ? error.message : String(error));
522
+ if (debug_1.debug.isEnabled()) {
523
+ debug_1.debug.error('Full error details:', error);
524
+ }
525
+ process.exit(1);
526
+ }
527
+ }
453
528
  // ============================================================================
454
529
  // Helper Functions
455
530
  // ============================================================================
@@ -467,9 +542,10 @@ function getConsole(options) {
467
542
  contractAbiType: options.contractAbi || networkConfig.contractAbiType,
468
543
  contractRootResolver2: options.contractRootResolver2 ||
469
544
  networkConfig.contractRootResolver2,
470
- supportSvcUrl: options.supportSvcUrl || networkConfig.supportSvcUrl
545
+ supportSvcUrl: options.supportSvcUrl || networkConfig.supportSvcUrl,
546
+ queryContract: networkConfig.queryContract
471
547
  };
472
- return index_1.default.createConsole(config.rpc, config.contractDid, config.contractRootResolver, config.contractAbiType, config.contractRootResolver2, config.supportSvcUrl);
548
+ return index_1.default.createConsole(config.rpc, config.contractDid, config.contractRootResolver, config.contractAbiType, config.contractRootResolver2, config.supportSvcUrl, config.queryContract);
473
549
  }
474
550
  function getPrivateKeyOrMnemonic() {
475
551
  const key = process.env.PRIVATE_KEY_OR_MNEMONIC;
@@ -1550,6 +1626,7 @@ async function configShow(options) {
1550
1626
  console.log(` Contract ABIType: ${networkConfig.contractAbiType}`);
1551
1627
  console.log(` Contract RootResolver2: ${networkConfig.contractRootResolver2}`);
1552
1628
  console.log(` Support Service URL: ${networkConfig.supportSvcUrl}`);
1629
+ console.log(` Query Contract: ${networkConfig.queryContract || '(not set)'}`);
1553
1630
  console.log(`\nšŸ“„ Configuration file: ${(0, config_1.getConfigFilePath)()}`);
1554
1631
  }
1555
1632
  }
@@ -1606,7 +1683,8 @@ async function configSet(key, value, options) {
1606
1683
  'contractRootResolver',
1607
1684
  'contractAbiType',
1608
1685
  'contractRootResolver2',
1609
- 'supportSvcUrl'
1686
+ 'supportSvcUrl',
1687
+ 'queryContract'
1610
1688
  ];
1611
1689
  if (!validKeys.includes(key)) {
1612
1690
  console.error(`āŒ Invalid config key: ${key}`);
@@ -1727,14 +1805,17 @@ async function tagDefine(domain, tagName, typeString, options) {
1727
1805
  /**
1728
1806
  * Set tag value
1729
1807
  */
1730
- async function tagSet(domain, tagName, valueStr, options) {
1808
+ async function tagSet(toDomain, fromDomain, tagName, valueStr, options) {
1731
1809
  try {
1732
1810
  const didConsole = getConsole(options);
1733
1811
  const privateKeyOrMnemonic = getPrivateKeyOrMnemonic();
1734
1812
  await didConsole.setSigner(privateKeyOrMnemonic);
1735
- const domainContext = didConsole.domain(domain);
1813
+ const domainContext = didConsole.domain(fromDomain);
1736
1814
  const tagCtx = domainContext.tag();
1737
- console.log(`\nšŸ“ Setting tag "${tagName}" for domain: ${domain}`);
1815
+ const fromLabel = fromDomain === '' ? '(root)' : fromDomain;
1816
+ console.log(`\nšŸ“ Setting tag "${tagName}"`);
1817
+ console.log(` From: ${fromLabel}`);
1818
+ console.log(` To: ${toDomain}`);
1738
1819
  console.log(` Value: ${valueStr}`);
1739
1820
  // Try to parse value as JSON, otherwise use as string
1740
1821
  let value;
@@ -1744,12 +1825,13 @@ async function tagSet(domain, tagName, valueStr, options) {
1744
1825
  catch {
1745
1826
  value = valueStr;
1746
1827
  }
1747
- const result = await tagCtx.setTag(domain, tagName, value);
1828
+ const result = await tagCtx.setTag(toDomain, tagName, value);
1748
1829
  if (result.success) {
1749
1830
  if (options.json) {
1750
1831
  console.log(JSON.stringify({
1751
1832
  success: true,
1752
- domain,
1833
+ from: fromDomain,
1834
+ to: toDomain,
1753
1835
  tagName,
1754
1836
  value,
1755
1837
  transactionHash: result.transactionHash,
@@ -1779,18 +1861,22 @@ async function tagSet(domain, tagName, valueStr, options) {
1779
1861
  /**
1780
1862
  * Get tag value
1781
1863
  */
1782
- async function tagGet(domain, tagName, options) {
1864
+ async function tagGet(toDomain, fromDomain, tagName, options) {
1783
1865
  try {
1784
1866
  const didConsole = getConsole(options);
1785
- const domainContext = didConsole.domain(domain);
1867
+ const domainContext = didConsole.domain(fromDomain);
1786
1868
  const tagCtx = domainContext.tag();
1787
- console.log(`\nšŸ“– Getting tag "${tagName}" for domain: ${domain}`);
1788
- const value = await tagCtx.getTag(domain, tagName);
1869
+ const fromLabel = fromDomain === '' ? '(root)' : fromDomain;
1870
+ console.log(`\nšŸ“– Getting tag "${tagName}"`);
1871
+ console.log(` From: ${fromLabel}`);
1872
+ console.log(` To: ${toDomain}`);
1873
+ const value = await tagCtx.getTag(toDomain, tagName);
1789
1874
  if (value !== null && value !== undefined) {
1790
1875
  if (options.json) {
1791
1876
  console.log(JSON.stringify({
1792
1877
  success: true,
1793
- domain,
1878
+ from: fromDomain,
1879
+ to: toDomain,
1794
1880
  tagName,
1795
1881
  value
1796
1882
  }, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2));
@@ -1809,7 +1895,8 @@ async function tagGet(domain, tagName, options) {
1809
1895
  if (options.json) {
1810
1896
  console.log(JSON.stringify({
1811
1897
  success: true,
1812
- domain,
1898
+ from: fromDomain,
1899
+ to: toDomain,
1813
1900
  tagName,
1814
1901
  value: null
1815
1902
  }));
@@ -1827,20 +1914,24 @@ async function tagGet(domain, tagName, options) {
1827
1914
  /**
1828
1915
  * Remove tag value
1829
1916
  */
1830
- async function tagRemove(domain, tagName, options) {
1917
+ async function tagRemove(toDomain, fromDomain, tagName, options) {
1831
1918
  try {
1832
1919
  const didConsole = getConsole(options);
1833
1920
  const privateKeyOrMnemonic = getPrivateKeyOrMnemonic();
1834
1921
  await didConsole.setSigner(privateKeyOrMnemonic);
1835
- const domainContext = didConsole.domain(domain);
1922
+ const domainContext = didConsole.domain(fromDomain);
1836
1923
  const tagCtx = domainContext.tag();
1837
- console.log(`\nšŸ—‘ļø Removing tag "${tagName}" for domain: ${domain}`);
1838
- const result = await tagCtx.removeTag(domain, tagName);
1924
+ const fromLabel = fromDomain === '' ? '(root)' : fromDomain;
1925
+ console.log(`\nšŸ—‘ļø Removing tag "${tagName}"`);
1926
+ console.log(` From: ${fromLabel}`);
1927
+ console.log(` To: ${toDomain}`);
1928
+ const result = await tagCtx.removeTag(toDomain, tagName);
1839
1929
  if (result.success) {
1840
1930
  if (options.json) {
1841
1931
  console.log(JSON.stringify({
1842
1932
  success: true,
1843
- domain,
1933
+ from: fromDomain,
1934
+ to: toDomain,
1844
1935
  tagName,
1845
1936
  transactionHash: result.transactionHash,
1846
1937
  gasUsed: result.gasUsed?.toString(),
@@ -1869,16 +1960,21 @@ async function tagRemove(domain, tagName, options) {
1869
1960
  /**
1870
1961
  * List all tags for a domain
1871
1962
  */
1872
- async function tagList(domain, options) {
1963
+ async function tagList(toDomain, fromDomain, options) {
1873
1964
  try {
1874
1965
  const didConsole = getConsole(options);
1875
- const domainContext = didConsole.domain(domain);
1876
- console.log(`\nšŸ“‹ Listing all tags for domain: ${domain}`);
1877
- const tags = await domainContext.getAllTags();
1966
+ const domainContext = didConsole.domain(fromDomain);
1967
+ const tagCtx = domainContext.tag();
1968
+ const fromLabel = fromDomain === '' ? '(root)' : fromDomain;
1969
+ console.log(`\nšŸ“‹ Listing all tags`);
1970
+ console.log(` From: ${fromLabel}`);
1971
+ console.log(` To: ${toDomain}`);
1972
+ const tags = await tagCtx.getAllTags(toDomain);
1878
1973
  if (options.json) {
1879
1974
  console.log(JSON.stringify({
1880
1975
  success: true,
1881
- domain,
1976
+ from: fromDomain,
1977
+ to: toDomain,
1882
1978
  count: tags.length,
1883
1979
  tags
1884
1980
  }, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2));
@@ -1908,7 +2004,8 @@ async function tagListDefined(domain, options) {
1908
2004
  try {
1909
2005
  const didConsole = getConsole(options);
1910
2006
  const domainContext = didConsole.domain(domain);
1911
- console.log(`\nšŸ“‹ Listing defined tag types for domain: ${domain}`);
2007
+ const domainLabel = domain === '' ? '(root)' : domain;
2008
+ console.log(`\nšŸ“‹ Listing tag types defined by: ${domainLabel}`);
1912
2009
  const tags = await domainContext.getDefinedTags();
1913
2010
  if (options.json) {
1914
2011
  console.log(JSON.stringify({
@@ -2221,8 +2318,9 @@ async function main() {
2221
2318
  }
2222
2319
  else {
2223
2320
  console.error('āŒ Error: Usage: did-cli config set <key> <value> [--network <network>]');
2224
- console.error(' Valid keys: rpc, contractDid, contractRootResolver, contractAbiType, contractRootResolver2, supportSvcUrl');
2321
+ console.error(' Valid keys: rpc, contractDid, contractRootResolver, contractAbiType, contractRootResolver2, supportSvcUrl, queryContract');
2225
2322
  console.error('\n Example: did-cli config set rpc https://optimism.llamarpc.com --network mainnet');
2323
+ console.error(' Example: did-cli config set queryContract 0xAf0430AB9f2450c52E7401846C7CA702D53eCFC2 --network sepolia');
2226
2324
  process.exit(1);
2227
2325
  }
2228
2326
  break;
@@ -2371,7 +2469,7 @@ async function main() {
2371
2469
  case 'set':
2372
2470
  if (!domain || !value) {
2373
2471
  console.error('āŒ Error: tag set requires <domain>, <tag-name> and <value>');
2374
- console.error('Usage: did-cli tag set <domain> <tag-name> <value>');
2472
+ console.error('Usage: did-cli tag set <domain> <tag-name> <value> [--from <domain|root>]');
2375
2473
  console.error(' Value can be a string or JSON (e.g., \'["item1","item2"]\' for arrays)');
2376
2474
  console.error('\nNote: Set PRIVATE_KEY_OR_MNEMONIC environment variable first');
2377
2475
  process.exit(1);
@@ -2380,14 +2478,15 @@ async function main() {
2380
2478
  const args = process.argv.slice(2);
2381
2479
  const setIdx = args.indexOf('set');
2382
2480
  if (setIdx >= 0 && args.length > setIdx + 3) {
2383
- const actualDomain = args[setIdx + 1];
2481
+ const actualDomain = (0, olares_id_1.normalizeToDomain)(args[setIdx + 1]);
2482
+ const fromDomain = normalizeTagFromDomain(options.from, actualDomain);
2384
2483
  const tagName = args[setIdx + 2];
2385
2484
  const valueStr = args[setIdx + 3];
2386
- await tagSet(actualDomain, tagName, valueStr, options);
2485
+ await tagSet(actualDomain, fromDomain, tagName, valueStr, options);
2387
2486
  }
2388
2487
  else {
2389
2488
  console.error('āŒ Error: Missing arguments for tag set');
2390
- console.error('Usage: did-cli tag set <domain> <tag-name> <value>');
2489
+ console.error('Usage: did-cli tag set <domain> <tag-name> <value> [--from <domain|root>]');
2391
2490
  process.exit(1);
2392
2491
  }
2393
2492
  }
@@ -2395,20 +2494,21 @@ async function main() {
2395
2494
  case 'get':
2396
2495
  if (!domain) {
2397
2496
  console.error('āŒ Error: tag get requires <domain> and <tag-name>');
2398
- console.error('Usage: did-cli tag get <domain> <tag-name>');
2497
+ console.error('Usage: did-cli tag get <domain> <tag-name> [--from <domain|root>]');
2399
2498
  process.exit(1);
2400
2499
  }
2401
2500
  {
2402
2501
  const args = process.argv.slice(2);
2403
2502
  const getIdx = args.indexOf('get');
2404
2503
  if (getIdx >= 0 && args.length > getIdx + 2) {
2405
- const actualDomain = args[getIdx + 1];
2504
+ const actualDomain = (0, olares_id_1.normalizeToDomain)(args[getIdx + 1]);
2505
+ const fromDomain = normalizeTagFromDomain(options.from, actualDomain);
2406
2506
  const tagName = args[getIdx + 2];
2407
- await tagGet(actualDomain, tagName, options);
2507
+ await tagGet(actualDomain, fromDomain, tagName, options);
2408
2508
  }
2409
2509
  else {
2410
2510
  console.error('āŒ Error: Missing arguments for tag get');
2411
- console.error('Usage: did-cli tag get <domain> <tag-name>');
2511
+ console.error('Usage: did-cli tag get <domain> <tag-name> [--from <domain|root>]');
2412
2512
  process.exit(1);
2413
2513
  }
2414
2514
  }
@@ -2416,7 +2516,7 @@ async function main() {
2416
2516
  case 'remove':
2417
2517
  if (!domain) {
2418
2518
  console.error('āŒ Error: tag remove requires <domain> and <tag-name>');
2419
- console.error('Usage: did-cli tag remove <domain> <tag-name>');
2519
+ console.error('Usage: did-cli tag remove <domain> <tag-name> [--from <domain|root>]');
2420
2520
  console.error('\nNote: Set PRIVATE_KEY_OR_MNEMONIC environment variable first');
2421
2521
  process.exit(1);
2422
2522
  }
@@ -2424,13 +2524,14 @@ async function main() {
2424
2524
  const args = process.argv.slice(2);
2425
2525
  const removeIdx = args.indexOf('remove');
2426
2526
  if (removeIdx >= 0 && args.length > removeIdx + 2) {
2427
- const actualDomain = args[removeIdx + 1];
2527
+ const actualDomain = (0, olares_id_1.normalizeToDomain)(args[removeIdx + 1]);
2528
+ const fromDomain = normalizeTagFromDomain(options.from, actualDomain);
2428
2529
  const tagName = args[removeIdx + 2];
2429
- await tagRemove(actualDomain, tagName, options);
2530
+ await tagRemove(actualDomain, fromDomain, tagName, options);
2430
2531
  }
2431
2532
  else {
2432
2533
  console.error('āŒ Error: Missing arguments for tag remove');
2433
- console.error('Usage: did-cli tag remove <domain> <tag-name>');
2534
+ console.error('Usage: did-cli tag remove <domain> <tag-name> [--from <domain|root>]');
2434
2535
  process.exit(1);
2435
2536
  }
2436
2537
  }
@@ -2438,18 +2539,15 @@ async function main() {
2438
2539
  case 'list':
2439
2540
  if (!domain) {
2440
2541
  console.error('āŒ Error: Domain argument is required');
2441
- console.error('Usage: did-cli tag list <domain>');
2542
+ console.error('Usage: did-cli tag list <domain> [--from <domain|root>]');
2442
2543
  process.exit(1);
2443
2544
  }
2444
- await tagList(domain, options);
2545
+ const fromDomain = normalizeTagFromDomain(options.from, domain);
2546
+ await tagList(domain, fromDomain, options);
2445
2547
  break;
2446
2548
  case 'list-defined':
2447
- if (!domain) {
2448
- console.error('āŒ Error: Domain argument is required');
2449
- console.error('Usage: did-cli tag list-defined <domain>');
2450
- process.exit(1);
2451
- }
2452
- await tagListDefined(domain, options);
2549
+ // domain defaults to "" (root) when not provided
2550
+ await tagListDefined(domain ?? '', options);
2453
2551
  break;
2454
2552
  case 'set-tagger':
2455
2553
  if (!domain || !value) {
@@ -2513,6 +2611,9 @@ async function main() {
2513
2611
  }
2514
2612
  await fetchDomain(domain, options);
2515
2613
  break;
2614
+ case 'fetch-all':
2615
+ await fetchAll(options);
2616
+ break;
2516
2617
  default:
2517
2618
  console.error(`āŒ Unknown command: ${command}`);
2518
2619
  console.error('Run "did-cli help" for usage information');