@trufnetwork/sdk-js 0.3.8 → 0.4.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 (78) hide show
  1. package/dist/cjs/client/client.cjs +44 -0
  2. package/dist/cjs/client/client.cjs.map +2 -2
  3. package/dist/cjs/contracts-api/action.cjs +301 -77
  4. package/dist/cjs/contracts-api/action.cjs.map +3 -3
  5. package/dist/cjs/contracts-api/cache.integration.test.cjs +265 -0
  6. package/dist/cjs/contracts-api/cache.integration.test.cjs.map +7 -0
  7. package/dist/cjs/contracts-api/composedAction.cjs +86 -0
  8. package/dist/cjs/contracts-api/composedAction.cjs.map +2 -2
  9. package/dist/cjs/contracts-api/composedAction.test.cjs +301 -0
  10. package/dist/cjs/contracts-api/composedAction.test.cjs.map +7 -0
  11. package/dist/cjs/index.common.cjs.map +1 -1
  12. package/dist/cjs/types/cache.cjs +34 -0
  13. package/dist/cjs/types/cache.cjs.map +7 -0
  14. package/dist/cjs/types/cache.test.cjs +205 -0
  15. package/dist/cjs/types/cache.test.cjs.map +7 -0
  16. package/dist/cjs/util/cacheMetadataParser.cjs +174 -0
  17. package/dist/cjs/util/cacheMetadataParser.cjs.map +7 -0
  18. package/dist/cjs/util/cacheMetadataParser.test.cjs +329 -0
  19. package/dist/cjs/util/cacheMetadataParser.test.cjs.map +7 -0
  20. package/dist/cjs/util/cacheValidation.cjs +88 -0
  21. package/dist/cjs/util/cacheValidation.cjs.map +7 -0
  22. package/dist/cjs/util/cacheValidation.test.cjs +108 -0
  23. package/dist/cjs/util/cacheValidation.test.cjs.map +7 -0
  24. package/dist/esm/client/client.mjs +44 -0
  25. package/dist/esm/client/client.mjs.map +2 -2
  26. package/dist/esm/contracts-api/action.mjs +302 -77
  27. package/dist/esm/contracts-api/action.mjs.map +3 -3
  28. package/dist/esm/contracts-api/cache.integration.test.mjs +263 -0
  29. package/dist/esm/contracts-api/cache.integration.test.mjs.map +7 -0
  30. package/dist/esm/contracts-api/composedAction.mjs +86 -0
  31. package/dist/esm/contracts-api/composedAction.mjs.map +2 -2
  32. package/dist/esm/contracts-api/composedAction.test.mjs +299 -0
  33. package/dist/esm/contracts-api/composedAction.test.mjs.map +7 -0
  34. package/dist/esm/index.common.mjs.map +1 -1
  35. package/dist/esm/types/cache.mjs +13 -0
  36. package/dist/esm/types/cache.mjs.map +7 -0
  37. package/dist/esm/types/cache.test.mjs +203 -0
  38. package/dist/esm/types/cache.test.mjs.map +7 -0
  39. package/dist/esm/util/cacheMetadataParser.mjs +153 -0
  40. package/dist/esm/util/cacheMetadataParser.mjs.map +7 -0
  41. package/dist/esm/util/cacheMetadataParser.test.mjs +327 -0
  42. package/dist/esm/util/cacheMetadataParser.test.mjs.map +7 -0
  43. package/dist/esm/util/cacheValidation.mjs +67 -0
  44. package/dist/esm/util/cacheValidation.mjs.map +7 -0
  45. package/dist/esm/util/cacheValidation.test.mjs +106 -0
  46. package/dist/esm/util/cacheValidation.test.mjs.map +7 -0
  47. package/dist/tsconfig.build.tsbuildinfo +1 -1
  48. package/dist/types/client/client.d.ts +39 -1
  49. package/dist/types/client/client.d.ts.map +1 -1
  50. package/dist/types/contracts-api/action.d.ts +11 -1
  51. package/dist/types/contracts-api/action.d.ts.map +1 -1
  52. package/dist/types/contracts-api/cache.integration.test.d.ts +2 -0
  53. package/dist/types/contracts-api/cache.integration.test.d.ts.map +1 -0
  54. package/dist/types/contracts-api/composedAction.d.ts +75 -0
  55. package/dist/types/contracts-api/composedAction.d.ts.map +1 -1
  56. package/dist/types/contracts-api/composedAction.test.d.ts +2 -0
  57. package/dist/types/contracts-api/composedAction.test.d.ts.map +1 -0
  58. package/dist/types/index.common.d.ts +1 -1
  59. package/dist/types/index.common.d.ts.map +1 -1
  60. package/dist/types/types/cache.d.ts +129 -0
  61. package/dist/types/types/cache.d.ts.map +1 -0
  62. package/dist/types/types/cache.test.d.ts +2 -0
  63. package/dist/types/types/cache.test.d.ts.map +1 -0
  64. package/dist/types/util/cacheMetadataParser.d.ts +38 -0
  65. package/dist/types/util/cacheMetadataParser.d.ts.map +1 -0
  66. package/dist/types/util/cacheMetadataParser.test.d.ts +2 -0
  67. package/dist/types/util/cacheMetadataParser.test.d.ts.map +1 -0
  68. package/dist/types/util/cacheValidation.d.ts +27 -0
  69. package/dist/types/util/cacheValidation.d.ts.map +1 -0
  70. package/dist/types/util/cacheValidation.test.d.ts +2 -0
  71. package/dist/types/util/cacheValidation.test.d.ts.map +1 -0
  72. package/package.json +5 -3
  73. package/dist/cjs/client/client.test.cjs +0 -32
  74. package/dist/cjs/client/client.test.cjs.map +0 -7
  75. package/dist/esm/client/client.test.mjs +0 -30
  76. package/dist/esm/client/client.test.mjs.map +0 -7
  77. package/dist/types/client/client.test.d.ts +0 -2
  78. package/dist/types/client/client.test.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/cacheValidation.ts"],
