@beclab/olaresid 0.1.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 (112) hide show
  1. package/LICENSE.md +49 -0
  2. package/README.md +93 -0
  3. package/dist/abi/ABITypeABI.d.ts +88 -0
  4. package/dist/abi/ABITypeABI.d.ts.map +1 -0
  5. package/dist/abi/ABITypeABI.js +382 -0
  6. package/dist/abi/ABITypeABI.js.map +1 -0
  7. package/dist/abi/RegistryABI.d.ts +77 -0
  8. package/dist/abi/RegistryABI.d.ts.map +1 -0
  9. package/dist/abi/RegistryABI.js +462 -0
  10. package/dist/abi/RegistryABI.js.map +1 -0
  11. package/dist/abi/RootResolverABI.d.ts +78 -0
  12. package/dist/abi/RootResolverABI.d.ts.map +1 -0
  13. package/dist/abi/RootResolverABI.js +372 -0
  14. package/dist/abi/RootResolverABI.js.map +1 -0
  15. package/dist/abi/TerminusDIDABI.d.ts +80 -0
  16. package/dist/abi/TerminusDIDABI.d.ts.map +1 -0
  17. package/dist/abi/TerminusDIDABI.js +1877 -0
  18. package/dist/abi/TerminusDIDABI.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +199 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/debug.d.ts +46 -0
  24. package/dist/debug.d.ts.map +1 -0
  25. package/dist/debug.js +129 -0
  26. package/dist/debug.js.map +1 -0
  27. package/dist/domain/index.d.ts +59 -0
  28. package/dist/domain/index.d.ts.map +1 -0
  29. package/dist/domain/index.js +431 -0
  30. package/dist/domain/index.js.map +1 -0
  31. package/dist/index.d.ts +193 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +166 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/tag/address.d.ts +11 -0
  36. package/dist/tag/address.d.ts.map +1 -0
  37. package/dist/tag/address.js +44 -0
  38. package/dist/tag/address.js.map +1 -0
  39. package/dist/tag/array.d.ts +14 -0
  40. package/dist/tag/array.d.ts.map +1 -0
  41. package/dist/tag/array.js +72 -0
  42. package/dist/tag/array.js.map +1 -0
  43. package/dist/tag/bool.d.ts +11 -0
  44. package/dist/tag/bool.d.ts.map +1 -0
  45. package/dist/tag/bool.js +43 -0
  46. package/dist/tag/bool.js.map +1 -0
  47. package/dist/tag/bytes.d.ts +11 -0
  48. package/dist/tag/bytes.d.ts.map +1 -0
  49. package/dist/tag/bytes.js +37 -0
  50. package/dist/tag/bytes.js.map +1 -0
  51. package/dist/tag/flarray.d.ts +15 -0
  52. package/dist/tag/flarray.d.ts.map +1 -0
  53. package/dist/tag/flarray.js +81 -0
  54. package/dist/tag/flarray.js.map +1 -0
  55. package/dist/tag/flbytes.d.ts +11 -0
  56. package/dist/tag/flbytes.d.ts.map +1 -0
  57. package/dist/tag/flbytes.js +47 -0
  58. package/dist/tag/flbytes.js.map +1 -0
  59. package/dist/tag/index.d.ts +32 -0
  60. package/dist/tag/index.d.ts.map +1 -0
  61. package/dist/tag/index.js +121 -0
  62. package/dist/tag/index.js.map +1 -0
  63. package/dist/tag/int.d.ts +12 -0
  64. package/dist/tag/int.d.ts.map +1 -0
  65. package/dist/tag/int.js +49 -0
  66. package/dist/tag/int.js.map +1 -0
  67. package/dist/tag/string.d.ts +11 -0
  68. package/dist/tag/string.d.ts.map +1 -0
  69. package/dist/tag/string.js +37 -0
  70. package/dist/tag/string.js.map +1 -0
  71. package/dist/tag/tag.d.ts +67 -0
  72. package/dist/tag/tag.d.ts.map +1 -0
  73. package/dist/tag/tag.js +157 -0
  74. package/dist/tag/tag.js.map +1 -0
  75. package/dist/tag/tuple.d.ts +17 -0
  76. package/dist/tag/tuple.d.ts.map +1 -0
  77. package/dist/tag/tuple.js +162 -0
  78. package/dist/tag/tuple.js.map +1 -0
  79. package/dist/tag/uint.d.ts +12 -0
  80. package/dist/tag/uint.d.ts.map +1 -0
  81. package/dist/tag/uint.js +49 -0
  82. package/dist/tag/uint.js.map +1 -0
  83. package/dist/test/did.d.ts +2 -0
  84. package/dist/test/did.d.ts.map +1 -0
  85. package/dist/test/did.js +177 -0
  86. package/dist/test/did.js.map +1 -0
  87. package/examples/index.ts +15 -0
  88. package/examples/legacy.ts +33 -0
  89. package/package.json +50 -0
  90. package/project.json +6 -0
  91. package/src/abi/ABITypeABI.ts +379 -0
  92. package/src/abi/RegistryABI.ts +459 -0
  93. package/src/abi/RootResolverABI.ts +369 -0
  94. package/src/abi/TerminusDIDABI.ts +1874 -0
  95. package/src/cli.ts +230 -0
  96. package/src/debug.ts +170 -0
  97. package/src/domain/index.ts +659 -0
  98. package/src/index.ts +302 -0
  99. package/src/tag/address.ts +48 -0
  100. package/src/tag/array.ts +80 -0
  101. package/src/tag/bool.ts +43 -0
  102. package/src/tag/bytes.ts +38 -0
  103. package/src/tag/flarray.ts +99 -0
  104. package/src/tag/flbytes.ts +48 -0
  105. package/src/tag/index.ts +170 -0
  106. package/src/tag/int.ts +51 -0
  107. package/src/tag/string.ts +38 -0
  108. package/src/tag/tag.ts +229 -0
  109. package/src/tag/tuple.ts +193 -0
  110. package/src/tag/uint.ts +51 -0
  111. package/src/test/did.ts +346 -0
  112. package/tsconfig.json +9 -0
