@aztec/foundation 0.24.0 → 0.26.2
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.
- package/dest/abi/abi.d.ts +1 -1
- package/dest/abi/abi.d.ts.map +1 -1
- package/dest/abi/event_selector.d.ts +45 -0
- package/dest/abi/event_selector.d.ts.map +1 -0
- package/dest/abi/event_selector.js +60 -0
- package/dest/abi/function_selector.d.ts +69 -0
- package/dest/abi/function_selector.d.ts.map +1 -0
- package/dest/abi/function_selector.js +86 -0
- package/dest/abi/index.d.ts +2 -1
- package/dest/abi/index.d.ts.map +1 -1
- package/dest/abi/index.js +3 -2
- package/dest/abi/selector.d.ts +4 -106
- package/dest/abi/selector.d.ts.map +1 -1
- package/dest/abi/selector.js +8 -143
- package/dest/abi/utils.js +3 -3
- package/dest/array/array.d.ts +8 -0
- package/dest/array/array.d.ts.map +1 -1
- package/dest/array/array.js +26 -1
- package/dest/aztec-address/index.d.ts +8 -1
- package/dest/aztec-address/index.d.ts.map +1 -1
- package/dest/aztec-address/index.js +16 -2
- package/dest/crypto/index.d.ts +1 -0
- package/dest/crypto/index.d.ts.map +1 -1
- package/dest/crypto/index.js +2 -1
- package/dest/crypto/pedersen/pedersen.wasm.d.ts +2 -1
- package/dest/crypto/pedersen/pedersen.wasm.d.ts.map +1 -1
- package/dest/crypto/pedersen/pedersen.wasm.js +7 -6
- package/dest/crypto/poseidon/index.d.ts +8 -0
- package/dest/crypto/poseidon/index.d.ts.map +1 -0
- package/dest/crypto/poseidon/index.js +12 -0
- package/dest/eth-address/index.d.ts +3 -0
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +5 -2
- package/dest/fields/fields.d.ts +19 -0
- package/dest/fields/fields.d.ts.map +1 -1
- package/dest/fields/fields.js +9 -2
- package/dest/json-rpc/client/json_rpc_client.js +2 -2
- package/dest/serialize/buffer_reader.d.ts +15 -0
- package/dest/serialize/buffer_reader.d.ts.map +1 -1
- package/dest/serialize/buffer_reader.js +18 -1
- package/dest/serialize/serialize.d.ts +3 -5
- package/dest/serialize/serialize.d.ts.map +1 -1
- package/dest/serialize/serialize.js +17 -8
- package/package.json +2 -2
- package/src/abi/abi.ts +1 -1
- package/src/abi/event_selector.ts +73 -0
- package/src/abi/function_selector.ts +122 -0
- package/src/abi/index.ts +2 -1
- package/src/abi/selector.ts +8 -188
- package/src/abi/utils.ts +2 -2
- package/src/array/array.ts +33 -0
- package/src/aztec-address/index.ts +22 -2
- package/src/crypto/index.ts +1 -0
- package/src/crypto/pedersen/pedersen.wasm.ts +14 -10
- package/src/crypto/poseidon/index.ts +17 -0
- package/src/eth-address/index.ts +6 -1
- package/src/fields/fields.ts +11 -1
- package/src/json-rpc/client/json_rpc_client.ts +1 -1
- package/src/serialize/buffer_reader.ts +23 -0
- package/src/serialize/serialize.ts +14 -7
|
@@ -133,6 +133,23 @@ export class BufferReader {
|
|
|
133
133
|
}
|
|
134
134
|
return result;
|
|
135
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Reads a vector of fixed size from the buffer and deserializes its elements using the provided itemDeserializer object.
|
|
138
|
+
* The 'itemDeserializer' object should have a 'fromBuffer' method that takes a BufferReader instance and returns the deserialized element.
|
|
139
|
+
* The method first reads the size of the vector (a number) from the buffer, then iterates through its elements,
|
|
140
|
+
* deserializing each one using the 'fromBuffer' method of 'itemDeserializer'.
|
|
141
|
+
*
|
|
142
|
+
* @param itemDeserializer - Object with 'fromBuffer' method to deserialize vector elements.
|
|
143
|
+
* @returns An array of deserialized elements of type T.
|
|
144
|
+
*/
|
|
145
|
+
readVectorUint8Prefix(itemDeserializer) {
|
|
146
|
+
const size = this.readUInt8();
|
|
147
|
+
const result = new Array(size);
|
|
148
|
+
for (let i = 0; i < size; i++) {
|
|
149
|
+
result[i] = itemDeserializer.fromBuffer(this);
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
136
153
|
/**
|
|
137
154
|
* Read an array of a fixed size with elements of type T from the buffer.
|
|
138
155
|
* The 'itemDeserializer' object should have a 'fromBuffer' method that takes a BufferReader instance as input,
|
|
@@ -237,4 +254,4 @@ export class BufferReader {
|
|
|
237
254
|
return this.buffer.length;
|
|
238
255
|
}
|
|
239
256
|
}
|
|
240
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyX3JlYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemUvYnVmZmVyX3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBRXZCLFlBQW9CLE1BQWMsRUFBRSxNQUFNLEdBQUcsQ0FBQztRQUExQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFrRDtRQUN2RSxJQUFJLGNBQWMsWUFBWSxZQUFZLEVBQUUsQ0FBQztZQUMzQyxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDekMsQ0FBQyxDQUFDLGNBQWM7WUFDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3RixPQUFPLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFVBQVU7UUFDZixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQW1CLEtBQVE7UUFDM0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMs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
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import { Fr } from '../fields/fields.js';
|
|
3
3
|
/**
|
|
4
4
|
* For serializing an array of fixed length buffers.
|
|
5
|
-
*
|
|
6
|
-
* @param
|
|
5
|
+
* @param arr - Array of bufferable.
|
|
6
|
+
* @param prefixLength - The length of the prefix (denominated in bytes).
|
|
7
7
|
* @returns The serialized buffers.
|
|
8
8
|
*/
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function serializeArrayOfBufferableToVector(objs: Bufferable[], prefixLength?: number): Buffer;
|
|
10
10
|
/**
|
|
11
11
|
* Helper function for deserializeArrayFromVector.
|
|
12
12
|
*/
|
|
@@ -26,8 +26,6 @@ type DeserializeFn<T> = (buf: Buffer, offset: number) => {
|
|
|
26
26
|
* @param vector - The vector to deserialize.
|
|
27
27
|
* @param offset - The position in the vector to start deserializing from.
|
|
28
28
|
* @returns Deserialized array and how many bytes we advanced by.
|
|
29
|
-
*
|
|
30
|
-
* TODO: move to foundation pkg.
|
|
31
29
|
*/
|
|
32
30
|
export declare function deserializeArrayFromVector<T>(deserialize: DeserializeFn<T>, vector: Buffer, offset?: number): {
|
|
33
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/serialize/serialize.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAGzC;;;;;GAKG;AACH,wBAAgB,
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/serialize/serialize.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAGzC;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,YAAY,SAAI,GAAG,MAAM,CAa/F;AAED;;GAEG;AACH,KAAK,aAAa,CAAC,CAAC,IAAI,CACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,KACX;IACH;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC;IACR;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAC1C,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,EAC7B,MAAM,EAAE,MAAM,EACd,MAAM,SAAI,GACT;IACD;;OAEG;IACH,IAAI,EAAE,CAAC,EAAE,CAAC;IACV;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACb,CAWA;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAGzD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,SAAI,GAAG,MAAM,CAInE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI;;;EAGvD;AAED,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,GACN;IACE;;OAEG;IACH,QAAQ,EAAE,MAAM,MAAM,CAAC;CACxB,GACD,UAAU,EAAE,CAAC;AAEjB,gEAAgE;AAChE,MAAM,MAAM,UAAU,GAClB,EAAE,GACF,OAAO,GACP,MAAM,GACN,MAAM,GACN;IACE,4BAA4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GACD;IACE,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;CACtB,GACD,UAAU,EAAE,CAAC;AAEjB;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAoBtE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,CAgB7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA0BlD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,UAEpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAK;;;EAEpE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,UAEvC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI;;;EAGtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI;;;EAGxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI;;;EAGvD"}
|
|
@@ -3,13 +3,24 @@ import { Fr } from '../fields/fields.js';
|
|
|
3
3
|
import { numToUInt32BE } from './free_funcs.js';
|
|
4
4
|
/**
|
|
5
5
|
* For serializing an array of fixed length buffers.
|
|
6
|
-
*
|
|
7
|
-
* @param
|
|
6
|
+
* @param arr - Array of bufferable.
|
|
7
|
+
* @param prefixLength - The length of the prefix (denominated in bytes).
|
|
8
8
|
* @returns The serialized buffers.
|
|
9
9
|
*/
|
|
10
|
-
export function
|
|
11
|
-
const
|
|
12
|
-
lengthBuf
|
|
10
|
+
export function serializeArrayOfBufferableToVector(objs, prefixLength = 4) {
|
|
11
|
+
const arr = serializeToBufferArray(objs);
|
|
12
|
+
let lengthBuf;
|
|
13
|
+
if (prefixLength === 1) {
|
|
14
|
+
lengthBuf = Buffer.alloc(1);
|
|
15
|
+
lengthBuf.writeUInt8(arr.length, 0);
|
|
16
|
+
}
|
|
17
|
+
else if (prefixLength === 4) {
|
|
18
|
+
lengthBuf = Buffer.alloc(4);
|
|
19
|
+
lengthBuf.writeUInt32BE(arr.length, 0);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
throw new Error(`Unsupported prefix length. Got ${prefixLength}, expected 1 or 4`);
|
|
23
|
+
}
|
|
13
24
|
return Buffer.concat([lengthBuf, ...arr]);
|
|
14
25
|
}
|
|
15
26
|
/**
|
|
@@ -18,8 +29,6 @@ export function serializeBufferArrayToVector(arr) {
|
|
|
18
29
|
* @param vector - The vector to deserialize.
|
|
19
30
|
* @param offset - The position in the vector to start deserializing from.
|
|
20
31
|
* @returns Deserialized array and how many bytes we advanced by.
|
|
21
|
-
*
|
|
22
|
-
* TODO: move to foundation pkg.
|
|
23
32
|
*/
|
|
24
33
|
export function deserializeArrayFromVector(deserialize, vector, offset = 0) {
|
|
25
34
|
let pos = offset;
|
|
@@ -225,4 +234,4 @@ export function deserializeInt32(buf, offset = 0) {
|
|
|
225
234
|
const adv = 4;
|
|
226
235
|
return { elem: buf.readInt32BE(offset), adv };
|
|
227
236
|
}
|
|
228
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtDQUFrQyxDQUFDLElBQWtCLEVBQUUsWUFBWSxHQUFHLENBQUM7SUFDckYsTUFBTSxHQUFHLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsSUFBSSxTQUFpQixDQUFDO0lBQ3RCLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO1NBQU0sSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsWUFBWSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFtQkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxXQUE2QixFQUM3QixNQUFjLEVBQ2QsTUFBTSxHQUFHLENBQUM7SUFXVixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUM7SUFDakIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ1QsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUksSUFBSSxDQUFDLENBQUM7SUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBaUI7SUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYyxFQUFFLFVBQVUsR0FBRyxDQUFDO0lBQ3pELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsTUFBTSxHQUFHLENBQUM7SUFDdEQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEQsQ0FBQztBQWdDRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEdBQUcsSUFBa0I7SUFDMUQsSUFBSSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3ZCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsQ0FBQzthQUFNLElBQUksT0FBTyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDO2FBQU0sSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxzREFBc0Q7WUFDdEQsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlEQUFpRDtRQUNqRixDQUFDO2FBQU0sSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQUcsSUFBa0I7SUFDckQsSUFBSSxHQUFHLEdBQVMsRUFBRSxDQUFDO0lBQ25CLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQzthQUFNLElBQUksR0FBRyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQzdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsQ0FBQzthQUFNLElBQUksT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxRixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsQ0FBQzthQUFNLElBQUksVUFBVSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzdCLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFHLElBQWtCO0lBQ3JELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVc7SUFDeEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUNuQixHQUFHLEVBQ0gsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDYixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEcsT0FBTyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLENBQUM7YUFBTSxJQUNMLEtBQUs7WUFFSCxLQU1ELENBQUMsY0FBYyxFQUNoQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDLEVBQ0QsQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxDQUFTLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFDbkQsT0FBTyxVQUFVLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDaEYsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQVU7SUFDdEMsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBVyxFQUFFLE1BQU0sR0FBRyxDQUFDO0lBQ3JELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBVyxFQUFFLE1BQU0sR0FBRyxDQUFDO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQztJQUN0RCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDaEQsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/foundation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.2",
|
|
4
4
|
"packageManager": "yarn@3.4.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dest/index.js",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"rootDir": "./src"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@aztec/bb.js": "0.
|
|
64
|
+
"@aztec/bb.js": "0.26.2",
|
|
65
65
|
"@koa/cors": "^4.0.0",
|
|
66
66
|
"@noble/curves": "^1.2.0",
|
|
67
67
|
"bn.js": "^5.2.1",
|
package/src/abi/abi.ts
CHANGED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { fromHex, toBigIntBE } from '../bigint-buffer/index.js';
|
|
2
|
+
import { keccak } from '../crypto/index.js';
|
|
3
|
+
import { Fr } from '../fields/fields.js';
|
|
4
|
+
import { BufferReader } from '../serialize/buffer_reader.js';
|
|
5
|
+
import { Selector } from './selector.js';
|
|
6
|
+
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
|
|
8
|
+
|
|
9
|
+
/** Event selector branding */
|
|
10
|
+
export interface EventSelector {
|
|
11
|
+
/** Brand. */
|
|
12
|
+
_branding: 'EventSelector';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** An event selector is the first 4 bytes of the hash of an event signature. */
|
|
16
|
+
export class EventSelector extends Selector {
|
|
17
|
+
/**
|
|
18
|
+
* Deserializes from a buffer or reader, corresponding to a write in cpp.
|
|
19
|
+
* @param buffer - Buffer or BufferReader to read from.
|
|
20
|
+
* @returns The Selector.
|
|
21
|
+
*/
|
|
22
|
+
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
23
|
+
const reader = BufferReader.asReader(buffer);
|
|
24
|
+
const value = Number(toBigIntBE(reader.readBytes(Selector.SIZE)));
|
|
25
|
+
return new EventSelector(value);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Converts a field to selector.
|
|
30
|
+
* @param fr - The field to convert.
|
|
31
|
+
* @returns The selector.
|
|
32
|
+
*/
|
|
33
|
+
static fromField(fr: Fr) {
|
|
34
|
+
return new EventSelector(Number(fr.toBigInt()));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Creates a selector from a signature.
|
|
39
|
+
* @param signature - Signature to generate the selector for (e.g. "transfer(field,field)").
|
|
40
|
+
* @returns selector.
|
|
41
|
+
*/
|
|
42
|
+
static fromSignature(signature: string) {
|
|
43
|
+
// throw if signature contains whitespace
|
|
44
|
+
if (/\s/.test(signature)) {
|
|
45
|
+
throw new Error('Signature cannot contain whitespace');
|
|
46
|
+
}
|
|
47
|
+
return EventSelector.fromBuffer(keccak(Buffer.from(signature)).subarray(0, Selector.SIZE));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Create a Selector instance from a hex-encoded string.
|
|
52
|
+
* The input 'address' should be prefixed with '0x' or not, and have exactly 64 hex characters.
|
|
53
|
+
* Throws an error if the input length is invalid or address value is out of range.
|
|
54
|
+
*
|
|
55
|
+
* @param selector - The hex-encoded string representing the Selector.
|
|
56
|
+
* @returns An Selector instance.
|
|
57
|
+
*/
|
|
58
|
+
static fromString(selector: string) {
|
|
59
|
+
const buf = fromHex(selector);
|
|
60
|
+
if (buf.length !== Selector.SIZE) {
|
|
61
|
+
throw new Error(`Invalid Selector length ${buf.length} (expected ${Selector.SIZE}).`);
|
|
62
|
+
}
|
|
63
|
+
return EventSelector.fromBuffer(buf);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Creates an empty selector.
|
|
68
|
+
* @returns An empty selector.
|
|
69
|
+
*/
|
|
70
|
+
static empty() {
|
|
71
|
+
return new EventSelector(0);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { fromHex, toBigIntBE } from '../bigint-buffer/index.js';
|
|
2
|
+
import { keccak, randomBytes } from '../crypto/index.js';
|
|
3
|
+
import { Fr } from '../fields/fields.js';
|
|
4
|
+
import { BufferReader } from '../serialize/buffer_reader.js';
|
|
5
|
+
import { FieldReader } from '../serialize/field_reader.js';
|
|
6
|
+
import { ABIParameter } from './abi.js';
|
|
7
|
+
import { decodeFunctionSignature } from './decoder.js';
|
|
8
|
+
import { Selector } from './selector.js';
|
|
9
|
+
|
|
10
|
+
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
|
|
11
|
+
|
|
12
|
+
/** Function selector branding */
|
|
13
|
+
export interface FunctionSelector {
|
|
14
|
+
/** Brand. */
|
|
15
|
+
_branding: 'FunctionSelector';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** A function selector is the first 4 bytes of the hash of a function signature. */
|
|
19
|
+
export class FunctionSelector extends Selector {
|
|
20
|
+
/**
|
|
21
|
+
* Checks if this function selector is equal to another.
|
|
22
|
+
* @returns True if the function selectors are equal.
|
|
23
|
+
*/
|
|
24
|
+
equals(otherName: string, otherParams: ABIParameter[]): boolean;
|
|
25
|
+
equals(other: FunctionSelector): boolean;
|
|
26
|
+
equals(other: FunctionSelector | string, otherParams?: ABIParameter[]): boolean {
|
|
27
|
+
if (typeof other === 'string') {
|
|
28
|
+
return this.equals(FunctionSelector.fromNameAndParameters(other, otherParams!));
|
|
29
|
+
}
|
|
30
|
+
return this.value === other.value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Deserializes from a buffer or reader, corresponding to a write in cpp.
|
|
35
|
+
* @param buffer - Buffer or BufferReader to read from.
|
|
36
|
+
* @returns The Selector.
|
|
37
|
+
*/
|
|
38
|
+
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
39
|
+
const reader = BufferReader.asReader(buffer);
|
|
40
|
+
const value = Number(toBigIntBE(reader.readBytes(Selector.SIZE)));
|
|
41
|
+
return new FunctionSelector(value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Converts a field to selector.
|
|
46
|
+
* @param fr - The field to convert.
|
|
47
|
+
* @returns The selector.
|
|
48
|
+
*/
|
|
49
|
+
static fromField(fr: Fr) {
|
|
50
|
+
return new FunctionSelector(Number(fr.toBigInt()));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static fromFields(fields: Fr[] | FieldReader) {
|
|
54
|
+
const reader = FieldReader.asReader(fields);
|
|
55
|
+
return FunctionSelector.fromField(reader.readField());
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Creates a selector from a signature.
|
|
60
|
+
* @param signature - Signature to generate the selector for (e.g. "transfer(field,field)").
|
|
61
|
+
* @returns selector.
|
|
62
|
+
*/
|
|
63
|
+
static fromSignature(signature: string) {
|
|
64
|
+
// throw if signature contains whitespace
|
|
65
|
+
if (/\s/.test(signature)) {
|
|
66
|
+
throw new Error('Signature cannot contain whitespace');
|
|
67
|
+
}
|
|
68
|
+
return FunctionSelector.fromBuffer(keccak(Buffer.from(signature)).subarray(0, Selector.SIZE));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Create a Selector instance from a hex-encoded string.
|
|
73
|
+
* The input 'address' should be prefixed with '0x' or not, and have exactly 64 hex characters.
|
|
74
|
+
* Throws an error if the input length is invalid or address value is out of range.
|
|
75
|
+
*
|
|
76
|
+
* @param selector - The hex-encoded string representing the Selector.
|
|
77
|
+
* @returns An Selector instance.
|
|
78
|
+
*/
|
|
79
|
+
static fromString(selector: string) {
|
|
80
|
+
const buf = fromHex(selector);
|
|
81
|
+
if (buf.length !== Selector.SIZE) {
|
|
82
|
+
throw new Error(`Invalid Selector length ${buf.length} (expected ${Selector.SIZE}).`);
|
|
83
|
+
}
|
|
84
|
+
return FunctionSelector.fromBuffer(buf);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Creates an empty selector.
|
|
89
|
+
* @returns An empty selector.
|
|
90
|
+
*/
|
|
91
|
+
static empty() {
|
|
92
|
+
return new FunctionSelector(0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Creates a function selector for a given function name and parameters.
|
|
97
|
+
* @param name - The name of the function.
|
|
98
|
+
* @param parameters - An array of ABIParameter objects, each containing the type information of a function parameter.
|
|
99
|
+
* @returns A Buffer containing the 4-byte selector.
|
|
100
|
+
*/
|
|
101
|
+
static fromNameAndParameters(args: { name: string; parameters: ABIParameter[] }): FunctionSelector;
|
|
102
|
+
static fromNameAndParameters(name: string, parameters: ABIParameter[]): FunctionSelector;
|
|
103
|
+
static fromNameAndParameters(
|
|
104
|
+
nameOrArgs: string | { name: string; parameters: ABIParameter[] },
|
|
105
|
+
maybeParameters?: ABIParameter[],
|
|
106
|
+
): FunctionSelector {
|
|
107
|
+
const { name, parameters } =
|
|
108
|
+
typeof nameOrArgs === 'string' ? { name: nameOrArgs, parameters: maybeParameters! } : nameOrArgs;
|
|
109
|
+
const signature = decodeFunctionSignature(name, parameters);
|
|
110
|
+
const selector = this.fromSignature(signature);
|
|
111
|
+
// If using the debug logger here it kill the typing in the `server_world_state_synchronizer` and jest tests.
|
|
112
|
+
// console.log(`selector for ${signature} is ${selector}`);
|
|
113
|
+
return selector;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Creates a random instance.
|
|
118
|
+
*/
|
|
119
|
+
static random() {
|
|
120
|
+
return FunctionSelector.fromBuffer(randomBytes(Selector.SIZE));
|
|
121
|
+
}
|
|
122
|
+
}
|
package/src/abi/index.ts
CHANGED
package/src/abi/selector.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { inspect } from 'util';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { keccak } from '../crypto/keccak/index.js';
|
|
3
|
+
import { toBufferBE } from '../bigint-buffer/index.js';
|
|
5
4
|
import { Fr } from '../fields/index.js';
|
|
6
|
-
import { BufferReader, FieldReader } from '../serialize/index.js';
|
|
7
|
-
import { type ABIParameter } from './abi.js';
|
|
8
|
-
import { decodeFunctionSignature } from './decoder.js';
|
|
9
|
-
|
|
10
|
-
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
|
|
11
5
|
|
|
12
6
|
/** A selector is the first 4 bytes of the hash of a signature. */
|
|
13
|
-
abstract class Selector {
|
|
7
|
+
export abstract class Selector {
|
|
14
8
|
/** The size of the selector in bytes. */
|
|
15
9
|
public static SIZE = 4;
|
|
16
10
|
|
|
@@ -42,7 +36,11 @@ abstract class Selector {
|
|
|
42
36
|
* @returns The string.
|
|
43
37
|
*/
|
|
44
38
|
toString(): string {
|
|
45
|
-
return this.toBuffer().toString('hex');
|
|
39
|
+
return '0x' + this.toBuffer().toString('hex');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
[inspect.custom]() {
|
|
43
|
+
return `Selector<${this.toString()}>`;
|
|
46
44
|
}
|
|
47
45
|
|
|
48
46
|
/**
|
|
@@ -63,181 +61,3 @@ abstract class Selector {
|
|
|
63
61
|
return new Fr(BigInt(this.value));
|
|
64
62
|
}
|
|
65
63
|
}
|
|
66
|
-
|
|
67
|
-
/** Function selector branding */
|
|
68
|
-
export interface FunctionSelector {
|
|
69
|
-
/** Brand. */
|
|
70
|
-
_branding: 'FunctionSelector';
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** A function selector is the first 4 bytes of the hash of a function signature. */
|
|
74
|
-
export class FunctionSelector extends Selector {
|
|
75
|
-
/**
|
|
76
|
-
* Checks if this function selector is equal to another.
|
|
77
|
-
* @returns True if the function selectors are equal.
|
|
78
|
-
*/
|
|
79
|
-
equals(otherName: string, otherParams: ABIParameter[]): boolean;
|
|
80
|
-
equals(other: FunctionSelector): boolean;
|
|
81
|
-
equals(other: FunctionSelector | string, otherParams?: ABIParameter[]): boolean {
|
|
82
|
-
if (typeof other === 'string') {
|
|
83
|
-
return this.equals(FunctionSelector.fromNameAndParameters(other, otherParams!));
|
|
84
|
-
}
|
|
85
|
-
return this.value === other.value;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Deserializes from a buffer or reader, corresponding to a write in cpp.
|
|
90
|
-
* @param buffer - Buffer or BufferReader to read from.
|
|
91
|
-
* @returns The Selector.
|
|
92
|
-
*/
|
|
93
|
-
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
94
|
-
const reader = BufferReader.asReader(buffer);
|
|
95
|
-
const value = Number(toBigIntBE(reader.readBytes(Selector.SIZE)));
|
|
96
|
-
return new FunctionSelector(value);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Converts a field to selector.
|
|
101
|
-
* @param fr - The field to convert.
|
|
102
|
-
* @returns The selector.
|
|
103
|
-
*/
|
|
104
|
-
static fromField(fr: Fr) {
|
|
105
|
-
return new FunctionSelector(Number(fr.toBigInt()));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
static fromFields(fields: Fr[] | FieldReader) {
|
|
109
|
-
const reader = FieldReader.asReader(fields);
|
|
110
|
-
return FunctionSelector.fromField(reader.readField());
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Creates a selector from a signature.
|
|
115
|
-
* @param signature - Signature to generate the selector for (e.g. "transfer(field,field)").
|
|
116
|
-
* @returns selector.
|
|
117
|
-
*/
|
|
118
|
-
static fromSignature(signature: string) {
|
|
119
|
-
// throw if signature contains whitespace
|
|
120
|
-
if (/\s/.test(signature)) {
|
|
121
|
-
throw new Error('Signature cannot contain whitespace');
|
|
122
|
-
}
|
|
123
|
-
return FunctionSelector.fromBuffer(keccak(Buffer.from(signature)).subarray(0, Selector.SIZE));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Create a Selector instance from a hex-encoded string.
|
|
128
|
-
* The input 'address' should be prefixed with '0x' or not, and have exactly 64 hex characters.
|
|
129
|
-
* Throws an error if the input length is invalid or address value is out of range.
|
|
130
|
-
*
|
|
131
|
-
* @param selector - The hex-encoded string representing the Selector.
|
|
132
|
-
* @returns An Selector instance.
|
|
133
|
-
*/
|
|
134
|
-
static fromString(selector: string) {
|
|
135
|
-
const buf = fromHex(selector);
|
|
136
|
-
if (buf.length !== Selector.SIZE) {
|
|
137
|
-
throw new Error(`Invalid Selector length ${buf.length} (expected ${Selector.SIZE}).`);
|
|
138
|
-
}
|
|
139
|
-
return FunctionSelector.fromBuffer(buf);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Creates an empty selector.
|
|
144
|
-
* @returns An empty selector.
|
|
145
|
-
*/
|
|
146
|
-
static empty() {
|
|
147
|
-
return new FunctionSelector(0);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Creates a function selector for a given function name and parameters.
|
|
152
|
-
* @param name - The name of the function.
|
|
153
|
-
* @param parameters - An array of ABIParameter objects, each containing the type information of a function parameter.
|
|
154
|
-
* @returns A Buffer containing the 4-byte selector.
|
|
155
|
-
*/
|
|
156
|
-
static fromNameAndParameters(args: { name: string; parameters: ABIParameter[] }): FunctionSelector;
|
|
157
|
-
static fromNameAndParameters(name: string, parameters: ABIParameter[]): FunctionSelector;
|
|
158
|
-
static fromNameAndParameters(
|
|
159
|
-
nameOrArgs: string | { name: string; parameters: ABIParameter[] },
|
|
160
|
-
maybeParameters?: ABIParameter[],
|
|
161
|
-
): FunctionSelector {
|
|
162
|
-
const { name, parameters } =
|
|
163
|
-
typeof nameOrArgs === 'string' ? { name: nameOrArgs, parameters: maybeParameters! } : nameOrArgs;
|
|
164
|
-
const signature = decodeFunctionSignature(name, parameters);
|
|
165
|
-
const selector = this.fromSignature(signature);
|
|
166
|
-
// If using the debug logger here it kill the typing in the `server_world_state_synchronizer` and jest tests.
|
|
167
|
-
// console.log(`selector for ${signature} is ${selector}`);
|
|
168
|
-
return selector;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Creates a random instance.
|
|
173
|
-
*/
|
|
174
|
-
static random() {
|
|
175
|
-
return FunctionSelector.fromBuffer(randomBytes(Selector.SIZE));
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/** Event selector branding */
|
|
180
|
-
export interface EventSelector {
|
|
181
|
-
/** Brand. */
|
|
182
|
-
_branding: 'EventSelector';
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/** An event selector is the first 4 bytes of the hash of an event signature. */
|
|
186
|
-
export class EventSelector extends Selector {
|
|
187
|
-
/**
|
|
188
|
-
* Deserializes from a buffer or reader, corresponding to a write in cpp.
|
|
189
|
-
* @param buffer - Buffer or BufferReader to read from.
|
|
190
|
-
* @returns The Selector.
|
|
191
|
-
*/
|
|
192
|
-
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
193
|
-
const reader = BufferReader.asReader(buffer);
|
|
194
|
-
const value = Number(toBigIntBE(reader.readBytes(Selector.SIZE)));
|
|
195
|
-
return new EventSelector(value);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Converts a field to selector.
|
|
200
|
-
* @param fr - The field to convert.
|
|
201
|
-
* @returns The selector.
|
|
202
|
-
*/
|
|
203
|
-
static fromField(fr: Fr) {
|
|
204
|
-
return new EventSelector(Number(fr.toBigInt()));
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Creates a selector from a signature.
|
|
209
|
-
* @param signature - Signature to generate the selector for (e.g. "transfer(field,field)").
|
|
210
|
-
* @returns selector.
|
|
211
|
-
*/
|
|
212
|
-
static fromSignature(signature: string) {
|
|
213
|
-
// throw if signature contains whitespace
|
|
214
|
-
if (/\s/.test(signature)) {
|
|
215
|
-
throw new Error('Signature cannot contain whitespace');
|
|
216
|
-
}
|
|
217
|
-
return EventSelector.fromBuffer(keccak(Buffer.from(signature)).subarray(0, Selector.SIZE));
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Create a Selector instance from a hex-encoded string.
|
|
222
|
-
* The input 'address' should be prefixed with '0x' or not, and have exactly 64 hex characters.
|
|
223
|
-
* Throws an error if the input length is invalid or address value is out of range.
|
|
224
|
-
*
|
|
225
|
-
* @param selector - The hex-encoded string representing the Selector.
|
|
226
|
-
* @returns An Selector instance.
|
|
227
|
-
*/
|
|
228
|
-
static fromString(selector: string) {
|
|
229
|
-
const buf = fromHex(selector);
|
|
230
|
-
if (buf.length !== Selector.SIZE) {
|
|
231
|
-
throw new Error(`Invalid Selector length ${buf.length} (expected ${Selector.SIZE}).`);
|
|
232
|
-
}
|
|
233
|
-
return EventSelector.fromBuffer(buf);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Creates an empty selector.
|
|
238
|
-
* @returns An empty selector.
|
|
239
|
-
*/
|
|
240
|
-
static empty() {
|
|
241
|
-
return new EventSelector(0);
|
|
242
|
-
}
|
|
243
|
-
}
|
package/src/abi/utils.ts
CHANGED
|
@@ -15,7 +15,7 @@ export function isAddressStruct(abiType: ABIType) {
|
|
|
15
15
|
* @returns Boolean.
|
|
16
16
|
*/
|
|
17
17
|
export function isEthAddressStruct(abiType: ABIType) {
|
|
18
|
-
return abiType.kind === 'struct' && abiType.path.endsWith('
|
|
18
|
+
return abiType.kind === 'struct' && abiType.path.endsWith('address::EthAddress');
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
/**
|
|
@@ -24,7 +24,7 @@ export function isEthAddressStruct(abiType: ABIType) {
|
|
|
24
24
|
* @returns Boolean.
|
|
25
25
|
*/
|
|
26
26
|
export function isAztecAddressStruct(abiType: ABIType) {
|
|
27
|
-
return abiType.kind === 'struct' && abiType.path.endsWith('
|
|
27
|
+
return abiType.kind === 'struct' && abiType.path.endsWith('address::AztecAddress');
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
package/src/array/array.ts
CHANGED
|
@@ -84,3 +84,36 @@ export function assertItemsLength<
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Checks that the permutation is valid. Throws an error if it is not.
|
|
90
|
+
* @param original - The original array.
|
|
91
|
+
* @param permutation - The array which is allegedly a permutation of the original.
|
|
92
|
+
* @param indexes - The indices of the original array which the permutation should map to.
|
|
93
|
+
* @param isEqual - A function to compare the elements of the original and permutation arrays.
|
|
94
|
+
*/
|
|
95
|
+
export function assertPermutation<T>(
|
|
96
|
+
original: T[],
|
|
97
|
+
permutation: T[],
|
|
98
|
+
indexes: number[],
|
|
99
|
+
isEqual: (a: T, b: T) => boolean,
|
|
100
|
+
): void {
|
|
101
|
+
if (original.length !== permutation.length || original.length !== indexes.length) {
|
|
102
|
+
throw new Error(`Invalid lengths: ${original.length}, ${permutation.length}, ${indexes.length}`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const seenValue = new Set<number>();
|
|
106
|
+
for (let i = 0; i < indexes.length; i++) {
|
|
107
|
+
const index = indexes[i];
|
|
108
|
+
const permutedValue = permutation[i];
|
|
109
|
+
const originalValueAtIndex = original[index];
|
|
110
|
+
|
|
111
|
+
if (!isEqual(permutedValue, originalValueAtIndex)) {
|
|
112
|
+
throw new Error(`Invalid permutation at index ${index}: ${permutedValue} !== ${originalValueAtIndex}`);
|
|
113
|
+
}
|
|
114
|
+
if (seenValue.has(index)) {
|
|
115
|
+
throw new Error(`Duplicate index in permutation: ${index}`);
|
|
116
|
+
}
|
|
117
|
+
seenValue.add(index);
|
|
118
|
+
}
|
|
119
|
+
}
|