@aztec/foundation 0.61.0 → 0.63.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.
- package/dest/abi/abi.d.ts +708 -228
- package/dest/abi/abi.d.ts.map +1 -1
- package/dest/abi/abi.js +92 -8
- package/dest/abi/decoder.d.ts.map +1 -1
- package/dest/abi/decoder.js +8 -6
- package/dest/abi/encoder.d.ts.map +1 -1
- package/dest/abi/encoder.js +4 -1
- package/dest/abi/event_selector.d.ts +4 -0
- package/dest/abi/event_selector.d.ts.map +1 -1
- package/dest/abi/event_selector.js +7 -1
- package/dest/abi/utils.d.ts +8 -0
- package/dest/abi/utils.d.ts.map +1 -1
- package/dest/abi/utils.js +23 -1
- package/dest/aztec-address/index.d.ts +19 -3
- package/dest/aztec-address/index.d.ts.map +1 -1
- package/dest/aztec-address/index.js +43 -14
- package/dest/buffer/buffer32.d.ts +1 -0
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/buffer32.js +4 -1
- package/dest/config/env_var.d.ts +1 -1
- package/dest/config/env_var.d.ts.map +1 -1
- 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/keys/index.d.ts +5 -0
- package/dest/crypto/keys/index.d.ts.map +1 -0
- package/dest/crypto/keys/index.js +8 -0
- package/dest/eth-address/index.d.ts +2 -6
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +3 -7
- package/dest/eth-signature/eth_signature.d.ts +2 -0
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/eth-signature/eth_signature.js +7 -1
- package/dest/fields/fields.d.ts +1 -3
- package/dest/fields/fields.d.ts.map +1 -1
- package/dest/fields/fields.js +2 -1
- package/dest/json-rpc/client/fetch.d.ts +21 -0
- package/dest/json-rpc/client/fetch.d.ts.map +1 -0
- package/dest/json-rpc/client/fetch.js +66 -0
- package/dest/json-rpc/client/index.d.ts +2 -1
- package/dest/json-rpc/client/index.d.ts.map +1 -1
- package/dest/json-rpc/client/index.js +3 -2
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +13 -0
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -0
- package/dest/json-rpc/client/safe_json_rpc_client.js +45 -0
- package/dest/json-rpc/convert.d.ts +11 -19
- package/dest/json-rpc/convert.d.ts.map +1 -1
- package/dest/json-rpc/convert.js +30 -123
- package/dest/json-rpc/fixtures/test_state.d.ts +45 -3
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/test_state.js +58 -2
- package/dest/json-rpc/index.d.ts +1 -2
- package/dest/json-rpc/index.d.ts.map +1 -1
- package/dest/json-rpc/index.js +2 -3
- package/dest/json-rpc/js_utils.d.ts.map +1 -1
- package/dest/json-rpc/js_utils.js +2 -1
- package/dest/json-rpc/server/index.d.ts +1 -2
- package/dest/json-rpc/server/index.d.ts.map +1 -1
- package/dest/json-rpc/server/index.js +2 -3
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +112 -0
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -0
- package/dest/json-rpc/server/safe_json_rpc_server.js +275 -0
- package/dest/json-rpc/test/index.d.ts +2 -0
- package/dest/json-rpc/test/index.d.ts.map +1 -0
- package/dest/json-rpc/test/index.js +2 -0
- package/dest/json-rpc/test/integration.d.ts +13 -0
- package/dest/json-rpc/test/integration.d.ts.map +1 -0
- package/dest/json-rpc/test/integration.js +12 -0
- package/dest/log/logger.d.ts +10 -2
- package/dest/log/logger.d.ts.map +1 -1
- package/dest/log/logger.js +55 -12
- package/dest/schemas/api.d.ts +21 -0
- package/dest/schemas/api.d.ts.map +1 -0
- package/dest/schemas/api.js +8 -0
- package/dest/schemas/index.d.ts +6 -0
- package/dest/schemas/index.d.ts.map +1 -0
- package/dest/schemas/index.js +6 -0
- package/dest/schemas/parse.d.ts +9 -0
- package/dest/schemas/parse.d.ts.map +1 -0
- package/dest/schemas/parse.js +26 -0
- package/dest/schemas/schemas.d.ts +79 -0
- package/dest/schemas/schemas.d.ts.map +1 -0
- package/dest/schemas/schemas.js +87 -0
- package/dest/schemas/types.d.ts +3 -0
- package/dest/schemas/types.d.ts.map +1 -0
- package/dest/schemas/types.js +2 -0
- package/dest/schemas/utils.d.ts +40 -0
- package/dest/schemas/utils.d.ts.map +1 -0
- package/dest/schemas/utils.js +56 -0
- package/dest/string/index.d.ts +7 -0
- package/dest/string/index.d.ts.map +1 -0
- package/dest/string/index.js +13 -0
- package/dest/types/index.d.ts +2 -0
- package/dest/types/index.d.ts.map +1 -1
- package/dest/validation/index.d.ts +6 -0
- package/dest/validation/index.d.ts.map +1 -1
- package/dest/validation/index.js +11 -1
- package/dest/wasm/wasm_module.js +1 -1
- package/package.json +7 -4
- package/src/abi/abi.ts +203 -233
- package/src/abi/decoder.ts +9 -5
- package/src/abi/encoder.ts +2 -0
- package/src/abi/event_selector.ts +7 -0
- package/src/abi/utils.ts +28 -0
- package/src/aztec-address/index.ts +64 -18
- package/src/buffer/buffer32.ts +5 -0
- package/src/config/env_var.ts +22 -8
- package/src/crypto/index.ts +1 -0
- package/src/crypto/keys/index.ts +9 -0
- package/src/eth-address/index.ts +2 -6
- package/src/eth-signature/eth_signature.ts +8 -0
- package/src/fields/fields.ts +2 -3
- package/src/json-rpc/client/fetch.ts +81 -0
- package/src/json-rpc/client/index.ts +2 -1
- package/src/json-rpc/client/safe_json_rpc_client.ts +61 -0
- package/src/json-rpc/convert.ts +29 -142
- package/src/json-rpc/fixtures/test_state.ts +87 -3
- package/src/json-rpc/index.ts +1 -8
- package/src/json-rpc/js_utils.ts +1 -0
- package/src/json-rpc/server/index.ts +1 -2
- package/src/json-rpc/server/safe_json_rpc_server.ts +336 -0
- package/src/json-rpc/test/index.ts +1 -0
- package/src/json-rpc/test/integration.ts +24 -0
- package/src/log/logger.ts +59 -15
- package/src/schemas/api.ts +47 -0
- package/src/schemas/index.ts +5 -0
- package/src/schemas/parse.ts +29 -0
- package/src/schemas/schemas.ts +111 -0
- package/src/schemas/types.ts +3 -0
- package/src/schemas/utils.ts +85 -0
- package/src/string/index.ts +15 -0
- package/src/types/index.ts +3 -0
- package/src/validation/index.ts +11 -0
- package/src/wasm/wasm_module.ts +1 -1
- package/dest/json-rpc/class_converter.d.ts +0 -144
- package/dest/json-rpc/class_converter.d.ts.map +0 -1
- package/dest/json-rpc/class_converter.js +0 -102
- package/dest/json-rpc/client/json_rpc_client.d.ts +0 -35
- package/dest/json-rpc/client/json_rpc_client.d.ts.map +0 -1
- package/dest/json-rpc/client/json_rpc_client.js +0 -117
- package/dest/json-rpc/server/json_proxy.d.ts +0 -30
- package/dest/json-rpc/server/json_proxy.d.ts.map +0 -1
- package/dest/json-rpc/server/json_proxy.js +0 -46
- package/dest/json-rpc/server/json_rpc_server.d.ts +0 -98
- package/dest/json-rpc/server/json_rpc_server.d.ts.map +0 -1
- package/dest/json-rpc/server/json_rpc_server.js +0 -248
- package/src/json-rpc/class_converter.ts +0 -213
- package/src/json-rpc/client/json_rpc_client.ts +0 -148
- package/src/json-rpc/server/json_proxy.ts +0 -60
- package/src/json-rpc/server/json_rpc_server.ts +0 -300
package/src/abi/abi.ts
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
1
2
|
import { inflate } from 'pako';
|
|
3
|
+
import { z } from 'zod';
|
|
2
4
|
|
|
3
5
|
import { type Fr } from '../fields/fields.js';
|
|
6
|
+
import { schemas } from '../schemas/schemas.js';
|
|
7
|
+
import { type ZodFor } from '../schemas/types.js';
|
|
4
8
|
import { type FunctionSelector } from './function_selector.js';
|
|
5
9
|
import { type NoteSelector } from './note_selector.js';
|
|
6
10
|
|
|
7
|
-
/**
|
|
8
|
-
* A basic value.
|
|
9
|
-
*/
|
|
11
|
+
/** A basic value. */
|
|
10
12
|
export interface BasicValue<T extends string, V> {
|
|
11
|
-
/**
|
|
12
|
-
* The kind of the value.
|
|
13
|
-
*/
|
|
13
|
+
/** The kind of the value. */
|
|
14
14
|
kind: T;
|
|
15
15
|
value: V;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* An exported value.
|
|
20
|
-
*/
|
|
18
|
+
/** An exported value. */
|
|
21
19
|
export type AbiValue =
|
|
22
20
|
| BasicValue<'boolean', boolean>
|
|
23
21
|
| BasicValue<'string', string>
|
|
@@ -26,6 +24,18 @@ export type AbiValue =
|
|
|
26
24
|
| IntegerValue
|
|
27
25
|
| StructValue;
|
|
28
26
|
|
|
27
|
+
export const AbiValueSchema: z.ZodType<AbiValue> = z.discriminatedUnion('kind', [
|
|
28
|
+
z.object({ kind: z.literal('boolean'), value: z.boolean() }),
|
|
29
|
+
z.object({ kind: z.literal('string'), value: z.string() }),
|
|
30
|
+
z.object({ kind: z.literal('array'), value: z.array(z.lazy(() => AbiValueSchema)) }),
|
|
31
|
+
z.object({ kind: z.literal('tuple'), fields: z.array(z.lazy(() => AbiValueSchema)) }),
|
|
32
|
+
z.object({ kind: z.literal('integer'), value: z.string(), sign: z.boolean() }),
|
|
33
|
+
z.object({
|
|
34
|
+
kind: z.literal('struct'),
|
|
35
|
+
fields: z.array(z.object({ name: z.string(), value: z.lazy(() => AbiValueSchema) })),
|
|
36
|
+
}),
|
|
37
|
+
]);
|
|
38
|
+
|
|
29
39
|
export type TypedStructFieldValue<T> = { name: string; value: T };
|
|
30
40
|
|
|
31
41
|
export interface StructValue {
|
|
@@ -42,48 +52,23 @@ export interface IntegerValue extends BasicValue<'integer', string> {
|
|
|
42
52
|
sign: boolean;
|
|
43
53
|
}
|
|
44
54
|
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
*/
|
|
48
|
-
export interface ABIVariable {
|
|
49
|
-
/**
|
|
50
|
-
* The name of the variable.
|
|
51
|
-
*/
|
|
52
|
-
name: string;
|
|
53
|
-
/**
|
|
54
|
-
* The type of the variable.
|
|
55
|
-
*/
|
|
56
|
-
type: AbiType;
|
|
57
|
-
}
|
|
55
|
+
/** Indicates whether a parameter is public or secret/private. */
|
|
56
|
+
export const ABIParameterVisibility = ['public', 'private', 'databus'] as const;
|
|
58
57
|
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
*/
|
|
62
|
-
export type ABIParameterVisibility = 'public' | 'private' | 'databus';
|
|
58
|
+
/** Indicates whether a parameter is public or secret/private. */
|
|
59
|
+
export type ABIParameterVisibility = (typeof ABIParameterVisibility)[number];
|
|
63
60
|
|
|
64
|
-
/**
|
|
65
|
-
* A function parameter.
|
|
66
|
-
*/
|
|
67
|
-
export interface ABIParameter extends ABIVariable {
|
|
68
|
-
/**
|
|
69
|
-
* Indicates whether a parameter is public or secret/private.
|
|
70
|
-
*/
|
|
71
|
-
visibility: ABIParameterVisibility;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* A basic type.
|
|
76
|
-
*/
|
|
61
|
+
/** A basic type. */
|
|
77
62
|
export interface BasicType<T extends string> {
|
|
78
|
-
/**
|
|
79
|
-
* The kind of the type.
|
|
80
|
-
*/
|
|
63
|
+
/** The kind of the type. */
|
|
81
64
|
kind: T;
|
|
82
65
|
}
|
|
83
66
|
|
|
84
|
-
/**
|
|
85
|
-
|
|
86
|
-
|
|
67
|
+
/** Sign for numeric types. */
|
|
68
|
+
const Sign = ['unsigned', 'signed'] as const;
|
|
69
|
+
type Sign = (typeof Sign)[number];
|
|
70
|
+
|
|
71
|
+
/** A variable type. */
|
|
87
72
|
export type AbiType =
|
|
88
73
|
| BasicType<'field'>
|
|
89
74
|
| BasicType<'boolean'>
|
|
@@ -93,156 +78,178 @@ export type AbiType =
|
|
|
93
78
|
| StructType
|
|
94
79
|
| TupleType;
|
|
95
80
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
81
|
+
export const AbiTypeSchema: z.ZodType<AbiType> = z.discriminatedUnion('kind', [
|
|
82
|
+
z.object({ kind: z.literal('field') }),
|
|
83
|
+
z.object({ kind: z.literal('boolean') }),
|
|
84
|
+
z.object({ kind: z.literal('integer'), sign: z.enum(Sign), width: z.number() }),
|
|
85
|
+
z.object({ kind: z.literal('array'), length: z.number(), type: z.lazy(() => AbiTypeSchema) }),
|
|
86
|
+
z.object({ kind: z.literal('string'), length: z.number() }),
|
|
87
|
+
z.object({ kind: z.literal('struct'), fields: z.array(z.lazy(() => ABIVariableSchema)), path: z.string() }),
|
|
88
|
+
z.object({ kind: z.literal('tuple'), fields: z.array(z.lazy(() => AbiTypeSchema)) }),
|
|
89
|
+
]);
|
|
90
|
+
|
|
91
|
+
/** A named type. */
|
|
92
|
+
export const ABIVariableSchema = z.object({
|
|
93
|
+
/** The name of the variable. */
|
|
94
|
+
name: z.string(),
|
|
95
|
+
/** The type of the variable. */
|
|
96
|
+
type: AbiTypeSchema,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
/** A named type. */
|
|
100
|
+
export type ABIVariable = z.infer<typeof ABIVariableSchema>;
|
|
101
|
+
|
|
102
|
+
/** A function parameter. */
|
|
103
|
+
export const ABIParameterSchema = ABIVariableSchema.and(
|
|
104
|
+
z.object({
|
|
105
|
+
/** Visibility of the parameter in the function. */
|
|
106
|
+
visibility: z.enum(ABIParameterVisibility),
|
|
107
|
+
}),
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
/** A function parameter. */
|
|
111
|
+
export type ABIParameter = z.infer<typeof ABIParameterSchema>;
|
|
112
|
+
|
|
113
|
+
/** An integer type. */
|
|
101
114
|
export interface IntegerType extends BasicType<'integer'> {
|
|
102
|
-
/**
|
|
103
|
-
* The sign of the integer.
|
|
104
|
-
*/
|
|
115
|
+
/** The sign of the integer. */
|
|
105
116
|
sign: Sign;
|
|
106
|
-
/**
|
|
107
|
-
* The width of the integer in bits.
|
|
108
|
-
*/
|
|
117
|
+
/** The width of the integer in bits. */
|
|
109
118
|
width: number;
|
|
110
119
|
}
|
|
111
120
|
|
|
112
|
-
/**
|
|
113
|
-
* An array type.
|
|
114
|
-
*/
|
|
121
|
+
/** An array type. */
|
|
115
122
|
export interface ArrayType extends BasicType<'array'> {
|
|
116
|
-
/**
|
|
117
|
-
* The length of the array.
|
|
118
|
-
*/
|
|
123
|
+
/** The length of the array. */
|
|
119
124
|
length: number;
|
|
120
|
-
/**
|
|
121
|
-
* The type of the array elements.
|
|
122
|
-
*/
|
|
125
|
+
/** The type of the array elements. */
|
|
123
126
|
type: AbiType;
|
|
124
127
|
}
|
|
125
128
|
|
|
126
|
-
/**
|
|
127
|
-
* A tuple type.
|
|
128
|
-
*/
|
|
129
|
+
/** A tuple type. */
|
|
129
130
|
export interface TupleType extends BasicType<'tuple'> {
|
|
130
|
-
/**
|
|
131
|
-
* The types of the tuple elements.
|
|
132
|
-
*/
|
|
131
|
+
/** The types of the tuple elements. */
|
|
133
132
|
fields: AbiType[];
|
|
134
133
|
}
|
|
135
134
|
|
|
136
|
-
/**
|
|
137
|
-
* A string type.
|
|
138
|
-
*/
|
|
135
|
+
/** A string type. */
|
|
139
136
|
export interface StringType extends BasicType<'string'> {
|
|
140
|
-
/**
|
|
141
|
-
* The length of the string.
|
|
142
|
-
*/
|
|
137
|
+
/** The length of the string. */
|
|
143
138
|
length: number;
|
|
144
139
|
}
|
|
145
140
|
|
|
146
|
-
/**
|
|
147
|
-
* A struct type.
|
|
148
|
-
*/
|
|
141
|
+
/** A struct type. */
|
|
149
142
|
export interface StructType extends BasicType<'struct'> {
|
|
150
|
-
/**
|
|
151
|
-
* The fields of the struct.
|
|
152
|
-
*/
|
|
143
|
+
/** The fields of the struct. */
|
|
153
144
|
fields: ABIVariable[];
|
|
154
|
-
/**
|
|
155
|
-
* Fully qualified name of the struct.
|
|
156
|
-
*/
|
|
145
|
+
/** Fully qualified name of the struct. */
|
|
157
146
|
path: string;
|
|
158
147
|
}
|
|
159
148
|
|
|
160
|
-
/**
|
|
161
|
-
|
|
162
|
-
|
|
149
|
+
/** An error could be a custom error of any regular type or a string error. */
|
|
150
|
+
export type AbiErrorType =
|
|
151
|
+
| { error_kind: 'string'; string: string }
|
|
152
|
+
| { error_kind: 'fmtstring'; length: number; item_types: AbiType[] }
|
|
153
|
+
| ({ error_kind: 'custom' } & AbiType);
|
|
154
|
+
|
|
155
|
+
const AbiErrorTypeSchema = z.union([
|
|
156
|
+
z.object({ error_kind: z.literal('string'), string: z.string() }),
|
|
157
|
+
z.object({ error_kind: z.literal('fmtstring'), length: z.number(), item_types: z.array(AbiTypeSchema) }),
|
|
158
|
+
z.object({ error_kind: z.literal('custom') }).and(AbiTypeSchema),
|
|
159
|
+
]) satisfies ZodFor<AbiErrorType>;
|
|
160
|
+
|
|
161
|
+
/** Aztec.nr function types. */
|
|
163
162
|
export enum FunctionType {
|
|
164
163
|
PRIVATE = 'private',
|
|
165
164
|
PUBLIC = 'public',
|
|
166
165
|
UNCONSTRAINED = 'unconstrained',
|
|
167
166
|
}
|
|
168
167
|
|
|
169
|
-
/**
|
|
170
|
-
* The abi entry of a function.
|
|
171
|
-
*/
|
|
168
|
+
/** The abi entry of a function. */
|
|
172
169
|
export interface FunctionAbi {
|
|
173
|
-
/**
|
|
174
|
-
* The name of the function.
|
|
175
|
-
*/
|
|
170
|
+
/** The name of the function. */
|
|
176
171
|
name: string;
|
|
177
|
-
/**
|
|
178
|
-
* Whether the function is secret.
|
|
179
|
-
*/
|
|
172
|
+
/** Whether the function is secret. */
|
|
180
173
|
functionType: FunctionType;
|
|
181
|
-
/**
|
|
182
|
-
* Whether the function is internal.
|
|
183
|
-
*/
|
|
174
|
+
/** Whether the function is internal. */
|
|
184
175
|
isInternal: boolean;
|
|
185
|
-
/**
|
|
186
|
-
* Whether the function can alter state or not
|
|
187
|
-
*/
|
|
176
|
+
/** Whether the function can alter state or not */
|
|
188
177
|
isStatic: boolean;
|
|
189
|
-
/**
|
|
190
|
-
* Function parameters.
|
|
191
|
-
*/
|
|
178
|
+
/** Function parameters. */
|
|
192
179
|
parameters: ABIParameter[];
|
|
193
|
-
/**
|
|
194
|
-
* The types of the return values.
|
|
195
|
-
*/
|
|
180
|
+
/** The types of the return values. */
|
|
196
181
|
returnTypes: AbiType[];
|
|
197
|
-
/**
|
|
198
|
-
|
|
199
|
-
|
|
182
|
+
/** The types of the errors that the function can throw. */
|
|
183
|
+
errorTypes: Partial<Record<string, AbiErrorType>>;
|
|
184
|
+
/** Whether the function is flagged as an initializer. */
|
|
200
185
|
isInitializer: boolean;
|
|
201
186
|
}
|
|
202
187
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
188
|
+
export const FunctionAbiSchema = z.object({
|
|
189
|
+
name: z.string(),
|
|
190
|
+
functionType: z.nativeEnum(FunctionType),
|
|
191
|
+
isInternal: z.boolean(),
|
|
192
|
+
isStatic: z.boolean(),
|
|
193
|
+
isInitializer: z.boolean(),
|
|
194
|
+
parameters: z.array(z.object({ name: z.string(), type: AbiTypeSchema, visibility: z.enum(ABIParameterVisibility) })),
|
|
195
|
+
returnTypes: z.array(AbiTypeSchema),
|
|
196
|
+
errorTypes: z.record(AbiErrorTypeSchema),
|
|
197
|
+
}) satisfies z.ZodType<FunctionAbi>;
|
|
198
|
+
|
|
199
|
+
/** Debug metadata for a function. */
|
|
200
|
+
export interface FunctionDebugMetadata {
|
|
201
|
+
/** Maps opcodes to source code pointers */
|
|
202
|
+
debugSymbols: DebugInfo;
|
|
203
|
+
/** Maps the file IDs to the file contents to resolve pointers */
|
|
204
|
+
files: DebugFileMap;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export const FunctionDebugMetadataSchema = z.object({
|
|
208
|
+
debugSymbols: z.object({
|
|
209
|
+
locations: z.record(
|
|
210
|
+
z.array(z.object({ span: z.object({ start: z.number(), end: z.number() }), file: z.number() })),
|
|
211
|
+
),
|
|
212
|
+
brillig_locations: z.record(
|
|
213
|
+
z.record(z.array(z.object({ span: z.object({ start: z.number(), end: z.number() }), file: z.number() }))),
|
|
214
|
+
),
|
|
215
|
+
}),
|
|
216
|
+
files: z.record(z.object({ source: z.string(), path: z.string() })),
|
|
217
|
+
}) satisfies z.ZodType<FunctionDebugMetadata>;
|
|
218
|
+
|
|
219
|
+
/** The artifact entry of a function. */
|
|
206
220
|
export interface FunctionArtifact extends FunctionAbi {
|
|
207
221
|
/** The ACIR bytecode of the function. */
|
|
208
222
|
bytecode: Buffer;
|
|
209
|
-
/** The verification key of the function. */
|
|
223
|
+
/** The verification key of the function, base64 encoded, if it's a private fn. */
|
|
210
224
|
verificationKey?: string;
|
|
211
225
|
/** Maps opcodes to source code pointers */
|
|
212
226
|
debugSymbols: string;
|
|
213
|
-
/**
|
|
214
|
-
* Public functions store their static assertion messages externally to the bytecode.
|
|
215
|
-
*/
|
|
216
|
-
assertMessages?: Record<number, string>;
|
|
217
227
|
/** Debug metadata for the function. */
|
|
218
228
|
debug?: FunctionDebugMetadata;
|
|
219
229
|
}
|
|
220
230
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
231
|
+
export const FunctionArtifactSchema = FunctionAbiSchema.and(
|
|
232
|
+
z.object({
|
|
233
|
+
bytecode: schemas.BufferB64,
|
|
234
|
+
verificationKey: z.string().optional(),
|
|
235
|
+
debugSymbols: z.string(),
|
|
236
|
+
debug: FunctionDebugMetadataSchema.optional(),
|
|
237
|
+
}),
|
|
238
|
+
) satisfies ZodFor<FunctionArtifact>;
|
|
239
|
+
|
|
240
|
+
/** A file ID. It's assigned during compilation. */
|
|
224
241
|
export type FileId = number;
|
|
225
242
|
|
|
226
|
-
/**
|
|
227
|
-
* A pointer to a specific section of the source code.
|
|
228
|
-
*/
|
|
243
|
+
/** A pointer to a specific section of the source code. */
|
|
229
244
|
export interface SourceCodeLocation {
|
|
230
|
-
/**
|
|
231
|
-
* The section of the source code.
|
|
232
|
-
*/
|
|
245
|
+
/** The section of the source code. */
|
|
233
246
|
span: {
|
|
234
|
-
/**
|
|
235
|
-
* The byte where the section starts.
|
|
236
|
-
*/
|
|
247
|
+
/** The byte where the section starts. */
|
|
237
248
|
start: number;
|
|
238
|
-
/**
|
|
239
|
-
* The byte where the section ends.
|
|
240
|
-
*/
|
|
249
|
+
/** The byte where the section ends. */
|
|
241
250
|
end: number;
|
|
242
251
|
};
|
|
243
|
-
/**
|
|
244
|
-
* The source code file pointed to.
|
|
245
|
-
*/
|
|
252
|
+
/** The source code file pointed to. */
|
|
246
253
|
file: FileId;
|
|
247
254
|
}
|
|
248
255
|
|
|
@@ -256,65 +263,31 @@ export type BrilligFunctionId = number;
|
|
|
256
263
|
|
|
257
264
|
export type OpcodeToLocationsMap = Record<OpcodeLocation, SourceCodeLocation[]>;
|
|
258
265
|
|
|
259
|
-
/**
|
|
260
|
-
* The debug information for a given function.
|
|
261
|
-
*/
|
|
266
|
+
/** The debug information for a given function. */
|
|
262
267
|
export interface DebugInfo {
|
|
263
|
-
/**
|
|
264
|
-
* A map of the opcode location to the source code location.
|
|
265
|
-
*/
|
|
268
|
+
/** A map of the opcode location to the source code location. */
|
|
266
269
|
locations: OpcodeToLocationsMap;
|
|
267
|
-
/**
|
|
268
|
-
* For each Brillig function, we have a map of the opcode location to the source code location.
|
|
269
|
-
*/
|
|
270
|
+
/** For each Brillig function, we have a map of the opcode location to the source code location. */
|
|
270
271
|
brillig_locations: Record<BrilligFunctionId, OpcodeToLocationsMap>;
|
|
271
272
|
}
|
|
272
273
|
|
|
273
|
-
/**
|
|
274
|
-
* The debug information for a given program (a collection of functions)
|
|
275
|
-
*/
|
|
274
|
+
/** The debug information for a given program (a collection of functions) */
|
|
276
275
|
export interface ProgramDebugInfo {
|
|
277
|
-
/**
|
|
278
|
-
* A list of debug information that matches with each function in a program
|
|
279
|
-
*/
|
|
276
|
+
/** A list of debug information that matches with each function in a program */
|
|
280
277
|
debug_infos: Array<DebugInfo>;
|
|
281
278
|
}
|
|
282
279
|
|
|
283
|
-
/**
|
|
284
|
-
* Maps a file ID to its metadata for debugging purposes.
|
|
285
|
-
*/
|
|
280
|
+
/** Maps a file ID to its metadata for debugging purposes. */
|
|
286
281
|
export type DebugFileMap = Record<
|
|
287
282
|
FileId,
|
|
288
283
|
{
|
|
289
|
-
/**
|
|
290
|
-
* The source code of the file.
|
|
291
|
-
*/
|
|
284
|
+
/** The source code of the file. */
|
|
292
285
|
source: string;
|
|
293
|
-
/**
|
|
294
|
-
* The path of the file.
|
|
295
|
-
*/
|
|
286
|
+
/** The path of the file. */
|
|
296
287
|
path: string;
|
|
297
288
|
}
|
|
298
289
|
>;
|
|
299
290
|
|
|
300
|
-
/**
|
|
301
|
-
* Type representing a note in use in the contract.
|
|
302
|
-
*/
|
|
303
|
-
export type ContractNote = {
|
|
304
|
-
/**
|
|
305
|
-
* Note identifier
|
|
306
|
-
*/
|
|
307
|
-
id: NoteSelector;
|
|
308
|
-
/**
|
|
309
|
-
* Type of the note (e.g., 'TransparentNote')
|
|
310
|
-
*/
|
|
311
|
-
typ: string;
|
|
312
|
-
/**
|
|
313
|
-
* Fields of the note.
|
|
314
|
-
*/
|
|
315
|
-
fields: NoteField[];
|
|
316
|
-
};
|
|
317
|
-
|
|
318
291
|
/** Type representing a field of a note (e.g. `amount` in `TokenNote`). */
|
|
319
292
|
export type NoteField = {
|
|
320
293
|
/** Name of the field (e.g. `amount`). */
|
|
@@ -325,77 +298,75 @@ export type NoteField = {
|
|
|
325
298
|
nullable: boolean;
|
|
326
299
|
};
|
|
327
300
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
301
|
+
export const NoteFieldSchema = z.object({
|
|
302
|
+
name: z.string(),
|
|
303
|
+
index: z.number(),
|
|
304
|
+
nullable: z.boolean(),
|
|
305
|
+
}) satisfies z.ZodType<NoteField>;
|
|
306
|
+
|
|
307
|
+
/** Type representing a note in use in the contract. */
|
|
308
|
+
export type ContractNote = {
|
|
309
|
+
/** Note identifier */
|
|
310
|
+
id: NoteSelector;
|
|
311
|
+
/** Type of the note (e.g., 'TransparentNote') */
|
|
312
|
+
typ: string;
|
|
313
|
+
/** Fields of the note. */
|
|
314
|
+
fields: NoteField[];
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
export const ContractNoteSchema = z.object({
|
|
318
|
+
id: schemas.NoteSelector,
|
|
319
|
+
typ: z.string(),
|
|
320
|
+
fields: z.array(NoteFieldSchema),
|
|
321
|
+
}) satisfies ZodFor<ContractNote>;
|
|
322
|
+
|
|
323
|
+
/** Type representing a field layout in the storage of a contract. */
|
|
331
324
|
export type FieldLayout = {
|
|
332
|
-
/**
|
|
333
|
-
* Slot in which the field is stored.
|
|
334
|
-
*/
|
|
325
|
+
/** Slot in which the field is stored. */
|
|
335
326
|
slot: Fr;
|
|
336
327
|
};
|
|
337
328
|
|
|
338
|
-
/**
|
|
339
|
-
* Defines artifact of a contract.
|
|
340
|
-
*/
|
|
329
|
+
/** Defines artifact of a contract. */
|
|
341
330
|
export interface ContractArtifact {
|
|
342
|
-
/**
|
|
343
|
-
* The name of the contract.
|
|
344
|
-
*/
|
|
331
|
+
/** The name of the contract. */
|
|
345
332
|
name: string;
|
|
346
333
|
|
|
347
|
-
/**
|
|
348
|
-
* The version of compiler used to create this artifact
|
|
349
|
-
*/
|
|
334
|
+
/** The version of compiler used to create this artifact */
|
|
350
335
|
aztecNrVersion?: string;
|
|
351
336
|
|
|
352
|
-
/**
|
|
353
|
-
* The functions of the contract.
|
|
354
|
-
*/
|
|
337
|
+
/** The functions of the contract. */
|
|
355
338
|
functions: FunctionArtifact[];
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
*/
|
|
339
|
+
|
|
340
|
+
/** The outputs of the contract. */
|
|
359
341
|
outputs: {
|
|
360
342
|
structs: Record<string, AbiType[]>;
|
|
361
343
|
globals: Record<string, AbiValue[]>;
|
|
362
344
|
};
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
*/
|
|
345
|
+
|
|
346
|
+
/** Storage layout */
|
|
366
347
|
storageLayout: Record<string, FieldLayout>;
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
*/
|
|
348
|
+
|
|
349
|
+
/** The notes used in the contract. */
|
|
370
350
|
notes: Record<string, ContractNote>;
|
|
371
351
|
|
|
372
|
-
/**
|
|
373
|
-
* The map of file ID to the source code and path of the file.
|
|
374
|
-
*/
|
|
352
|
+
/** The map of file ID to the source code and path of the file. */
|
|
375
353
|
fileMap: DebugFileMap;
|
|
376
354
|
}
|
|
377
355
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
*/
|
|
393
|
-
assertMessages?: Record<number, string>;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Gets a function artifact including debug metadata given its name or selector.
|
|
398
|
-
*/
|
|
356
|
+
export const ContractArtifactSchema: ZodFor<ContractArtifact> = z.object({
|
|
357
|
+
name: z.string(),
|
|
358
|
+
aztecNrVersion: z.string().optional(),
|
|
359
|
+
functions: z.array(FunctionArtifactSchema),
|
|
360
|
+
outputs: z.object({
|
|
361
|
+
structs: z.record(z.array(AbiTypeSchema)),
|
|
362
|
+
globals: z.record(z.array(AbiValueSchema)),
|
|
363
|
+
}),
|
|
364
|
+
storageLayout: z.record(z.object({ slot: schemas.Fr })),
|
|
365
|
+
notes: z.record(ContractNoteSchema),
|
|
366
|
+
fileMap: z.record(z.coerce.number(), z.object({ source: z.string(), path: z.string() })),
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
/** Gets a function artifact including debug metadata given its name or selector. */
|
|
399
370
|
export function getFunctionArtifact(
|
|
400
371
|
artifact: ContractArtifact,
|
|
401
372
|
functionNameOrSelector: string | FunctionSelector,
|
|
@@ -432,7 +403,6 @@ export function getFunctionDebugMetadata(
|
|
|
432
403
|
return {
|
|
433
404
|
debugSymbols: programDebugSymbols.debug_infos[0],
|
|
434
405
|
files: contractArtifact.fileMap,
|
|
435
|
-
assertMessages: functionArtifact.assertMessages,
|
|
436
406
|
};
|
|
437
407
|
}
|
|
438
408
|
return undefined;
|
package/src/abi/decoder.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AztecAddress } from '../aztec-address/index.js';
|
|
2
2
|
import { type Fr } from '../fields/index.js';
|
|
3
3
|
import { type ABIParameter, type ABIVariable, type AbiType } from './abi.js';
|
|
4
|
-
import { isAztecAddressStruct } from './utils.js';
|
|
4
|
+
import { isAztecAddressStruct, parseSignedInt } from './utils.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* The type of our decoded ABI.
|
|
@@ -10,7 +10,6 @@ export type AbiDecoded = bigint | boolean | AztecAddress | AbiDecoded[] | { [key
|
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Decodes values using a provided ABI.
|
|
13
|
-
* Missing support for signed integer.
|
|
14
13
|
*/
|
|
15
14
|
class AbiDecoder {
|
|
16
15
|
constructor(private types: AbiType[], private flattened: Fr[]) {}
|
|
@@ -24,11 +23,16 @@ class AbiDecoder {
|
|
|
24
23
|
switch (abiType.kind) {
|
|
25
24
|
case 'field':
|
|
26
25
|
return this.getNextField().toBigInt();
|
|
27
|
-
case 'integer':
|
|
26
|
+
case 'integer': {
|
|
27
|
+
const nextField = this.getNextField();
|
|
28
|
+
|
|
28
29
|
if (abiType.sign === 'signed') {
|
|
29
|
-
|
|
30
|
+
// We parse the buffer using 2's complement
|
|
31
|
+
return parseSignedInt(nextField.toBuffer(), abiType.width);
|
|
30
32
|
}
|
|
31
|
-
|
|
33
|
+
|
|
34
|
+
return nextField.toBigInt();
|
|
35
|
+
}
|
|
32
36
|
case 'boolean':
|
|
33
37
|
return !this.getNextField().isZero();
|
|
34
38
|
case 'array': {
|
package/src/abi/encoder.ts
CHANGED
|
@@ -57,6 +57,8 @@ class ArgumentEncoder {
|
|
|
57
57
|
this.flattened.push(Fr.fromBuffer(arg));
|
|
58
58
|
} else if (typeof arg.toField === 'function') {
|
|
59
59
|
this.flattened.push(arg.toField());
|
|
60
|
+
} else if (typeof arg.value === 'string') {
|
|
61
|
+
this.flattened.push(Fr.fromString(arg.value));
|
|
60
62
|
} else {
|
|
61
63
|
throw new Error(`Argument for ${name} cannot be serialized to a field`);
|
|
62
64
|
}
|
package/src/abi/utils.ts
CHANGED
|
@@ -48,3 +48,31 @@ export function isWrappedFieldStruct(abiType: AbiType) {
|
|
|
48
48
|
abiType.fields[0].type.kind === 'field'
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Returns a bigint by parsing a serialized 2's complement signed int.
|
|
54
|
+
* @param b - The signed int as a buffer
|
|
55
|
+
* @returns - a deserialized bigint
|
|
56
|
+
*/
|
|
57
|
+
export function parseSignedInt(b: Buffer, width?: number) {
|
|
58
|
+
const buf = Buffer.from(b);
|
|
59
|
+
|
|
60
|
+
// We get the last (width / 8) bytes where width = bits of type (i64, i32 etc)
|
|
61
|
+
const slicedBuf = width !== undefined ? buf.subarray(-(width / 8)) : buf;
|
|
62
|
+
|
|
63
|
+
// Then manually deserialize with 2's complement, with the process as follows:
|
|
64
|
+
|
|
65
|
+
// If our most significant bit is high...
|
|
66
|
+
if (0x80 & slicedBuf.subarray(0, 1).readUInt8()) {
|
|
67
|
+
// We flip the bits
|
|
68
|
+
for (let i = 0; i < slicedBuf.length; i++) {
|
|
69
|
+
slicedBuf[i] = ~slicedBuf[i];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Add one, then negate it
|
|
73
|
+
return -(BigInt(`0x${slicedBuf.toString('hex')}`) + 1n);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ...otherwise we just return our positive int
|
|
77
|
+
return BigInt(`0x${slicedBuf.toString('hex')}`);
|
|
78
|
+
}
|