@aztec/sequencer-client 0.47.1 → 0.48.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 +2 -2
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +2 -2
- package/dest/config.d.ts +6 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +96 -31
- package/dest/global_variable_builder/global_builder.d.ts +14 -8
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +10 -16
- package/dest/global_variable_builder/index.d.ts +2 -3
- package/dest/global_variable_builder/index.d.ts.map +1 -1
- package/dest/global_variable_builder/index.js +1 -1
- package/dest/global_variable_builder/viem-reader.d.ts +5 -4
- package/dest/global_variable_builder/viem-reader.d.ts.map +1 -1
- package/dest/global_variable_builder/viem-reader.js +11 -8
- package/dest/publisher/config.d.ts +7 -15
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +38 -11
- package/dest/publisher/index.d.ts +3 -2
- package/dest/publisher/index.d.ts.map +1 -1
- package/dest/publisher/index.js +4 -4
- package/dest/publisher/l1-publisher-metrics.d.ts +17 -0
- package/dest/publisher/l1-publisher-metrics.d.ts.map +1 -0
- package/dest/publisher/l1-publisher-metrics.js +75 -0
- package/dest/publisher/l1-publisher.d.ts +33 -5
- package/dest/publisher/l1-publisher.d.ts.map +1 -1
- package/dest/publisher/l1-publisher.js +44 -36
- package/dest/publisher/viem-tx-sender.d.ts +9 -2
- package/dest/publisher/viem-tx-sender.d.ts.map +1 -1
- package/dest/publisher/viem-tx-sender.js +85 -16
- package/dest/receiver.d.ts +2 -8
- package/dest/receiver.d.ts.map +1 -1
- package/dest/sequencer/metrics.d.ts +17 -0
- package/dest/sequencer/metrics.d.ts.map +1 -0
- package/dest/sequencer/metrics.js +56 -0
- package/dest/sequencer/sequencer.d.ts +7 -5
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +58 -21
- package/dest/tx_validator/gas_validator.d.ts +1 -1
- package/dest/tx_validator/gas_validator.js +11 -11
- package/dest/tx_validator/tx_validator_factory.js +2 -2
- package/package.json +15 -15
- package/src/client/sequencer-client.ts +3 -3
- package/src/config.ts +111 -54
- package/src/global_variable_builder/global_builder.ts +35 -25
- package/src/global_variable_builder/index.ts +3 -3
- package/src/global_variable_builder/viem-reader.ts +14 -11
- package/src/publisher/config.ts +43 -31
- package/src/publisher/index.ts +5 -3
- package/src/publisher/l1-publisher-metrics.ts +108 -0
- package/src/publisher/l1-publisher.ts +78 -43
- package/src/publisher/viem-tx-sender.ts +89 -14
- package/src/receiver.ts +3 -8
- package/src/sequencer/metrics.ts +86 -0
- package/src/sequencer/sequencer.ts +86 -31
- package/src/tx_validator/gas_validator.ts +9 -9
- package/src/tx_validator/tx_validator_factory.ts +2 -2
- package/dest/global_variable_builder/config.d.ts +0 -19
- package/dest/global_variable_builder/config.d.ts.map +0 -1
- package/dest/global_variable_builder/config.js +0 -2
- package/src/global_variable_builder/config.ts +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l1-publisher-metrics.d.ts","sourceRoot":"","sources":["../../src/publisher/l1-publisher-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AAEjD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAY;IAE5B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,aAAa,CAAY;gBAErB,MAAM,EAAE,eAAe,EAAE,IAAI,SAAgB;IA4CzD,cAAc,CAAC,MAAM,EAAE,QAAQ;IAO/B,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;IAIhE,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;IAInE,OAAO,CAAC,QAAQ;CAyBjB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Attributes, Metrics, ValueType, } from '@aztec/telemetry-client';
|
|
2
|
+
import { formatEther } from 'viem/utils';
|
|
3
|
+
export class L1PublisherMetrics {
|
|
4
|
+
constructor(client, name = 'L1Publisher') {
|
|
5
|
+
const meter = client.getMeter(name);
|
|
6
|
+
this.gasPrice = meter.createHistogram(Metrics.L1_PUBLISHER_GAS_PRICE, {
|
|
7
|
+
description: 'The gas price used for transactions',
|
|
8
|
+
unit: 'gwei',
|
|
9
|
+
valueType: ValueType.DOUBLE,
|
|
10
|
+
});
|
|
11
|
+
this.txCount = meter.createUpDownCounter(Metrics.L1_PUBLISHER_TX_COUNT, {
|
|
12
|
+
description: 'The number of transactions processed',
|
|
13
|
+
});
|
|
14
|
+
this.txDuration = meter.createHistogram(Metrics.L1_PUBLISHER_TX_DURATION, {
|
|
15
|
+
description: 'The duration of transaction processing',
|
|
16
|
+
unit: 'ms',
|
|
17
|
+
valueType: ValueType.INT,
|
|
18
|
+
advice: {
|
|
19
|
+
explicitBucketBoundaries: [10, 50, 100, 200, 500, 1000, 2000, 5000, 10000],
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
this.txGas = meter.createHistogram(Metrics.L1_PUBLISHER_TX_GAS, {
|
|
23
|
+
description: 'The gas consumed by transactions',
|
|
24
|
+
unit: 'gas',
|
|
25
|
+
valueType: ValueType.INT,
|
|
26
|
+
});
|
|
27
|
+
this.txCalldataSize = meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_SIZE, {
|
|
28
|
+
description: 'The size of the calldata in transactions',
|
|
29
|
+
unit: 'bytes',
|
|
30
|
+
valueType: ValueType.INT,
|
|
31
|
+
advice: {
|
|
32
|
+
explicitBucketBoundaries: [0, 100, 200, 500, 1000, 2000, 5000, 10000],
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
this.txCalldataGas = meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_GAS, {
|
|
36
|
+
description: 'The gas consumed by the calldata in transactions',
|
|
37
|
+
unit: 'gas',
|
|
38
|
+
valueType: ValueType.INT,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
recordFailedTx(txType) {
|
|
42
|
+
this.txCount.add(1, {
|
|
43
|
+
[Attributes.L1_TX_TYPE]: txType,
|
|
44
|
+
[Attributes.OK]: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
recordSubmitProof(durationMs, stats) {
|
|
48
|
+
this.recordTx('submitProof', durationMs, stats);
|
|
49
|
+
}
|
|
50
|
+
recordProcessBlockTx(durationMs, stats) {
|
|
51
|
+
this.recordTx('process', durationMs, stats);
|
|
52
|
+
}
|
|
53
|
+
recordTx(txType, durationMs, stats) {
|
|
54
|
+
const attributes = {
|
|
55
|
+
[Attributes.L1_TX_TYPE]: txType,
|
|
56
|
+
};
|
|
57
|
+
this.txCount.add(1, {
|
|
58
|
+
...attributes,
|
|
59
|
+
[Attributes.OK]: true,
|
|
60
|
+
});
|
|
61
|
+
this.txDuration.record(Math.ceil(durationMs), attributes);
|
|
62
|
+
this.txGas.record(
|
|
63
|
+
// safe to downcast - total block limit is 30M gas which fits in a JS number
|
|
64
|
+
Number(stats.gasUsed), attributes);
|
|
65
|
+
this.txCalldataGas.record(stats.calldataGas, attributes);
|
|
66
|
+
this.txCalldataSize.record(stats.calldataSize, attributes);
|
|
67
|
+
try {
|
|
68
|
+
this.gasPrice.record(parseInt(formatEther(stats.gasPrice, 'gwei'), 10));
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
// ignore
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDEtcHVibGlzaGVyLW1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGlzaGVyL2wxLXB1Ymxpc2hlci1tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxVQUFVLEVBRVYsT0FBTyxFQUdQLFNBQVMsR0FDVixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJekMsTUFBTSxPQUFPLGtCQUFrQjtJQVM3QixZQUFZLE1BQXVCLEVBQUUsSUFBSSxHQUFHLGFBQWE7UUFDdkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFO1lBQ3BFLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsSUFBSSxFQUFFLE1BQU07WUFDWixTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU07U0FDNUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFO1lBQ3RFLFdBQVcsRUFBRSxzQ0FBc0M7U0FDcEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRTtZQUN4RSxXQUFXLEVBQUUsd0NBQXdDO1lBQ3JELElBQUksRUFBRSxJQUFJO1lBQ1YsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1lBQ3hCLE1BQU0sRUFBRTtnQkFDTix3QkFBd0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO2FB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
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { type L2Block } from '@aztec/circuit-types';
|
|
3
3
|
import { type EthAddress, type Header, type Proof } from '@aztec/circuits.js';
|
|
4
4
|
import { type Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
6
|
import { type L2BlockReceiver } from '../receiver.js';
|
|
6
7
|
import { type PublisherConfig } from './config.js';
|
|
7
8
|
/**
|
|
@@ -30,14 +31,27 @@ export type MinimalTransactionReceipt = {
|
|
|
30
31
|
/** Logs emitted in this tx. */
|
|
31
32
|
logs: any[];
|
|
32
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* @notice An attestation for the sequencing model.
|
|
36
|
+
* @todo This is not where it belongs. But I think we should do a bigger rewrite of some of
|
|
37
|
+
* this spaghetti.
|
|
38
|
+
*/
|
|
39
|
+
export type Attestation = {
|
|
40
|
+
isEmpty: boolean;
|
|
41
|
+
v: number;
|
|
42
|
+
r: `0x${string}`;
|
|
43
|
+
s: `0x${string}`;
|
|
44
|
+
};
|
|
33
45
|
/**
|
|
34
46
|
* Pushes txs to the L1 chain and waits for their completion.
|
|
35
47
|
*/
|
|
36
48
|
export interface L1PublisherTxSender {
|
|
49
|
+
/** Attests to the given archive root. */
|
|
50
|
+
attest(archive: `0x${string}`): Promise<Attestation>;
|
|
37
51
|
/** Returns the EOA used for sending txs to L1. */
|
|
38
52
|
getSenderAddress(): Promise<EthAddress>;
|
|
39
|
-
/** Returns the address of the
|
|
40
|
-
|
|
53
|
+
/** Returns the address of the L2 proposer at the NEXT Ethereum block zero if anyone can submit. */
|
|
54
|
+
getProposerAtNextEthBlock(): Promise<EthAddress>;
|
|
41
55
|
/**
|
|
42
56
|
* Publishes tx effects to Availability Oracle.
|
|
43
57
|
* @param encodedBody - Encoded block body.
|
|
@@ -50,6 +64,12 @@ export interface L1PublisherTxSender {
|
|
|
50
64
|
* @returns The hash of the mined tx.
|
|
51
65
|
*/
|
|
52
66
|
sendProcessTx(encodedData: L1ProcessArgs): Promise<string | undefined>;
|
|
67
|
+
/**
|
|
68
|
+
* Publishes tx effects to availability oracle and send L2 block to rollup contract
|
|
69
|
+
* @param encodedData - Data for processing the new L2 block.
|
|
70
|
+
* @returns The hash of the tx.
|
|
71
|
+
*/
|
|
72
|
+
sendPublishAndProcessTx(encodedData: L1ProcessArgs): Promise<string | undefined>;
|
|
53
73
|
/**
|
|
54
74
|
* Sends a tx to the L1 rollup contract with a proof. Returns once the tx has been mined.
|
|
55
75
|
* @param encodedData - Serialized data for processing the new L2 block.
|
|
@@ -87,6 +107,8 @@ export type L1ProcessArgs = {
|
|
|
87
107
|
archive: Buffer;
|
|
88
108
|
/** L2 block body. */
|
|
89
109
|
body: Buffer;
|
|
110
|
+
/** Attestations */
|
|
111
|
+
attestations?: Attestation[];
|
|
90
112
|
};
|
|
91
113
|
/** Arguments to the submitProof method of the rollup contract */
|
|
92
114
|
export type L1SubmitProofArgs = {
|
|
@@ -94,6 +116,8 @@ export type L1SubmitProofArgs = {
|
|
|
94
116
|
header: Buffer;
|
|
95
117
|
/** A root of the archive tree after the L2 block is applied. */
|
|
96
118
|
archive: Buffer;
|
|
119
|
+
/** Identifier of the prover. */
|
|
120
|
+
proverId: Buffer;
|
|
97
121
|
/** The proof for the block. */
|
|
98
122
|
proof: Buffer;
|
|
99
123
|
/** The aggregation object for the block's proof. */
|
|
@@ -112,16 +136,19 @@ export declare class L1Publisher implements L2BlockReceiver {
|
|
|
112
136
|
private interruptibleSleep;
|
|
113
137
|
private sleepTimeMs;
|
|
114
138
|
private interrupted;
|
|
139
|
+
private metrics;
|
|
115
140
|
private log;
|
|
116
|
-
constructor(txSender: L1PublisherTxSender, config?: PublisherConfig);
|
|
141
|
+
constructor(txSender: L1PublisherTxSender, client: TelemetryClient, config?: PublisherConfig);
|
|
142
|
+
attest(archive: `0x${string}`): Promise<Attestation>;
|
|
143
|
+
senderAddress(): Promise<EthAddress>;
|
|
117
144
|
isItMyTurnToSubmit(): Promise<boolean>;
|
|
118
145
|
/**
|
|
119
146
|
* Publishes L2 block on L1.
|
|
120
147
|
* @param block - L2 block to publish.
|
|
121
148
|
* @returns True once the tx has been confirmed and is successful, false on revert or interrupt, blocks otherwise.
|
|
122
149
|
*/
|
|
123
|
-
processL2Block(block: L2Block): Promise<boolean>;
|
|
124
|
-
submitProof(header: Header, archiveRoot: Fr, aggregationObject: Fr[], proof: Proof): Promise<boolean>;
|
|
150
|
+
processL2Block(block: L2Block, attestations?: Attestation[]): Promise<boolean>;
|
|
151
|
+
submitProof(header: Header, archiveRoot: Fr, proverId: Fr, aggregationObject: Fr[], proof: Proof): Promise<boolean>;
|
|
125
152
|
/**
|
|
126
153
|
* Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap.
|
|
127
154
|
* Be warned, the call may return false even if the tx subsequently gets successfully mined.
|
|
@@ -140,6 +167,7 @@ export declare class L1Publisher implements L2BlockReceiver {
|
|
|
140
167
|
private sendSubmitProofTx;
|
|
141
168
|
private sendPublishTx;
|
|
142
169
|
private sendProcessTx;
|
|
170
|
+
private sendPublishAndProcessTx;
|
|
143
171
|
private getTransactionReceipt;
|
|
144
172
|
protected sleepOrInterrupted(): Promise<void>;
|
|
145
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l1-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/l1-publisher.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"l1-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/l1-publisher.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAKnD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC;CACb,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,MAAM,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAErD,mDAAmD;IACnD,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAExC,mGAAmG;IACnG,yBAAyB,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjD;;;;OAIG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEhE;;;;OAIG;IACH,aAAa,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEvE;;;;OAIG;IACH,uBAAuB,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEjF;;;;OAIG;IACH,iBAAiB,CAAC,eAAe,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEnF;;;;OAIG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAC;IAEtF;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAE3E;;;OAGG;IACH,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAErC;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG;IAC1B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAC9B,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,WAAY,YAAW,eAAe;IAOrC,OAAO,CAAC,QAAQ;IAN5B,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,GAAG,CAAkD;gBAEzC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,eAAe;IAKvF,MAAM,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAIpD,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAIpC,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAMnD;;;;OAIG;IACU,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAsE9E,WAAW,CACtB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,EAAE,EACf,QAAQ,EAAE,EAAE,EACZ,iBAAiB,EAAE,EAAE,EAAE,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,OAAO,CAAC;IA8CnB;;;;;OAKG;IACI,SAAS;IAKhB,wDAAwD;IACjD,OAAO;IAId;;;;OAIG;YACW,oBAAoB;YAUpB,iBAAiB;YAWjB,aAAa;YAYb,aAAa;YAWb,uBAAuB;YAWvB,qBAAqB;cAWnB,kBAAkB;CAGnC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { serializeToBuffer } from '@aztec/foundation/serialize';
|
|
3
3
|
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
4
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
4
5
|
import pick from 'lodash.pick';
|
|
6
|
+
import { L1PublisherMetrics } from './l1-publisher-metrics.js';
|
|
5
7
|
/**
|
|
6
8
|
* Publishes L2 blocks to L1. This implementation does *not* retry a transaction in
|
|
7
9
|
* the event of network congestion, but should work for local development.
|
|
@@ -11,15 +13,22 @@ import pick from 'lodash.pick';
|
|
|
11
13
|
* Adapted from https://github.com/AztecProtocol/aztec2-internal/blob/master/falafel/src/rollup_publisher.ts.
|
|
12
14
|
*/
|
|
13
15
|
export class L1Publisher {
|
|
14
|
-
constructor(txSender, config) {
|
|
16
|
+
constructor(txSender, client, config) {
|
|
15
17
|
this.txSender = txSender;
|
|
16
18
|
this.interruptibleSleep = new InterruptibleSleep();
|
|
17
19
|
this.interrupted = false;
|
|
18
20
|
this.log = createDebugLogger('aztec:sequencer:publisher');
|
|
19
21
|
this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60000;
|
|
22
|
+
this.metrics = new L1PublisherMetrics(client, 'L1Publisher');
|
|
23
|
+
}
|
|
24
|
+
async attest(archive) {
|
|
25
|
+
return await this.txSender.attest(archive);
|
|
26
|
+
}
|
|
27
|
+
async senderAddress() {
|
|
28
|
+
return await this.txSender.getSenderAddress();
|
|
20
29
|
}
|
|
21
30
|
async isItMyTurnToSubmit() {
|
|
22
|
-
const submitter = await this.txSender.
|
|
31
|
+
const submitter = await this.txSender.getProposerAtNextEthBlock();
|
|
23
32
|
const sender = await this.txSender.getSenderAddress();
|
|
24
33
|
return submitter.isZero() || submitter.equals(sender);
|
|
25
34
|
}
|
|
@@ -28,7 +37,7 @@ export class L1Publisher {
|
|
|
28
37
|
* @param block - L2 block to publish.
|
|
29
38
|
* @returns True once the tx has been confirmed and is successful, false on revert or interrupt, blocks otherwise.
|
|
30
39
|
*/
|
|
31
|
-
async processL2Block(block) {
|
|
40
|
+
async processL2Block(block, attestations) {
|
|
32
41
|
const ctx = { blockNumber: block.number, blockHash: block.hash().toString() };
|
|
33
42
|
// TODO(#4148) Remove this block number check, it's here because we don't currently have proper genesis state on the contract
|
|
34
43
|
const lastArchive = block.header.lastArchive.root.toBuffer();
|
|
@@ -37,48 +46,30 @@ export class L1Publisher {
|
|
|
37
46
|
return false;
|
|
38
47
|
}
|
|
39
48
|
const encodedBody = block.body.toBuffer();
|
|
40
|
-
// Publish block transaction effects
|
|
41
|
-
while (!this.interrupted) {
|
|
42
|
-
if (await this.txSender.checkIfTxsAreAvailable(block)) {
|
|
43
|
-
this.log.verbose(`Transaction effects of block ${block.number} already published.`, ctx);
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
const txHash = await this.sendPublishTx(encodedBody);
|
|
47
|
-
if (!txHash) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
const receipt = await this.getTransactionReceipt(txHash);
|
|
51
|
-
if (!receipt) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
if (receipt.status) {
|
|
55
|
-
let txsEffectsHash;
|
|
56
|
-
if (receipt.logs.length === 1) {
|
|
57
|
-
// txsEffectsHash from IAvailabilityOracle.TxsPublished event
|
|
58
|
-
txsEffectsHash = receipt.logs[0].data;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
this.log.warn(`Expected 1 log, got ${receipt.logs.length}`, ctx);
|
|
62
|
-
}
|
|
63
|
-
this.log.info(`Block txs effects published`, { ...ctx, txsEffectsHash });
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
this.log.error(`AvailabilityOracle.publish tx status failed: ${receipt.transactionHash}`, ctx);
|
|
67
|
-
await this.sleepOrInterrupted();
|
|
68
|
-
}
|
|
69
49
|
const processTxArgs = {
|
|
70
50
|
header: block.header.toBuffer(),
|
|
71
51
|
archive: block.archive.root.toBuffer(),
|
|
72
52
|
body: encodedBody,
|
|
53
|
+
attestations,
|
|
73
54
|
};
|
|
74
|
-
// Process block
|
|
55
|
+
// Process block and publish the body if needed (if not already published)
|
|
75
56
|
while (!this.interrupted) {
|
|
76
|
-
|
|
57
|
+
let txHash;
|
|
58
|
+
const timer = new Timer();
|
|
59
|
+
if (await this.txSender.checkIfTxsAreAvailable(block)) {
|
|
60
|
+
this.log.verbose(`Transaction effects of block ${block.number} already published.`, ctx);
|
|
61
|
+
txHash = await this.sendProcessTx(processTxArgs);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
txHash = await this.sendPublishAndProcessTx(processTxArgs);
|
|
65
|
+
}
|
|
77
66
|
if (!txHash) {
|
|
67
|
+
this.log.info(`Failed to publish block ${block.number} to L1`, ctx);
|
|
78
68
|
break;
|
|
79
69
|
}
|
|
80
70
|
const receipt = await this.getTransactionReceipt(txHash);
|
|
81
71
|
if (!receipt) {
|
|
72
|
+
this.log.info(`Failed to get receipt for tx ${txHash}`, ctx);
|
|
82
73
|
break;
|
|
83
74
|
}
|
|
84
75
|
// Tx was mined successfully
|
|
@@ -91,8 +82,10 @@ export class L1Publisher {
|
|
|
91
82
|
eventName: 'rollup-published-to-l1',
|
|
92
83
|
};
|
|
93
84
|
this.log.info(`Published L2 block to L1 rollup contract`, { ...stats, ...ctx });
|
|
85
|
+
this.metrics.recordProcessBlockTx(timer.ms(), stats);
|
|
94
86
|
return true;
|
|
95
87
|
}
|
|
88
|
+
this.metrics.recordFailedTx('process');
|
|
96
89
|
// Check if someone else incremented the block number
|
|
97
90
|
if (!(await this.checkLastArchiveHash(lastArchive))) {
|
|
98
91
|
this.log.warn('Publish failed. Detected different last archive hash.', ctx);
|
|
@@ -104,16 +97,18 @@ export class L1Publisher {
|
|
|
104
97
|
this.log.verbose('L2 block data syncing interrupted while processing blocks.', ctx);
|
|
105
98
|
return false;
|
|
106
99
|
}
|
|
107
|
-
async submitProof(header, archiveRoot, aggregationObject, proof) {
|
|
100
|
+
async submitProof(header, archiveRoot, proverId, aggregationObject, proof) {
|
|
108
101
|
const ctx = { blockNumber: header.globalVariables.blockNumber };
|
|
109
102
|
const txArgs = {
|
|
110
103
|
header: header.toBuffer(),
|
|
111
104
|
archive: archiveRoot.toBuffer(),
|
|
105
|
+
proverId: proverId.toBuffer(),
|
|
112
106
|
aggregationObject: serializeToBuffer(aggregationObject),
|
|
113
107
|
proof: proof.withoutPublicInputs(),
|
|
114
108
|
};
|
|
115
109
|
// Process block
|
|
116
110
|
while (!this.interrupted) {
|
|
111
|
+
const timer = new Timer();
|
|
117
112
|
const txHash = await this.sendSubmitProofTx(txArgs);
|
|
118
113
|
if (!txHash) {
|
|
119
114
|
break;
|
|
@@ -131,8 +126,10 @@ export class L1Publisher {
|
|
|
131
126
|
eventName: 'proof-published-to-l1',
|
|
132
127
|
};
|
|
133
128
|
this.log.info(`Published L2 block to L1 rollup contract`, { ...stats, ...ctx });
|
|
129
|
+
this.metrics.recordSubmitProof(timer.ms(), stats);
|
|
134
130
|
return true;
|
|
135
131
|
}
|
|
132
|
+
this.metrics.recordFailedTx('submitProof');
|
|
136
133
|
this.log.error(`Rollup.submitProof tx status failed: ${receipt.transactionHash}`, ctx);
|
|
137
134
|
await this.sleepOrInterrupted();
|
|
138
135
|
}
|
|
@@ -201,6 +198,17 @@ export class L1Publisher {
|
|
|
201
198
|
}
|
|
202
199
|
}
|
|
203
200
|
}
|
|
201
|
+
async sendPublishAndProcessTx(encodedData) {
|
|
202
|
+
while (!this.interrupted) {
|
|
203
|
+
try {
|
|
204
|
+
return await this.txSender.sendPublishAndProcessTx(encodedData);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
this.log.error(`Rollup publish failed`, err);
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
204
212
|
async getTransactionReceipt(txHash) {
|
|
205
213
|
while (!this.interrupted) {
|
|
206
214
|
try {
|
|
@@ -216,4 +224,4 @@ export class L1Publisher {
|
|
|
216
224
|
await this.interruptibleSleep.sleep(this.sleepTimeMs);
|
|
217
225
|
}
|
|
218
226
|
}
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDEtcHVibGlzaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1Ymxpc2hlci9sMS1wdWJsaXNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR2hELE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUkvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQW1JL0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBT3RCLFlBQW9CLFFBQTZCLEVBQUUsTUFBdUIsRUFBRSxNQUF3QjtRQUFoRixhQUFRLEdBQVIsUUFBUSxDQUFxQjtRQU56Qyx1QkFBa0IsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFOUMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFcEIsUUFBRyxHQUFHLGlCQUFpQixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFHM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLEVBQUUsd0JBQXdCLElBQUksS0FBTSxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBc0I7UUFDeEMsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUN4QixPQUFPLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0Is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
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { type L2Block } from '@aztec/circuit-types';
|
|
3
3
|
import { EthAddress } from '@aztec/circuits.js';
|
|
4
4
|
import { type TxSenderConfig } from './config.js';
|
|
5
|
-
import { type L1PublisherTxSender, type L1SubmitProofArgs, type MinimalTransactionReceipt, type L1ProcessArgs as ProcessTxArgs, type TransactionStats } from './l1-publisher.js';
|
|
5
|
+
import { type Attestation, type L1PublisherTxSender, type L1SubmitProofArgs, type MinimalTransactionReceipt, type L1ProcessArgs as ProcessTxArgs, type TransactionStats } from './l1-publisher.js';
|
|
6
6
|
/**
|
|
7
7
|
* Pushes transactions to the L1 rollup contract using viem.
|
|
8
8
|
*/
|
|
@@ -13,8 +13,9 @@ export declare class ViemTxSender implements L1PublisherTxSender {
|
|
|
13
13
|
private publicClient;
|
|
14
14
|
private account;
|
|
15
15
|
constructor(config: TxSenderConfig);
|
|
16
|
+
attest(archive: `0x{string}`): Promise<Attestation>;
|
|
16
17
|
getSenderAddress(): Promise<EthAddress>;
|
|
17
|
-
|
|
18
|
+
getProposerAtNextEthBlock(): Promise<EthAddress>;
|
|
18
19
|
getCurrentArchive(): Promise<Buffer>;
|
|
19
20
|
checkIfTxsAreAvailable(block: L2Block): Promise<boolean>;
|
|
20
21
|
getTransactionStats(txHash: string): Promise<TransactionStats | undefined>;
|
|
@@ -36,6 +37,12 @@ export declare class ViemTxSender implements L1PublisherTxSender {
|
|
|
36
37
|
* @returns The hash of the mined tx.
|
|
37
38
|
*/
|
|
38
39
|
sendProcessTx(encodedData: ProcessTxArgs): Promise<string | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* @notice Publishes the body AND process the block in one transaction
|
|
42
|
+
* @param encodedData - Serialized data for processing the new L2 block.
|
|
43
|
+
* @returns The hash of the transaction
|
|
44
|
+
*/
|
|
45
|
+
sendPublishAndProcessTx(encodedData: ProcessTxArgs): Promise<string | undefined>;
|
|
39
46
|
/**
|
|
40
47
|
* Sends a tx to the L1 rollup contract with a proof. Returns once the tx has been mined.
|
|
41
48
|
* @param encodedData - Serialized data for the proof.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viem-tx-sender.d.ts","sourceRoot":"","sources":["../../src/publisher/viem-tx-sender.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"viem-tx-sender.d.ts","sourceRoot":"","sources":["../../src/publisher/viem-tx-sender.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAA0B,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsBxE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,IAAI,aAAa,EACnC,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,qBAAa,YAAa,YAAW,mBAAmB;IACtD,OAAO,CAAC,0BAA0B,CAGhC;IACF,OAAO,CAAC,cAAc,CAGpB;IAEF,OAAO,CAAC,GAAG,CAAuD;IAClE,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,OAAO,CAAoB;gBAEvB,MAAM,EAAE,cAAc;IA2B5B,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAczD,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC;IAOjC,yBAAyB,IAAI,OAAO,CAAC,UAAU,CAAC;IAWhD,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAK1C,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAahF;;;;OAIG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAmB3F;;;;OAIG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAarE;;;;OAIG;IACG,aAAa,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA4B5E;;;;OAIG;IACG,uBAAuB,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAkCtF;;;;OAIG;IACG,iBAAiB,CAAC,eAAe,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAqBxF;;;;OAIG;IACH,OAAO,CAAC,QAAQ;CASjB"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { EthAddress } from '@aztec/circuits.js';
|
|
1
|
+
import { ETHEREUM_SLOT_DURATION, EthAddress } from '@aztec/circuits.js';
|
|
2
2
|
import { createEthereumChain } from '@aztec/ethereum';
|
|
3
3
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { AvailabilityOracleAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
5
|
-
import { createPublicClient, createWalletClient, getAddress, getContract, hexToBytes, http, } from 'viem';
|
|
5
|
+
import { createPublicClient, createWalletClient, getAddress, getContract, hexToBytes, http, parseSignature, } from 'viem';
|
|
6
6
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
7
7
|
import * as chains from 'viem/chains';
|
|
8
8
|
/**
|
|
@@ -11,7 +11,7 @@ import * as chains from 'viem/chains';
|
|
|
11
11
|
export class ViemTxSender {
|
|
12
12
|
constructor(config) {
|
|
13
13
|
this.log = createDebugLogger('aztec:sequencer:viem-tx-sender');
|
|
14
|
-
const { rpcUrl, l1ChainId: chainId, publisherPrivateKey, l1Contracts } = config;
|
|
14
|
+
const { l1RpcUrl: rpcUrl, l1ChainId: chainId, publisherPrivateKey, l1Contracts } = config;
|
|
15
15
|
const chain = createEthereumChain(rpcUrl, chainId);
|
|
16
16
|
this.account = privateKeyToAccount(publisherPrivateKey);
|
|
17
17
|
const walletClient = createWalletClient({
|
|
@@ -34,12 +34,28 @@ export class ViemTxSender {
|
|
|
34
34
|
client: walletClient,
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
+
async attest(archive) {
|
|
38
|
+
// @note Something seems slightly off in viem, think it should be Hex instead of Hash
|
|
39
|
+
// but as they both are just `0x${string}` it should be fine anyways.
|
|
40
|
+
const signature = await this.account.signMessage({ message: { raw: archive } });
|
|
41
|
+
const { r, s, v } = parseSignature(signature);
|
|
42
|
+
return {
|
|
43
|
+
isEmpty: false,
|
|
44
|
+
v: v ? Number(v) : 0,
|
|
45
|
+
r: r,
|
|
46
|
+
s: s,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
37
49
|
getSenderAddress() {
|
|
38
50
|
return Promise.resolve(EthAddress.fromString(this.account.address));
|
|
39
51
|
}
|
|
40
|
-
|
|
52
|
+
// Computes who will be the L2 proposer at the next Ethereum block
|
|
53
|
+
// Using next Ethereum block so we do NOT need to wait for it being mined before seeing the effect
|
|
54
|
+
// @note Assumes that all ethereum slots have blocks
|
|
55
|
+
async getProposerAtNextEthBlock() {
|
|
41
56
|
try {
|
|
42
|
-
const
|
|
57
|
+
const ts = BigInt((await this.publicClient.getBlock()).timestamp + BigInt(ETHEREUM_SLOT_DURATION));
|
|
58
|
+
const submitter = await this.rollupContract.read.getProposerAt([ts]);
|
|
43
59
|
return EthAddress.fromString(submitter);
|
|
44
60
|
}
|
|
45
61
|
catch (err) {
|
|
@@ -110,15 +126,67 @@ export class ViemTxSender {
|
|
|
110
126
|
* @returns The hash of the mined tx.
|
|
111
127
|
*/
|
|
112
128
|
async sendProcessTx(encodedData) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
129
|
+
if (encodedData.attestations) {
|
|
130
|
+
const args = [
|
|
131
|
+
`0x${encodedData.header.toString('hex')}`,
|
|
132
|
+
`0x${encodedData.archive.toString('hex')}`,
|
|
133
|
+
encodedData.attestations,
|
|
134
|
+
];
|
|
135
|
+
const gas = await this.rollupContract.estimateGas.process(args, {
|
|
136
|
+
account: this.account,
|
|
137
|
+
});
|
|
138
|
+
return await this.rollupContract.write.process(args, {
|
|
139
|
+
gas,
|
|
140
|
+
account: this.account,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const args = [`0x${encodedData.header.toString('hex')}`, `0x${encodedData.archive.toString('hex')}`];
|
|
145
|
+
const gas = await this.rollupContract.estimateGas.process(args, {
|
|
146
|
+
account: this.account,
|
|
147
|
+
});
|
|
148
|
+
return await this.rollupContract.write.process(args, {
|
|
149
|
+
gas,
|
|
150
|
+
account: this.account,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* @notice Publishes the body AND process the block in one transaction
|
|
156
|
+
* @param encodedData - Serialized data for processing the new L2 block.
|
|
157
|
+
* @returns The hash of the transaction
|
|
158
|
+
*/
|
|
159
|
+
async sendPublishAndProcessTx(encodedData) {
|
|
160
|
+
// @note This is quite a sin, but I'm committing war crimes in this code already.
|
|
161
|
+
if (encodedData.attestations) {
|
|
162
|
+
const args = [
|
|
163
|
+
`0x${encodedData.header.toString('hex')}`,
|
|
164
|
+
`0x${encodedData.archive.toString('hex')}`,
|
|
165
|
+
encodedData.attestations,
|
|
166
|
+
`0x${encodedData.body.toString('hex')}`,
|
|
167
|
+
];
|
|
168
|
+
const gas = await this.rollupContract.estimateGas.publishAndProcess(args, {
|
|
169
|
+
account: this.account,
|
|
170
|
+
});
|
|
171
|
+
return await this.rollupContract.write.publishAndProcess(args, {
|
|
172
|
+
gas,
|
|
173
|
+
account: this.account,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const args = [
|
|
178
|
+
`0x${encodedData.header.toString('hex')}`,
|
|
179
|
+
`0x${encodedData.archive.toString('hex')}`,
|
|
180
|
+
`0x${encodedData.body.toString('hex')}`,
|
|
181
|
+
];
|
|
182
|
+
const gas = await this.rollupContract.estimateGas.publishAndProcess(args, {
|
|
183
|
+
account: this.account,
|
|
184
|
+
});
|
|
185
|
+
return await this.rollupContract.write.publishAndProcess(args, {
|
|
186
|
+
gas,
|
|
187
|
+
account: this.account,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
122
190
|
}
|
|
123
191
|
/**
|
|
124
192
|
* Sends a tx to the L1 rollup contract with a proof. Returns once the tx has been mined.
|
|
@@ -126,10 +194,11 @@ export class ViemTxSender {
|
|
|
126
194
|
* @returns The hash of the mined tx.
|
|
127
195
|
*/
|
|
128
196
|
async sendSubmitProofTx(submitProofArgs) {
|
|
129
|
-
const { header, archive, aggregationObject, proof } = submitProofArgs;
|
|
197
|
+
const { header, archive, proverId, aggregationObject, proof } = submitProofArgs;
|
|
130
198
|
const args = [
|
|
131
199
|
`0x${header.toString('hex')}`,
|
|
132
200
|
`0x${archive.toString('hex')}`,
|
|
201
|
+
`0x${proverId.toString('hex')}`,
|
|
133
202
|
`0x${aggregationObject.toString('hex')}`,
|
|
134
203
|
`0x${proof.toString('hex')}`,
|
|
135
204
|
];
|
|
@@ -164,4 +233,4 @@ export class ViemTxSender {
|
|
|
164
233
|
function getCalldataGasUsage(data) {
|
|
165
234
|
return data.filter(byte => byte === 0).length * 4 + data.filter(byte => byte !== 0).length * 16;
|
|
166
235
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmllbS10eC1zZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGlzaGVyL3ZpZW0tdHgtc2VuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkUsT0FBTyxFQU1MLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFdBQVcsRUFDWCxVQUFVLEVBQ1YsSUFBSSxFQUNKLGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBMEIsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFZdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQWN2QixZQUFZLE1BQXNCO1FBSjFCLFFBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBS2hFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQzFGLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsT0FBTyxHQUFHLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7WUFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEtBQUssRUFBRSxLQUFL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
|