@aztec/sequencer-client 0.33.0 → 0.35.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/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +3 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +84 -7
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +5 -4
- package/dest/index.d.ts +0 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- package/dest/publisher/l1-publisher.js +10 -10
- package/dest/publisher/viem-tx-sender.js +2 -2
- package/dest/sequencer/sequencer.d.ts +7 -8
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +22 -24
- package/dest/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/tx_validator/aggregate_tx_validator.js +23 -0
- package/dest/tx_validator/double_spend_validator.d.ts +11 -0
- package/dest/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/tx_validator/double_spend_validator.js +50 -0
- package/dest/tx_validator/gas_validator.d.ts +12 -0
- package/dest/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/tx_validator/gas_validator.js +62 -0
- package/dest/tx_validator/metadata_validator.d.ts +8 -0
- package/dest/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/tx_validator/metadata_validator.js +50 -0
- package/dest/tx_validator/phases_validator.d.ts +13 -0
- package/dest/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/tx_validator/phases_validator.js +73 -0
- package/dest/tx_validator/tx_validator_factory.d.ts +13 -0
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -0
- package/dest/tx_validator/tx_validator_factory.js +21 -0
- package/package.json +14 -13
- package/src/client/sequencer-client.ts +2 -3
- package/src/config.ts +93 -7
- package/src/global_variable_builder/global_builder.ts +4 -3
- package/src/index.ts +0 -1
- package/src/publisher/l1-publisher.ts +9 -9
- package/src/publisher/viem-tx-sender.ts +1 -1
- package/src/sequencer/sequencer.ts +39 -33
- package/src/tx_validator/aggregate_tx_validator.ts +24 -0
- package/src/tx_validator/double_spend_validator.ts +65 -0
- package/src/tx_validator/gas_validator.ts +81 -0
- package/src/tx_validator/metadata_validator.ts +60 -0
- package/src/tx_validator/phases_validator.ts +101 -0
- package/src/tx_validator/tx_validator_factory.ts +37 -0
- package/dest/sequencer/abstract_phase_manager.d.ts +0 -77
- package/dest/sequencer/abstract_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/abstract_phase_manager.js +0 -307
- package/dest/sequencer/app_logic_phase_manager.d.ts +0 -28
- package/dest/sequencer/app_logic_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/app_logic_phase_manager.js +0 -41
- package/dest/sequencer/hints_builder.d.ts +0 -23
- package/dest/sequencer/hints_builder.d.ts.map +0 -1
- package/dest/sequencer/hints_builder.js +0 -62
- package/dest/sequencer/phase_manager_factory.d.ts +0 -18
- package/dest/sequencer/phase_manager_factory.d.ts.map +0 -1
- package/dest/sequencer/phase_manager_factory.js +0 -56
- package/dest/sequencer/public_processor.d.ts +0 -54
- package/dest/sequencer/public_processor.d.ts.map +0 -1
- package/dest/sequencer/public_processor.js +0 -142
- package/dest/sequencer/setup_phase_manager.d.ts +0 -28
- package/dest/sequencer/setup_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/setup_phase_manager.js +0 -30
- package/dest/sequencer/tail_phase_manager.d.ts +0 -29
- package/dest/sequencer/tail_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/tail_phase_manager.js +0 -52
- package/dest/sequencer/teardown_phase_manager.d.ts +0 -28
- package/dest/sequencer/teardown_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/teardown_phase_manager.js +0 -30
- package/dest/sequencer/tx_validator.d.ts +0 -28
- package/dest/sequencer/tx_validator.d.ts.map +0 -1
- package/dest/sequencer/tx_validator.js +0 -174
- package/dest/sequencer/tx_validator_factory.d.ts +0 -12
- package/dest/sequencer/tx_validator_factory.d.ts.map +0 -1
- package/dest/sequencer/tx_validator_factory.js +0 -17
- package/dest/sequencer/utils.d.ts +0 -8
- package/dest/sequencer/utils.d.ts.map +0 -1
- package/dest/sequencer/utils.js +0 -29
- package/dest/simulator/index.d.ts +0 -31
- package/dest/simulator/index.d.ts.map +0 -1
- package/dest/simulator/index.js +0 -2
- package/dest/simulator/public_executor.d.ts +0 -79
- package/dest/simulator/public_executor.d.ts.map +0 -1
- package/dest/simulator/public_executor.js +0 -198
- package/dest/simulator/public_kernel.d.ts +0 -37
- package/dest/simulator/public_kernel.d.ts.map +0 -1
- package/dest/simulator/public_kernel.js +0 -97
- package/src/sequencer/abstract_phase_manager.ts +0 -549
- package/src/sequencer/app_logic_phase_manager.ts +0 -62
- package/src/sequencer/hints_builder.ts +0 -119
- package/src/sequencer/phase_manager_factory.ts +0 -126
- package/src/sequencer/public_processor.ts +0 -209
- package/src/sequencer/setup_phase_manager.ts +0 -50
- package/src/sequencer/tail_phase_manager.ts +0 -111
- package/src/sequencer/teardown_phase_manager.ts +0 -50
- package/src/sequencer/tx_validator.ts +0 -265
- package/src/sequencer/tx_validator_factory.ts +0 -32
- package/src/sequencer/utils.ts +0 -31
- package/src/simulator/index.ts +0 -36
- package/src/simulator/public_executor.ts +0 -267
- package/src/simulator/public_kernel.ts +0 -139
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
export declare class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(...validators: TxValidator<T>[]);
|
|
5
|
+
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=aggregate_tx_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAEzE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;IAQrC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;CAWvE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
var _AggregateTxValidator_validators;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
export class AggregateTxValidator {
|
|
4
|
+
constructor(...validators) {
|
|
5
|
+
_AggregateTxValidator_validators.set(this, void 0);
|
|
6
|
+
if (validators.length === 0) {
|
|
7
|
+
throw new Error('At least one validator must be provided');
|
|
8
|
+
}
|
|
9
|
+
__classPrivateFieldSet(this, _AggregateTxValidator_validators, validators, "f");
|
|
10
|
+
}
|
|
11
|
+
async validateTxs(txs) {
|
|
12
|
+
const invalidTxs = [];
|
|
13
|
+
let txPool = txs;
|
|
14
|
+
for (const validator of __classPrivateFieldGet(this, _AggregateTxValidator_validators, "f")) {
|
|
15
|
+
const [valid, invalid] = await validator.validateTxs(txPool);
|
|
16
|
+
invalidTxs.push(...invalid);
|
|
17
|
+
txPool = valid;
|
|
18
|
+
}
|
|
19
|
+
return [txPool, invalidTxs];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
_AggregateTxValidator_validators = new WeakMap();
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvYWdncmVnYXRlX3R4X3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsWUFBWSxHQUFHLFVBQTRCO1FBRDNDLG1EQUE4QjtRQUU1QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCx1QkFBQSxJQUFJLG9DQUFlLFVBQVUsTUFBQSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVE7UUFDeEIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNqQixLQUFLLE1BQU0sU0FBUyxJQUFJLHVCQUFBLElBQUksd0NBQVksRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztZQUM1QixNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type AnyTx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/circuits.js';
|
|
3
|
+
export interface NullifierSource {
|
|
4
|
+
getNullifierIndex: (nullifier: Fr) => Promise<bigint | undefined>;
|
|
5
|
+
}
|
|
6
|
+
export declare class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(nullifierSource: NullifierSource);
|
|
9
|
+
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=double_spend_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/double_spend_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAGxC,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACnE;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAIhE,eAAe,EAAE,eAAe;IAItC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;CAgDvE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var _DoubleSpendTxValidator_instances, _DoubleSpendTxValidator_log, _DoubleSpendTxValidator_nullifierSource, _DoubleSpendTxValidator_uniqueNullifiers;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { Fr } from '@aztec/circuits.js';
|
|
5
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
+
export class DoubleSpendTxValidator {
|
|
7
|
+
constructor(nullifierSource) {
|
|
8
|
+
_DoubleSpendTxValidator_instances.add(this);
|
|
9
|
+
_DoubleSpendTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_double_spend'));
|
|
10
|
+
_DoubleSpendTxValidator_nullifierSource.set(this, void 0);
|
|
11
|
+
__classPrivateFieldSet(this, _DoubleSpendTxValidator_nullifierSource, nullifierSource, "f");
|
|
12
|
+
}
|
|
13
|
+
async validateTxs(txs) {
|
|
14
|
+
const validTxs = [];
|
|
15
|
+
const invalidTxs = [];
|
|
16
|
+
const thisBlockNullifiers = new Set();
|
|
17
|
+
for (const tx of txs) {
|
|
18
|
+
if (!(await __classPrivateFieldGet(this, _DoubleSpendTxValidator_instances, "m", _DoubleSpendTxValidator_uniqueNullifiers).call(this, tx, thisBlockNullifiers))) {
|
|
19
|
+
invalidTxs.push(tx);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
validTxs.push(tx);
|
|
23
|
+
}
|
|
24
|
+
return [validTxs, invalidTxs];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
_DoubleSpendTxValidator_log = new WeakMap(), _DoubleSpendTxValidator_nullifierSource = new WeakMap(), _DoubleSpendTxValidator_instances = new WeakSet(), _DoubleSpendTxValidator_uniqueNullifiers = async function _DoubleSpendTxValidator_uniqueNullifiers(tx, thisBlockNullifiers) {
|
|
28
|
+
const newNullifiers = tx.data.getNonEmptyNullifiers().map(x => x.toBigInt());
|
|
29
|
+
// Ditch this tx if it has repeated nullifiers
|
|
30
|
+
const uniqueNullifiers = new Set(newNullifiers);
|
|
31
|
+
if (uniqueNullifiers.size !== newNullifiers.length) {
|
|
32
|
+
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
for (const nullifier of newNullifiers) {
|
|
36
|
+
if (thisBlockNullifiers.has(nullifier)) {
|
|
37
|
+
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
thisBlockNullifiers.add(nullifier);
|
|
41
|
+
}
|
|
42
|
+
const nullifierIndexes = await Promise.all(newNullifiers.map(n => __classPrivateFieldGet(this, _DoubleSpendTxValidator_nullifierSource, "f").getNullifierIndex(new Fr(n))));
|
|
43
|
+
const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
|
|
44
|
+
if (hasDuplicates) {
|
|
45
|
+
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlX3NwZW5kX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZG91YmxlX3NwZW5kX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTTFELE1BQU0sT0FBTyxzQkFBc0I7SUFJakMsWUFBWSxlQUFnQzs7UUFINUMsc0NBQU8saUJBQWlCLENBQUMsOENBQThDLENBQUMsRUFBQztRQUN6RSwwREFBa0M7UUFHaEMsdUJBQUEsSUFBSSwyQ0FBb0IsZUFBZSxNQUFBLENBQUM7SUFDMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUTtRQUN4QixNQUFNLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUU5QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxDQUFDLE1BQU0sdUJBQUEsSUFBSSxtRkFBa0IsTUFBdEIsSUFBSSxFQUFtQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBaUNGO29NQS9CQyxLQUFLLG1EQUFtQixFQUFTLEVBQUUsbUJBQWdDO0lBQ2pFLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUU3RSw4Q0FBOEM7SUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoRCxJQUFJLGdCQUFnQixDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkQsdUJBQUEsSUFBSSxtQ0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNuRixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLElBQUksbUJBQW1CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsdUJBQUEsSUFBSSxtQ0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM3RixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN4QyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsdUJBQUEsSUFBSSwrQ0FBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzNFLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDMUUsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQix1QkFBQSxJQUFJLG1DQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2pHLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type AztecAddress, Fr } from '@aztec/circuits.js';
|
|
3
|
+
/** Provides a view into public contract state */
|
|
4
|
+
export interface PublicStateSource {
|
|
5
|
+
storageRead: (contractAddress: AztecAddress, slot: Fr) => Promise<Fr>;
|
|
6
|
+
}
|
|
7
|
+
export declare class GasTxValidator implements TxValidator<Tx> {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(publicDataSource: PublicStateSource, gasTokenAddress: AztecAddress, requireFees?: boolean);
|
|
10
|
+
validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=gas_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/gas_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,KAAK,YAAY,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAM3D,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;CACvE;AAED,qBAAa,cAAe,YAAW,WAAW,CAAC,EAAE,CAAC;;gBAMxC,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,UAAQ;IAM7F,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;CAwD1E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
var _GasTxValidator_instances, _GasTxValidator_log, _GasTxValidator_publicDataSource, _GasTxValidator_gasTokenAddress, _GasTxValidator_requireFees, _GasTxValidator_validateTxFee;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { Fr } from '@aztec/circuits.js';
|
|
5
|
+
import { pedersenHash } from '@aztec/foundation/crypto';
|
|
6
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
7
|
+
import { GasTokenContract } from '@aztec/noir-contracts.js';
|
|
8
|
+
import { AbstractPhaseManager, PublicKernelPhase } from '@aztec/simulator';
|
|
9
|
+
export class GasTxValidator {
|
|
10
|
+
constructor(publicDataSource, gasTokenAddress, requireFees = false) {
|
|
11
|
+
_GasTxValidator_instances.add(this);
|
|
12
|
+
_GasTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_gas'));
|
|
13
|
+
_GasTxValidator_publicDataSource.set(this, void 0);
|
|
14
|
+
_GasTxValidator_gasTokenAddress.set(this, void 0);
|
|
15
|
+
_GasTxValidator_requireFees.set(this, void 0);
|
|
16
|
+
__classPrivateFieldSet(this, _GasTxValidator_publicDataSource, publicDataSource, "f");
|
|
17
|
+
__classPrivateFieldSet(this, _GasTxValidator_gasTokenAddress, gasTokenAddress, "f");
|
|
18
|
+
__classPrivateFieldSet(this, _GasTxValidator_requireFees, requireFees, "f");
|
|
19
|
+
}
|
|
20
|
+
async validateTxs(txs) {
|
|
21
|
+
const validTxs = [];
|
|
22
|
+
const invalidTxs = [];
|
|
23
|
+
for (const tx of txs) {
|
|
24
|
+
if (await __classPrivateFieldGet(this, _GasTxValidator_instances, "m", _GasTxValidator_validateTxFee).call(this, tx)) {
|
|
25
|
+
validTxs.push(tx);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
invalidTxs.push(tx);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return [validTxs, invalidTxs];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
_GasTxValidator_log = new WeakMap(), _GasTxValidator_publicDataSource = new WeakMap(), _GasTxValidator_gasTokenAddress = new WeakMap(), _GasTxValidator_requireFees = new WeakMap(), _GasTxValidator_instances = new WeakSet(), _GasTxValidator_validateTxFee = async function _GasTxValidator_validateTxFee(tx) {
|
|
35
|
+
const { [PublicKernelPhase.TEARDOWN]: teardownFns } = AbstractPhaseManager.extractEnqueuedPublicCallsByPhase(tx.data, tx.enqueuedPublicFunctionCalls);
|
|
36
|
+
if (teardownFns.length === 0) {
|
|
37
|
+
if (__classPrivateFieldGet(this, _GasTxValidator_requireFees, "f")) {
|
|
38
|
+
__classPrivateFieldGet(this, _GasTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it should pay for gas but has no enqueued teardown functions`);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
__classPrivateFieldGet(this, _GasTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not pay fees. Skipping balance check.`);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (teardownFns.length > 1) {
|
|
47
|
+
__classPrivateFieldGet(this, _GasTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it has multiple teardown functions`);
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// check that the caller of the teardown function has enough balance to pay for tx costs
|
|
51
|
+
const teardownFn = teardownFns[0];
|
|
52
|
+
const slot = pedersenHash([GasTokenContract.storage.balances.slot, teardownFn.callContext.msgSender]);
|
|
53
|
+
const gasBalance = await __classPrivateFieldGet(this, _GasTxValidator_publicDataSource, "f").storageRead(__classPrivateFieldGet(this, _GasTxValidator_gasTokenAddress, "f"), slot);
|
|
54
|
+
// TODO(#5004) calculate fee needed based on tx limits and gas prices
|
|
55
|
+
const gasAmountNeeded = new Fr(1);
|
|
56
|
+
if (gasBalance.lt(gasAmountNeeded)) {
|
|
57
|
+
__classPrivateFieldGet(this, _GasTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it should pay for gas but has insufficient balance ${gasBalance.toShortString()} < ${gasAmountNeeded.toShortString()}`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZ2FzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFxQixFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPM0UsTUFBTSxPQUFPLGNBQWM7SUFNekIsWUFBWSxnQkFBbUMsRUFBRSxlQUE2QixFQUFFLFdBQVcsR0FBRyxLQUFLOztRQUxuRyw4QkFBTyxpQkFBaUIsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFDO1FBQ2hFLG1EQUFxQztRQUNyQyxrREFBK0I7UUFDL0IsOENBQXNCO1FBR3BCLHVCQUFBLElBQUksb0NBQXFCLGdCQUFnQixNQUFBLENBQUM7UUFDMUMsdUJBQUEsSUFBSSxtQ0FBb0IsZUFBZSxNQUFBLENBQUM7UUFDeEMsdUJBQUEsSUFBSSwrQkFBZ0IsV0FBVyxNQUFBLENBQUM7SUFDbEMsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUztRQUN6QixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxNQUFNLHVCQUFBLElBQUksZ0VBQWUsTUFBbkIsSUFBSSxFQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBMkNGO2dRQXpDQyxLQUFLLHdDQUFnQixFQUFNO0lBQ3pCLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLG9CQUFvQixDQUFDLGlDQUFpQyxDQUMxRyxFQUFFLENBQUMsSUFBSSxFQUNQLEVBQUUsQ0FBQywyQkFBMkIsQ0FDL0IsQ0FBQztJQUVGLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QixJQUFJLHVCQUFBLElBQUksbUNBQWEsRUFBRSxDQUFDO1lBQ3RCLHVCQUFBLElBQUksMkJBQUssQ0FBQyxJQUFJLENBQ1osZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLHVFQUF1RSxDQUN0RyxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO2FBQU0sQ0FBQztZQUNOLHVCQUFBLElBQUksMkJBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsdUJBQUEsSUFBSSwyQkFBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUM1RixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3RkFBd0Y7SUFDeEYsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN0RyxNQUFNLFVBQVUsR0FBRyxNQUFNLHVCQUFBLElBQUksd0NBQWtCLENBQUMsV0FBVyxDQUFDLHVCQUFBLElBQUksdUNBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFekYscUVBQXFFO0lBQ3JFLE1BQU0sZUFBZSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ25DLHVCQUFBLElBQUksMkJBQUssQ0FBQyxJQUFJLENBQ1osZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQ3hCLEVBQUUsQ0FDSCwrREFBK0QsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUNsSSxDQUFDO1FBQ0YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AnyTx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
+
export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(globalVariables: GlobalVariables);
|
|
6
|
+
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=metadata_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAI7D,eAAe,EAAE,eAAe;IAI5C,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;CA+CjE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var _MetadataTxValidator_instances, _MetadataTxValidator_log, _MetadataTxValidator_globalVariables, _MetadataTxValidator_hasCorrectChainId, _MetadataTxValidator_isValidForBlockNumber;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
export class MetadataTxValidator {
|
|
6
|
+
constructor(globalVariables) {
|
|
7
|
+
_MetadataTxValidator_instances.add(this);
|
|
8
|
+
_MetadataTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_metadata'));
|
|
9
|
+
_MetadataTxValidator_globalVariables.set(this, void 0);
|
|
10
|
+
__classPrivateFieldSet(this, _MetadataTxValidator_globalVariables, globalVariables, "f");
|
|
11
|
+
}
|
|
12
|
+
validateTxs(txs) {
|
|
13
|
+
const validTxs = [];
|
|
14
|
+
const invalidTxs = [];
|
|
15
|
+
for (const tx of txs) {
|
|
16
|
+
if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_hasCorrectChainId).call(this, tx)) {
|
|
17
|
+
invalidTxs.push(tx);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_isValidForBlockNumber).call(this, tx)) {
|
|
21
|
+
invalidTxs.push(tx);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
validTxs.push(tx);
|
|
25
|
+
}
|
|
26
|
+
return Promise.resolve([validTxs, invalidTxs]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
_MetadataTxValidator_log = new WeakMap(), _MetadataTxValidator_globalVariables = new WeakMap(), _MetadataTxValidator_instances = new WeakSet(), _MetadataTxValidator_hasCorrectChainId = function _MetadataTxValidator_hasCorrectChainId(tx) {
|
|
30
|
+
if (!tx.data.constants.txContext.chainId.equals(__classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").chainId)) {
|
|
31
|
+
__classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${__classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").chainId.toNumber()}`);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}, _MetadataTxValidator_isValidForBlockNumber = function _MetadataTxValidator_isValidForBlockNumber(tx) {
|
|
38
|
+
const target = tx instanceof Tx
|
|
39
|
+
? tx.data.forRollup?.rollupValidationRequests || tx.data.forPublic.validationRequests.forRollup
|
|
40
|
+
: tx.data.rollupValidationRequests;
|
|
41
|
+
const maxBlockNumber = target.maxBlockNumber;
|
|
42
|
+
if (maxBlockNumber.isSome && maxBlockNumber.value < __classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").blockNumber) {
|
|
43
|
+
__classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for low max block number`);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGFfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9tZXRhZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQWMsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBWSxlQUFnQzs7UUFINUMsbUNBQU8saUJBQWlCLENBQUMsMENBQTBDLENBQUMsRUFBQztRQUNyRSx1REFBa0M7UUFHaEMsdUJBQUEsSUFBSSx3Q0FBb0IsZUFBZSxNQUFBLENBQUM7SUFDMUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFRO1FBQ2xCLE1BQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsdUJBQUEsSUFBSSw4RUFBbUIsTUFBdkIsSUFBSSxFQUFvQixFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyx1QkFBQSxJQUFJLGtGQUF1QixNQUEzQixJQUFJLEVBQXdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQTZCRjt5T0EzQm9CLEVBQUs7SUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHVCQUFBLElBQUksNENBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMvRSx1QkFBQSxJQUFJLGdDQUFLLENBQUMsSUFBSSxDQUNaLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUN4QixFQUFFLENBQ0gsK0JBQStCLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sdUJBQUEsSUFBSSw0Q0FBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDaEksQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLG1HQUVzQixFQUFLO0lBQzFCLE1BQU0sTUFBTSxHQUNWLEVBQUUsWUFBWSxFQUFFO1FBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdCQUF3QixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLGtCQUFrQixDQUFDLFNBQVM7UUFDaEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUU3QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLEtBQUssR0FBRyx1QkFBQSxJQUFJLDRDQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RGLHVCQUFBLElBQUksZ0NBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type AllowedFunction, Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type PublicCallRequest } from '@aztec/circuits.js';
|
|
3
|
+
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
4
|
+
export declare class PhasesTxValidator implements TxValidator<Tx> {
|
|
5
|
+
#private;
|
|
6
|
+
private contractDataSource;
|
|
7
|
+
private setupAllowList;
|
|
8
|
+
private teardownAllowList;
|
|
9
|
+
constructor(contractDataSource: ContractDataSource, setupAllowList: AllowedFunction[], teardownAllowList: AllowedFunction[]);
|
|
10
|
+
validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]>;
|
|
11
|
+
isOnAllowList(publicCall: PublicCallRequest, allowList: AllowedFunction[]): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=phases_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAIrD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,iBAAiB;gBAFjB,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,eAAe,EAAE,EACjC,iBAAiB,EAAE,eAAe,EAAE;IAGxC,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAmDnE,aAAa,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAkCnG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
var _PhasesTxValidator_instances, _PhasesTxValidator_log, _PhasesTxValidator_validateTx;
|
|
2
|
+
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { AbstractPhaseManager, PublicKernelPhase } from '@aztec/simulator';
|
|
6
|
+
export class PhasesTxValidator {
|
|
7
|
+
constructor(contractDataSource, setupAllowList, teardownAllowList) {
|
|
8
|
+
_PhasesTxValidator_instances.add(this);
|
|
9
|
+
this.contractDataSource = contractDataSource;
|
|
10
|
+
this.setupAllowList = setupAllowList;
|
|
11
|
+
this.teardownAllowList = teardownAllowList;
|
|
12
|
+
_PhasesTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_phases'));
|
|
13
|
+
}
|
|
14
|
+
async validateTxs(txs) {
|
|
15
|
+
const validTxs = [];
|
|
16
|
+
const invalidTxs = [];
|
|
17
|
+
for (const tx of txs) {
|
|
18
|
+
if (await __classPrivateFieldGet(this, _PhasesTxValidator_instances, "m", _PhasesTxValidator_validateTx).call(this, tx)) {
|
|
19
|
+
validTxs.push(tx);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
invalidTxs.push(tx);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return Promise.resolve([validTxs, invalidTxs]);
|
|
26
|
+
}
|
|
27
|
+
async isOnAllowList(publicCall, allowList) {
|
|
28
|
+
const { contractAddress, functionData: { selector }, } = publicCall;
|
|
29
|
+
// do these checks first since they don't require the contract class
|
|
30
|
+
for (const entry of allowList) {
|
|
31
|
+
if (!('address' in entry)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (contractAddress.equals(entry.address) && entry.selector.equals(selector)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const contractClass = await this.contractDataSource.getContract(contractAddress);
|
|
39
|
+
if (!contractClass) {
|
|
40
|
+
throw new Error(`Contract not found: ${publicCall.contractAddress.toString()}`);
|
|
41
|
+
}
|
|
42
|
+
for (const entry of allowList) {
|
|
43
|
+
if (!('classId' in entry)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (contractClass.contractClassId.equals(entry.classId) && entry.selector.equals(selector)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
_PhasesTxValidator_log = new WeakMap(), _PhasesTxValidator_instances = new WeakSet(), _PhasesTxValidator_validateTx = async function _PhasesTxValidator_validateTx(tx) {
|
|
54
|
+
if (!tx.data.forPublic) {
|
|
55
|
+
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
const { [PublicKernelPhase.SETUP]: setupFns, [PublicKernelPhase.TEARDOWN]: teardownFns } = AbstractPhaseManager.extractEnqueuedPublicCallsByPhase(tx.data, tx.enqueuedPublicFunctionCalls);
|
|
59
|
+
for (const setupFn of setupFns) {
|
|
60
|
+
if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
|
|
61
|
+
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.contractAddress}:${setupFn.functionData.selector}`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const teardownFn of teardownFns) {
|
|
66
|
+
if (!(await this.isOnAllowList(teardownFn, this.teardownAllowList))) {
|
|
67
|
+
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls teardown function not on allowlist: ${teardownFn.contractAddress}:${teardownFn.functionData.selector}`);
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBd0IsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRWxGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzNFLE1BQU0sT0FBTyxpQkFBaUI7SUFHNUIsWUFDVSxrQkFBc0MsRUFDdEMsY0FBaUMsRUFDakMsaUJBQW9DOztRQUZwQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBTDlDLGlDQUFPLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLEVBQUM7SUFNaEUsQ0FBQztJQUVKLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUztRQUN6QixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxNQUFNLHVCQUFBLElBQUksbUVBQVksTUFBaEIsSUFBSSxFQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFD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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type AllowedFunction, type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type EthAddress, type GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
+
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
4
|
+
import { type MerkleTreeOperations } from '@aztec/world-state';
|
|
5
|
+
export declare class TxValidatorFactory {
|
|
6
|
+
private merkleTreeDb;
|
|
7
|
+
private contractDataSource;
|
|
8
|
+
private gasPortalAddress;
|
|
9
|
+
constructor(merkleTreeDb: MerkleTreeOperations, contractDataSource: ContractDataSource, gasPortalAddress: EthAddress);
|
|
10
|
+
validatorForNewTxs(globalVariables: GlobalVariables, setupAllowList: AllowedFunction[], teardownAllowList: AllowedFunction[]): TxValidator<Tx>;
|
|
11
|
+
validatorForProcessedTxs(): TxValidator<ProcessedTx>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=tx_validator_factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ/D,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,gBAAgB;gBAFhB,YAAY,EAAE,oBAAoB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,UAAU;IAGtC,kBAAkB,CAChB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,eAAe,EAAE,EACjC,iBAAiB,EAAE,eAAe,EAAE,GACnC,WAAW,CAAC,EAAE,CAAC;IASlB,wBAAwB,IAAI,WAAW,CAAC,WAAW,CAAC;CAGrD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getCanonicalGasTokenAddress } from '@aztec/protocol-contracts/gas-token';
|
|
2
|
+
import { WorldStateDB, WorldStatePublicDB } from '@aztec/simulator';
|
|
3
|
+
import { AggregateTxValidator } from './aggregate_tx_validator.js';
|
|
4
|
+
import { DoubleSpendTxValidator } from './double_spend_validator.js';
|
|
5
|
+
import { GasTxValidator } from './gas_validator.js';
|
|
6
|
+
import { MetadataTxValidator } from './metadata_validator.js';
|
|
7
|
+
import { PhasesTxValidator } from './phases_validator.js';
|
|
8
|
+
export class TxValidatorFactory {
|
|
9
|
+
constructor(merkleTreeDb, contractDataSource, gasPortalAddress) {
|
|
10
|
+
this.merkleTreeDb = merkleTreeDb;
|
|
11
|
+
this.contractDataSource = contractDataSource;
|
|
12
|
+
this.gasPortalAddress = gasPortalAddress;
|
|
13
|
+
}
|
|
14
|
+
validatorForNewTxs(globalVariables, setupAllowList, teardownAllowList) {
|
|
15
|
+
return new AggregateTxValidator(new MetadataTxValidator(globalVariables), new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb)), new PhasesTxValidator(this.contractDataSource, setupAllowList, teardownAllowList), new GasTxValidator(new WorldStatePublicDB(this.merkleTreeDb), getCanonicalGasTokenAddress(this.gasPortalAddress)));
|
|
16
|
+
}
|
|
17
|
+
validatorForProcessedTxs() {
|
|
18
|
+
return new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUlwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLFlBQWtDLEVBQ2xDLGtCQUFzQyxFQUN0QyxnQkFBNEI7UUFGNUIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO0lBQ25DLENBQUM7SUFFSixrQkFBa0IsQ0FDaEIsZUFBZ0MsRUFDaEMsY0FBaUMsRUFDakMsaUJBQW9DO1FBRXBDLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFDeEMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDL0QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEVBQ2pGLElBQUksY0FBYyxDQUFDLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLDJCQUEyQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQ2xILENBQUM7SUFDSixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0YifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -24,18 +24,19 @@
|
|
|
24
24
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@aztec/circuit-types": "0.
|
|
28
|
-
"@aztec/circuits.js": "0.
|
|
29
|
-
"@aztec/ethereum": "0.
|
|
30
|
-
"@aztec/foundation": "0.
|
|
31
|
-
"@aztec/l1-artifacts": "0.
|
|
32
|
-
"@aztec/merkle-tree": "0.
|
|
33
|
-
"@aztec/noir-
|
|
34
|
-
"@aztec/
|
|
35
|
-
"@aztec/
|
|
36
|
-
"@aztec/
|
|
37
|
-
"@aztec/
|
|
38
|
-
"@aztec/
|
|
27
|
+
"@aztec/circuit-types": "0.35.0",
|
|
28
|
+
"@aztec/circuits.js": "0.35.0",
|
|
29
|
+
"@aztec/ethereum": "0.35.0",
|
|
30
|
+
"@aztec/foundation": "0.35.0",
|
|
31
|
+
"@aztec/l1-artifacts": "0.35.0",
|
|
32
|
+
"@aztec/merkle-tree": "0.35.0",
|
|
33
|
+
"@aztec/noir-contracts.js": "0.35.0",
|
|
34
|
+
"@aztec/noir-protocol-circuits-types": "0.35.0",
|
|
35
|
+
"@aztec/p2p": "0.35.0",
|
|
36
|
+
"@aztec/protocol-contracts": "0.35.0",
|
|
37
|
+
"@aztec/simulator": "0.35.0",
|
|
38
|
+
"@aztec/types": "0.35.0",
|
|
39
|
+
"@aztec/world-state": "0.35.0",
|
|
39
40
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
40
41
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
41
42
|
"lodash.chunk": "^4.2.0",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types';
|
|
2
2
|
import { type BlockProver } from '@aztec/circuit-types/interfaces';
|
|
3
3
|
import { type P2P } from '@aztec/p2p';
|
|
4
|
-
import { type SimulationProvider } from '@aztec/simulator';
|
|
4
|
+
import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator';
|
|
5
5
|
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
6
6
|
import { type WorldStateSynchronizer } from '@aztec/world-state';
|
|
7
7
|
|
|
@@ -9,8 +9,7 @@ import { type SequencerClientConfig } from '../config.js';
|
|
|
9
9
|
import { getGlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
10
10
|
import { getL1Publisher } from '../publisher/index.js';
|
|
11
11
|
import { Sequencer, type SequencerConfig } from '../sequencer/index.js';
|
|
12
|
-
import {
|
|
13
|
-
import { TxValidatorFactory } from '../sequencer/tx_validator_factory.js';
|
|
12
|
+
import { TxValidatorFactory } from '../tx_validator/tx_validator_factory.js';
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* Encapsulates the full sequencer and publisher.
|
package/src/config.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type AllowedFunction } from '@aztec/circuit-types';
|
|
2
|
+
import { AztecAddress, Fr, FunctionSelector, getContractClassFromArtifact } from '@aztec/circuits.js';
|
|
2
3
|
import { type L1ContractAddresses, NULL_KEY } from '@aztec/ethereum';
|
|
3
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
|
+
import { EcdsaAccountContractArtifact } from '@aztec/noir-contracts.js/EcdsaAccount';
|
|
6
|
+
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
7
|
+
import { GasTokenContract } from '@aztec/noir-contracts.js/GasToken';
|
|
8
|
+
import { SchnorrAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrAccount';
|
|
9
|
+
import { SchnorrHardcodedAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrHardcodedAccount';
|
|
10
|
+
import { SchnorrSingleKeyAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrSingleKeyAccount';
|
|
11
|
+
import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
|
|
4
12
|
|
|
5
13
|
import { type Hex } from 'viem';
|
|
6
14
|
|
|
@@ -40,8 +48,8 @@ export function getConfigEnvVars(): SequencerClientConfig {
|
|
|
40
48
|
SEQ_TX_POLLING_INTERVAL_MS,
|
|
41
49
|
SEQ_MAX_TX_PER_BLOCK,
|
|
42
50
|
SEQ_MIN_TX_PER_BLOCK,
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
SEQ_ALLOWED_SETUP_FN,
|
|
52
|
+
SEQ_ALLOWED_TEARDOWN_FN,
|
|
45
53
|
AVAILABILITY_ORACLE_CONTRACT_ADDRESS,
|
|
46
54
|
ROLLUP_CONTRACT_ADDRESS,
|
|
47
55
|
REGISTRY_CONTRACT_ADDRESS,
|
|
@@ -90,9 +98,87 @@ export function getConfigEnvVars(): SequencerClientConfig {
|
|
|
90
98
|
feeRecipient: FEE_RECIPIENT ? AztecAddress.fromString(FEE_RECIPIENT) : undefined,
|
|
91
99
|
acvmWorkingDirectory: ACVM_WORKING_DIRECTORY ? ACVM_WORKING_DIRECTORY : undefined,
|
|
92
100
|
acvmBinaryPath: ACVM_BINARY_PATH ? ACVM_BINARY_PATH : undefined,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
101
|
+
allowedFunctionsInSetup: SEQ_ALLOWED_SETUP_FN
|
|
102
|
+
? parseSequencerAllowList(SEQ_ALLOWED_SETUP_FN)
|
|
103
|
+
: getDefaultAllowedSetupFunctions(),
|
|
104
|
+
allowedFunctionsInTeardown: SEQ_ALLOWED_TEARDOWN_FN
|
|
105
|
+
? parseSequencerAllowList(SEQ_ALLOWED_TEARDOWN_FN)
|
|
106
|
+
: getDefaultAllowedTeardownFunctions(),
|
|
97
107
|
};
|
|
98
108
|
}
|
|
109
|
+
|
|
110
|
+
function parseSequencerAllowList(value: string): AllowedFunction[] {
|
|
111
|
+
const entries: AllowedFunction[] = [];
|
|
112
|
+
|
|
113
|
+
if (!value) {
|
|
114
|
+
return entries;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
for (const val of value.split(',')) {
|
|
118
|
+
const [identifierString, selectorString] = val.split(':');
|
|
119
|
+
const selector = FunctionSelector.fromString(selectorString);
|
|
120
|
+
|
|
121
|
+
if (identifierString.startsWith('0x')) {
|
|
122
|
+
entries.push({
|
|
123
|
+
address: AztecAddress.fromString(identifierString),
|
|
124
|
+
selector,
|
|
125
|
+
});
|
|
126
|
+
} else {
|
|
127
|
+
entries.push({
|
|
128
|
+
classId: Fr.fromString(identifierString),
|
|
129
|
+
selector,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return entries;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function getDefaultAllowedSetupFunctions(): AllowedFunction[] {
|
|
138
|
+
return [
|
|
139
|
+
{
|
|
140
|
+
classId: getContractClassFromArtifact(SchnorrAccountContractArtifact).id,
|
|
141
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
classId: getContractClassFromArtifact(SchnorrHardcodedAccountContractArtifact).id,
|
|
145
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
classId: getContractClassFromArtifact(SchnorrSingleKeyAccountContractArtifact).id,
|
|
149
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
classId: getContractClassFromArtifact(EcdsaAccountContractArtifact).id,
|
|
153
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
// needed for private transfers via FPC
|
|
157
|
+
{
|
|
158
|
+
classId: getContractClassFromArtifact(TokenContractArtifact).id,
|
|
159
|
+
selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'),
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
{
|
|
163
|
+
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
164
|
+
selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function getDefaultAllowedTeardownFunctions(): AllowedFunction[] {
|
|
170
|
+
return [
|
|
171
|
+
{
|
|
172
|
+
classId: getContractClassFromArtifact(GasTokenContract.artifact).id,
|
|
173
|
+
selector: FunctionSelector.fromSignature('pay_fee(Field)'),
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
177
|
+
selector: FunctionSelector.fromSignature('pay_fee((Field),Field,(Field))'),
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
181
|
+
selector: FunctionSelector.fromSignature('pay_fee_with_shielded_rebate(Field,(Field),Field)'),
|
|
182
|
+
},
|
|
183
|
+
];
|
|
184
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AztecAddress, type EthAddress, GlobalVariables } from '@aztec/circuits.js';
|
|
1
|
+
import { type AztecAddress, type EthAddress, GasFees, GlobalVariables } from '@aztec/circuits.js';
|
|
2
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
3
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
4
|
|
|
@@ -86,10 +86,11 @@ export class SimpleTestGlobalVariableBuilder implements GlobalVariableBuilder {
|
|
|
86
86
|
lastTimestamp = new Fr(lastTimestamp.value + 1n);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
this.log(
|
|
89
|
+
this.log.debug(
|
|
90
90
|
`Built global variables for block ${blockNumber}: (${chainId}, ${version}, ${blockNumber}, ${lastTimestamp}, ${coinbase}, ${feeRecipient})`,
|
|
91
91
|
);
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
const gasFees = GasFees.default();
|
|
94
|
+
return new GlobalVariables(chainId, version, blockNumber, lastTimestamp, coinbase, feeRecipient, gasFees);
|
|
94
95
|
}
|
|
95
96
|
}
|
package/src/index.ts
CHANGED