@toruslabs/ethereum-controllers 4.1.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 (88) hide show
  1. package/dist/ethereumControllers.cjs.js +6153 -0
  2. package/dist/ethereumControllers.cjs.js.map +1 -0
  3. package/dist/ethereumControllers.esm.js +5570 -0
  4. package/dist/ethereumControllers.esm.js.map +1 -0
  5. package/dist/ethereumControllers.umd.min.js +3 -0
  6. package/dist/ethereumControllers.umd.min.js.LICENSE.txt +38 -0
  7. package/dist/ethereumControllers.umd.min.js.map +1 -0
  8. package/dist/types/Account/AccountTrackerController.d.ts +35 -0
  9. package/dist/types/Block/PollingBlockTracker.d.ts +14 -0
  10. package/dist/types/Currency/CurrencyController.d.ts +30 -0
  11. package/dist/types/Gas/GasFeeController.d.ts +64 -0
  12. package/dist/types/Gas/IGasFeeController.d.ts +49 -0
  13. package/dist/types/Gas/gasUtil.d.ts +21 -0
  14. package/dist/types/Keyring/KeyringController.d.ts +20 -0
  15. package/dist/types/Message/AbstractMessageController.d.ts +36 -0
  16. package/dist/types/Message/DecryptMessageController.d.ts +20 -0
  17. package/dist/types/Message/EncryptionPublicKeyController.d.ts +20 -0
  18. package/dist/types/Message/MessageController.d.ts +20 -0
  19. package/dist/types/Message/PersonalMessageController.d.ts +20 -0
  20. package/dist/types/Message/TypedMessageController.d.ts +21 -0
  21. package/dist/types/Message/utils.d.ts +10 -0
  22. package/dist/types/Network/NetworkController.d.ts +40 -0
  23. package/dist/types/Network/createEthereumMiddleware.d.ts +66 -0
  24. package/dist/types/Network/createJsonRpcClient.d.ts +9 -0
  25. package/dist/types/Nfts/INftsController.d.ts +10 -0
  26. package/dist/types/Nfts/NftHandler.d.ts +35 -0
  27. package/dist/types/Nfts/NftsController.d.ts +40 -0
  28. package/dist/types/Preferences/PreferencesController.d.ts +53 -0
  29. package/dist/types/Tokens/ITokensController.d.ts +10 -0
  30. package/dist/types/Tokens/TokenHandler.d.ts +20 -0
  31. package/dist/types/Tokens/TokenRatesController.d.ts +42 -0
  32. package/dist/types/Tokens/TokensController.d.ts +42 -0
  33. package/dist/types/Transaction/NonceTracker.d.ts +37 -0
  34. package/dist/types/Transaction/PendingTransactionTracker.d.ts +32 -0
  35. package/dist/types/Transaction/TransactionController.d.ts +67 -0
  36. package/dist/types/Transaction/TransactionGasUtil.d.ts +21 -0
  37. package/dist/types/Transaction/TransactionStateHistoryHelper.d.ts +16 -0
  38. package/dist/types/Transaction/TransactionStateManager.d.ts +30 -0
  39. package/dist/types/Transaction/TransactionUtils.d.ts +70 -0
  40. package/dist/types/index.d.ts +43 -0
  41. package/dist/types/utils/abiDecoder.d.ts +17 -0
  42. package/dist/types/utils/abis.d.ts +84 -0
  43. package/dist/types/utils/constants.d.ts +81 -0
  44. package/dist/types/utils/contractAddresses.d.ts +1 -0
  45. package/dist/types/utils/conversionUtils.d.ts +42 -0
  46. package/dist/types/utils/helpers.d.ts +24 -0
  47. package/dist/types/utils/interfaces.d.ts +384 -0
  48. package/package.json +71 -0
  49. package/src/Account/AccountTrackerController.ts +157 -0
  50. package/src/Block/PollingBlockTracker.ts +89 -0
  51. package/src/Currency/CurrencyController.ts +117 -0
  52. package/src/Gas/GasFeeController.ts +254 -0
  53. package/src/Gas/IGasFeeController.ts +56 -0
  54. package/src/Gas/gasUtil.ts +163 -0
  55. package/src/Keyring/KeyringController.ts +118 -0
  56. package/src/Message/AbstractMessageController.ts +136 -0
  57. package/src/Message/DecryptMessageController.ts +81 -0
  58. package/src/Message/EncryptionPublicKeyController.ts +83 -0
  59. package/src/Message/MessageController.ts +74 -0
  60. package/src/Message/PersonalMessageController.ts +74 -0
  61. package/src/Message/TypedMessageController.ts +112 -0
  62. package/src/Message/utils.ts +107 -0
  63. package/src/Network/NetworkController.ts +184 -0
  64. package/src/Network/createEthereumMiddleware.ts +307 -0
  65. package/src/Network/createJsonRpcClient.ts +59 -0
  66. package/src/Nfts/INftsController.ts +13 -0
  67. package/src/Nfts/NftHandler.ts +191 -0
  68. package/src/Nfts/NftsController.ts +230 -0
  69. package/src/Preferences/PreferencesController.ts +409 -0
  70. package/src/Tokens/ITokensController.ts +13 -0
  71. package/src/Tokens/TokenHandler.ts +60 -0
  72. package/src/Tokens/TokenRatesController.ts +134 -0
  73. package/src/Tokens/TokensController.ts +278 -0
  74. package/src/Transaction/NonceTracker.ts +152 -0
  75. package/src/Transaction/PendingTransactionTracker.ts +235 -0
  76. package/src/Transaction/TransactionController.ts +558 -0
  77. package/src/Transaction/TransactionGasUtil.ts +74 -0
  78. package/src/Transaction/TransactionStateHistoryHelper.ts +41 -0
  79. package/src/Transaction/TransactionStateManager.ts +315 -0
  80. package/src/Transaction/TransactionUtils.ts +333 -0
  81. package/src/index.ts +45 -0
  82. package/src/utils/abiDecoder.ts +195 -0
  83. package/src/utils/abis.ts +677 -0
  84. package/src/utils/constants.ts +379 -0
  85. package/src/utils/contractAddresses.ts +21 -0
  86. package/src/utils/conversionUtils.ts +269 -0
  87. package/src/utils/helpers.ts +177 -0
  88. package/src/utils/interfaces.ts +454 -0
@@ -0,0 +1,195 @@
1
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2
+ // @ts-nocheck
3
+ // TODO: fix this when working on transaction controller
4
+ import BN from "bn.js";
5
+ import { AbiCoder, keccak256 } from "ethers";
6
+
7
+ class AbiDecoder {
8
+ // TODO: update any
9
+ state: {
10
+ savedABIs: any[];
11
+ methodIDs: Record<string, any>;
12
+ };
13
+
14
+ constructor(abi) {
15
+ this.state = {
16
+ savedABIs: [],
17
+ methodIDs: {},
18
+ };
19
+ this.addABI(abi);
20
+ }
21
+
22
+ getABIs() {
23
+ return this.state.savedABIs;
24
+ }
25
+
26
+ addABI(abiArray) {
27
+ if (Array.isArray(abiArray)) {
28
+ // Iterate new abi to generate method id's
29
+ abiArray.map((abi) => {
30
+ if (abi.name) {
31
+ const signature = keccak256(Buffer.from(`${abi.name}(${abi.inputs.map((input) => input.type).join(",")})`, "utf8"));
32
+ if (abi.type === "event") {
33
+ this.state.methodIDs[signature.slice(2)] = abi;
34
+ } else {
35
+ this.state.methodIDs[signature.slice(2, 10)] = abi;
36
+ }
37
+ }
38
+ return undefined;
39
+ });
40
+
41
+ this.state.savedABIs = [...this.state.savedABIs, ...abiArray];
42
+ } else {
43
+ throw new TypeError(`Expected ABI array, got ${typeof abiArray}`);
44
+ }
45
+ }
46
+
47
+ removeABI(abiArray) {
48
+ if (Array.isArray(abiArray)) {
49
+ // Iterate new abi to generate method id's
50
+ abiArray.map((abi) => {
51
+ if (abi.name) {
52
+ const signature = keccak256(Buffer.from(`${abi.name}(${abi.inputs.map((input) => input.type).join(",")})`, "utf8"));
53
+ if (abi.type === "event") {
54
+ if (this.state.methodIDs[signature.slice(2)]) {
55
+ delete this.state.methodIDs[signature.slice(2)];
56
+ }
57
+ } else if (this.state.methodIDs[signature.slice(2, 10)]) {
58
+ delete this.state.methodIDs[signature.slice(2, 10)];
59
+ }
60
+ }
61
+ return undefined;
62
+ });
63
+ } else {
64
+ throw new TypeError(`Expected ABI array, got ${typeof abiArray}`);
65
+ }
66
+ }
67
+
68
+ getMethodIDs() {
69
+ return this.state.methodIDs;
70
+ }
71
+
72
+ decodeMethod(data) {
73
+ const methodID = data.slice(2, 10);
74
+ const abiItem = this.state.methodIDs[methodID];
75
+ if (abiItem) {
76
+ const parameters = abiItem.inputs.map((item) => item.type);
77
+ const decoded = AbiCoder.defaultAbiCoder().decode(parameters, Buffer.from(data.slice(10), "hex"));
78
+
79
+ const returnValueData = {
80
+ name: abiItem.name,
81
+ params: [],
82
+ };
83
+
84
+ for (const [i, parameter] of decoded.entries()) {
85
+ let parsedParameter = parameter;
86
+ const isUint = abiItem.inputs[i].type.indexOf("uint") === 0;
87
+ const isInt = abiItem.inputs[i].type.indexOf("int") === 0;
88
+ const isAddress = abiItem.inputs[i].type.indexOf("address") === 0;
89
+
90
+ if (isUint || isInt) {
91
+ const isArray = Array.isArray(parameter);
92
+ if (isArray) {
93
+ parsedParameter = parameter.map((value) => new BN(value.toString(16), "hex").toString());
94
+ } else {
95
+ parsedParameter = new BN(parameter.toString(16), "hex").toString();
96
+ }
97
+ }
98
+
99
+ // Addresses returned by web3 are randomly cased so we need to standardize and lowercase all
100
+ if (isAddress) {
101
+ const isArray = Array.isArray(parameter);
102
+
103
+ if (isArray) {
104
+ parsedParameter = parameter.map((_) => _.toLowerCase());
105
+ } else {
106
+ parsedParameter = parameter.toLowerCase();
107
+ }
108
+ }
109
+
110
+ returnValueData.params.push({
111
+ name: abiItem.inputs[i].name,
112
+ value: parsedParameter,
113
+ type: abiItem.inputs[i].type,
114
+ });
115
+ }
116
+
117
+ return returnValueData;
118
+ }
119
+ return undefined;
120
+ }
121
+
122
+ decodeLogs(logs) {
123
+ return logs
124
+ .filter((log) => log.topics.length > 0)
125
+ .map((logItem) => {
126
+ const methodID = logItem.topics[0].slice(2);
127
+ const method = this.state.methodIDs[methodID];
128
+ if (method) {
129
+ const logData = logItem.data;
130
+ const decodedParameters = [];
131
+ let dataIndex = 0;
132
+ let topicsIndex = 1;
133
+
134
+ const dataTypes = [];
135
+ method.inputs.map((input) => {
136
+ if (!input.indexed) {
137
+ dataTypes.push(input.type);
138
+ }
139
+ return undefined;
140
+ });
141
+
142
+ const decodedData = AbiCoder.defaultAbiCoder().decode(dataTypes, logData.slice(2));
143
+
144
+ // Loop topic and data to get the params
145
+ method.inputs.map((parameter) => {
146
+ const decodedP = {
147
+ name: parameter.name,
148
+ type: parameter.type,
149
+ value: "",
150
+ };
151
+
152
+ if (parameter.indexed) {
153
+ decodedP.value = logItem.topics[topicsIndex];
154
+ topicsIndex += 1;
155
+ } else {
156
+ decodedP.value = decodedData[dataIndex];
157
+ dataIndex += 1;
158
+ }
159
+
160
+ if (parameter.type === "address") {
161
+ decodedP.value = decodedP.value.toLowerCase();
162
+ // 42 because len(0x) + 40
163
+ if (decodedP.value.length > 42) {
164
+ const toRemove = decodedP.value.length - 42;
165
+ const temporary = [...decodedP.value];
166
+ temporary.splice(2, toRemove);
167
+ decodedP.value = temporary.join("");
168
+ }
169
+ }
170
+
171
+ if (parameter.type === "uint256" || parameter.type === "uint8" || parameter.type === "int") {
172
+ // ensure to remove leading 0x for hex numbers
173
+ if (typeof decodedP.value === "string" && decodedP.value.startsWith("0x")) {
174
+ decodedP.value = new BN(decodedP.value.slice(2), 16).toString(10);
175
+ } else {
176
+ decodedP.value = new BN(decodedP.value).toString(10);
177
+ }
178
+ }
179
+
180
+ decodedParameters.push(decodedP);
181
+ return undefined;
182
+ });
183
+
184
+ return {
185
+ name: method.name,
186
+ events: decodedParameters,
187
+ address: logItem.address,
188
+ };
189
+ }
190
+ return undefined;
191
+ });
192
+ }
193
+ }
194
+
195
+ export default AbiDecoder;