@beclab/olaresid 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CLI-TREE.md +107 -0
  2. package/CLI.md +122 -1329
  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 +1 -1
  12. package/dist/business/index.d.ts.map +1 -1
  13. package/dist/business/index.js +11 -24
  14. package/dist/business/index.js.map +1 -1
  15. package/dist/business/tag-context.d.ts +1 -0
  16. package/dist/business/tag-context.d.ts.map +1 -1
  17. package/dist/business/tag-context.js +13 -7
  18. package/dist/business/tag-context.js.map +1 -1
  19. package/dist/cli.js +238 -107
  20. package/dist/cli.js.map +1 -1
  21. package/dist/config/index.d.ts +16 -4
  22. package/dist/config/index.d.ts.map +1 -1
  23. package/dist/config/index.js +28 -14
  24. package/dist/config/index.js.map +1 -1
  25. package/dist/domain/core.d.ts +65 -0
  26. package/dist/domain/core.d.ts.map +1 -0
  27. package/dist/domain/core.js +317 -0
  28. package/dist/domain/core.js.map +1 -0
  29. package/dist/domain/index.d.ts +104 -57
  30. package/dist/domain/index.d.ts.map +1 -1
  31. package/dist/domain/index.js +188 -428
  32. package/dist/domain/index.js.map +1 -1
  33. package/dist/domain/types.d.ts +56 -0
  34. package/dist/domain/types.d.ts.map +1 -0
  35. package/dist/domain/types.js +3 -0
  36. package/dist/domain/types.js.map +1 -0
  37. package/dist/index.d.ts +81 -24
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +153 -143
  40. package/dist/index.js.map +1 -1
  41. package/dist/utils/crypto-utils.d.ts +124 -0
  42. package/dist/utils/crypto-utils.d.ts.map +1 -1
  43. package/dist/utils/crypto-utils.js +156 -8
  44. package/dist/utils/crypto-utils.js.map +1 -1
  45. package/dist/utils/error-parser.d.ts.map +1 -1
  46. package/dist/utils/error-parser.js +2 -1
  47. package/dist/utils/error-parser.js.map +1 -1
  48. package/dist/utils/event-parser.d.ts +161 -0
  49. package/dist/utils/event-parser.d.ts.map +1 -0
  50. package/dist/utils/event-parser.js +140 -0
  51. package/dist/utils/event-parser.js.map +1 -0
  52. package/dist/utils/tag-type-builder.d.ts +43 -0
  53. package/dist/utils/tag-type-builder.d.ts.map +1 -1
  54. package/dist/utils/tag-type-builder.js +122 -0
  55. package/dist/utils/tag-type-builder.js.map +1 -1
  56. package/dist/utils/tag-type-parser.d.ts +70 -0
  57. package/dist/utils/tag-type-parser.d.ts.map +1 -0
  58. package/dist/utils/tag-type-parser.js +190 -0
  59. package/dist/utils/tag-type-parser.js.map +1 -0
  60. package/examples/create-with-rpc-demo.ts +142 -0
  61. package/examples/fetch-all-flat-demo.ts +159 -0
  62. package/examples/fetch-by-indices-demo.ts +235 -0
  63. package/examples/fetch-domain-demo.ts +137 -0
  64. package/examples/fetch-domains-demo.ts +221 -0
  65. package/examples/frontend-demo/index.html +2 -2
  66. package/examples/frontend-demo/package-lock.json +4 -1
  67. package/examples/index.ts +3 -5
  68. package/jest.config.js +25 -0
  69. package/package.json +6 -2
  70. package/src/abi/TerminusDIDQueryABI.ts +516 -0
  71. package/src/business/index.ts +10 -33
  72. package/src/business/tag-context.ts +35 -7
  73. package/src/cli.ts +344 -121
  74. package/src/config/index.ts +34 -19
  75. package/src/domain/core.ts +382 -0
  76. package/src/domain/index.ts +271 -641
  77. package/src/domain/types.ts +59 -0
  78. package/src/index.ts +222 -207
  79. package/src/utils/crypto-utils.ts +239 -2
  80. package/src/utils/error-parser.ts +2 -1
  81. package/src/utils/event-parser.ts +353 -0
  82. package/src/utils/tag-type-builder.ts +138 -0
  83. package/src/utils/tag-type-parser.ts +246 -0
  84. package/tests/unit/crypto-utils.test.ts +338 -0
  85. package/tests/unit/ed25519-jwk.test.ts +201 -0
  86. package/tests/unit/event-parser.test.ts +690 -0
  87. package/tests/unit/generate-mnemonic.test.ts +268 -0
  88. package/tests/unit/olares-id-format.test.ts +321 -0
  89. package/tests/unit/tag-type-parser.test.ts +802 -0
  90. package/tests/unit/tag-types.test.ts +821 -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