4
+ "sourcesContent": ["import { GetRecordOptions, GetIndexOptions, GetIndexChangeOptions, GetFirstRecordOptions } from '../types/cache';\n\n/**\n * Validation utilities for cache-related parameters\n */\nexport class CacheValidation {\n /**\n * Validates GetRecordOptions parameters\n */\n static validateGetRecordOptions(options: GetRecordOptions): void {\n if (options.from !== undefined && (typeof options.from !== 'number' || options.from < 0)) {\n throw new Error('Invalid from parameter: must be a non-negative number');\n }\n \n if (options.to !== undefined && (typeof options.to !== 'number' || options.to < 0)) {\n throw new Error('Invalid to parameter: must be a non-negative number');\n }\n \n if (options.frozenAt !== undefined && (typeof options.frozenAt !== 'number' || options.frozenAt < 0)) {\n throw new Error('Invalid frozenAt parameter: must be a non-negative number');\n }\n \n if (options.useCache !== undefined && typeof options.useCache !== 'boolean') {\n throw new Error('Invalid useCache parameter: must be a boolean');\n }\n \n if (options.prefix !== undefined && typeof options.prefix !== 'string') {\n throw new Error('Invalid prefix parameter: must be a string');\n }\n \n if (options.baseTime !== undefined && typeof options.baseTime !== 'number' && typeof options.baseTime !== 'string') {\n throw new Error('Invalid baseTime parameter: must be a number or string');\n }\n }\n \n /**\n * Validates GetIndexOptions parameters\n */\n static validateGetIndexOptions(options: GetIndexOptions): void {\n // GetIndexOptions has the same validation as GetRecordOptions\n this.validateGetRecordOptions(options);\n }\n \n /**\n * Validates GetIndexChangeOptions parameters\n */\n static validateGetIndexChangeOptions(options: GetIndexChangeOptions): void {\n // Validate base options\n this.validateGetRecordOptions(options);\n \n // Validate timeInterval - required for index change\n if (typeof options.timeInterval !== 'number' || options.timeInterval <= 0) {\n throw new Error('Invalid timeInterval parameter: must be a positive number');\n }\n }\n \n /**\n * Validates GetFirstRecordOptions parameters\n */\n static validateGetFirstRecordOptions(options: GetFirstRecordOptions): void {\n if (options.after !== undefined && (typeof options.after !== 'number' || options.after < 0)) {\n throw new Error('Invalid after parameter: must be a non-negative number');\n }\n \n if (options.frozenAt !== undefined && (typeof options.frozenAt !== 'number' || options.frozenAt < 0)) {\n throw new Error('Invalid frozenAt parameter: must be a non-negative number');\n }\n \n if (options.useCache !== undefined && typeof options.useCache !== 'boolean') {\n throw new Error('Invalid useCache parameter: must be a boolean');\n }\n }\n \n /**\n * Validates time range parameters\n */\n static validateTimeRange(from?: number, to?: number): void {\n if (from !== undefined && to !== undefined && from > to) {\n throw new Error('Invalid time range: from time cannot be greater than to time');\n }\n }\n}"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA,EAI3B,OAAO,yBAAyB,SAAiC;AAC/D,QAAI,QAAQ,SAAS,WAAc,OAAO,QAAQ,SAAS,YAAY,QAAQ,OAAO,IAAI;AACxF,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,QAAI,QAAQ,OAAO,WAAc,OAAO,QAAQ,OAAO,YAAY,QAAQ,KAAK,IAAI;AAClF,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,QAAI,QAAQ,aAAa,WAAc,OAAO,QAAQ,aAAa,YAAY,QAAQ,WAAW,IAAI;AACpG,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAEA,QAAI,QAAQ,aAAa,UAAa,OAAO,QAAQ,aAAa,WAAW;AAC3E,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,QAAI,QAAQ,WAAW,UAAa,OAAO,QAAQ,WAAW,UAAU;AACtE,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,QAAI,QAAQ,aAAa,UAAa,OAAO,QAAQ,aAAa,YAAY,OAAO,QAAQ,aAAa,UAAU;AAClH,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAwB,SAAgC;AAE7D,SAAK,yBAAyB,OAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,8BAA8B,SAAsC;AAEzE,SAAK,yBAAyB,OAAO;AAGrC,QAAI,OAAO,QAAQ,iBAAiB,YAAY,QAAQ,gBAAgB,GAAG;AACzE,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,8BAA8B,SAAsC;AACzE,QAAI,QAAQ,UAAU,WAAc,OAAO,QAAQ,UAAU,YAAY,QAAQ,QAAQ,IAAI;AAC3F,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAEA,QAAI,QAAQ,aAAa,WAAc,OAAO,QAAQ,aAAa,YAAY,QAAQ,WAAW,IAAI;AACpG,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAEA,QAAI,QAAQ,aAAa,UAAa,OAAO,QAAQ,aAAa,WAAW;AAC3E,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,MAAe,IAAmB;AACzD,QAAI,SAAS,UAAa,OAAO,UAAa,OAAO,IAAI;AACvD,YAAM,IAAI,MAAM,8DAA8D;AAAA,IAChF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ // src/util/cacheValidation.test.ts
4
+ var import_vitest = require("vitest");
5
+ var import_cacheValidation = require("./cacheValidation.cjs");
6
+ (0, import_vitest.describe)("CacheValidation", () => {
7
+ (0, import_vitest.describe)("validateGetRecordOptions", () => {
8
+ (0, import_vitest.it)("should validate correct options", () => {
9
+ const options = {
10
+ from: 1609459200,
11
+ to: 1609545600,
12
+ frozenAt: 1609459200,
13
+ useCache: true,
14
+ prefix: "test_",
15
+ baseTime: 1609459200
16
+ };
17
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions(options)).not.toThrow();
18
+ });
19
+ (0, import_vitest.it)("should validate options with string baseTime", () => {
20
+ const options = {
21
+ baseTime: "2021-01-01",
22
+ useCache: true
23
+ };
24
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions(options)).not.toThrow();
25
+ });
26
+ (0, import_vitest.it)("should validate empty options", () => {
27
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({})).not.toThrow();
28
+ });
29
+ (0, import_vitest.it)("should throw for invalid from parameter", () => {
30
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({ from: -1 })).toThrow("Invalid from parameter: must be a non-negative number");
31
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({ from: "invalid" })).toThrow("Invalid from parameter: must be a non-negative number");
32
+ });
33
+ (0, import_vitest.it)("should throw for invalid to parameter", () => {
34
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({ to: -1 })).toThrow("Invalid to parameter: must be a non-negative number");
35
+ });
36
+ (0, import_vitest.it)("should throw for invalid frozenAt parameter", () => {
37
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({ frozenAt: -1 })).toThrow("Invalid frozenAt parameter: must be a non-negative number");
38
+ });
39
+ (0, import_vitest.it)("should throw for invalid useCache parameter", () => {
40
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({ useCache: "true" })).toThrow("Invalid useCache parameter: must be a boolean");
41
+ });
42
+ (0, import_vitest.it)("should throw for invalid prefix parameter", () => {
43
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({ prefix: 123 })).toThrow("Invalid prefix parameter: must be a string");
44
+ });
45
+ (0, import_vitest.it)("should throw for invalid baseTime parameter", () => {
46
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetRecordOptions({ baseTime: true })).toThrow("Invalid baseTime parameter: must be a number or string");
47
+ });
48
+ });
49
+ (0, import_vitest.describe)("validateGetIndexChangeOptions", () => {
50
+ (0, import_vitest.it)("should validate correct options", () => {
51
+ const options = {
52
+ from: 1609459200,
53
+ to: 1609545600,
54
+ timeInterval: 3600,
55
+ useCache: true
56
+ };
57
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetIndexChangeOptions(options)).not.toThrow();
58
+ });
59
+ (0, import_vitest.it)("should throw for missing timeInterval", () => {
60
+ const options = {
61
+ from: 1609459200,
62
+ to: 1609545600
63
+ };
64
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetIndexChangeOptions(options)).toThrow("Invalid timeInterval parameter: must be a positive number");
65
+ });
66
+ (0, import_vitest.it)("should throw for invalid timeInterval", () => {
67
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetIndexChangeOptions({ timeInterval: -1 })).toThrow("Invalid timeInterval parameter: must be a positive number");
68
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetIndexChangeOptions({ timeInterval: 0 })).toThrow("Invalid timeInterval parameter: must be a positive number");
69
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetIndexChangeOptions({ timeInterval: "invalid" })).toThrow("Invalid timeInterval parameter: must be a positive number");
70
+ });
71
+ });
72
+ (0, import_vitest.describe)("validateGetFirstRecordOptions", () => {
73
+ (0, import_vitest.it)("should validate correct options", () => {
74
+ const options = {
75
+ after: 1609459200,
76
+ frozenAt: 1609459200,
77
+ useCache: true
78
+ };
79
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetFirstRecordOptions(options)).not.toThrow();
80
+ });
81
+ (0, import_vitest.it)("should throw for invalid after parameter", () => {
82
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetFirstRecordOptions({ after: -1 })).toThrow("Invalid after parameter: must be a non-negative number");
83
+ });
84
+ (0, import_vitest.it)("should throw for invalid frozenAt parameter", () => {
85
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetFirstRecordOptions({ frozenAt: -1 })).toThrow("Invalid frozenAt parameter: must be a non-negative number");
86
+ });
87
+ (0, import_vitest.it)("should throw for invalid useCache parameter", () => {
88
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateGetFirstRecordOptions({ useCache: "true" })).toThrow("Invalid useCache parameter: must be a boolean");
89
+ });
90
+ });
91
+ (0, import_vitest.describe)("validateTimeRange", () => {
92
+ (0, import_vitest.it)("should validate correct time range", () => {
93
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateTimeRange(1609459200, 1609545600)).not.toThrow();
94
+ });
95
+ (0, import_vitest.it)("should validate undefined parameters", () => {
96
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateTimeRange(void 0, void 0)).not.toThrow();
97
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateTimeRange(1609459200, void 0)).not.toThrow();
98
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateTimeRange(void 0, 1609545600)).not.toThrow();
99
+ });
100
+ (0, import_vitest.it)("should validate equal times", () => {
101
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateTimeRange(1609459200, 1609459200)).not.toThrow();
102
+ });
103
+ (0, import_vitest.it)("should throw for invalid time range", () => {
104
+ (0, import_vitest.expect)(() => import_cacheValidation.CacheValidation.validateTimeRange(1609545600, 1609459200)).toThrow("Invalid time range: from time cannot be greater than to time");
105
+ });
106
+ });
107
+ });
108
+ //# sourceMappingURL=cacheValidation.test.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/cacheValidation.test.ts"],
4
+ "sourcesContent": ["import { describe, it, expect } from 'vitest';\nimport { CacheValidation } from './cacheValidation';\n\ndescribe('CacheValidation', () => {\n describe('validateGetRecordOptions', () => {\n it('should validate correct options', () => {\n const options = {\n from: 1609459200,\n to: 1609545600,\n frozenAt: 1609459200,\n useCache: true,\n prefix: 'test_',\n baseTime: 1609459200\n };\n \n expect(() => CacheValidation.validateGetRecordOptions(options)).not.toThrow();\n });\n\n it('should validate options with string baseTime', () => {\n const options = {\n baseTime: '2021-01-01',\n useCache: true\n };\n \n expect(() => CacheValidation.validateGetRecordOptions(options)).not.toThrow();\n });\n\n it('should validate empty options', () => {\n expect(() => CacheValidation.validateGetRecordOptions({})).not.toThrow();\n });\n\n it('should throw for invalid from parameter', () => {\n expect(() => CacheValidation.validateGetRecordOptions({ from: -1 }))\n .toThrow('Invalid from parameter: must be a non-negative number');\n \n expect(() => CacheValidation.validateGetRecordOptions({ from: 'invalid' as any }))\n .toThrow('Invalid from parameter: must be a non-negative number');\n });\n\n it('should throw for invalid to parameter', () => {\n expect(() => CacheValidation.validateGetRecordOptions({ to: -1 }))\n .toThrow('Invalid to parameter: must be a non-negative number');\n });\n\n it('should throw for invalid frozenAt parameter', () => {\n expect(() => CacheValidation.validateGetRecordOptions({ frozenAt: -1 }))\n .toThrow('Invalid frozenAt parameter: must be a non-negative number');\n });\n\n it('should throw for invalid useCache parameter', () => {\n expect(() => CacheValidation.validateGetRecordOptions({ useCache: 'true' as any }))\n .toThrow('Invalid useCache parameter: must be a boolean');\n });\n\n it('should throw for invalid prefix parameter', () => {\n expect(() => CacheValidation.validateGetRecordOptions({ prefix: 123 as any }))\n .toThrow('Invalid prefix parameter: must be a string');\n });\n\n it('should throw for invalid baseTime parameter', () => {\n expect(() => CacheValidation.validateGetRecordOptions({ baseTime: true as any }))\n .toThrow('Invalid baseTime parameter: must be a number or string');\n });\n });\n\n describe('validateGetIndexChangeOptions', () => {\n it('should validate correct options', () => {\n const options = {\n from: 1609459200,\n to: 1609545600,\n timeInterval: 3600,\n useCache: true\n };\n \n expect(() => CacheValidation.validateGetIndexChangeOptions(options)).not.toThrow();\n });\n\n it('should throw for missing timeInterval', () => {\n const options = {\n from: 1609459200,\n to: 1609545600\n };\n \n expect(() => CacheValidation.validateGetIndexChangeOptions(options as any))\n .toThrow('Invalid timeInterval parameter: must be a positive number');\n });\n\n it('should throw for invalid timeInterval', () => {\n expect(() => CacheValidation.validateGetIndexChangeOptions({ timeInterval: -1 }))\n .toThrow('Invalid timeInterval parameter: must be a positive number');\n \n expect(() => CacheValidation.validateGetIndexChangeOptions({ timeInterval: 0 }))\n .toThrow('Invalid timeInterval parameter: must be a positive number');\n \n expect(() => CacheValidation.validateGetIndexChangeOptions({ timeInterval: 'invalid' as any }))\n .toThrow('Invalid timeInterval parameter: must be a positive number');\n });\n });\n\n describe('validateGetFirstRecordOptions', () => {\n it('should validate correct options', () => {\n const options = {\n after: 1609459200,\n frozenAt: 1609459200,\n useCache: true\n };\n \n expect(() => CacheValidation.validateGetFirstRecordOptions(options)).not.toThrow();\n });\n\n it('should throw for invalid after parameter', () => {\n expect(() => CacheValidation.validateGetFirstRecordOptions({ after: -1 }))\n .toThrow('Invalid after parameter: must be a non-negative number');\n });\n\n it('should throw for invalid frozenAt parameter', () => {\n expect(() => CacheValidation.validateGetFirstRecordOptions({ frozenAt: -1 }))\n .toThrow('Invalid frozenAt parameter: must be a non-negative number');\n });\n\n it('should throw for invalid useCache parameter', () => {\n expect(() => CacheValidation.validateGetFirstRecordOptions({ useCache: 'true' as any }))\n .toThrow('Invalid useCache parameter: must be a boolean');\n });\n });\n\n describe('validateTimeRange', () => {\n it('should validate correct time range', () => {\n expect(() => CacheValidation.validateTimeRange(1609459200, 1609545600)).not.toThrow();\n });\n\n it('should validate undefined parameters', () => {\n expect(() => CacheValidation.validateTimeRange(undefined, undefined)).not.toThrow();\n expect(() => CacheValidation.validateTimeRange(1609459200, undefined)).not.toThrow();\n expect(() => CacheValidation.validateTimeRange(undefined, 1609545600)).not.toThrow();\n });\n\n it('should validate equal times', () => {\n expect(() => CacheValidation.validateTimeRange(1609459200, 1609459200)).not.toThrow();\n });\n\n it('should throw for invalid time range', () => {\n expect(() => CacheValidation.validateTimeRange(1609545600, 1609459200))\n .toThrow('Invalid time range: from time cannot be greater than to time');\n });\n });\n});"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -176,6 +176,50 @@ var BaseTNClient = class {
176
176
  async getLastTransactions(input) {
177
177
  return getLastTransactions(this.getKwilClient(), this.getKwilSigner(), input);
178
178
  }
179
+ /**
180
+ * Lists taxonomies by height range for incremental synchronization.
181
+ * High-level wrapper for ComposedAction.listTaxonomiesByHeight()
182
+ *
183
+ * @param params Height range and pagination parameters
184
+ * @returns Promise resolving to taxonomy query results
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * const taxonomies = await client.listTaxonomiesByHeight({
189
+ * fromHeight: 1000,
190
+ * toHeight: 2000,
191
+ * limit: 100,
192
+ * latestOnly: true
193
+ * });
194
+ * ```
195
+ */
196
+ async listTaxonomiesByHeight(params = {}) {
197
+ const composedAction = this.loadComposedAction();
198
+ return composedAction.listTaxonomiesByHeight(params);
199
+ }
200
+ /**
201
+ * Gets taxonomies for specific streams in batch.
202
+ * High-level wrapper for ComposedAction.getTaxonomiesForStreams()
203
+ *
204
+ * @param params Stream locators and options
205
+ * @returns Promise resolving to taxonomy query results
206
+ *
207
+ * @example
208
+ * ```typescript
209
+ * const streams = [
210
+ * { dataProvider: provider1, streamId: streamId1 },
211
+ * { dataProvider: provider2, streamId: streamId2 }
212
+ * ];
213
+ * const taxonomies = await client.getTaxonomiesForStreams({
214
+ * streams,
215
+ * latestOnly: true
216
+ * });
217
+ * ```
218
+ */
219
+ async getTaxonomiesForStreams(params) {
220
+ const composedAction = this.loadComposedAction();
221
+ return composedAction.getTaxonomiesForStreams(params);
222
+ }
179
223
  /**
180
224
  * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.
181
225
  * @param provider - The provider URL.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/client.ts"],
4
- "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@trufnetwork/kwil-js\";\nimport { KwilConfig } from \"@trufnetwork/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@trufnetwork/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@trufnetwork/kwil-js/dist/core/signature\";\nimport { EnvironmentType } from \"@trufnetwork/kwil-js/dist/core/enums\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { TxInfoReceipt } from \"@trufnetwork/kwil-js/dist/core/txQuery\";\nimport { ComposedAction } from \"../contracts-api/composedAction\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { deleteStream } from \"../contracts-api/deleteStream\";\nimport { PrimitiveAction } from \"../contracts-api/primitiveAction\";\nimport { Action } from \"../contracts-api/action\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator, TNStream } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listStreams } from \"./listStreams\";\nimport { getLastTransactions } from \"./getLastTransactions\";\nimport { RoleManagement } from \"../contracts-api/roleManagement\";\nimport { OwnerIdentifier } from \"../types/role\";\n\nexport interface SignerInfo {\n // we need to have the address upfront to create the KwilSigner, instead of relying on the signer to return it asynchronously\n address: string;\n signer: EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport interface ListStreamsInput {\n dataProvider?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n blockHeight?: number;\n}\n\n/**\n * @param dataProvider optional address; when omitted or null, returns for all providers\n * @param limitSize max rows to return (default 6, max 100)\n */\nexport interface GetLastTransactionsInput {\n dataProvider?: string;\n limitSize?: number;\n}\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n }\n\n /**\n * Waits for a transaction to be mined by TN.\n * @param txHash - The transaction hash to wait for.\n * @param timeout - The timeout in milliseconds.\n * @returns A promise that resolves to the transaction info receipt.\n */\n async waitForTx(txHash: string, timeout = 12000): Promise<TxInfoReceipt> {\n return new Promise<TxInfoReceipt>(async (resolve, reject) => {\n const interval = setInterval(async () => {\n const receipt = await this.getKwilClient()\n [\"txInfoClient\"](txHash)\n .catch(() => ({ data: undefined, status: undefined }));\n switch (receipt.status) {\n case 200:\n if (receipt.data?.tx_result?.log !== undefined && receipt.data?.tx_result?.log.includes(\"ERROR\")) {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ))\n } else {\n resolve(receipt.data!);\n }\n break;\n case undefined:\n break;\n default:\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\n }\n }, 1000);\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(\"Transaction failed: Timeout\"));\n }, timeout);\n });\n }\n\n /**\n * Returns the Kwil signer used by the client.\n * @returns An instance of KwilSigner.\n */\n getKwilSigner(): KwilSigner {\n return new KwilSigner(\n this.signerInfo.signer,\n this.address().getAddress(),\n );\n }\n\n /**\n * Returns the Kwil client used by the client.\n * @returns An instance of Kwil.\n * @throws If the Kwil client is not initialized.\n */\n getKwilClient(): Kwil<EnvironmentType> {\n if (!this.kwilClient) {\n throw new Error(\"Kwil client not initialized\");\n }\n return this.kwilClient;\n }\n\n /**\n * Deploys a new stream.\n * @param streamId - The ID of the stream to deploy.\n * @param streamType - The type of the stream.\n * @param synchronous - Whether the deployment should be synchronous.\n * @param contractVersion\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async deployStream(\n streamId: StreamId,\n streamType: StreamType,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param stream - The StreamLocator of the stream to destroy.\n * @param synchronous - Whether the destruction should be synchronous.\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async destroyStream(\n stream: StreamLocator,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deleteStream({\n stream,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Loads an already deployed stream, permitting its API usage.\n * @returns An instance of IStream.\n */\n loadAction(): Action {\n return new Action(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads a primitive stream.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveAction(): PrimitiveAction {\n return PrimitiveAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads a composed stream.\n * @returns An instance of IComposedStream.\n */\n loadComposedAction(): ComposedAction {\n return ComposedAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads the role management contract API, permitting its RBAC usage.\n */\n loadRoleManagementAction(): RoleManagement {\n return RoleManagement.fromClient(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Creates a new stream locator.\n * @param streamId - The ID of the stream.\n * @returns A StreamLocator object.\n */\n ownStreamLocator(streamId: StreamId): StreamLocator {\n return {\n streamId,\n dataProvider: this.address(),\n };\n }\n\n /**\n * Returns the address of the signer used by the client.\n * @returns An instance of EthereumAddress.\n */\n address(): EthereumAddress {\n return new EthereumAddress(this.signerInfo.address);\n }\n\n /**\n * Returns all streams from the TN network.\n * @param input - The input parameters for listing streams.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getListStreams(input: ListStreamsInput): Promise<TNStream[]> {\n return listStreams(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Returns the last write activity across streams.\n * @param input - The input parameters for getting last transactions.\n * @returns A promise that resolves to a list of last transactions.\n */\n async getLastTransactions(input: GetLastTransactionsInput): Promise<any[]> {\n return getLastTransactions(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.\n * @param provider - The provider URL.\n * @returns A promise that resolves to the chain ID.\n */\n public static async getDefaultChainId(provider: string) {\n const kwilClient = new Client({\n kwilProvider: provider,\n });\n const chainInfo = await kwilClient[\"chainInfoClient\"]();\n return chainInfo.data?.chain_id;\n }\n\n /*\n * High-level role-management helpers. These wrap the lower-level\n * RoleManagement contract calls and expose a simpler API on the\n * TN client.\n */\n\n /** Grants a role to one or more wallets. */\n async grantRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.grantRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /** Revokes a role from one or more wallets. */\n async revokeRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.revokeRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /**\n * Checks if a wallet is member of a role.\n * Returns true if the wallet is a member.\n */\n async isMemberOf(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallet: EthereumAddress;\n }): Promise<boolean> {\n const rm = this.loadRoleManagementAction();\n const res = await rm.areMembersOf({\n owner: input.owner,\n roleName: input.roleName,\n wallets: [input.wallet],\n });\n return res.length > 0 && res[0].isMember;\n }\n\n /**\n * Lists role members \u2013 currently unsupported in the\n * smart-contract layer.\n */\n async listRoleMembers(input: {\n owner: OwnerIdentifier;\n roleName: string;\n limit?: number;\n offset?: number;\n }): Promise<import(\"../types/role\").RoleMember[]> {\n const rm = this.loadRoleManagementAction();\n return rm.listRoleMembers({\n owner: input.owner,\n roleName: input.roleName,\n limit: input.limit,\n offset: input.offset,\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@trufnetwork/kwil-js\";\nimport { KwilConfig } from \"@trufnetwork/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@trufnetwork/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@trufnetwork/kwil-js/dist/core/signature\";\nimport { EnvironmentType } from \"@trufnetwork/kwil-js/dist/core/enums\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { TxInfoReceipt } from \"@trufnetwork/kwil-js/dist/core/txQuery\";\nimport { ComposedAction, ListTaxonomiesByHeightParams, GetTaxonomiesForStreamsParams, TaxonomyQueryResult } from \"../contracts-api/composedAction\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { deleteStream } from \"../contracts-api/deleteStream\";\nimport { PrimitiveAction } from \"../contracts-api/primitiveAction\";\nimport { Action } from \"../contracts-api/action\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator, TNStream } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listStreams } from \"./listStreams\";\nimport { getLastTransactions } from \"./getLastTransactions\";\nimport { RoleManagement } from \"../contracts-api/roleManagement\";\nimport { OwnerIdentifier } from \"../types/role\";\n\nexport interface SignerInfo {\n // we need to have the address upfront to create the KwilSigner, instead of relying on the signer to return it asynchronously\n address: string;\n signer: EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport interface ListStreamsInput {\n dataProvider?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n blockHeight?: number;\n}\n\n/**\n * @param dataProvider optional address; when omitted or null, returns for all providers\n * @param limitSize max rows to return (default 6, max 100)\n */\nexport interface GetLastTransactionsInput {\n dataProvider?: string;\n limitSize?: number;\n}\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n }\n\n /**\n * Waits for a transaction to be mined by TN.\n * @param txHash - The transaction hash to wait for.\n * @param timeout - The timeout in milliseconds.\n * @returns A promise that resolves to the transaction info receipt.\n */\n async waitForTx(txHash: string, timeout = 12000): Promise<TxInfoReceipt> {\n return new Promise<TxInfoReceipt>(async (resolve, reject) => {\n const interval = setInterval(async () => {\n const receipt = await this.getKwilClient()\n [\"txInfoClient\"](txHash)\n .catch(() => ({ data: undefined, status: undefined }));\n switch (receipt.status) {\n case 200:\n if (receipt.data?.tx_result?.log !== undefined && receipt.data?.tx_result?.log.includes(\"ERROR\")) {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ))\n } else {\n resolve(receipt.data!);\n }\n break;\n case undefined:\n break;\n default:\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\n }\n }, 1000);\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(\"Transaction failed: Timeout\"));\n }, timeout);\n });\n }\n\n /**\n * Returns the Kwil signer used by the client.\n * @returns An instance of KwilSigner.\n */\n getKwilSigner(): KwilSigner {\n return new KwilSigner(\n this.signerInfo.signer,\n this.address().getAddress(),\n );\n }\n\n /**\n * Returns the Kwil client used by the client.\n * @returns An instance of Kwil.\n * @throws If the Kwil client is not initialized.\n */\n getKwilClient(): Kwil<EnvironmentType> {\n if (!this.kwilClient) {\n throw new Error(\"Kwil client not initialized\");\n }\n return this.kwilClient;\n }\n\n /**\n * Deploys a new stream.\n * @param streamId - The ID of the stream to deploy.\n * @param streamType - The type of the stream.\n * @param synchronous - Whether the deployment should be synchronous.\n * @param contractVersion\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async deployStream(\n streamId: StreamId,\n streamType: StreamType,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param stream - The StreamLocator of the stream to destroy.\n * @param synchronous - Whether the destruction should be synchronous.\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async destroyStream(\n stream: StreamLocator,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deleteStream({\n stream,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Loads an already deployed stream, permitting its API usage.\n * @returns An instance of IStream.\n */\n loadAction(): Action {\n return new Action(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads a primitive stream.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveAction(): PrimitiveAction {\n return PrimitiveAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads a composed stream.\n * @returns An instance of IComposedStream.\n */\n loadComposedAction(): ComposedAction {\n return ComposedAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads the role management contract API, permitting its RBAC usage.\n */\n loadRoleManagementAction(): RoleManagement {\n return RoleManagement.fromClient(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Creates a new stream locator.\n * @param streamId - The ID of the stream.\n * @returns A StreamLocator object.\n */\n ownStreamLocator(streamId: StreamId): StreamLocator {\n return {\n streamId,\n dataProvider: this.address(),\n };\n }\n\n /**\n * Returns the address of the signer used by the client.\n * @returns An instance of EthereumAddress.\n */\n address(): EthereumAddress {\n return new EthereumAddress(this.signerInfo.address);\n }\n\n /**\n * Returns all streams from the TN network.\n * @param input - The input parameters for listing streams.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getListStreams(input: ListStreamsInput): Promise<TNStream[]> {\n return listStreams(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Returns the last write activity across streams.\n * @param input - The input parameters for getting last transactions.\n * @returns A promise that resolves to a list of last transactions.\n */\n async getLastTransactions(input: GetLastTransactionsInput): Promise<any[]> {\n return getLastTransactions(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Lists taxonomies by height range for incremental synchronization.\n * High-level wrapper for ComposedAction.listTaxonomiesByHeight()\n * \n * @param params Height range and pagination parameters \n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const taxonomies = await client.listTaxonomiesByHeight({\n * fromHeight: 1000,\n * toHeight: 2000,\n * limit: 100,\n * latestOnly: true\n * });\n * ```\n */\n async listTaxonomiesByHeight(params: ListTaxonomiesByHeightParams = {}): Promise<TaxonomyQueryResult[]> {\n const composedAction = this.loadComposedAction();\n return composedAction.listTaxonomiesByHeight(params);\n }\n\n /**\n * Gets taxonomies for specific streams in batch.\n * High-level wrapper for ComposedAction.getTaxonomiesForStreams()\n * \n * @param params Stream locators and options\n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const streams = [\n * { dataProvider: provider1, streamId: streamId1 },\n * { dataProvider: provider2, streamId: streamId2 }\n * ];\n * const taxonomies = await client.getTaxonomiesForStreams({\n * streams,\n * latestOnly: true\n * });\n * ```\n */\n async getTaxonomiesForStreams(params: GetTaxonomiesForStreamsParams): Promise<TaxonomyQueryResult[]> {\n const composedAction = this.loadComposedAction();\n return composedAction.getTaxonomiesForStreams(params);\n }\n\n /**\n * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.\n * @param provider - The provider URL.\n * @returns A promise that resolves to the chain ID.\n */\n public static async getDefaultChainId(provider: string) {\n const kwilClient = new Client({\n kwilProvider: provider,\n });\n const chainInfo = await kwilClient[\"chainInfoClient\"]();\n return chainInfo.data?.chain_id;\n }\n\n /*\n * High-level role-management helpers. These wrap the lower-level\n * RoleManagement contract calls and expose a simpler API on the\n * TN client.\n */\n\n /** Grants a role to one or more wallets. */\n async grantRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.grantRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /** Revokes a role from one or more wallets. */\n async revokeRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.revokeRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /**\n * Checks if a wallet is member of a role.\n * Returns true if the wallet is a member.\n */\n async isMemberOf(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallet: EthereumAddress;\n }): Promise<boolean> {\n const rm = this.loadRoleManagementAction();\n const res = await rm.areMembersOf({\n owner: input.owner,\n roleName: input.roleName,\n wallets: [input.wallet],\n });\n return res.length > 0 && res[0].isMember;\n }\n\n /**\n * Lists role members \u2013 currently unsupported in the\n * smart-contract layer.\n */\n async listRoleMembers(input: {\n owner: OwnerIdentifier;\n roleName: string;\n limit?: number;\n offset?: number;\n }): Promise<import(\"../types/role\").RoleMember[]> {\n const rm = this.loadRoleManagementAction();\n return rm.listRoleMembers({\n owner: input.owner,\n roleName: input.roleName,\n limit: input.limit,\n offset: input.offset,\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }