@quentinadam/evm-base 0.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 (67) hide show
  1. package/README.md +12 -0
  2. package/dist/ABI.d.ts +21 -0
  3. package/dist/ABI.d.ts.map +1 -0
  4. package/dist/ABI.js +393 -0
  5. package/dist/ABI.js.map +1 -0
  6. package/dist/Block.d.ts +9 -0
  7. package/dist/Block.d.ts.map +1 -0
  8. package/dist/Block.js +2 -0
  9. package/dist/Block.js.map +1 -0
  10. package/dist/Client.d.ts +43 -0
  11. package/dist/Client.d.ts.map +1 -0
  12. package/dist/Client.js +116 -0
  13. package/dist/Client.js.map +1 -0
  14. package/dist/ClientError.d.ts +10 -0
  15. package/dist/ClientError.d.ts.map +1 -0
  16. package/dist/ClientError.js +10 -0
  17. package/dist/ClientError.js.map +1 -0
  18. package/dist/ClientHelper.d.ts +32 -0
  19. package/dist/ClientHelper.d.ts.map +1 -0
  20. package/dist/ClientHelper.js +107 -0
  21. package/dist/ClientHelper.js.map +1 -0
  22. package/dist/DataEncoder.d.ts +14 -0
  23. package/dist/DataEncoder.d.ts.map +1 -0
  24. package/dist/DataEncoder.js +20 -0
  25. package/dist/DataEncoder.js.map +1 -0
  26. package/dist/Log.d.ts +13 -0
  27. package/dist/Log.d.ts.map +1 -0
  28. package/dist/Log.js +2 -0
  29. package/dist/Log.js.map +1 -0
  30. package/dist/MulticallClient.d.ts +18 -0
  31. package/dist/MulticallClient.d.ts.map +1 -0
  32. package/dist/MulticallClient.js +71 -0
  33. package/dist/MulticallClient.js.map +1 -0
  34. package/dist/Transaction.d.ts +17 -0
  35. package/dist/Transaction.d.ts.map +1 -0
  36. package/dist/Transaction.js +2 -0
  37. package/dist/Transaction.js.map +1 -0
  38. package/dist/TransactionReceipt.d.ts +14 -0
  39. package/dist/TransactionReceipt.d.ts.map +1 -0
  40. package/dist/TransactionReceipt.js +2 -0
  41. package/dist/TransactionReceipt.js.map +1 -0
  42. package/dist/computeCREATE2Address.d.ts +17 -0
  43. package/dist/computeCREATE2Address.d.ts.map +1 -0
  44. package/dist/computeCREATE2Address.js +20 -0
  45. package/dist/computeCREATE2Address.js.map +1 -0
  46. package/dist/computeCREATEAddress.d.ts +8 -0
  47. package/dist/computeCREATEAddress.d.ts.map +1 -0
  48. package/dist/computeCREATEAddress.js +7 -0
  49. package/dist/computeCREATEAddress.js.map +1 -0
  50. package/dist/mod.d.ts +15 -0
  51. package/dist/mod.d.ts.map +1 -0
  52. package/dist/mod.js +10 -0
  53. package/dist/mod.js.map +1 -0
  54. package/package.json +33 -0
  55. package/src/ABI.ts +434 -0
  56. package/src/Block.ts +9 -0
  57. package/src/Client.ts +152 -0
  58. package/src/ClientError.ts +10 -0
  59. package/src/ClientHelper.ts +131 -0
  60. package/src/DataEncoder.ts +28 -0
  61. package/src/Log.ts +13 -0
  62. package/src/MulticallClient.ts +87 -0
  63. package/src/Transaction.ts +17 -0
  64. package/src/TransactionReceipt.ts +15 -0
  65. package/src/computeCREATE2Address.ts +32 -0
  66. package/src/computeCREATEAddress.ts +13 -0
  67. package/src/mod.ts +25 -0
package/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # @quentinadam/evm-base
2
+
3
+ [![JSR][jsr-image]][jsr-url] [![NPM][npm-image]][npm-url] [![CI][ci-image]][ci-url]
4
+
5
+ EVM base library.
6
+
7
+ [ci-image]: https://img.shields.io/github/actions/workflow/status/quentinadam/deno-evm-base/ci.yml?branch=main&logo=github&style=flat-square
8
+ [ci-url]: https://github.com/quentinadam/deno-evm-base/actions/workflows/ci.yml
9
+ [npm-image]: https://img.shields.io/npm/v/@quentinadam/evm-base.svg?style=flat-square
10
+ [npm-url]: https://npmjs.org/package/@quentinadam/evm-base
11
+ [jsr-image]: https://jsr.io/badges/@quentinadam/evm-base?style=flat-square
12
+ [jsr-url]: https://jsr.io/@quentinadam/evm-base
package/dist/ABI.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ declare abstract class Element {
2
+ readonly encodedLength: number | undefined;
3
+ constructor(encodedLength: number | undefined);
4
+ get dynamic(): boolean;
5
+ abstract encode(value: unknown): Uint8Array<ArrayBuffer>;
6
+ abstract decode(bytes: Uint8Array<ArrayBuffer>): unknown;
7
+ }
8
+ export default class ABI {
9
+ #private;
10
+ readonly selector?: Uint8Array<ArrayBuffer>;
11
+ readonly type: string;
12
+ readonly element: Element;
13
+ constructor(type: string, { addressFromBytes, bytesFromAddress }: {
14
+ addressFromBytes: (bytes: Uint8Array<ArrayBuffer>) => string;
15
+ bytesFromAddress: (address: string) => Uint8Array<ArrayBuffer>;
16
+ });
17
+ decode(bytes: Uint8Array<ArrayBuffer>): unknown;
18
+ encode(value: unknown): Uint8Array<ArrayBuffer>;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=ABI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ABI.d.ts","sourceRoot":"","sources":["../src/ABI.ts"],"names":[],"mappings":"AAKA,uBAAe,OAAO;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE/B,aAAa,EAAE,MAAM,GAAG,SAAS;IAI7C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC;IAExD,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO;CACzD;AAgTD,MAAM,CAAC,OAAO,OAAO,GAAG;;IAItB,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,IAAI,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,EAAE;QAChE,gBAAgB,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC;QAC7D,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC,WAAW,CAAC,CAAC;KAChE;IAaD,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO;IAS/C,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC;CA6EhD"}
package/dist/ABI.js ADDED
@@ -0,0 +1,393 @@
1
+ import assert from '@quentinadam/assert';
2
+ import * as Uint8ArrayExtension from '@quentinadam/uint8array-extension';
3
+ import keccak256 from '@quentinadam/hash/keccak256';
4
+ import ensure from '@quentinadam/ensure';
5
+ class Element {
6
+ encodedLength;
7
+ constructor(encodedLength) {
8
+ this.encodedLength = encodedLength;
9
+ }
10
+ get dynamic() {
11
+ return this.encodedLength === undefined;
12
+ }
13
+ }
14
+ class IntElement extends Element {
15
+ bits;
16
+ constructor(bits) {
17
+ super(32);
18
+ assert(Number.isSafeInteger(bits), 'Bits must be an integer');
19
+ assert(bits % 8 === 0, 'Bits must be a multiple of 8');
20
+ assert(bits >= 8 && bits <= 256, 'Bits must be between 8 and 256');
21
+ this.bits = bits;
22
+ }
23
+ encode(value) {
24
+ assert(typeof value === 'number' || typeof value === 'bigint', 'Value must be a number or a bigint');
25
+ return ((value) => {
26
+ if (typeof value === 'number') {
27
+ assert(Number.isSafeInteger(value), 'Value must be a safe integer');
28
+ value = BigInt(value);
29
+ }
30
+ return Uint8ArrayExtension.fromIntBE(value, 32);
31
+ })(value);
32
+ }
33
+ decode(bytes) {
34
+ assert(bytes.length >= 32);
35
+ const value = Uint8ArrayExtension.toBigUintBE(bytes.slice(0, 32));
36
+ return (value >= (1n << 255n)) ? value - (1n << 256n) : value;
37
+ }
38
+ }
39
+ class UintElement extends Element {
40
+ bits;
41
+ constructor(bits) {
42
+ super(32);
43
+ assert(Number.isSafeInteger(bits), 'Bits must be an integer');
44
+ assert(bits % 8 === 0, 'Bits must be a multiple of 8');
45
+ assert(bits >= 8 && bits <= 256, 'Bits must be between 8 and 256');
46
+ this.bits = bits;
47
+ }
48
+ encode(value) {
49
+ assert(typeof value === 'number' || typeof value === 'bigint', 'Value must be a number or a bigint');
50
+ return ((value) => {
51
+ if (typeof value === 'number') {
52
+ assert(Number.isSafeInteger(value), 'Value must be a safe integer');
53
+ value = BigInt(value);
54
+ }
55
+ return Uint8ArrayExtension.fromUintBE(value, 32);
56
+ })(value);
57
+ }
58
+ decode(bytes) {
59
+ assert(bytes.length >= 32);
60
+ return Uint8ArrayExtension.toBigUintBE(bytes.slice(0, 32));
61
+ }
62
+ }
63
+ class BoolElement extends Element {
64
+ constructor() {
65
+ super(32);
66
+ }
67
+ encode(value) {
68
+ assert(typeof value === 'boolean', 'Value must be a boolean');
69
+ return ((value) => {
70
+ return Uint8ArrayExtension.fromUintBE(value ? 1 : 0, 32);
71
+ })(value);
72
+ }
73
+ decode(bytes) {
74
+ assert(bytes.length >= 32);
75
+ const value = Uint8ArrayExtension.toBigUintBE(bytes.slice(0, 32));
76
+ if (value === 0n) {
77
+ return false;
78
+ }
79
+ else {
80
+ assert(value === 1n);
81
+ return true;
82
+ }
83
+ }
84
+ }
85
+ class AddressElement extends Element {
86
+ constructor() {
87
+ super(32);
88
+ }
89
+ encode(value) {
90
+ assert(typeof value === 'string', 'Value must be a string');
91
+ const bytes = this.bytesFromAddress(value);
92
+ assert(bytes.length === 20, 'Buffer must be 20 bytes long');
93
+ return Uint8ArrayExtension.padStart(bytes, 32);
94
+ }
95
+ decode(bytes) {
96
+ assert(bytes.length >= 32);
97
+ assert(bytes.slice(0, 12).every((byte) => byte === 0), 'First 12 bytes must be zero');
98
+ return this.addressFromBytes(bytes.slice(12, 32));
99
+ }
100
+ }
101
+ class StringElement extends Element {
102
+ constructor() {
103
+ super(undefined);
104
+ }
105
+ encode(value) {
106
+ assert(typeof value === 'string', 'Value must be a string');
107
+ let bytes = new TextEncoder().encode(value);
108
+ const length = bytes.length;
109
+ bytes = padEnd(bytes);
110
+ return Uint8ArrayExtension.concat([Uint8ArrayExtension.fromUintBE(length, 32), bytes]);
111
+ }
112
+ decode(bytes) {
113
+ assert(bytes.length >= 32);
114
+ const length = Number(Uint8ArrayExtension.toBigUintBE(bytes.slice(0, 32)));
115
+ assert(bytes.length >= 32 + padLength(length));
116
+ return new TextDecoder().decode(bytes.slice(32, 32 + length));
117
+ }
118
+ }
119
+ class BytesElement extends Element {
120
+ length;
121
+ constructor(length) {
122
+ super(length === undefined ? undefined : 32);
123
+ if (length !== undefined) {
124
+ assert(Number.isSafeInteger(length), 'Length must be an integer');
125
+ assert(length >= 1 && length <= 32, 'Length must be between 1 and 32');
126
+ }
127
+ this.length = length;
128
+ }
129
+ #encode(bytes) {
130
+ const length = bytes.length;
131
+ bytes = padEnd(bytes);
132
+ if (this.length !== undefined) {
133
+ return bytes;
134
+ }
135
+ else {
136
+ return Uint8ArrayExtension.concat([Uint8ArrayExtension.fromUintBE(length, 32), bytes]);
137
+ }
138
+ }
139
+ encode(value) {
140
+ if (typeof value === 'string') {
141
+ const match = value.match(/^(?:0x)?(?<hex>(?:[0-9a-f][0-9a-f])*)$/i);
142
+ if (match !== null) {
143
+ return this.#encode(Uint8Array.fromHex(ensure(ensure(match.groups).hex)));
144
+ }
145
+ }
146
+ if (value instanceof Uint8Array && Uint8ArrayExtension.isArrayBufferBacked(value)) {
147
+ return this.#encode(value);
148
+ }
149
+ throw new Error('Value must be a hex string or a Uint8Array<ArrayBuffer>');
150
+ }
151
+ decode(bytes) {
152
+ assert(bytes.length >= 32);
153
+ if (this.length !== undefined) {
154
+ return bytes.slice(0, this.length);
155
+ }
156
+ else {
157
+ const length = Number(Uint8ArrayExtension.toBigUintBE(bytes.slice(0, 32)));
158
+ assert(bytes.length >= 32 + padLength(length));
159
+ return bytes.slice(32, 32 + length);
160
+ }
161
+ }
162
+ }
163
+ function padLength(length) {
164
+ return length + (32 - length % 32) % 32;
165
+ }
166
+ function padEnd(bytes) {
167
+ return Uint8ArrayExtension.padEnd(bytes, padLength(bytes.length));
168
+ }
169
+ class StructElement extends Element {
170
+ elements;
171
+ constructor(elements) {
172
+ super((() => {
173
+ let encodedLength = 0;
174
+ for (const element of elements) {
175
+ if (element.encodedLength === undefined) {
176
+ return undefined;
177
+ }
178
+ encodedLength += element.encodedLength;
179
+ }
180
+ return encodedLength;
181
+ })());
182
+ this.elements = elements;
183
+ }
184
+ encode(value) {
185
+ assert(Array.isArray(value), 'Value must be an array');
186
+ return encode({ elements: this.elements, values: value });
187
+ }
188
+ decode(bytes) {
189
+ let offset = 0;
190
+ return this.elements.map((element) => {
191
+ const encodedLength = element.encodedLength;
192
+ if (encodedLength === undefined) {
193
+ const _offset = Number(Uint8ArrayExtension.toBigUintBE(bytes.slice(offset, offset + 32)));
194
+ const value = element.decode(bytes.slice(_offset));
195
+ offset += 32;
196
+ return value;
197
+ }
198
+ else {
199
+ const value = element.decode(bytes.slice(offset));
200
+ offset += encodedLength;
201
+ return value;
202
+ }
203
+ });
204
+ }
205
+ }
206
+ function encode({ elements, values }) {
207
+ assert(values.length === elements.length, 'Array length must match');
208
+ return ((elements) => {
209
+ let offset = 0;
210
+ for (const { dynamic, encodedValue } of elements) {
211
+ if (dynamic) {
212
+ offset += 32;
213
+ }
214
+ else {
215
+ offset += encodedValue.length;
216
+ }
217
+ }
218
+ const heads = new Array();
219
+ const tails = new Array();
220
+ for (const { dynamic, encodedValue } of elements) {
221
+ if (dynamic) {
222
+ heads.push(Uint8ArrayExtension.fromUintBE(offset, 32));
223
+ tails.push(encodedValue);
224
+ offset += encodedValue.length;
225
+ }
226
+ else {
227
+ heads.push(encodedValue);
228
+ }
229
+ }
230
+ return Uint8ArrayExtension.concat([...heads, ...tails]);
231
+ })(elements.map((element, index) => {
232
+ const value = values[index];
233
+ const encodedValue = element.encode(value);
234
+ return { dynamic: element.dynamic, encodedValue };
235
+ }));
236
+ }
237
+ class ArrayElement extends Element {
238
+ element;
239
+ length;
240
+ constructor(element, length) {
241
+ super(length === undefined || element.encodedLength === undefined ? undefined : element.encodedLength * length);
242
+ this.element = element;
243
+ this.length = length;
244
+ }
245
+ encode(values) {
246
+ assert(Array.isArray(values), 'Value must be an array');
247
+ const encodedValue = encode({ elements: new Array(values.length).fill(this.element), values });
248
+ if (this.length !== undefined) {
249
+ assert(values.length === this.length, 'Array length must match');
250
+ return encodedValue;
251
+ }
252
+ else {
253
+ return Uint8ArrayExtension.concat([Uint8ArrayExtension.fromUintBE(values.length, 32), encodedValue]);
254
+ }
255
+ }
256
+ decode(bytes) {
257
+ const { length, dataOffset } = (() => {
258
+ if (this.length === undefined) {
259
+ // Dynamic array: read length from first 32 bytes
260
+ assert(bytes.length >= 32);
261
+ return { length: Number(Uint8ArrayExtension.toBigUintBE(bytes.slice(0, 32))), dataOffset: 32 };
262
+ }
263
+ else {
264
+ // Fixed array: use predefined length, no length prefix
265
+ return { length: this.length, dataOffset: 0 };
266
+ }
267
+ })();
268
+ const encodedElementLength = this.element.encodedLength;
269
+ if (encodedElementLength === undefined) {
270
+ // Dynamic elements: use offsets
271
+ assert(bytes.length >= dataOffset + length * 32);
272
+ return Array.from({ length }, (_, index) => {
273
+ const offset = Number(Uint8ArrayExtension.toBigUintBE(bytes.slice(dataOffset + index * 32, dataOffset + (index + 1) * 32)));
274
+ return this.element.decode(bytes.slice(dataOffset + offset));
275
+ });
276
+ }
277
+ else {
278
+ // Static elements: decode sequentially
279
+ assert(bytes.length >= dataOffset + length * encodedElementLength);
280
+ return Array.from({ length }, (_, index) => {
281
+ const offset = dataOffset + index * encodedElementLength;
282
+ return this.element.decode(bytes.slice(offset, offset + encodedElementLength));
283
+ });
284
+ }
285
+ }
286
+ }
287
+ export default class ABI {
288
+ #addressFromBytes;
289
+ #bytesFromAddress;
290
+ selector;
291
+ type;
292
+ element;
293
+ constructor(type, { addressFromBytes, bytesFromAddress }) {
294
+ this.type = type;
295
+ this.#addressFromBytes = addressFromBytes;
296
+ this.#bytesFromAddress = bytesFromAddress;
297
+ const match = type.match(/^([^\(\)]+)(\(.*\))$/);
298
+ if (match !== null) {
299
+ const method = ensure(match[1]);
300
+ type = ensure(match[2]);
301
+ this.selector = keccak256(new TextEncoder().encode(`${method}${type}`)).slice(0, 4);
302
+ }
303
+ this.element = this.#parse(type);
304
+ }
305
+ decode(bytes) {
306
+ if (this.selector !== undefined) {
307
+ assert(bytes.length >= 4);
308
+ assert(Uint8ArrayExtension.equals(bytes.slice(0, 4), this.selector));
309
+ bytes = bytes.slice(4);
310
+ }
311
+ return this.element.decode(bytes);
312
+ }
313
+ encode(value) {
314
+ let bytes = this.element.encode(value);
315
+ if (this.selector !== undefined) {
316
+ bytes = Uint8ArrayExtension.concat([this.selector, bytes]);
317
+ }
318
+ return bytes;
319
+ }
320
+ #parse(type) {
321
+ const parsers = [
322
+ {
323
+ regex: /^(.+)\[(\d+)\]$/,
324
+ fn: (match) => new ArrayElement(this.#parse(ensure(match[1])), Number(ensure(match[2]))),
325
+ },
326
+ { regex: /^(.+)\[\]$/, fn: (match) => new ArrayElement(this.#parse(ensure(match[1]))) },
327
+ {
328
+ regex: /^\((.*)\)$/,
329
+ fn: (match) => {
330
+ const inner = ensure(match[1]);
331
+ const elements = new Array();
332
+ let element = '';
333
+ let depth = 0;
334
+ for (let i = 0; i < inner.length; i++) {
335
+ const char = inner[i];
336
+ if (char === ',' && depth === 0) {
337
+ elements.push(this.#parse(element));
338
+ element = '';
339
+ }
340
+ else {
341
+ if (char === '(') {
342
+ depth++;
343
+ }
344
+ else if (char === ')') {
345
+ depth--;
346
+ }
347
+ element += char;
348
+ }
349
+ }
350
+ assert(depth === 0, 'Unbalanced parentheses');
351
+ if (element !== '') {
352
+ elements.push(this.#parse(element));
353
+ }
354
+ return new StructElement(elements);
355
+ },
356
+ },
357
+ { regex: /^uint(\d+)$/, fn: (match) => new UintElement(Number(ensure(match[1]))) },
358
+ { regex: /^int(\d+)$/, fn: (match) => new IntElement(Number(ensure(match[1]))) },
359
+ { regex: /^bytes(\d+)$/, fn: (match) => new BytesElement(Number(ensure(match[1]))) },
360
+ { regex: /^bytes$/, fn: () => new BytesElement() },
361
+ { regex: /^string$/, fn: () => new StringElement() },
362
+ { regex: /^bool$/, fn: () => new BoolElement() },
363
+ {
364
+ regex: /^address$/,
365
+ fn: () => {
366
+ const bytesFromAddress = this.#bytesFromAddress.bind(this);
367
+ const addressFromBytes = this.#addressFromBytes.bind(this);
368
+ return new class extends AddressElement {
369
+ bytesFromAddress(address) {
370
+ return bytesFromAddress(address);
371
+ }
372
+ addressFromBytes(bytes) {
373
+ return addressFromBytes(bytes);
374
+ }
375
+ }();
376
+ },
377
+ },
378
+ ];
379
+ try {
380
+ for (const { regex, fn } of parsers) {
381
+ const match = type.match(regex);
382
+ if (match) {
383
+ return fn(match);
384
+ }
385
+ }
386
+ throw new Error('No match');
387
+ }
388
+ catch (_) {
389
+ throw new Error(`Failed to parse "${type}"`);
390
+ }
391
+ }
392
+ }
393
+ //# sourceMappingURL=ABI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ABI.js","sourceRoot":"","sources":["../src/ABI.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type Block = {
2
+ hash: string;
3
+ parentHash: string;
4
+ number: number;
5
+ transactions: string[];
6
+ timestamp: Date;
7
+ };
8
+ export default Block;
9
+ //# sourceMappingURL=Block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Block.d.ts","sourceRoot":"","sources":["../src/Block.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,eAAe,KAAK,CAAC"}
package/dist/Block.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Block.js","sourceRoot":"","sources":["../src/Block.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import type ABI from './ABI.ts';
2
+ import type Block from './Block.ts';
3
+ import type ClientHelper from './ClientHelper.ts';
4
+ import type Log from './Log.ts';
5
+ import type Transaction from './Transaction.ts';
6
+ import type TransactionReceipt from './TransactionReceipt.ts';
7
+ export default class Client {
8
+ #private;
9
+ constructor(url: string, helper: ClientHelper);
10
+ createABI(type: string): ABI;
11
+ request({ method, params }: {
12
+ method: string;
13
+ params?: unknown;
14
+ }): Promise<unknown>;
15
+ call({ contract, data }: {
16
+ contract: string;
17
+ data: Uint8Array<ArrayBuffer> | {
18
+ method: string;
19
+ parameters: Uint8Array<ArrayBuffer> | unknown[];
20
+ };
21
+ }): Promise<Uint8Array<ArrayBuffer>>;
22
+ getBlockNumber(): Promise<number>;
23
+ getBlockByNumber(blockNumber: number): Promise<Block | undefined>;
24
+ getLogs({ address, fromBlock, toBlock, topics }: {
25
+ fromBlock?: number;
26
+ toBlock?: number;
27
+ address?: string | string[];
28
+ topics?: (null | Uint8Array | Uint8Array[])[];
29
+ }): Promise<Log[]>;
30
+ getTransaction(hash: string): Promise<Transaction | undefined>;
31
+ getTransactionReceipt(hash: string): Promise<TransactionReceipt | undefined>;
32
+ estimateGas({ from, to, value, data }: {
33
+ from: string;
34
+ to?: string;
35
+ value?: bigint;
36
+ data?: Uint8Array<ArrayBuffer> | {
37
+ method: string;
38
+ parameters: Uint8Array<ArrayBuffer> | unknown[];
39
+ };
40
+ }): Promise<number>;
41
+ getChainId(): Promise<number>;
42
+ }
43
+ //# sourceMappingURL=Client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../src/Client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,MAAM;;gBAKb,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;IAK7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAItB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBnF,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,EAAE,CAAA;SAAE,CAAC;KACrG,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAU9B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAKjC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAiBjE,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QACrD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;KAC/C,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAqBZ,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAS9D,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAS5E,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3C,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,EAAE,CAAA;SAAE,CAAC;KACtG,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBb,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CAIpC"}
package/dist/Client.js ADDED
@@ -0,0 +1,116 @@
1
+ import * as z from '@quentinadam/zod';
2
+ import ClientError from "./ClientError.js";
3
+ export default class Client {
4
+ #url;
5
+ #helper;
6
+ #id = 0;
7
+ constructor(url, helper) {
8
+ this.#url = url;
9
+ this.#helper = helper;
10
+ }
11
+ createABI(type) {
12
+ return this.#helper.createABI(type);
13
+ }
14
+ async request({ method, params }) {
15
+ const body = JSON.stringify({ method, params, id: this.#id++, jsonrpc: '2.0' });
16
+ const response = await fetch(this.#url, {
17
+ method: 'POST',
18
+ headers: { 'Content-Type': 'application/json' },
19
+ body,
20
+ });
21
+ if (!response.ok) {
22
+ throw new Error(`HTTP ${response.status}: ${await response.text()}`);
23
+ }
24
+ const result = z.union([
25
+ z.object({
26
+ error: z.object({ code: z.number(), message: z.string(), data: z.unknown() }),
27
+ }).transform(({ error }) => {
28
+ return { success: false, code: error.code, message: error.message, data: error.data };
29
+ }),
30
+ z.object({ result: z.unknown() }).transform(({ result }) => ({ success: true, value: result })),
31
+ ]).parse(await response.json());
32
+ if (!result.success) {
33
+ throw new ClientError({ message: result.message, code: result.code, data: result.data });
34
+ }
35
+ return result.value;
36
+ }
37
+ async call({ contract, data }) {
38
+ data = this.#helper.normalizeData(data);
39
+ return this.#helper.BytesSchema.parse(await this.request({
40
+ method: 'eth_call',
41
+ params: [{ to: this.#helper.serializeAddress(contract), data: '0x' + data.toHex() }, 'latest'],
42
+ }));
43
+ }
44
+ async getBlockNumber() {
45
+ const response = await this.request({ method: 'eth_blockNumber' });
46
+ return this.#helper.HexNumberSchema.parse(response);
47
+ }
48
+ async getBlockByNumber(blockNumber) {
49
+ const response = await this.request({
50
+ method: 'eth_getBlockByNumber',
51
+ params: [`0x${blockNumber.toString(16)}`, false],
52
+ });
53
+ return z.union([
54
+ z.null().transform(() => undefined),
55
+ z.object({
56
+ hash: z.string(),
57
+ parentHash: z.string(),
58
+ number: this.#helper.HexNumberSchema,
59
+ transactions: z.array(z.string()),
60
+ timestamp: this.#helper.HexNumberSchema.transform((value) => new Date(value * 1000)),
61
+ }),
62
+ ]).parse(response);
63
+ }
64
+ async getLogs({ address, fromBlock, toBlock, topics }) {
65
+ const response = await this.request({
66
+ method: 'eth_getLogs',
67
+ params: [{
68
+ fromBlock: fromBlock !== undefined ? `0x${fromBlock.toString(16)}` : undefined,
69
+ toBlock: toBlock !== undefined ? `0x${toBlock.toString(16)}` : undefined,
70
+ address: address === undefined
71
+ ? undefined
72
+ : typeof address === 'string'
73
+ ? this.#helper.serializeAddress(address)
74
+ : address.map((address) => this.#helper.serializeAddress(address)),
75
+ topics: topics?.map((topic) => {
76
+ return topic !== null
77
+ ? topic instanceof Uint8Array ? '0x' + topic.toHex() : topic.map((topic) => '0x' + topic.toHex())
78
+ : null;
79
+ }),
80
+ }],
81
+ });
82
+ return z.array(this.#helper.LogSchema).parse(response);
83
+ }
84
+ async getTransaction(hash) {
85
+ return this.#helper.TransactionSchema.parse(await this.request({
86
+ method: 'eth_getTransactionByHash',
87
+ params: [this.#helper.serializeHash(hash)],
88
+ }));
89
+ }
90
+ async getTransactionReceipt(hash) {
91
+ return this.#helper.TransactionReceiptSchema.parse(await this.request({
92
+ method: 'eth_getTransactionReceipt',
93
+ params: [this.#helper.serializeHash(hash)],
94
+ }));
95
+ }
96
+ async estimateGas({ from, to, value, data }) {
97
+ if (data !== undefined) {
98
+ data = this.#helper.normalizeData(data);
99
+ }
100
+ const result = await this.request({
101
+ method: 'eth_estimateGas',
102
+ params: [{
103
+ from,
104
+ value: `0x${(value ?? 0n).toString(16)}`,
105
+ to,
106
+ data: '0x' + (data ?? new Uint8Array(0)).toHex(),
107
+ }],
108
+ });
109
+ return this.#helper.HexNumberSchema.parse(result);
110
+ }
111
+ async getChainId() {
112
+ const result = await this.request({ method: 'eth_chainId', params: [] });
113
+ return this.#helper.HexNumberSchema.parse(result);
114
+ }
115
+ }
116
+ //# sourceMappingURL=Client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Client.js","sourceRoot":"","sources":["../src/Client.ts"],"names":[],"mappings":"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"}