@@ -1,99 +0,0 @@
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;
@@ -1,48 +0,0 @@
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;
package/src/tag/index.ts DELETED
@@ -1,170 +0,0 @@
1
- import {
2
- Tag,
3
- TagType,
4
- TagBase,
5
- readByte,
6
- parserHolder,
7
- read2Byte,
8
- Box,
9
- ProviderHolder
10
- } from './tag';
11
- import { Int } from './int';
12
- import Uint from './uint';
13
- import Bool from './bool';
14
- import Array from './array';
15
- import String from './string';
16
- import FixedLengthArray from './flarray';
17
- import Tuple from './tuple';
18
- import Address from './address';
19
- import FixedLengthBytes from './flbytes';
20
- import Bytes from './bytes';
21
- import { AbiCoder, ethers } from 'ethers';
22
-
23
- const isHex = (hex: string) => {
24
- return (
25
- typeof hex === 'string' &&
26
- hex.length % 2 === 0 &&
27
- !isNaN(Number('0x' + hex))
28
- );
29
- };
30
-
31
- const formatType = (typeBytes: string): Tag => {
32
- if (typeBytes.startsWith('0x')) {
33
- typeBytes = typeBytes.substring(2);
34
- }
35
-
36
- if (!isHex(typeBytes)) {
37
- throw new Error('input is not a valid hex string');
38
- }
39
-
40
- let { cursor, tag } = parse(typeBytes, 0);
41
-
42
- if (cursor !== typeBytes.length) {
43
- throw new Error(`input is not a valid typeBytes`);
44
- }
45
-
46
- if (tag == undefined) {
47
- throw new Error(`format type error, please check version`);
48
- }
49
-
50
- return tag;
51
- };
52
-
53
- const encode = (tag: Tag, data: any) => {
54
- const paramTypes = [];
55
- const parameters = [];
56
-
57
- paramTypes.push(tag.getParamTypes());
58
- parameters.push(tag.getParameters(data));
59
-
60
- const coder = new AbiCoder();
61
-
62
- // console.log('paramTypes', paramTypes);
63
- // console.dir(parameters, { depth: null });
64
-
65
- return coder.encode(paramTypes, parameters);
66
- };
67
-
68
- // {cursor: number, tag: Tag}
69
- const parse = (
70
- typeBytes: string,
71
- index: number
72
- ): { cursor: number; tag: Tag | undefined } => {
73
- let cursor = 0;
74
- let tag: Tag | undefined = undefined;
75
-
76
- let typeFlag = readByte(typeBytes, index);
77
- switch (typeFlag) {
78
- case TagType.INT:
79
- tag = new Int(typeBytes, index, false);
80
- break;
81
- case TagType.UINT:
82
- tag = new Uint(typeBytes, index, false);
83
- break;
84
- case TagType.BOOL:
85
- tag = new Bool(typeBytes, index, false);
86
- break;
87
- case TagType.STRING:
88
- tag = new String(typeBytes, index, false);
89
- break;
90
- case TagType.ARRAY:
91
- tag = new Array(typeBytes, index, false);
92
- break;
93
- case TagType.FL_ARRAY:
94
- tag = new FixedLengthArray(typeBytes, index, false);
95
- break;
96
- case TagType.TUPLE:
97
- tag = new Tuple(typeBytes, index, false);
98
- break;
99
- case TagType.ADDRESS:
100
- tag = new Address(typeBytes, index, false);
101
- break;
102
- case TagType.FL_BYTES:
103
- tag = new FixedLengthBytes(typeBytes, index, false);
104
- break;
105
- case TagType.BYTES:
106
- tag = new Bytes(typeBytes, index, false);
107
- break;
108
- default:
109
- break;
110
- }
111
- if (tag != undefined && tag.cursor != undefined) {
112
- // // console.log('cursor', tag)
113
- cursor = tag.cursor;
114
- }
115
-
116
- return {
117
- cursor,
118
- tag
119
- };
120
- };
121
-
122
- parserHolder.setParser(parse);
123
-
124
- namespace DIDTag {
125
- export type TagParser = Tag;
126
-
127
- export type TagParserType = TagType;
128
-
129
- export type TagParserBase = TagBase;
130
-
131
- export type TagParserBox = Box;
132
-
133
- export type ABITypeProviderHolder = ProviderHolder;
134
-
135
- isHex;
136
-
137
- readByte;
138
-
139
- read2Byte;
140
-
141
- export const doFormatType = (typeBytes: string): TagParser => {
142
- return formatType(typeBytes);
143
- };
144
-
145
- export const doEncode = (tag: TagParser, data: any) => {
146
- return encode(tag, data);
147
- };
148
-
149
- export const TagValueTypeInt = Int;
150
-
151
- export const TagValueTypeUint = Uint;
152
-
153
- export const TagValueTypeBool = Bool;
154
-
155
- export const TagValueTypeArray = Array;
156
-
157
- export const TagValueTypeString = String;
158
-
159
- export const TagValueTypeFlarray = FixedLengthArray;
160
-
161
- export const TagValueTypeTuple = Tuple;
162
-
163
- export const TagValueTypeAddress = Address;
164
-
165
- export const TagValueTypeFlbytes = FixedLengthBytes;
166
-
167
- export const TagValueTypeBytes = Bytes;
168
- }
169
-
170
- export default DIDTag;
package/src/tag/int.ts DELETED
@@ -1,51 +0,0 @@
1
- import { Tag, TagBase, ProviderHolder } from './tag';
2
- import { ethers } from 'ethers';
3
- import ABITypeABI from '../abi/ABITypeABI';
4
- export class Int extends TagBase {
5
- formatType(typeBytes: any, index: number): number {
6
- let bit = parseInt(typeBytes, 16);
7
- bit = bit * 2 * 2 * 2;
8
- if (bit < 8 || bit % 8 !== 0 || bit > 256) {
9
- throw new Error(`input is not a valid int type`);
10
- }
11
- this.boxData = {
12
- length: bit
13
- };
14
- return index + 4;
15
- }
16
-
17
- getAbiTypeString(): string {
18
- return `int${this.boxData.length}`;
19
- }
20
-
21
- setSize = (size: number) => {
22
- this.boxData.size = size;
23
- };
24
-
25
- getAbiType = (providerHolder: ProviderHolder) =>
26
- new Promise<void>(async (resolve, reject) => {
27
- const c = new ethers.Contract(
28
- providerHolder.contractAbiType,
29
- ABITypeABI.abi,
30
- providerHolder.getProvider()
31
- );
32
-
33
- const resp = await c.intT(this.boxData.size);
34
- // console.log('getAbiType', 'int', resp);
35
- resolve(resp);
36
- });
37
-
38
- getParamTypes(): string {
39
- return `int${this.boxData.length}`;
40
- }
41
-
42
- getParameters(data: any) {
43
- return data;
44
- }
45
-
46
- doHydration(d: any) {
47
- return (d as BigInt).toString();
48
- }
49
- }
50
-
51
- export default Int;
package/src/tag/string.ts DELETED
@@ -1,38 +0,0 @@
1
- import { Tag, TagBase, ProviderHolder } from './tag';
2
- import { ethers } from 'ethers';
3
- import ABITypeABI from '../abi/ABITypeABI';
4
- export class String extends TagBase {
5
- name: string = 'string';
6
-
7
- formatType(typeBytes: any, index: number): number {
8
- this.name = 'string';
9
- return index + 2;
10
- }
11
-
12
- getAbiTypeString(): string {
13
- return 'string';
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.stringT();
25
- // console.log('getAbiType', 'string', resp);
26
- resolve(resp);
27
- });
28
-
29
- getParamTypes(): string {
30
- return 'string';
31
- }
32
-
33
- getParameters(data: any) {
34
- return data;
35
- }
36
- }
37
-
38
- export default String;
package/src/tag/tag.ts DELETED
@@ -1,229 +0,0 @@
1
- import { ethers } from 'ethers';
2
-
3
- export enum TagType {
4
- INT = '00',
5
- UINT = '01',
6
- BOOL = '02',
7
- STRING = '03',
8
- ARRAY = '04',
9
- FL_ARRAY = '05',
10
- TUPLE = '06',
11
- ADDRESS = '07',
12
- FL_BYTES = '08',
13
- BYTES = '09'
14
- }
15
-
16
- export const needLength = (type: TagType) => {
17
- return type == TagType.INT;
18
- };
19
-
20
- export const read2Byte = (hex: string, index: number) => {
21
- return hex.substring(index, index + 4);
22
- };
23
-
24
- export const readByte = (hex: string, index: number) => {
25
- return hex.substring(index, index + 2);
26
- };
27
-
28
- export interface ProviderHolder {
29
- contractAbiType: string;
30
- getProvider(): ethers.JsonRpcProvider;
31
- }
32
-
33
- export interface Tag {
34
- formatType(typeBytes: any, index: number | undefined): number;
35
-
36
- parseValue(data: any): any;
37
-
38
- getParamTypes(): string;
39
-
40
- getParameters(data: any): any;
41
-
42
- cursor: number | undefined;
43
-
44
- type: TagType | undefined;
45
-
46
- boxData: any;
47
-
48
- fieldName: string | undefined;
49
- }
50
-
51
- export type Parse = (
52
- typeBytes: string,
53
- index: number
54
- ) => { cursor: number; tag: Tag | undefined };
55
- export class ParserHolder {
56
- parse: Parse | undefined = undefined;
57
-
58
- setParser = (parse: Parse) => {
59
- this.parse = parse;
60
- };
61
- }
62
-
63
- export const parserHolder = new ParserHolder();
64
-
65
- export abstract class TagBase implements Tag {
66
- type: TagType | undefined;
67
- cursor: number | undefined;
68
- boxData: any;
69
- fieldName: string | undefined;
70
-
71
- abstract getAbiType(providerHolder: ProviderHolder): Promise<any>;
72
-
73
- abstract getParamTypes(): string;
74
-
75
- abstract getParameters(data: any): any; // 包装类负责解析对应字段,并验证字段是否存在, 基础类型负责验证数据格式正确性
76
-
77
- getFieldNames = (): string[][] => {
78
- if (this instanceof Box) {
79
- let a: string[][] = this.getFieldName();
80
- return a;
81
- } else {
82
- let a: string[][] = [];
83
- return a;
84
- }
85
- };
86
-
87
- typeName = (): string => {
88
- switch (this.type) {
89
- case TagType.INT:
90
- return `int${this.boxData.length}`;
91
- case TagType.UINT:
92
- return `uint${this.boxData.length}`;
93
- case TagType.BOOL:
94
- return `bool`;
95
- case TagType.STRING:
96
- return 'string';
97
- case TagType.ARRAY:
98
- return `array<${this.boxData.arrayTag.typeName()}>`;
99
- case TagType.FL_ARRAY:
100
- return `array<${this.boxData.arrayTag.typeName()}>(${
101
- this.boxData.length
102
- })`;
103
- case TagType.TUPLE:
104
- return 'tuple';
105
- case TagType.ADDRESS:
106
- return 'address';
107
- case TagType.FL_BYTES:
108
- return `bytes${this.boxData.length}`;
109
- case TagType.BYTES:
110
- return 'bytes';
111
- default:
112
- return 'error';
113
- }
114
- };
115
-
116
- constructor(
117
- typeBytes: string | undefined,
118
- index: number | undefined,
119
- builder: boolean
120
- ) {
121
- this.boxData = {};
122
-
123
- if (builder) {
124
- } else {
125
- if (typeBytes == undefined || index == undefined) {
126
- throw new Error(
127
- "constructor value error, typeBytes and index can't be undefined"
128
- );
129
- }
130
-
131
- let typeFlag = readByte(typeBytes, index);
132
-
133
- switch (typeFlag) {
134
- case TagType.INT:
135
- this.type = TagType.INT;
136
- this.cursor = this.formatType(
137
- readByte(typeBytes, index + 2),
138
- index
139
- );
140
- break;
141
- case TagType.UINT:
142
- this.type = TagType.UINT;
143
- this.cursor = this.formatType(
144
- readByte(typeBytes, index + 2),
145
- index
146
- );
147
- break;
148
- case TagType.BOOL:
149
- this.type = TagType.BOOL;
150
- this.cursor = this.formatType(typeBytes, index);
151
- break;
152
- case TagType.STRING:
153
- this.type = TagType.STRING;
154
- this.cursor = this.formatType(typeBytes, index);
155
- break;
156
- case TagType.ARRAY:
157
- this.type = TagType.ARRAY;
158
- this.cursor = this.formatType(typeBytes, index);
159
- break;
160
- case TagType.FL_ARRAY:
161
- this.type = TagType.FL_ARRAY;
162
- this.cursor = this.formatType(typeBytes, index);
163
- break;
164
- case TagType.TUPLE:
165
- this.type = TagType.TUPLE;
166
- this.cursor = this.formatType(typeBytes, index);
167
- break;
168
- case TagType.ADDRESS:
169
- this.type = TagType.ADDRESS;
170
- this.cursor = this.formatType(typeBytes, index);
171
- break;
172
- case TagType.FL_BYTES:
173
- this.type = TagType.FL_BYTES;
174
- this.cursor = this.formatType(typeBytes, index);
175
- break;
176
- case TagType.BYTES:
177
- this.type = TagType.BYTES;
178
- this.cursor = this.formatType(typeBytes, index);
179
- break;
180
-
181
- default:
182
- throw new Error('formatType error');
183
- break;
184
- }
185
- // // console.log('cursor', this)
186
- }
187
- }
188
-
189
- abstract formatType(typeBytes: any, index: number | undefined): number;
190
-
191
- parseValue(data: any) {
192
- let abiCoder = new ethers.AbiCoder();
193
-
194
- // // console.log('AbiTypeString', this.getAbiTypeString());
195
- // // console.dir(this, { depth: null });
196
- return abiCoder.decode([this.getAbiTypeString()], data, false);
197
- }
198
-
199
- hydration(data: any) {
200
- let d = this.parseValue(data);
201
-
202
- return this.doHydration(d[0]);
203
- }
204
-
205
- doHydration(d: any) {
206
- return d;
207
- }
208
-
209
- abstract getAbiTypeString(): string;
210
- }
211
-
212
- export abstract class Box extends TagBase {
213
- abstract formatType(typeBytes: any, index: number | undefined): number;
214
-
215
- abstract setFieldNames(names: string[] | string[][], index: number): number;
216
-
217
- formatChild(
218
- typeBytes: any,
219
- index: number
220
- ): { cursor: number; tag: Tag | undefined } {
221
- if (!parserHolder.parse) throw new Error('not found parse');
222
-
223
- return parserHolder.parse(typeBytes, index);
224
- }
225
-
226
- abstract getFieldName(): string[][];
227
- }
228
-
229
- export default Tag;