package/src/index.ts ADDED
@@ -0,0 +1,302 @@
1
+ import { PackageDomain } from './domain/index';
2
+ import DIDTag from './tag/index';
3
+ import { ethers } from 'ethers';
4
+ import DID_ABI from './abi/TerminusDIDABI';
5
+ import RootResolverABI from './abi/RootResolverABI';
6
+ import { debug } from './debug';
7
+
8
+ type Domain = PackageDomain.Domain;
9
+
10
+ type StoreDomain = PackageDomain.DomainData;
11
+
12
+ export class DIDConsole implements DIDTag.ABITypeProviderHolder {
13
+ rpcNode: string;
14
+ contractDid: string;
15
+ contractRootResolver: string;
16
+ contractAbiType: string;
17
+
18
+ allDomainCache: Domain[] = [];
19
+ treesCache: Domain[] = [];
20
+
21
+ constructor(
22
+ rpcNode: string,
23
+ contractDid: string,
24
+ contractRootResolver: string,
25
+ contractAbiType: string
26
+ ) {
27
+ this.rpcNode = rpcNode;
28
+ this.contractDid = contractDid;
29
+ this.contractRootResolver = contractRootResolver;
30
+ this.contractAbiType = contractAbiType;
31
+ }
32
+
33
+ getProvider = () => new ethers.JsonRpcProvider(this.rpcNode);
34
+
35
+ getContractDID = () =>
36
+ new ethers.Contract(this.contractDid, DID_ABI.abi, this.getProvider());
37
+
38
+ getContractDIDByPrivateKey = (privateKey: string) => {
39
+ const wallet = new ethers.Wallet(privateKey, this.getProvider());
40
+
41
+ const contract = new ethers.Contract(
42
+ this.contractDid,
43
+ DID_ABI.abi,
44
+ wallet
45
+ );
46
+ return contract;
47
+ };
48
+
49
+ getSignerContractDIDByProvider = async (
50
+ provider: ethers.JsonRpcApiProvider
51
+ ) =>
52
+ new ethers.Contract(
53
+ this.contractDid,
54
+ DID_ABI.abi,
55
+ await provider.getSigner()
56
+ );
57
+
58
+ getContractRootResolver = () =>
59
+ new ethers.Contract(
60
+ this.contractRootResolver,
61
+ RootResolverABI.abi,
62
+ this.getProvider()
63
+ );
64
+
65
+ getSignerContractRootResolverByProvider = async (
66
+ provider: ethers.JsonRpcApiProvider
67
+ ) =>
68
+ new ethers.Contract(
69
+ this.contractRootResolver,
70
+ RootResolverABI.abi,
71
+ await provider.getSigner()
72
+ );
73
+
74
+ fetchAll = () =>
75
+ new Promise<Domain[]>(async (resolve, reject) => {
76
+ debug.group('fetchAll');
77
+ const contract = await this.getContractDID();
78
+ const size = await contract.totalSupply();
79
+ debug.info('fetchAll--->domain size', size);
80
+
81
+ let arr: Domain[] = [];
82
+ for (let index = 0; index < size; index++) {
83
+ const domain = await PackageDomain.syncByIndex(index, contract);
84
+ debug.debug('fetchAll--->synced domain', domain);
85
+ debug.info(
86
+ `fetchAll--->${((index / parseInt(size)) * 100).toFixed(
87
+ 0
88
+ )}%`
89
+ );
90
+ arr.push(domain);
91
+ }
92
+ this.allDomainCache = arr;
93
+ this.treesCache = PackageDomain.buildTree(this.allDomainCache);
94
+
95
+ debug.groupEnd();
96
+ resolve(this.treesCache);
97
+ });
98
+
99
+ fetchDomain = (name: string) =>
100
+ new Promise<Domain | undefined>(async (resolve, reject) => {
101
+ debug.group('fetchDomain');
102
+ const hasCache = this.allDomainCache.length > 0;
103
+ debug.info('fetchDomain--->hasCache', hasCache);
104
+
105
+ if (hasCache) {
106
+ const domain = PackageDomain.findASubtree(
107
+ name,
108
+ this.allDomainCache
109
+ );
110
+
111
+ debug.groupEnd();
112
+ resolve(domain);
113
+ } else {
114
+ const domain = await PackageDomain.syncByName(
115
+ name,
116
+ await this.getContractDID()
117
+ );
118
+
119
+ debug.groupEnd();
120
+ resolve(domain);
121
+ }
122
+ });
123
+
124
+ updateDomain = (name: string) =>
125
+ new Promise<Domain>(async (resolve, reject) => {
126
+ const domain = await PackageDomain.syncByName(
127
+ name,
128
+ await this.getContractDID()
129
+ );
130
+
131
+ if (domain == undefined) {
132
+ reject('not found domain');
133
+ return;
134
+ }
135
+
136
+ const [oldDomain] = this.allDomainCache.filter(
137
+ (d) => d.name == domain.name
138
+ );
139
+
140
+ if (oldDomain != undefined) {
141
+ for (const tagNew of domain.tags) {
142
+ for (const tagOld of oldDomain.tags) {
143
+ if (tagNew.name == tagOld.name) {
144
+ if (
145
+ tagNew.valueFormated == undefined &&
146
+ tagOld.valueFormated != undefined
147
+ ) {
148
+ tagNew.valueFormated = tagOld.valueFormated;
149
+ }
150
+ if (
151
+ tagNew.valueSource == undefined &&
152
+ tagOld.valueSource != undefined
153
+ ) {
154
+ tagNew.valueSource = tagOld.valueSource;
155
+ }
156
+ if (
157
+ tagNew.definition == undefined &&
158
+ tagOld.definition != undefined
159
+ ) {
160
+ tagNew.definition = tagOld.definition;
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+
167
+ this.allDomainCache = this.allDomainCache.filter(
168
+ (d) => d.name != domain.name
169
+ );
170
+ this.allDomainCache.push(domain);
171
+
172
+ this.treesCache = PackageDomain.buildTree(this.allDomainCache);
173
+
174
+ resolve(domain);
175
+ });
176
+
177
+ updateDomainById = (id: string) =>
178
+ new Promise<Domain>(async (resolve, reject) => {
179
+ const domain = await PackageDomain.syncById(
180
+ id,
181
+ await this.getContractDID()
182
+ );
183
+
184
+ if (domain == undefined) {
185
+ reject('not found domain');
186
+ return;
187
+ }
188
+
189
+ const [oldDomain] = this.allDomainCache.filter(
190
+ (d) => d.name == domain.name
191
+ );
192
+ for (const tagNew of domain.tags) {
193
+ for (const tagOld of oldDomain.tags) {
194
+ if (tagNew.name == tagOld.name) {
195
+ if (
196
+ tagNew.valueFormated == undefined &&
197
+ tagOld.valueFormated != undefined
198
+ ) {
199
+ tagNew.valueFormated = tagOld.valueFormated;
200
+ }
201
+ if (
202
+ tagNew.valueSource == undefined &&
203
+ tagOld.valueSource != undefined
204
+ ) {
205
+ tagNew.valueSource = tagOld.valueSource;
206
+ }
207
+ if (
208
+ tagNew.definition == undefined &&
209
+ tagOld.definition != undefined
210
+ ) {
211
+ tagNew.definition = tagOld.definition;
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ this.allDomainCache = this.allDomainCache.filter(
218
+ (d) => d.name != domain.name
219
+ );
220
+ this.allDomainCache.push(domain);
221
+
222
+ this.treesCache = PackageDomain.buildTree(this.allDomainCache);
223
+
224
+ resolve(domain);
225
+ });
226
+
227
+ formatData = (doamin: Domain) =>
228
+ new Promise<StoreDomain>((resolve, reject) => {
229
+ resolve(doamin);
230
+ });
231
+
232
+ formatDatas = (doamins: Domain[]) =>
233
+ new Promise<StoreDomain[]>((resolve, reject) => {
234
+ resolve(doamins);
235
+ });
236
+
237
+ loadData = (data: StoreDomain) =>
238
+ new Promise<Domain>((resolve, reject) => {
239
+ resolve(data);
240
+ });
241
+
242
+ loadDatas = (datas: StoreDomain[]) =>
243
+ new Promise<Domain[]>((resolve, reject) => {
244
+ this.treesCache = datas;
245
+ let arr = [];
246
+ arr.push(...this.treesCache);
247
+ for (const StoreDomain of this.treesCache) {
248
+ arr.push(...PackageDomain.getAllSubdoamin(StoreDomain));
249
+ }
250
+
251
+ this.allDomainCache = arr;
252
+
253
+ resolve(datas);
254
+ });
255
+ }
256
+
257
+ namespace OlaresID {
258
+ export const createConsole = (
259
+ rpcNode: string,
260
+ contractDid: string,
261
+ contractRootResolver: string,
262
+ contractAbiType: string
263
+ ): DIDConsole => {
264
+ return new DIDConsole(
265
+ rpcNode,
266
+ contractDid,
267
+ contractRootResolver,
268
+ contractAbiType
269
+ );
270
+ };
271
+
272
+ export const createMainnet = (): DIDConsole => {
273
+ return createConsole(
274
+ 'https://optimism-rpc.publicnode.com',
275
+ '0x5DA4Fa8E567d86e52Ef8Da860de1be8f54cae97D',
276
+ '0xE2EABA0979277A90511F8873ae1e8cA26B54E740',
277
+ '0x9ae3F16bD99294Af1784beB1a0A5C84bf2636365'
278
+ );
279
+ };
280
+
281
+ export const createTestnet = (): DIDConsole => {
282
+ return createConsole(
283
+ 'https://sepolia.optimism.io',
284
+ '0xe2D7c3a9013960E04d4E9F5F9B63fff37eEd97A8',
285
+ '0xeF727cb066Fee98F88Db84555830063b4A24ddfc',
286
+ '0x7386fCBae6Ad4CCE1499d9153D99bc950B589718'
287
+ );
288
+ };
289
+
290
+ export import Domain = PackageDomain;
291
+
292
+ export import Tag = DIDTag;
293
+
294
+ export type StoreDomain = PackageDomain.DomainData;
295
+
296
+ export const ABI_DID = DID_ABI;
297
+
298
+ export const ABI_ROOT_RESOLVER = RootResolverABI;
299
+ }
300
+
301
+ export { debug } from './debug';
302
+ export default OlaresID;
@@ -0,0 +1,48 @@
1
+ import { Tag, TagBase, ProviderHolder } from './tag';
2
+ import { ethers } from 'ethers';
3
+ import ABITypeABI from '../abi/ABITypeABI';
4
+
5
+ function isEthereumAddress(address: string): boolean {
6
+ const ethereumAddressRegex = /^(0x)?[0-9a-fA-F]{40}$/;
7
+ return ethereumAddressRegex.test(address);
8
+ }
9
+
10
+ export class Address extends TagBase {
11
+ name: string = 'address';
12
+
13
+ formatType(typeBytes: any, index: number): number {
14
+ this.name = 'address';
15
+ return index + 2;
16
+ }
17
+
18
+ getAbiTypeString(): string {
19
+ return 'address';
20
+ }
21
+
22
+ getAbiType = (providerHolder: ProviderHolder) =>
23
+ new Promise<void>(async (resolve, reject) => {
24
+ const c = new ethers.Contract(
25
+ providerHolder.contractAbiType,
26
+ ABITypeABI.abi,
27
+ providerHolder.getProvider()
28
+ );
29
+
30
+ const resp = await c.addressT();
31
+ // console.log('getAbiType', 'Address', resp);
32
+ resolve(resp);
33
+ });
34
+
35
+ getParamTypes(): string {
36
+ return 'address';
37
+ }
38
+
39
+ getParameters(data: any) {
40
+ if (!isEthereumAddress(data)) {
41
+ throw new Error(`${data} is not ethereum address`);
42
+ }
43
+
44
+ return data;
45
+ }
46
+ }
47
+
48
+ export default Address;
@@ -0,0 +1,80 @@
1
+ import { Tag, TagBase, Box, ProviderHolder } from './tag';
2
+ import { ethers } from 'ethers';
3
+ import ABITypeABI from '../abi/ABITypeABI';
4
+ export class Array extends Box {
5
+ setBuliderType(type: TagBase) {
6
+ this.boxData.arrayTag = type;
7
+ }
8
+
9
+ formatType(typeBytes: any, index: number): number {
10
+ let { cursor, tag } = this.formatChild(typeBytes, index + 2);
11
+ if (tag == undefined) {
12
+ throw new Error('formatType error in array');
13
+ }
14
+
15
+ this.boxData = {
16
+ arrayTag: tag
17
+ };
18
+ return cursor;
19
+ }
20
+
21
+ getAbiTypeString(): string {
22
+ return `${this.boxData.arrayTag.getAbiTypeString()}[]`;
23
+ }
24
+
25
+ setFieldNames(names: string[] | string[][], index: number): number {
26
+ if (this.boxData.arrayTag instanceof Box) {
27
+ return (this.boxData.arrayTag as Box).setFieldNames(names, index);
28
+ }
29
+ return index;
30
+ }
31
+
32
+ doHydration(d: any) {
33
+ let arr: any[] = [];
34
+ for (const item of d) {
35
+ arr.push(this.boxData.arrayTag.doHydration(item));
36
+ }
37
+
38
+ return arr;
39
+ }
40
+
41
+ getAbiType = (providerHolder: ProviderHolder) =>
42
+ new Promise<void>(async (resolve, reject) => {
43
+ const c = new ethers.Contract(
44
+ providerHolder.contractAbiType,
45
+ ABITypeABI.abi,
46
+ providerHolder.getProvider()
47
+ );
48
+
49
+ const arrAbi = await this.boxData.arrayTag.getAbiType(
50
+ providerHolder
51
+ );
52
+
53
+ const resp = await c.arrayT(arrAbi);
54
+ // console.log('getAbiType', 'array', resp);
55
+ resolve(resp);
56
+ });
57
+
58
+ getFieldName(): string[][] {
59
+ if (this.boxData.arrayTag instanceof Box) {
60
+ return this.boxData.arrayTag.getFieldName();
61
+ } else {
62
+ return [];
63
+ }
64
+ }
65
+
66
+ getParamTypes(): string {
67
+ return `${this.boxData.arrayTag.getAbiTypeString()}[]`;
68
+ }
69
+
70
+ getParameters(data: any) {
71
+ let arr = [];
72
+ for (const item of data) {
73
+ const value = this.boxData.arrayTag.getParameters(item);
74
+ arr.push(value);
75
+ }
76
+ return arr;
77
+ }
78
+ }
79
+
80
+ export default Array;
@@ -0,0 +1,43 @@
1
+ import { Tag, TagBase, ProviderHolder } from './tag';
2
+ import { ethers } from 'ethers';
3
+ import ABITypeABI from '../abi/ABITypeABI';
4
+ export class Bool extends TagBase {
5
+ name: string = 'bool';
6
+
7
+ formatType(typeBytes: any, index: number): number {
8
+ this.name = 'bool';
9
+ return index + 2;
10
+ }
11
+
12
+ getAbiTypeString(): string {
13
+ return 'bool';
14
+ }
15
+
16
+ getAbiType = (providerHolder: ProviderHolder) =>
17
+ new Promise<void>(async (resolve, reject) => {
18
+ const c = new ethers.Contract(
19
+ providerHolder.contractAbiType,
20
+ ABITypeABI.abi,
21
+ providerHolder.getProvider()
22
+ );
23
+
24
+ const resp = await c.boolT();
25
+ // console.log('getAbiType', 'Bool', resp);
26
+ resolve(resp);
27
+ });
28
+
29
+ getParamTypes(): string {
30
+ return 'bool';
31
+ }
32
+
33
+ getParameters(data: any) {
34
+ // console.log('data', data);
35
+ if (data == true || data == false) {
36
+ return data;
37
+ } else {
38
+ throw new Error(`${data} is not a boolean`);
39
+ }
40
+ }
41
+ }
42
+
43
+ export default Bool;
@@ -0,0 +1,38 @@
1
+ import { Tag, TagBase, ProviderHolder } from './tag';
2
+ import { ethers } from 'ethers';
3
+ import ABITypeABI from '../abi/ABITypeABI';
4
+ export class Bytes extends TagBase {
5
+ name: string = 'bytes';
6
+
7
+ formatType(typeBytes: any, index: number): number {
8
+ this.name = 'bytes';
9
+ return index + 2;
10
+ }
11
+
12
+ getAbiTypeString(): string {
13
+ return 'bytes';
14
+ }
15
+
16
+ getAbiType = (providerHolder: ProviderHolder) =>
17
+ new Promise<void>(async (resolve, reject) => {
18
+ const c = new ethers.Contract(
19
+ providerHolder.contractAbiType,
20
+ ABITypeABI.abi,
21
+ providerHolder.getProvider()
22
+ );
23
+
24
+ const resp = await c.bytesT();
25
+ // console.log('getAbiType', 'bytes', resp);
26
+ resolve(resp);
27
+ });
28
+
29
+ getParamTypes(): string {
30
+ return 'bytes';
31
+ }
32
+
33
+ getParameters(data: any) {
34
+ return data;
35
+ }
36
+ }
37
+
38
+ export default Bytes;
@@ -0,0 +1,99 @@
1
+ import { Tag, TagBase, Box, read2Byte, ProviderHolder } from './tag';
2
+ import { ethers } from 'ethers';
3
+ import ABITypeABI from '../abi/ABITypeABI';
4
+ export class FixedLengthArray extends Box {
5
+ setBuliderType(type: TagBase) {
6
+ this.boxData.arrayTag = type;
7
+ }
8
+
9
+ formatType(typeBytes: any, index: number): number {
10
+ let la = read2Byte(typeBytes, index + 2);
11
+ let length = parseInt(la, 16);
12
+
13
+ let { cursor, tag } = this.formatChild(typeBytes, index + 6);
14
+ if (tag == undefined) {
15
+ throw new Error('formatType error in array');
16
+ }
17
+
18
+ this.boxData = {
19
+ arrayTag: tag,
20
+ length: length
21
+ };
22
+ return cursor;
23
+ }
24
+
25
+ getAbiTypeString(): string {
26
+ return `${this.boxData.arrayTag.getAbiTypeString()}[${
27
+ this.boxData.length
28
+ }]`;
29
+ }
30
+
31
+ setFieldNames(names: string[] | string[][], index: number): number {
32
+ if (this.boxData.arrayTag instanceof Box) {
33
+ return (this.boxData.arrayTag as Box).setFieldNames(names, index);
34
+ }
35
+ return index;
36
+ }
37
+
38
+ doHydration(d: any) {
39
+ let arr: any[] = [];
40
+ for (const item of d) {
41
+ arr.push(this.boxData.arrayTag.doHydration(item));
42
+ }
43
+
44
+ return arr;
45
+ }
46
+
47
+ setSize = (size: number) => {
48
+ this.boxData.length = size;
49
+ };
50
+
51
+ getAbiType = (providerHolder: ProviderHolder) =>
52
+ new Promise<void>(async (resolve, reject) => {
53
+ const c = new ethers.Contract(
54
+ providerHolder.contractAbiType,
55
+ ABITypeABI.abiHaveCount,
56
+ providerHolder.getProvider()
57
+ );
58
+
59
+ const arrAbi = await this.boxData.arrayTag.getAbiType(
60
+ providerHolder
61
+ );
62
+
63
+ const resp = await c.arrayT(arrAbi, this.boxData.length);
64
+ // console.log('getAbiType', 'Address', resp);
65
+ resolve(resp);
66
+ });
67
+
68
+ getFieldName(): string[][] {
69
+ if (this.boxData.arrayTag instanceof Box) {
70
+ return this.boxData.arrayTag.getFieldName();
71
+ } else {
72
+ return [];
73
+ }
74
+ }
75
+
76
+ getParamTypes(): string {
77
+ return `${this.boxData.arrayTag.getAbiTypeString()}[${
78
+ this.boxData.length
79
+ }]`;
80
+ }
81
+
82
+ getParameters(data: any) {
83
+ if (data.length != this.boxData.length) {
84
+ throw new Error(
85
+ `${this.fieldName} muse be length ${this.boxData.length}, but input data is length ${data.length}`
86
+ );
87
+ }
88
+
89
+ const arr = [];
90
+ for (const item of data) {
91
+ const value = this.boxData.arrayTag.getParameters(item);
92
+ arr.push(value);
93
+ }
94
+
95
+ return arr;
96
+ }
97
+ }
98
+
99
+ export default FixedLengthArray;
@@ -0,0 +1,48 @@
1
+ import { Tag, TagBase, readByte, ProviderHolder } from './tag';
2
+ import { ethers } from 'ethers';
3
+ import ABITypeABI from '../abi/ABITypeABI';
4
+ export class FixedLengthBytes extends TagBase {
5
+ // length: number = 0
6
+ formatType(typeBytes: any, index: number): number {
7
+ let b = readByte(typeBytes, index + 2);
8
+ let length = parseInt(b, 16);
9
+ if (length < 1 || length > 32) {
10
+ throw new Error(`input is not a valid bytes type`);
11
+ }
12
+ this.boxData = {
13
+ length: length
14
+ };
15
+ return index + 4;
16
+ }
17
+
18
+ getAbiTypeString(): string {
19
+ return `bytes${this.boxData.length}`;
20
+ }
21
+
22
+ setSize = (size: number) => {
23
+ this.boxData.length = size;
24
+ };
25
+
26
+ getAbiType = (providerHolder: ProviderHolder) =>
27
+ new Promise<void>(async (resolve, reject) => {
28
+ const c = new ethers.Contract(
29
+ providerHolder.contractAbiType,
30
+ ABITypeABI.abiHaveCount,
31
+ providerHolder.getProvider()
32
+ );
33
+
34
+ const resp = await c.bytesT(this.boxData.length);
35
+ // console.log('getAbiType', 'uint', resp);
36
+ resolve(resp);
37
+ });
38
+
39
+ getParamTypes(): string {
40
+ return `bytes${this.boxData.length}`;
41
+ }
42
+
43
+ getParameters(data: any) {
44
+ return data;
45
+ }
46
+ }
47
+
48
+ export default FixedLengthBytes;