@beclab/olaresid 0.1.13 → 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 (181) hide show
  1. package/CLI-TREE.md +107 -0
  2. package/CLI.md +122 -1340
  3. package/README.md +30 -12
  4. package/SDK-TREE.md +151 -0
  5. package/TAG.md +95 -41
  6. package/config.json +6 -4
  7. package/dist/abi/TerminusDIDQueryABI.d.ts +397 -0
  8. package/dist/abi/TerminusDIDQueryABI.d.ts.map +1 -0
  9. package/dist/abi/TerminusDIDQueryABI.js +519 -0
  10. package/dist/abi/TerminusDIDQueryABI.js.map +1 -0
  11. package/dist/business/index.d.ts.map +1 -1
  12. package/dist/business/index.js +9 -23
  13. package/dist/business/index.js.map +1 -1
  14. package/dist/business/tag-context.d.ts +1 -0
  15. package/dist/business/tag-context.d.ts.map +1 -1
  16. package/dist/business/tag-context.js +13 -7
  17. package/dist/business/tag-context.js.map +1 -1
  18. package/dist/cli.js +177 -76
  19. package/dist/cli.js.map +1 -1
  20. package/dist/config/index.d.ts +16 -4
  21. package/dist/config/index.d.ts.map +1 -1
  22. package/dist/config/index.js +28 -14
  23. package/dist/config/index.js.map +1 -1
  24. package/dist/domain/core.d.ts +65 -0
  25. package/dist/domain/core.d.ts.map +1 -0
  26. package/dist/domain/core.js +317 -0
  27. package/dist/domain/core.js.map +1 -0
  28. package/dist/domain/index.d.ts +104 -57
  29. package/dist/domain/index.d.ts.map +1 -1
  30. package/dist/domain/index.js +188 -428
  31. package/dist/domain/index.js.map +1 -1
  32. package/dist/domain/types.d.ts +56 -0
  33. package/dist/domain/types.d.ts.map +1 -0
  34. package/dist/domain/types.js +3 -0
  35. package/dist/domain/types.js.map +1 -0
  36. package/dist/index.d.ts +80 -23
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +152 -143
  39. package/dist/index.js.map +1 -1
  40. package/dist/utils/crypto-utils.d.ts +110 -0
  41. package/dist/utils/crypto-utils.d.ts.map +1 -1
  42. package/dist/utils/crypto-utils.js +127 -8
  43. package/dist/utils/crypto-utils.js.map +1 -1
  44. package/dist/utils/error-parser.d.ts.map +1 -1
  45. package/dist/utils/error-parser.js +2 -1
  46. package/dist/utils/error-parser.js.map +1 -1
  47. package/dist/utils/event-parser.d.ts +161 -0
  48. package/dist/utils/event-parser.d.ts.map +1 -0
  49. package/dist/utils/event-parser.js +140 -0
  50. package/dist/utils/event-parser.js.map +1 -0
  51. package/dist/utils/tag-type-builder.d.ts +43 -0
  52. package/dist/utils/tag-type-builder.d.ts.map +1 -1
  53. package/dist/utils/tag-type-builder.js +122 -0
  54. package/dist/utils/tag-type-builder.js.map +1 -1
  55. package/dist/utils/tag-type-parser.d.ts +70 -0
  56. package/dist/utils/tag-type-parser.d.ts.map +1 -0
  57. package/dist/utils/tag-type-parser.js +190 -0
  58. package/dist/utils/tag-type-parser.js.map +1 -0
  59. package/examples/create-with-rpc-demo.ts +142 -0
  60. package/examples/fetch-all-flat-demo.ts +159 -0
  61. package/examples/fetch-by-indices-demo.ts +235 -0
  62. package/examples/fetch-domain-demo.ts +137 -0
  63. package/examples/fetch-domains-demo.ts +221 -0
  64. package/examples/frontend-demo/index.html +2 -2
  65. package/examples/frontend-demo/package-lock.json +4 -1
  66. package/examples/index.ts +3 -5
  67. package/jest.config.js +25 -0
  68. package/package.json +6 -2
  69. package/src/abi/TerminusDIDQueryABI.ts +516 -0
  70. package/src/business/index.ts +9 -33
  71. package/src/business/tag-context.ts +35 -7
  72. package/src/cli.ts +253 -90
  73. package/src/config/index.ts +34 -19
  74. package/src/domain/core.ts +382 -0
  75. package/src/domain/index.ts +271 -641
  76. package/src/domain/types.ts +59 -0
  77. package/src/index.ts +221 -207
  78. package/src/utils/crypto-utils.ts +205 -2
  79. package/src/utils/error-parser.ts +2 -1
  80. package/src/utils/event-parser.ts +353 -0
  81. package/src/utils/tag-type-builder.ts +138 -0
  82. package/src/utils/tag-type-parser.ts +246 -0
  83. package/tests/unit/crypto-utils.test.ts +338 -0
  84. package/tests/unit/ed25519-jwk.test.ts +201 -0
  85. package/tests/unit/event-parser.test.ts +690 -0
  86. package/tests/unit/generate-mnemonic.test.ts +268 -0
  87. package/tests/unit/olares-id-format.test.ts +321 -0
  88. package/tests/unit/tag-type-parser.test.ts +802 -0
  89. package/tests/unit/tag-types.test.ts +821 -0
  90. package/tsconfig.json +3 -2
  91. package/dist/abi/ABITypeABI.d.ts +0 -88
  92. package/dist/abi/ABITypeABI.d.ts.map +0 -1
  93. package/dist/abi/ABITypeABI.js +0 -382
  94. package/dist/abi/ABITypeABI.js.map +0 -1
  95. package/dist/abi/RegistryABI.d.ts +0 -77
  96. package/dist/abi/RegistryABI.d.ts.map +0 -1
  97. package/dist/abi/RegistryABI.js +0 -462
  98. package/dist/abi/RegistryABI.js.map +0 -1
  99. package/dist/tag/address.d.ts +0 -11
  100. package/dist/tag/address.d.ts.map +0 -1
  101. package/dist/tag/address.js +0 -44
  102. package/dist/tag/address.js.map +0 -1
  103. package/dist/tag/array.d.ts +0 -14
  104. package/dist/tag/array.d.ts.map +0 -1
  105. package/dist/tag/array.js +0 -72
  106. package/dist/tag/array.js.map +0 -1
  107. package/dist/tag/bool.d.ts +0 -11
  108. package/dist/tag/bool.d.ts.map +0 -1
  109. package/dist/tag/bool.js +0 -43
  110. package/dist/tag/bool.js.map +0 -1
  111. package/dist/tag/bytes.d.ts +0 -11
  112. package/dist/tag/bytes.d.ts.map +0 -1
  113. package/dist/tag/bytes.js +0 -37
  114. package/dist/tag/bytes.js.map +0 -1
  115. package/dist/tag/flarray.d.ts +0 -15
  116. package/dist/tag/flarray.d.ts.map +0 -1
  117. package/dist/tag/flarray.js +0 -81
  118. package/dist/tag/flarray.js.map +0 -1
  119. package/dist/tag/flbytes.d.ts +0 -11
  120. package/dist/tag/flbytes.d.ts.map +0 -1
  121. package/dist/tag/flbytes.js +0 -47
  122. package/dist/tag/flbytes.js.map +0 -1
  123. package/dist/tag/index.d.ts +0 -32
  124. package/dist/tag/index.d.ts.map +0 -1
  125. package/dist/tag/index.js +0 -121
  126. package/dist/tag/index.js.map +0 -1
  127. package/dist/tag/int.d.ts +0 -12
  128. package/dist/tag/int.d.ts.map +0 -1
  129. package/dist/tag/int.js +0 -49
  130. package/dist/tag/int.js.map +0 -1
  131. package/dist/tag/string.d.ts +0 -11
  132. package/dist/tag/string.d.ts.map +0 -1
  133. package/dist/tag/string.js +0 -37
  134. package/dist/tag/string.js.map +0 -1
  135. package/dist/tag/tag.d.ts +0 -67
  136. package/dist/tag/tag.d.ts.map +0 -1
  137. package/dist/tag/tag.js +0 -157
  138. package/dist/tag/tag.js.map +0 -1
  139. package/dist/tag/tuple.d.ts +0 -17
  140. package/dist/tag/tuple.d.ts.map +0 -1
  141. package/dist/tag/tuple.js +0 -162
  142. package/dist/tag/tuple.js.map +0 -1
  143. package/dist/tag/uint.d.ts +0 -12
  144. package/dist/tag/uint.d.ts.map +0 -1
  145. package/dist/tag/uint.js +0 -49
  146. package/dist/tag/uint.js.map +0 -1
  147. package/dist/test/did.d.ts +0 -2
  148. package/dist/test/did.d.ts.map +0 -1
  149. package/dist/test/did.js +0 -177
  150. package/dist/test/did.js.map +0 -1
  151. package/dist/utils/tag-abi-codec.d.ts +0 -69
  152. package/dist/utils/tag-abi-codec.d.ts.map +0 -1
  153. package/dist/utils/tag-abi-codec.js +0 -144
  154. package/dist/utils/tag-abi-codec.js.map +0 -1
  155. package/examples/crypto-utilities.ts +0 -140
  156. package/examples/ed25519-jwk.ts +0 -73
  157. package/examples/generate-mnemonic.ts +0 -149
  158. package/examples/legacy.ts +0 -33
  159. package/examples/olares-id-format.ts +0 -197
  160. package/examples/tag-builder.ts +0 -235
  161. package/examples/tag-nested-tuple.ts +0 -190
  162. package/examples/tag-simple.ts +0 -149
  163. package/examples/tag-tagger.ts +0 -217
  164. package/examples/test-nested-tuple-conversion.ts +0 -143
  165. package/examples/test-type-bytes-parser.ts +0 -70
  166. package/src/abi/ABITypeABI.ts +0 -379
  167. package/src/abi/RegistryABI.ts +0 -459
  168. package/src/tag/address.ts +0 -48
  169. package/src/tag/array.ts +0 -80
  170. package/src/tag/bool.ts +0 -43
  171. package/src/tag/bytes.ts +0 -38
  172. package/src/tag/flarray.ts +0 -99
  173. package/src/tag/flbytes.ts +0 -48
  174. package/src/tag/index.ts +0 -170
  175. package/src/tag/int.ts +0 -51
  176. package/src/tag/string.ts +0 -38
  177. package/src/tag/tag.ts +0 -229
  178. package/src/tag/tuple.ts +0 -193
  179. package/src/tag/uint.ts +0 -51
  180. package/src/test/did.ts +0 -346
  181. 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;