@aztec/sequencer-client 0.0.1-commit.808bf7f90 → 0.0.1-commit.8227e42
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/publisher/config.d.ts +5 -1
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +6 -1
- package/dest/publisher/index.d.ts +2 -1
- package/dest/publisher/index.d.ts.map +1 -1
- package/dest/publisher/l1_tx_failed_store/factory.d.ts +11 -0
- package/dest/publisher/l1_tx_failed_store/factory.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/factory.js +22 -0
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts +59 -0
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.js +1 -0
- package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.d.ts +15 -0
- package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.js +34 -0
- package/dest/publisher/l1_tx_failed_store/index.d.ts +4 -0
- package/dest/publisher/l1_tx_failed_store/index.d.ts.map +1 -0
- package/dest/publisher/l1_tx_failed_store/index.js +2 -0
- package/dest/publisher/sequencer-publisher.d.ts +8 -2
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +217 -8
- package/package.json +28 -28
- package/src/publisher/config.ts +9 -0
- package/src/publisher/index.ts +3 -0
- package/src/publisher/l1_tx_failed_store/factory.ts +32 -0
- package/src/publisher/l1_tx_failed_store/failed_tx_store.ts +55 -0
- package/src/publisher/l1_tx_failed_store/file_store_failed_tx_store.ts +46 -0
- package/src/publisher/l1_tx_failed_store/index.ts +3 -0
- package/src/publisher/sequencer-publisher.ts +178 -8
|
@@ -28,6 +28,8 @@ export type PublisherConfig = L1TxUtilsConfig & BlobClientConfig & {
|
|
|
28
28
|
fishermanMode?: boolean;
|
|
29
29
|
/** Address of the forwarder contract to wrap all L1 transactions through (for testing purposes only) */
|
|
30
30
|
publisherForwarderAddress?: EthAddress;
|
|
31
|
+
/** Store for failed L1 transaction inputs (test networks only). Format: gs://bucket/path */
|
|
32
|
+
l1TxFailedStore?: string;
|
|
31
33
|
};
|
|
32
34
|
export type ProverPublisherConfig = L1TxUtilsConfig & BlobClientConfig & {
|
|
33
35
|
fishermanMode?: boolean;
|
|
@@ -38,6 +40,8 @@ export type SequencerPublisherConfig = L1TxUtilsConfig & BlobClientConfig & {
|
|
|
38
40
|
fishermanMode?: boolean;
|
|
39
41
|
sequencerPublisherAllowInvalidStates?: boolean;
|
|
40
42
|
sequencerPublisherForwarderAddress?: EthAddress;
|
|
43
|
+
/** Store for failed L1 transaction inputs (test networks only). Format: gs://bucket/path */
|
|
44
|
+
l1TxFailedStore?: string;
|
|
41
45
|
};
|
|
42
46
|
export declare function getPublisherConfigFromProverConfig(config: ProverPublisherConfig): PublisherConfig;
|
|
43
47
|
export declare function getPublisherConfigFromSequencerConfig(config: SequencerPublisherConfig): PublisherConfig;
|
|
@@ -45,4 +49,4 @@ export declare const proverTxSenderConfigMappings: ConfigMappingsType<Omit<Prove
|
|
|
45
49
|
export declare const sequencerTxSenderConfigMappings: ConfigMappingsType<Omit<SequencerTxSenderConfig, 'l1Contracts'>>;
|
|
46
50
|
export declare const sequencerPublisherConfigMappings: ConfigMappingsType<SequencerPublisherConfig & L1TxUtilsConfig>;
|
|
47
51
|
export declare const proverPublisherConfigMappings: ConfigMappingsType<ProverPublisherConfig & L1TxUtilsConfig>;
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGlzaGVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBMkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQTBCLE1BQU0sMkJBQTJCLENBQUM7QUFDeEYsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUEyQixNQUFNLG9DQUFvQyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFFLFdBQVcsRUFBdUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0Qsa0RBQWtEO0FBQ2xELE1BQU0sTUFBTSxjQUFjLEdBQUcsY0FBYyxHQUFHO0lBQzVDLG1EQUFtRDtJQUNuRCxvQkFBb0IsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVwRCwwREFBMEQ7SUFDMUQsa0JBQWtCLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUNuQyxDQUFDO0FBRUYsTUFBTSxNQUFNLG9CQUFvQixHQUFHLGNBQWMsR0FBRztJQUNsRCwwQkFBMEIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMxRCx3QkFBd0IsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQ3pDLENBQUM7QUFFRixNQUFNLE1BQU0sdUJBQXVCLEdBQUcsY0FBYyxHQUFHO0lBQ3JELDZCQUE2QixDQUFDLEVBQUUsV0FBVyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzdELDJCQUEyQixDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDNUMsQ0FBQztBQUVGLHdCQUFnQixpQ0FBaUMsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLEdBQUcsY0FBYyxDQU05RjtBQUVELHdCQUFnQixvQ0FBb0MsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEdBQUcsY0FBYyxDQU1wRztBQUVELHdDQUF3QztBQUN4QyxNQUFNLE1BQU0sZUFBZSxHQUFHLGVBQWUsR0FDM0MsZ0JBQWdCLEdBQUc7SUFDakIsb0dBQW9HO0lBQ3BHLDJCQUEyQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQ3RDLDRHQUE0RztJQUM1RyxhQUFhLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDeEIsd0dBQXdHO0lBQ3hHLHlCQUF5QixDQUFDLEVBQUUsVUFBVSxDQUFDO0lBQ3ZDLDRGQUE0RjtJQUM1RixlQUFlLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDMUIsQ0FBQztBQUVKLE1BQU0sTUFBTSxxQkFBcUIsR0FBRyxlQUFlLEdBQ2pELGdCQUFnQixHQUFHO0lBQ2pCLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUN4QixpQ0FBaUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUM1QywrQkFBK0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQztDQUM5QyxDQUFDO0FBRUosTUFBTSxNQUFNLHdCQUF3QixHQUFHLGVBQWUsR0FDcEQsZ0JBQWdCLEdBQUc7SUFDakIsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQ3hCLG9DQUFvQyxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQy9DLGtDQUFrQyxDQUFDLEVBQUUsVUFBVSxDQUFDO0lBQ2hELDRGQUE0RjtJQUM1RixlQUFlLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDMUIsQ0FBQztBQUVKLHdCQUFnQixrQ0FBa0MsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEdBQUcsZUFBZSxDQU1qRztBQUVELHdCQUFnQixxQ0FBcUMsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLEdBQUcsZUFBZSxDQU92RztBQUVELGVBQU8sTUFBTSw0QkFBNEIsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLENBZXRHLENBQUM7QUFFRixlQUFPLE1BQU0sK0JBQStCLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLGFBQWEsQ0FBQyxDQWU1RyxDQUFDO0FBRUYsZUFBTyxNQUFNLGdDQUFnQyxFQUFFLGtCQUFrQixDQUFDLHdCQUF3QixHQUFHLGVBQWUsQ0F1QjNHLENBQUM7QUFFRixlQUFPLE1BQU0sNkJBQTZCLEVBQUUsa0JBQWtCLENBQUMscUJBQXFCLEdBQUcsZUFBZSxDQW1CckcsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/publisher/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAuB,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,kDAAkD;AAClD,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAC5C,mDAAmD;IACnD,oBAAoB,CAAC,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;IAEpD,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG;IAClD,0BAA0B,CAAC,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;IAC1D,wBAAwB,CAAC,EAAE,UAAU,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,cAAc,GAAG;IACrD,6BAA6B,CAAC,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7D,2BAA2B,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5C,CAAC;AAEF,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAM9F;AAED,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,uBAAuB,GAAG,cAAc,CAMpG;AAED,wCAAwC;AACxC,MAAM,MAAM,eAAe,GAAG,eAAe,GAC3C,gBAAgB,GAAG;IACjB,oGAAoG;IACpG,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,4GAA4G;IAC5G,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wGAAwG;IACxG,yBAAyB,CAAC,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/publisher/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAuB,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,kDAAkD;AAClD,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAC5C,mDAAmD;IACnD,oBAAoB,CAAC,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;IAEpD,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG;IAClD,0BAA0B,CAAC,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;IAC1D,wBAAwB,CAAC,EAAE,UAAU,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,cAAc,GAAG;IACrD,6BAA6B,CAAC,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7D,2BAA2B,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5C,CAAC;AAEF,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAM9F;AAED,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,uBAAuB,GAAG,cAAc,CAMpG;AAED,wCAAwC;AACxC,MAAM,MAAM,eAAe,GAAG,eAAe,GAC3C,gBAAgB,GAAG;IACjB,oGAAoG;IACpG,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,4GAA4G;IAC5G,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wGAAwG;IACxG,yBAAyB,CAAC,EAAE,UAAU,CAAC;IACvC,4FAA4F;IAC5F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEJ,MAAM,MAAM,qBAAqB,GAAG,eAAe,GACjD,gBAAgB,GAAG;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,+BAA+B,CAAC,EAAE,UAAU,CAAC;CAC9C,CAAC;AAEJ,MAAM,MAAM,wBAAwB,GAAG,eAAe,GACpD,gBAAgB,GAAG;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oCAAoC,CAAC,EAAE,OAAO,CAAC;IAC/C,kCAAkC,CAAC,EAAE,UAAU,CAAC;IAChD,4FAA4F;IAC5F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEJ,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAMjG;AAED,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,wBAAwB,GAAG,eAAe,CAOvG;AAED,eAAO,MAAM,4BAA4B,EAAE,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAetG,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,kBAAkB,CAAC,IAAI,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAe5G,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,kBAAkB,CAAC,wBAAwB,GAAG,eAAe,CAuB3G,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,kBAAkB,CAAC,qBAAqB,GAAG,eAAe,CAmBrG,CAAC"}
|
package/dest/publisher/config.js
CHANGED
|
@@ -28,7 +28,8 @@ export function getPublisherConfigFromSequencerConfig(config) {
|
|
|
28
28
|
return {
|
|
29
29
|
...config,
|
|
30
30
|
publisherAllowInvalidStates: config.sequencerPublisherAllowInvalidStates,
|
|
31
|
-
publisherForwarderAddress: config.sequencerPublisherForwarderAddress
|
|
31
|
+
publisherForwarderAddress: config.sequencerPublisherForwarderAddress,
|
|
32
|
+
l1TxFailedStore: config.l1TxFailedStore
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
35
|
export const proverTxSenderConfigMappings = {
|
|
@@ -84,6 +85,10 @@ export const sequencerPublisherConfigMappings = {
|
|
|
84
85
|
env: `SEQ_PUBLISHER_FORWARDER_ADDRESS`,
|
|
85
86
|
description: 'Address of the forwarder contract to wrap all L1 transactions through (for testing purposes only)',
|
|
86
87
|
parseEnv: (val)=>val ? EthAddress.fromString(val) : undefined
|
|
88
|
+
},
|
|
89
|
+
l1TxFailedStore: {
|
|
90
|
+
env: 'L1_TX_FAILED_STORE',
|
|
91
|
+
description: 'Store for failed L1 transaction inputs (test networks only). Format: gs://bucket/path'
|
|
87
92
|
}
|
|
88
93
|
};
|
|
89
94
|
export const proverPublisherConfigMappings = {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { SequencerPublisher } from './sequencer-publisher.js';
|
|
2
2
|
export { SequencerPublisherFactory } from './sequencer-publisher-factory.js';
|
|
3
3
|
export { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
4
|
-
|
|
4
|
+
export { type FailedL1Tx, type FailedL1TxUri, type L1TxFailedStore } from './l1_tx_failed_store/index.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaXNoZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHN0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHN0UsT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLEtBQUssYUFBYSxFQUFFLEtBQUssZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/publisher/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/publisher/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { L1TxFailedStore } from './failed_tx_store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an L1TxFailedStore from a config string.
|
|
5
|
+
* Supports any backend that FileStore supports (GCS, S3, R2, local filesystem).
|
|
6
|
+
* @param config - Config string (e.g., 'gs://bucket/path', 's3://bucket/path', 'file:///path'). If undefined, returns undefined.
|
|
7
|
+
* @param logger - Optional logger.
|
|
8
|
+
* @returns The store instance, or undefined if config is not provided.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createL1TxFailedStore(config: string | undefined, logger?: Logger): Promise<L1TxFailedStore | undefined>;
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3B1Ymxpc2hlci9sMV90eF9mYWlsZWRfc3RvcmUvZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHNUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUN6QyxNQUFNLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDMUIsTUFBTSxHQUFFLE1BQXFELEdBQzVELE9BQU8sQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLENBZXRDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/publisher/l1_tx_failed_store/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,GAAE,MAAqD,GAC5D,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAetC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { createFileStore } from '@aztec/stdlib/file-store';
|
|
3
|
+
import { FileStoreL1TxFailedStore } from './file_store_failed_tx_store.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates an L1TxFailedStore from a config string.
|
|
6
|
+
* Supports any backend that FileStore supports (GCS, S3, R2, local filesystem).
|
|
7
|
+
* @param config - Config string (e.g., 'gs://bucket/path', 's3://bucket/path', 'file:///path'). If undefined, returns undefined.
|
|
8
|
+
* @param logger - Optional logger.
|
|
9
|
+
* @returns The store instance, or undefined if config is not provided.
|
|
10
|
+
*/ export async function createL1TxFailedStore(config, logger = createLogger('sequencer:l1-tx-failed-store')) {
|
|
11
|
+
if (!config) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const fileStore = await createFileStore(config, logger);
|
|
15
|
+
if (!fileStore) {
|
|
16
|
+
throw new Error(`Failed to create file store from config: '${config}'. ` + `Supported formats: 'gs://bucket/path', 's3://bucket/path', 'file:///path'.`);
|
|
17
|
+
}
|
|
18
|
+
logger.info(`Created L1 tx failed store`, {
|
|
19
|
+
config
|
|
20
|
+
});
|
|
21
|
+
return new FileStoreL1TxFailedStore(fileStore, logger);
|
|
22
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Hex } from 'viem';
|
|
2
|
+
/** URI pointing to a stored failed L1 transaction. */
|
|
3
|
+
export type FailedL1TxUri = string & {
|
|
4
|
+
__brand: 'FailedL1TxUri';
|
|
5
|
+
};
|
|
6
|
+
/** A failed L1 transaction captured for debugging and replay. */
|
|
7
|
+
export type FailedL1Tx = {
|
|
8
|
+
/** Tx hash (for reverts) or keccak256(request.data) (for simulation/send failures). */
|
|
9
|
+
id: Hex;
|
|
10
|
+
/** Unix timestamp (ms) when failure occurred. */
|
|
11
|
+
timestamp: number;
|
|
12
|
+
/** Whether the failure was during simulation or after sending. */
|
|
13
|
+
failureType: 'simulation' | 'revert' | 'send-error';
|
|
14
|
+
/** The actual L1 transaction for replay (multicall-encoded for bundled txs). */
|
|
15
|
+
request: {
|
|
16
|
+
to: Hex;
|
|
17
|
+
data: Hex;
|
|
18
|
+
value?: string;
|
|
19
|
+
};
|
|
20
|
+
/** Raw blob data as hex for replay. */
|
|
21
|
+
blobData?: Hex[];
|
|
22
|
+
/** L1 block number at time of failure (simulation target or receipt block). */
|
|
23
|
+
l1BlockNumber: string;
|
|
24
|
+
/** Receipt info (present only for on-chain reverts). */
|
|
25
|
+
receipt?: {
|
|
26
|
+
transactionHash: Hex;
|
|
27
|
+
blockNumber: string;
|
|
28
|
+
gasUsed: string;
|
|
29
|
+
status: 'reverted';
|
|
30
|
+
};
|
|
31
|
+
/** Error information. */
|
|
32
|
+
error: {
|
|
33
|
+
message: string;
|
|
34
|
+
/** Decoded error name (e.g., 'Rollup__InvalidProposer'). */
|
|
35
|
+
name?: string;
|
|
36
|
+
};
|
|
37
|
+
/** Context metadata. */
|
|
38
|
+
context: {
|
|
39
|
+
/** Actions involved (e.g., ['propose', 'governance-signal']). */
|
|
40
|
+
actions: string[];
|
|
41
|
+
/** Individual request data for each action (metadata, not used for replay). */
|
|
42
|
+
requests?: Array<{
|
|
43
|
+
action: string;
|
|
44
|
+
to: Hex;
|
|
45
|
+
data: Hex;
|
|
46
|
+
}>;
|
|
47
|
+
checkpointNumber?: number;
|
|
48
|
+
slot?: number;
|
|
49
|
+
sender: Hex;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
/** Store for failed L1 transactions for debugging purposes. */
|
|
53
|
+
export interface L1TxFailedStore {
|
|
54
|
+
/** Saves a failed transaction and returns its URI. */
|
|
55
|
+
saveFailedTx(tx: FailedL1Tx): Promise<FailedL1TxUri>;
|
|
56
|
+
/** Retrieves a failed transaction by its URI. */
|
|
57
|
+
getFailedTx(uri: FailedL1TxUri): Promise<FailedL1Tx>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpbGVkX3R4X3N0b3JlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHVibGlzaGVyL2wxX3R4X2ZhaWxlZF9zdG9yZS9mYWlsZWRfdHhfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhDLHNEQUFzRDtBQUN0RCxNQUFNLE1BQU0sYUFBYSxHQUFHLE1BQU0sR0FBRztJQUFFLE9BQU8sRUFBRSxlQUFlLENBQUE7Q0FBRSxDQUFDO0FBRWxFLGlFQUFpRTtBQUNqRSxNQUFNLE1BQU0sVUFBVSxHQUFHO0lBQ3ZCLHVGQUF1RjtJQUN2RixFQUFFLEVBQUUsR0FBRyxDQUFDO0lBQ1IsaURBQWlEO0lBQ2pELFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsa0VBQWtFO0lBQ2xFLFdBQVcsRUFBRSxZQUFZLEdBQUcsUUFBUSxHQUFHLFlBQVksQ0FBQztJQUNwRCxnRkFBZ0Y7SUFDaEYsT0FBTyxFQUFFO1FBQ1AsRUFBRSxFQUFFLEdBQUcsQ0FBQztRQUNSLElBQUksRUFBRSxHQUFHLENBQUM7UUFDVixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDaEIsQ0FBQztJQUNGLHVDQUF1QztJQUN2QyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNqQiwrRUFBK0U7SUFDL0UsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUN0Qix3REFBd0Q7SUFDeEQsT0FBTyxDQUFDLEVBQUU7UUFDUixlQUFlLEVBQUUsR0FBRyxDQUFDO1FBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFDcEIsT0FBTyxFQUFFLE1BQU0sQ0FBQztRQUNoQixNQUFNLEVBQUUsVUFBVSxDQUFDO0tBQ3BCLENBQUM7SUFDRix5QkFBeUI7SUFDekIsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLE1BQU0sQ0FBQztRQUNoQiw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO0tBQ2YsQ0FBQztJQUNGLHdCQUF3QjtJQUN4QixPQUFPLEVBQUU7UUFDUCxpRUFBaUU7UUFDakUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLCtFQUErRTtRQUMvRSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7WUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQztZQUFDLElBQUksRUFBRSxHQUFHLENBQUE7U0FBRSxDQUFDLENBQUM7UUFDekQsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ2QsTUFBTSxFQUFFLEdBQUcsQ0FBQztLQUNiLENBQUM7Q0FDSCxDQUFDO0FBRUYsK0RBQStEO0FBQy9ELE1BQU0sV0FBVyxlQUFlO0lBQzlCLHNEQUFzRDtJQUN0RCxZQUFZLENBQUMsRUFBRSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckQsaURBQWlEO0lBQ2pELFdBQVcsQ0FBQyxHQUFHLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztDQUN0RCJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failed_tx_store.d.ts","sourceRoot":"","sources":["../../../src/publisher/l1_tx_failed_store/failed_tx_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEhC,sDAAsD;AACtD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAElE,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG;IACvB,uFAAuF;IACvF,EAAE,EAAE,GAAG,CAAC;IACR,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,WAAW,EAAE,YAAY,GAAG,QAAQ,GAAG,YAAY,CAAC;IACpD,gFAAgF;IAChF,OAAO,EAAE;QACP,EAAE,EAAE,GAAG,CAAC;QACR,IAAI,EAAE,GAAG,CAAC;QACV,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,uCAAuC;IACvC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,OAAO,CAAC,EAAE;QACR,eAAe,EAAE,GAAG,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,UAAU,CAAC;KACpB,CAAC;IACF,yBAAyB;IACzB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,4DAA4D;QAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,wBAAwB;IACxB,OAAO,EAAE;QACP,iEAAiE;QACjE,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,+EAA+E;QAC/E,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,GAAG,CAAC;YAAC,IAAI,EAAE,GAAG,CAAA;SAAE,CAAC,CAAC;QACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,GAAG,CAAC;KACb,CAAC;CACH,CAAC;AAEF,+DAA+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACrD,iDAAiD;IACjD,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/** Store for failed L1 transactions for debugging purposes. */ export { };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { FileStore } from '@aztec/stdlib/file-store';
|
|
3
|
+
import type { FailedL1Tx, FailedL1TxUri, L1TxFailedStore } from './failed_tx_store.js';
|
|
4
|
+
/**
|
|
5
|
+
* L1TxFailedStore implementation using the FileStore abstraction.
|
|
6
|
+
* Supports any backend that FileStore supports (GCS, S3, R2, local filesystem).
|
|
7
|
+
*/
|
|
8
|
+
export declare class FileStoreL1TxFailedStore implements L1TxFailedStore {
|
|
9
|
+
private readonly fileStore;
|
|
10
|
+
private readonly log;
|
|
11
|
+
constructor(fileStore: FileStore, logger?: Logger);
|
|
12
|
+
saveFailedTx(tx: FailedL1Tx): Promise<FailedL1TxUri>;
|
|
13
|
+
getFailedTx(uri: FailedL1TxUri): Promise<FailedL1Tx>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9zdG9yZV9mYWlsZWRfdHhfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaXNoZXIvbDFfdHhfZmFpbGVkX3N0b3JlL2ZpbGVfc3RvcmVfZmFpbGVkX3R4X3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZGOzs7R0FHRztBQUNILHFCQUFhLHdCQUF5QixZQUFXLGVBQWU7SUFJNUQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBSDVCLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFTO0lBRTdCLFlBQ21CLFNBQVMsRUFBRSxTQUFTLEVBQ3JDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFHaEI7SUFFWSxZQUFZLENBQUMsRUFBRSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBb0JoRTtJQUVZLFdBQVcsQ0FBQyxHQUFHLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FHaEU7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file_store_failed_tx_store.d.ts","sourceRoot":"","sources":["../../../src/publisher/l1_tx_failed_store/file_store_failed_tx_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvF;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,eAAe;IAI5D,OAAO,CAAC,QAAQ,CAAC,SAAS;IAH5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YACmB,SAAS,EAAE,SAAS,EACrC,MAAM,CAAC,EAAE,MAAM,EAGhB;IAEY,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAoBhE;IAEY,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAGhE;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
/**
|
|
3
|
+
* L1TxFailedStore implementation using the FileStore abstraction.
|
|
4
|
+
* Supports any backend that FileStore supports (GCS, S3, R2, local filesystem).
|
|
5
|
+
*/ export class FileStoreL1TxFailedStore {
|
|
6
|
+
fileStore;
|
|
7
|
+
log;
|
|
8
|
+
constructor(fileStore, logger){
|
|
9
|
+
this.fileStore = fileStore;
|
|
10
|
+
this.log = logger ?? createLogger('sequencer:l1-tx-failed-store');
|
|
11
|
+
}
|
|
12
|
+
async saveFailedTx(tx) {
|
|
13
|
+
const prefix = tx.receipt ? 'tx' : 'data';
|
|
14
|
+
const path = `${tx.failureType}/${prefix}-${tx.id}.json`;
|
|
15
|
+
const json = JSON.stringify(tx, null, 2);
|
|
16
|
+
const uri = await this.fileStore.save(path, Buffer.from(json), {
|
|
17
|
+
metadata: {
|
|
18
|
+
'content-type': 'application/json',
|
|
19
|
+
actions: tx.context.actions.join(','),
|
|
20
|
+
'failure-type': tx.failureType
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
this.log.info(`Saved failed L1 tx to ${uri}`, {
|
|
24
|
+
id: tx.id,
|
|
25
|
+
failureType: tx.failureType,
|
|
26
|
+
actions: tx.context.actions.join(',')
|
|
27
|
+
});
|
|
28
|
+
return uri;
|
|
29
|
+
}
|
|
30
|
+
async getFailedTx(uri) {
|
|
31
|
+
const data = await this.fileStore.read(uri);
|
|
32
|
+
return JSON.parse(data.toString());
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { type FailedL1Tx, type FailedL1TxUri, type L1TxFailedStore } from './failed_tx_store.js';
|
|
2
|
+
export { createL1TxFailedStore } from './factory.js';
|
|
3
|
+
export { FileStoreL1TxFailedStore } from './file_store_failed_tx_store.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaXNoZXIvbDFfdHhfZmFpbGVkX3N0b3JlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxLQUFLLGFBQWEsRUFBRSxLQUFLLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQyJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/publisher/l1_tx_failed_store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -47,6 +47,7 @@ export declare class SequencerPublisher {
|
|
|
47
47
|
private interrupted;
|
|
48
48
|
private metrics;
|
|
49
49
|
epochCache: EpochCache;
|
|
50
|
+
private failedTxStore?;
|
|
50
51
|
protected governanceLog: Logger;
|
|
51
52
|
protected slashingLog: Logger;
|
|
52
53
|
protected lastActions: Partial<Record<Action, SlotNumber>>;
|
|
@@ -70,7 +71,7 @@ export declare class SequencerPublisher {
|
|
|
70
71
|
slashFactoryContract: SlashFactoryContract;
|
|
71
72
|
readonly tracer: Tracer;
|
|
72
73
|
protected requests: RequestWithExpiry[];
|
|
73
|
-
constructor(config: Pick<SequencerPublisherConfig, 'fishermanMode'> & Pick<L1ContractsConfig, 'ethereumSlotDuration'> & {
|
|
74
|
+
constructor(config: Pick<SequencerPublisherConfig, 'fishermanMode' | 'l1TxFailedStore'> & Pick<L1ContractsConfig, 'ethereumSlotDuration'> & {
|
|
74
75
|
l1ChainId: number;
|
|
75
76
|
}, deps: {
|
|
76
77
|
telemetry?: TelemetryClient;
|
|
@@ -86,6 +87,11 @@ export declare class SequencerPublisher {
|
|
|
86
87
|
lastActions: Partial<Record<Action, SlotNumber>>;
|
|
87
88
|
log?: Logger;
|
|
88
89
|
});
|
|
90
|
+
/**
|
|
91
|
+
* Backs up a failed L1 transaction to the configured store for debugging.
|
|
92
|
+
* Does nothing if no store is configured.
|
|
93
|
+
*/
|
|
94
|
+
private backupFailedTx;
|
|
89
95
|
getRollupContract(): RollupContract;
|
|
90
96
|
/**
|
|
91
97
|
* Gets the fee asset price modifier from the oracle.
|
|
@@ -204,4 +210,4 @@ export declare class SequencerPublisher {
|
|
|
204
210
|
private addProposeTx;
|
|
205
211
|
}
|
|
206
212
|
export {};
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLXB1Ymxpc2hlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1Ymxpc2hlci9zZXF1ZW5jZXItcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyw4QkFBOEIsRUFFbkMsS0FBSywwQkFBMEIsRUFJL0IsY0FBYyxFQUNkLEtBQUssNkJBQTZCLEVBR25DLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUYsT0FBTyxFQUNMLEtBQUssWUFBWSxFQUNqQixLQUFLLFVBQVUsRUFDZixLQUFLLFdBQVcsRUFDaEIsS0FBSyxTQUFTLEVBRWQsS0FBSyxnQkFBZ0IsRUFFdEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsa0JBQWtCLEVBQStDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9FLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsT0FBTyxF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,KAAK,8BAA8B,EAEnC,KAAK,0BAA0B,EAI/B,cAAc,EACd,KAAK,6BAA6B,EAGnC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,mBAAmB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,SAAS,EAEd,KAAK,gBAAgB,EAEtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAA+C,MAAM,uBAAuB,CAAC;AAGxG,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE/E,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAsB,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACrG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAiC,MAAM,yBAAyB,CAAC;AAE3G,OAAO,
|
|
1
|
+
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -390,7 +390,8 @@ import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
|
390
390
|
import { encodeSlashConsensusVotes } from '@aztec/slasher';
|
|
391
391
|
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
392
392
|
import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
393
|
-
import { encodeFunctionData, toHex } from 'viem';
|
|
393
|
+
import { encodeFunctionData, keccak256, multicall3Abi, toHex } from 'viem';
|
|
394
|
+
import { createL1TxFailedStore } from './l1_tx_failed_store/index.js';
|
|
394
395
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
395
396
|
export const Actions = [
|
|
396
397
|
'invalidate-by-invalid-attestation',
|
|
@@ -430,6 +431,7 @@ export class SequencerPublisher {
|
|
|
430
431
|
interrupted;
|
|
431
432
|
metrics;
|
|
432
433
|
epochCache;
|
|
434
|
+
failedTxStore;
|
|
433
435
|
governanceLog;
|
|
434
436
|
slashingLog;
|
|
435
437
|
lastActions;
|
|
@@ -485,6 +487,24 @@ export class SequencerPublisher {
|
|
|
485
487
|
}
|
|
486
488
|
// Initialize fee asset price oracle
|
|
487
489
|
this.feeAssetPriceOracle = new FeeAssetPriceOracle(this.l1TxUtils.client, this.rollupContract, createLogger('sequencer:publisher:price-oracle'));
|
|
490
|
+
// Initialize failed L1 tx store (optional, for test networks)
|
|
491
|
+
this.failedTxStore = createL1TxFailedStore(config.l1TxFailedStore, this.log);
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Backs up a failed L1 transaction to the configured store for debugging.
|
|
495
|
+
* Does nothing if no store is configured.
|
|
496
|
+
*/ backupFailedTx(failedTx) {
|
|
497
|
+
if (!this.failedTxStore) {
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
const tx = {
|
|
501
|
+
...failedTx,
|
|
502
|
+
timestamp: Date.now()
|
|
503
|
+
};
|
|
504
|
+
// Fire and forget - don't block on backup
|
|
505
|
+
void this.failedTxStore.then((store)=>store?.saveFailedTx(tx)).catch((err)=>{
|
|
506
|
+
this.log.warn(`Failed to backup failed L1 tx to store`, err);
|
|
507
|
+
});
|
|
488
508
|
}
|
|
489
509
|
getRollupContract() {
|
|
490
510
|
return this.rollupContract;
|
|
@@ -630,12 +650,31 @@ export class SequencerPublisher {
|
|
|
630
650
|
// This ensures the committee gets precomputed correctly
|
|
631
651
|
validRequests.sort((a, b)=>compareActions(a.action, b.action));
|
|
632
652
|
try {
|
|
653
|
+
// Capture context for failed tx backup before sending
|
|
654
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
655
|
+
const multicallData = encodeFunctionData({
|
|
656
|
+
abi: multicall3Abi,
|
|
657
|
+
functionName: 'aggregate3',
|
|
658
|
+
args: [
|
|
659
|
+
validRequests.map((r)=>({
|
|
660
|
+
target: r.request.to,
|
|
661
|
+
callData: r.request.data,
|
|
662
|
+
allowFailure: true
|
|
663
|
+
}))
|
|
664
|
+
]
|
|
665
|
+
});
|
|
666
|
+
const blobDataHex = blobConfig?.blobs?.map((b)=>toHex(b));
|
|
633
667
|
this.log.debug('Forwarding transactions', {
|
|
634
668
|
validRequests: validRequests.map((request)=>request.action),
|
|
635
669
|
txConfig
|
|
636
670
|
});
|
|
637
671
|
const result = await Multicall3.forward(validRequests.map((request)=>request.request), this.l1TxUtils, txConfig, blobConfig, this.rollupContract.address, this.log);
|
|
638
|
-
const
|
|
672
|
+
const txContext = {
|
|
673
|
+
multicallData,
|
|
674
|
+
blobData: blobDataHex,
|
|
675
|
+
l1BlockNumber
|
|
676
|
+
};
|
|
677
|
+
const { successfulActions = [], failedActions = [] } = this.callbackBundledTransactions(validRequests, result, txContext);
|
|
639
678
|
return {
|
|
640
679
|
result,
|
|
641
680
|
expiredActions,
|
|
@@ -655,10 +694,33 @@ export class SequencerPublisher {
|
|
|
655
694
|
}
|
|
656
695
|
}
|
|
657
696
|
}
|
|
658
|
-
callbackBundledTransactions(requests, result) {
|
|
697
|
+
callbackBundledTransactions(requests, result, txContext) {
|
|
659
698
|
const actionsListStr = requests.map((r)=>r.action).join(', ');
|
|
660
699
|
if (result instanceof FormattedViemError) {
|
|
661
700
|
this.log.error(`Failed to publish bundled transactions (${actionsListStr})`, result);
|
|
701
|
+
this.backupFailedTx({
|
|
702
|
+
id: keccak256(txContext.multicallData),
|
|
703
|
+
failureType: 'send-error',
|
|
704
|
+
request: {
|
|
705
|
+
to: MULTI_CALL_3_ADDRESS,
|
|
706
|
+
data: txContext.multicallData
|
|
707
|
+
},
|
|
708
|
+
blobData: txContext.blobData,
|
|
709
|
+
l1BlockNumber: txContext.l1BlockNumber.toString(),
|
|
710
|
+
error: {
|
|
711
|
+
message: result.message,
|
|
712
|
+
name: result.name
|
|
713
|
+
},
|
|
714
|
+
context: {
|
|
715
|
+
actions: requests.map((r)=>r.action),
|
|
716
|
+
requests: requests.map((r)=>({
|
|
717
|
+
action: r.action,
|
|
718
|
+
to: r.request.to,
|
|
719
|
+
data: r.request.data
|
|
720
|
+
})),
|
|
721
|
+
sender: this.getSenderAddress().toString()
|
|
722
|
+
}
|
|
723
|
+
});
|
|
662
724
|
return {
|
|
663
725
|
failedActions: requests.map((r)=>r.action)
|
|
664
726
|
};
|
|
@@ -676,6 +738,37 @@ export class SequencerPublisher {
|
|
|
676
738
|
failedActions.push(request.action);
|
|
677
739
|
}
|
|
678
740
|
}
|
|
741
|
+
// Single backup for the whole reverted tx
|
|
742
|
+
if (failedActions.length > 0 && result?.receipt?.status === 'reverted') {
|
|
743
|
+
this.backupFailedTx({
|
|
744
|
+
id: result.receipt.transactionHash,
|
|
745
|
+
failureType: 'revert',
|
|
746
|
+
request: {
|
|
747
|
+
to: MULTI_CALL_3_ADDRESS,
|
|
748
|
+
data: txContext.multicallData
|
|
749
|
+
},
|
|
750
|
+
blobData: txContext.blobData,
|
|
751
|
+
l1BlockNumber: result.receipt.blockNumber.toString(),
|
|
752
|
+
receipt: {
|
|
753
|
+
transactionHash: result.receipt.transactionHash,
|
|
754
|
+
blockNumber: result.receipt.blockNumber.toString(),
|
|
755
|
+
gasUsed: (result.receipt.gasUsed ?? 0n).toString(),
|
|
756
|
+
status: 'reverted'
|
|
757
|
+
},
|
|
758
|
+
error: {
|
|
759
|
+
message: result.errorMsg ?? 'Transaction reverted'
|
|
760
|
+
},
|
|
761
|
+
context: {
|
|
762
|
+
actions: failedActions,
|
|
763
|
+
requests: requests.filter((r)=>failedActions.includes(r.action)).map((r)=>({
|
|
764
|
+
action: r.action,
|
|
765
|
+
to: r.request.to,
|
|
766
|
+
data: r.request.data
|
|
767
|
+
})),
|
|
768
|
+
sender: this.getSenderAddress().toString()
|
|
769
|
+
}
|
|
770
|
+
});
|
|
771
|
+
}
|
|
679
772
|
return {
|
|
680
773
|
successfulActions,
|
|
681
774
|
failedActions
|
|
@@ -778,6 +871,7 @@ export class SequencerPublisher {
|
|
|
778
871
|
...logData,
|
|
779
872
|
request
|
|
780
873
|
});
|
|
874
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
781
875
|
try {
|
|
782
876
|
const { gasUsed } = await this.l1TxUtils.simulate(request, undefined, undefined, mergeAbis([
|
|
783
877
|
request.abi ?? [],
|
|
@@ -820,6 +914,27 @@ export class SequencerPublisher {
|
|
|
820
914
|
}
|
|
821
915
|
// Otherwise, throw. We cannot build the next checkpoint if we cannot invalidate the previous one.
|
|
822
916
|
this.log.error(`Simulation for invalidate checkpoint ${checkpointNumber} failed`, viemError, logData);
|
|
917
|
+
this.backupFailedTx({
|
|
918
|
+
id: keccak256(request.data),
|
|
919
|
+
failureType: 'simulation',
|
|
920
|
+
request: {
|
|
921
|
+
to: request.to,
|
|
922
|
+
data: request.data,
|
|
923
|
+
value: request.value?.toString()
|
|
924
|
+
},
|
|
925
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
926
|
+
error: {
|
|
927
|
+
message: viemError.message,
|
|
928
|
+
name: viemError.name
|
|
929
|
+
},
|
|
930
|
+
context: {
|
|
931
|
+
actions: [
|
|
932
|
+
`invalidate-${reason}`
|
|
933
|
+
],
|
|
934
|
+
checkpointNumber,
|
|
935
|
+
sender: this.getSenderAddress().toString()
|
|
936
|
+
}
|
|
937
|
+
});
|
|
823
938
|
throw new Error(`Failed to simulate invalidate checkpoint ${checkpointNumber}`, {
|
|
824
939
|
cause: viemError
|
|
825
940
|
});
|
|
@@ -922,6 +1037,7 @@ export class SequencerPublisher {
|
|
|
922
1037
|
signer: this.l1TxUtils.client.account?.address,
|
|
923
1038
|
lastValidL2Slot: slotNumber
|
|
924
1039
|
});
|
|
1040
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
925
1041
|
try {
|
|
926
1042
|
await this.l1TxUtils.simulate(request, {
|
|
927
1043
|
time: timestamp
|
|
@@ -933,7 +1049,29 @@ export class SequencerPublisher {
|
|
|
933
1049
|
request
|
|
934
1050
|
});
|
|
935
1051
|
} catch (err) {
|
|
936
|
-
|
|
1052
|
+
const viemError = formatViemError(err);
|
|
1053
|
+
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError);
|
|
1054
|
+
this.backupFailedTx({
|
|
1055
|
+
id: keccak256(request.data),
|
|
1056
|
+
failureType: 'simulation',
|
|
1057
|
+
request: {
|
|
1058
|
+
to: request.to,
|
|
1059
|
+
data: request.data,
|
|
1060
|
+
value: request.value?.toString()
|
|
1061
|
+
},
|
|
1062
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1063
|
+
error: {
|
|
1064
|
+
message: viemError.message,
|
|
1065
|
+
name: viemError.name
|
|
1066
|
+
},
|
|
1067
|
+
context: {
|
|
1068
|
+
actions: [
|
|
1069
|
+
action
|
|
1070
|
+
],
|
|
1071
|
+
slot: slotNumber,
|
|
1072
|
+
sender: this.getSenderAddress().toString()
|
|
1073
|
+
}
|
|
1074
|
+
});
|
|
937
1075
|
// Yes, we enqueue the request anyway, in case there was a bug with the simulation itself
|
|
938
1076
|
}
|
|
939
1077
|
// TODO(palla/slash): All votes (governance and slashing) should txTimeoutAt at the end of the slot.
|
|
@@ -1155,6 +1293,7 @@ export class SequencerPublisher {
|
|
|
1155
1293
|
const cachedLastActionSlot = this.lastActions[action];
|
|
1156
1294
|
this.lastActions[action] = slotNumber;
|
|
1157
1295
|
this.log.debug(`Simulating ${action} for slot ${slotNumber}`, logData);
|
|
1296
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1158
1297
|
let gasUsed;
|
|
1159
1298
|
const simulateAbi = mergeAbis([
|
|
1160
1299
|
request.abi ?? [],
|
|
@@ -1172,6 +1311,27 @@ export class SequencerPublisher {
|
|
|
1172
1311
|
} catch (err) {
|
|
1173
1312
|
const viemError = formatViemError(err, simulateAbi);
|
|
1174
1313
|
this.log.error(`Simulation for ${action} at ${slotNumber} failed`, viemError, logData);
|
|
1314
|
+
this.backupFailedTx({
|
|
1315
|
+
id: keccak256(request.data),
|
|
1316
|
+
failureType: 'simulation',
|
|
1317
|
+
request: {
|
|
1318
|
+
to: request.to,
|
|
1319
|
+
data: request.data,
|
|
1320
|
+
value: request.value?.toString()
|
|
1321
|
+
},
|
|
1322
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1323
|
+
error: {
|
|
1324
|
+
message: viemError.message,
|
|
1325
|
+
name: viemError.name
|
|
1326
|
+
},
|
|
1327
|
+
context: {
|
|
1328
|
+
actions: [
|
|
1329
|
+
action
|
|
1330
|
+
],
|
|
1331
|
+
slot: slotNumber,
|
|
1332
|
+
sender: this.getSenderAddress().toString()
|
|
1333
|
+
}
|
|
1334
|
+
});
|
|
1175
1335
|
return false;
|
|
1176
1336
|
}
|
|
1177
1337
|
// We issued the simulation against the rollup contract, so we need to account for the overhead of the multicall3
|
|
@@ -1250,10 +1410,38 @@ export class SequencerPublisher {
|
|
|
1250
1410
|
}, {}, {
|
|
1251
1411
|
blobs: encodedData.blobs.map((b)=>b.data),
|
|
1252
1412
|
kzg
|
|
1253
|
-
}).catch((err)=>{
|
|
1254
|
-
const
|
|
1255
|
-
this.log.error(`Failed to validate blobs`, message, {
|
|
1256
|
-
metaMessages
|
|
1413
|
+
}).catch(async (err)=>{
|
|
1414
|
+
const viemError = formatViemError(err);
|
|
1415
|
+
this.log.error(`Failed to validate blobs`, viemError.message, {
|
|
1416
|
+
metaMessages: viemError.metaMessages
|
|
1417
|
+
});
|
|
1418
|
+
const validateBlobsData = encodeFunctionData({
|
|
1419
|
+
abi: RollupAbi,
|
|
1420
|
+
functionName: 'validateBlobs',
|
|
1421
|
+
args: [
|
|
1422
|
+
blobInput
|
|
1423
|
+
]
|
|
1424
|
+
});
|
|
1425
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1426
|
+
this.backupFailedTx({
|
|
1427
|
+
id: keccak256(validateBlobsData),
|
|
1428
|
+
failureType: 'simulation',
|
|
1429
|
+
request: {
|
|
1430
|
+
to: this.rollupContract.address,
|
|
1431
|
+
data: validateBlobsData
|
|
1432
|
+
},
|
|
1433
|
+
blobData: encodedData.blobs.map((b)=>toHex(b.data)),
|
|
1434
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1435
|
+
error: {
|
|
1436
|
+
message: viemError.message,
|
|
1437
|
+
name: viemError.name
|
|
1438
|
+
},
|
|
1439
|
+
context: {
|
|
1440
|
+
actions: [
|
|
1441
|
+
'validate-blobs'
|
|
1442
|
+
],
|
|
1443
|
+
sender: this.getSenderAddress().toString()
|
|
1444
|
+
}
|
|
1257
1445
|
});
|
|
1258
1446
|
throw new Error('Failed to validate blobs');
|
|
1259
1447
|
});
|
|
@@ -1313,6 +1501,7 @@ export class SequencerPublisher {
|
|
|
1313
1501
|
balance: 10n * WEI_CONST * WEI_CONST
|
|
1314
1502
|
});
|
|
1315
1503
|
}
|
|
1504
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1316
1505
|
const simulationResult = await this.l1TxUtils.simulate({
|
|
1317
1506
|
to: this.rollupContract.address,
|
|
1318
1507
|
data: rollupData,
|
|
@@ -1340,6 +1529,26 @@ export class SequencerPublisher {
|
|
|
1340
1529
|
};
|
|
1341
1530
|
}
|
|
1342
1531
|
this.log.error(`Failed to simulate propose tx`, viemError);
|
|
1532
|
+
this.backupFailedTx({
|
|
1533
|
+
id: keccak256(rollupData),
|
|
1534
|
+
failureType: 'simulation',
|
|
1535
|
+
request: {
|
|
1536
|
+
to: this.rollupContract.address,
|
|
1537
|
+
data: rollupData
|
|
1538
|
+
},
|
|
1539
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1540
|
+
error: {
|
|
1541
|
+
message: viemError.message,
|
|
1542
|
+
name: viemError.name
|
|
1543
|
+
},
|
|
1544
|
+
context: {
|
|
1545
|
+
actions: [
|
|
1546
|
+
'propose'
|
|
1547
|
+
],
|
|
1548
|
+
slot: Number(args[0].header.slotNumber),
|
|
1549
|
+
sender: this.getSenderAddress().toString()
|
|
1550
|
+
}
|
|
1551
|
+
});
|
|
1343
1552
|
throw err;
|
|
1344
1553
|
});
|
|
1345
1554
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.8227e42",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -26,38 +26,38 @@
|
|
|
26
26
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@aztec/aztec.js": "0.0.1-commit.
|
|
30
|
-
"@aztec/bb-prover": "0.0.1-commit.
|
|
31
|
-
"@aztec/blob-client": "0.0.1-commit.
|
|
32
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
33
|
-
"@aztec/constants": "0.0.1-commit.
|
|
34
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
35
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
36
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
37
|
-
"@aztec/l1-artifacts": "0.0.1-commit.
|
|
38
|
-
"@aztec/merkle-tree": "0.0.1-commit.
|
|
39
|
-
"@aztec/node-keystore": "0.0.1-commit.
|
|
40
|
-
"@aztec/noir-acvm_js": "0.0.1-commit.
|
|
41
|
-
"@aztec/noir-contracts.js": "0.0.1-commit.
|
|
42
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
43
|
-
"@aztec/noir-types": "0.0.1-commit.
|
|
44
|
-
"@aztec/p2p": "0.0.1-commit.
|
|
45
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
46
|
-
"@aztec/prover-client": "0.0.1-commit.
|
|
47
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
48
|
-
"@aztec/slasher": "0.0.1-commit.
|
|
49
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
50
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
51
|
-
"@aztec/validator-client": "0.0.1-commit.
|
|
52
|
-
"@aztec/validator-ha-signer": "0.0.1-commit.
|
|
53
|
-
"@aztec/world-state": "0.0.1-commit.
|
|
29
|
+
"@aztec/aztec.js": "0.0.1-commit.8227e42",
|
|
30
|
+
"@aztec/bb-prover": "0.0.1-commit.8227e42",
|
|
31
|
+
"@aztec/blob-client": "0.0.1-commit.8227e42",
|
|
32
|
+
"@aztec/blob-lib": "0.0.1-commit.8227e42",
|
|
33
|
+
"@aztec/constants": "0.0.1-commit.8227e42",
|
|
34
|
+
"@aztec/epoch-cache": "0.0.1-commit.8227e42",
|
|
35
|
+
"@aztec/ethereum": "0.0.1-commit.8227e42",
|
|
36
|
+
"@aztec/foundation": "0.0.1-commit.8227e42",
|
|
37
|
+
"@aztec/l1-artifacts": "0.0.1-commit.8227e42",
|
|
38
|
+
"@aztec/merkle-tree": "0.0.1-commit.8227e42",
|
|
39
|
+
"@aztec/node-keystore": "0.0.1-commit.8227e42",
|
|
40
|
+
"@aztec/noir-acvm_js": "0.0.1-commit.8227e42",
|
|
41
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.8227e42",
|
|
42
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.8227e42",
|
|
43
|
+
"@aztec/noir-types": "0.0.1-commit.8227e42",
|
|
44
|
+
"@aztec/p2p": "0.0.1-commit.8227e42",
|
|
45
|
+
"@aztec/protocol-contracts": "0.0.1-commit.8227e42",
|
|
46
|
+
"@aztec/prover-client": "0.0.1-commit.8227e42",
|
|
47
|
+
"@aztec/simulator": "0.0.1-commit.8227e42",
|
|
48
|
+
"@aztec/slasher": "0.0.1-commit.8227e42",
|
|
49
|
+
"@aztec/stdlib": "0.0.1-commit.8227e42",
|
|
50
|
+
"@aztec/telemetry-client": "0.0.1-commit.8227e42",
|
|
51
|
+
"@aztec/validator-client": "0.0.1-commit.8227e42",
|
|
52
|
+
"@aztec/validator-ha-signer": "0.0.1-commit.8227e42",
|
|
53
|
+
"@aztec/world-state": "0.0.1-commit.8227e42",
|
|
54
54
|
"lodash.chunk": "^4.2.0",
|
|
55
55
|
"tslib": "^2.4.0",
|
|
56
56
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@aztec/archiver": "0.0.1-commit.
|
|
60
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
59
|
+
"@aztec/archiver": "0.0.1-commit.8227e42",
|
|
60
|
+
"@aztec/kv-store": "0.0.1-commit.8227e42",
|
|
61
61
|
"@electric-sql/pglite": "^0.3.14",
|
|
62
62
|
"@jest/globals": "^30.0.0",
|
|
63
63
|
"@types/jest": "^30.0.0",
|
package/src/publisher/config.ts
CHANGED
|
@@ -48,6 +48,8 @@ export type PublisherConfig = L1TxUtilsConfig &
|
|
|
48
48
|
fishermanMode?: boolean;
|
|
49
49
|
/** Address of the forwarder contract to wrap all L1 transactions through (for testing purposes only) */
|
|
50
50
|
publisherForwarderAddress?: EthAddress;
|
|
51
|
+
/** Store for failed L1 transaction inputs (test networks only). Format: gs://bucket/path */
|
|
52
|
+
l1TxFailedStore?: string;
|
|
51
53
|
};
|
|
52
54
|
|
|
53
55
|
export type ProverPublisherConfig = L1TxUtilsConfig &
|
|
@@ -62,6 +64,8 @@ export type SequencerPublisherConfig = L1TxUtilsConfig &
|
|
|
62
64
|
fishermanMode?: boolean;
|
|
63
65
|
sequencerPublisherAllowInvalidStates?: boolean;
|
|
64
66
|
sequencerPublisherForwarderAddress?: EthAddress;
|
|
67
|
+
/** Store for failed L1 transaction inputs (test networks only). Format: gs://bucket/path */
|
|
68
|
+
l1TxFailedStore?: string;
|
|
65
69
|
};
|
|
66
70
|
|
|
67
71
|
export function getPublisherConfigFromProverConfig(config: ProverPublisherConfig): PublisherConfig {
|
|
@@ -77,6 +81,7 @@ export function getPublisherConfigFromSequencerConfig(config: SequencerPublisher
|
|
|
77
81
|
...config,
|
|
78
82
|
publisherAllowInvalidStates: config.sequencerPublisherAllowInvalidStates,
|
|
79
83
|
publisherForwarderAddress: config.sequencerPublisherForwarderAddress,
|
|
84
|
+
l1TxFailedStore: config.l1TxFailedStore,
|
|
80
85
|
};
|
|
81
86
|
}
|
|
82
87
|
|
|
@@ -133,6 +138,10 @@ export const sequencerPublisherConfigMappings: ConfigMappingsType<SequencerPubli
|
|
|
133
138
|
description: 'Address of the forwarder contract to wrap all L1 transactions through (for testing purposes only)',
|
|
134
139
|
parseEnv: (val: string) => (val ? EthAddress.fromString(val) : undefined),
|
|
135
140
|
},
|
|
141
|
+
l1TxFailedStore: {
|
|
142
|
+
env: 'L1_TX_FAILED_STORE',
|
|
143
|
+
description: 'Store for failed L1 transaction inputs (test networks only). Format: gs://bucket/path',
|
|
144
|
+
},
|
|
136
145
|
};
|
|
137
146
|
|
|
138
147
|
export const proverPublisherConfigMappings: ConfigMappingsType<ProverPublisherConfig & L1TxUtilsConfig> = {
|
package/src/publisher/index.ts
CHANGED
|
@@ -3,3 +3,6 @@ export { SequencerPublisherFactory } from './sequencer-publisher-factory.js';
|
|
|
3
3
|
|
|
4
4
|
// Used for tests
|
|
5
5
|
export { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
6
|
+
|
|
7
|
+
// Failed L1 tx store (optional, for test networks)
|
|
8
|
+
export { type FailedL1Tx, type FailedL1TxUri, type L1TxFailedStore } from './l1_tx_failed_store/index.js';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { createFileStore } from '@aztec/stdlib/file-store';
|
|
3
|
+
|
|
4
|
+
import type { L1TxFailedStore } from './failed_tx_store.js';
|
|
5
|
+
import { FileStoreL1TxFailedStore } from './file_store_failed_tx_store.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates an L1TxFailedStore from a config string.
|
|
9
|
+
* Supports any backend that FileStore supports (GCS, S3, R2, local filesystem).
|
|
10
|
+
* @param config - Config string (e.g., 'gs://bucket/path', 's3://bucket/path', 'file:///path'). If undefined, returns undefined.
|
|
11
|
+
* @param logger - Optional logger.
|
|
12
|
+
* @returns The store instance, or undefined if config is not provided.
|
|
13
|
+
*/
|
|
14
|
+
export async function createL1TxFailedStore(
|
|
15
|
+
config: string | undefined,
|
|
16
|
+
logger: Logger = createLogger('sequencer:l1-tx-failed-store'),
|
|
17
|
+
): Promise<L1TxFailedStore | undefined> {
|
|
18
|
+
if (!config) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const fileStore = await createFileStore(config, logger);
|
|
23
|
+
if (!fileStore) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
`Failed to create file store from config: '${config}'. ` +
|
|
26
|
+
`Supported formats: 'gs://bucket/path', 's3://bucket/path', 'file:///path'.`,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
logger.info(`Created L1 tx failed store`, { config });
|
|
31
|
+
return new FileStoreL1TxFailedStore(fileStore, logger);
|
|
32
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Hex } from 'viem';
|
|
2
|
+
|
|
3
|
+
/** URI pointing to a stored failed L1 transaction. */
|
|
4
|
+
export type FailedL1TxUri = string & { __brand: 'FailedL1TxUri' };
|
|
5
|
+
|
|
6
|
+
/** A failed L1 transaction captured for debugging and replay. */
|
|
7
|
+
export type FailedL1Tx = {
|
|
8
|
+
/** Tx hash (for reverts) or keccak256(request.data) (for simulation/send failures). */
|
|
9
|
+
id: Hex;
|
|
10
|
+
/** Unix timestamp (ms) when failure occurred. */
|
|
11
|
+
timestamp: number;
|
|
12
|
+
/** Whether the failure was during simulation or after sending. */
|
|
13
|
+
failureType: 'simulation' | 'revert' | 'send-error';
|
|
14
|
+
/** The actual L1 transaction for replay (multicall-encoded for bundled txs). */
|
|
15
|
+
request: {
|
|
16
|
+
to: Hex;
|
|
17
|
+
data: Hex;
|
|
18
|
+
value?: string; // bigint as string
|
|
19
|
+
};
|
|
20
|
+
/** Raw blob data as hex for replay. */
|
|
21
|
+
blobData?: Hex[];
|
|
22
|
+
/** L1 block number at time of failure (simulation target or receipt block). */
|
|
23
|
+
l1BlockNumber: string; // bigint as string
|
|
24
|
+
/** Receipt info (present only for on-chain reverts). */
|
|
25
|
+
receipt?: {
|
|
26
|
+
transactionHash: Hex;
|
|
27
|
+
blockNumber: string; // bigint as string
|
|
28
|
+
gasUsed: string; // bigint as string
|
|
29
|
+
status: 'reverted';
|
|
30
|
+
};
|
|
31
|
+
/** Error information. */
|
|
32
|
+
error: {
|
|
33
|
+
message: string;
|
|
34
|
+
/** Decoded error name (e.g., 'Rollup__InvalidProposer'). */
|
|
35
|
+
name?: string;
|
|
36
|
+
};
|
|
37
|
+
/** Context metadata. */
|
|
38
|
+
context: {
|
|
39
|
+
/** Actions involved (e.g., ['propose', 'governance-signal']). */
|
|
40
|
+
actions: string[];
|
|
41
|
+
/** Individual request data for each action (metadata, not used for replay). */
|
|
42
|
+
requests?: Array<{ action: string; to: Hex; data: Hex }>;
|
|
43
|
+
checkpointNumber?: number;
|
|
44
|
+
slot?: number;
|
|
45
|
+
sender: Hex;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/** Store for failed L1 transactions for debugging purposes. */
|
|
50
|
+
export interface L1TxFailedStore {
|
|
51
|
+
/** Saves a failed transaction and returns its URI. */
|
|
52
|
+
saveFailedTx(tx: FailedL1Tx): Promise<FailedL1TxUri>;
|
|
53
|
+
/** Retrieves a failed transaction by its URI. */
|
|
54
|
+
getFailedTx(uri: FailedL1TxUri): Promise<FailedL1Tx>;
|
|
55
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import type { FileStore } from '@aztec/stdlib/file-store';
|
|
3
|
+
|
|
4
|
+
import type { FailedL1Tx, FailedL1TxUri, L1TxFailedStore } from './failed_tx_store.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* L1TxFailedStore implementation using the FileStore abstraction.
|
|
8
|
+
* Supports any backend that FileStore supports (GCS, S3, R2, local filesystem).
|
|
9
|
+
*/
|
|
10
|
+
export class FileStoreL1TxFailedStore implements L1TxFailedStore {
|
|
11
|
+
private readonly log: Logger;
|
|
12
|
+
|
|
13
|
+
constructor(
|
|
14
|
+
private readonly fileStore: FileStore,
|
|
15
|
+
logger?: Logger,
|
|
16
|
+
) {
|
|
17
|
+
this.log = logger ?? createLogger('sequencer:l1-tx-failed-store');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async saveFailedTx(tx: FailedL1Tx): Promise<FailedL1TxUri> {
|
|
21
|
+
const prefix = tx.receipt ? 'tx' : 'data';
|
|
22
|
+
const path = `${tx.failureType}/${prefix}-${tx.id}.json`;
|
|
23
|
+
const json = JSON.stringify(tx, null, 2);
|
|
24
|
+
|
|
25
|
+
const uri = await this.fileStore.save(path, Buffer.from(json), {
|
|
26
|
+
metadata: {
|
|
27
|
+
'content-type': 'application/json',
|
|
28
|
+
actions: tx.context.actions.join(','),
|
|
29
|
+
'failure-type': tx.failureType,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
this.log.info(`Saved failed L1 tx to ${uri}`, {
|
|
34
|
+
id: tx.id,
|
|
35
|
+
failureType: tx.failureType,
|
|
36
|
+
actions: tx.context.actions.join(','),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return uri as FailedL1TxUri;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public async getFailedTx(uri: FailedL1TxUri): Promise<FailedL1Tx> {
|
|
43
|
+
const data = await this.fileStore.read(uri);
|
|
44
|
+
return JSON.parse(data.toString()) as FailedL1Tx;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -45,9 +45,19 @@ import type { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
|
45
45
|
import type { L1PublishCheckpointStats } from '@aztec/stdlib/stats';
|
|
46
46
|
import { type TelemetryClient, type Tracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
47
47
|
|
|
48
|
-
import {
|
|
48
|
+
import {
|
|
49
|
+
type Hex,
|
|
50
|
+
type StateOverride,
|
|
51
|
+
type TransactionReceipt,
|
|
52
|
+
type TypedDataDefinition,
|
|
53
|
+
encodeFunctionData,
|
|
54
|
+
keccak256,
|
|
55
|
+
multicall3Abi,
|
|
56
|
+
toHex,
|
|
57
|
+
} from 'viem';
|
|
49
58
|
|
|
50
59
|
import type { SequencerPublisherConfig } from './config.js';
|
|
60
|
+
import { type FailedL1Tx, type L1TxFailedStore, createL1TxFailedStore } from './l1_tx_failed_store/index.js';
|
|
51
61
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
52
62
|
|
|
53
63
|
/** Arguments to the process method of the rollup contract */
|
|
@@ -109,6 +119,7 @@ export class SequencerPublisher {
|
|
|
109
119
|
private interrupted = false;
|
|
110
120
|
private metrics: SequencerPublisherMetrics;
|
|
111
121
|
public epochCache: EpochCache;
|
|
122
|
+
private failedTxStore?: Promise<L1TxFailedStore | undefined>;
|
|
112
123
|
|
|
113
124
|
protected governanceLog = createLogger('sequencer:publisher:governance');
|
|
114
125
|
protected slashingLog = createLogger('sequencer:publisher:slashing');
|
|
@@ -149,7 +160,7 @@ export class SequencerPublisher {
|
|
|
149
160
|
protected requests: RequestWithExpiry[] = [];
|
|
150
161
|
|
|
151
162
|
constructor(
|
|
152
|
-
private config: Pick<SequencerPublisherConfig, 'fishermanMode'> &
|
|
163
|
+
private config: Pick<SequencerPublisherConfig, 'fishermanMode' | 'l1TxFailedStore'> &
|
|
153
164
|
Pick<L1ContractsConfig, 'ethereumSlotDuration'> & { l1ChainId: number },
|
|
154
165
|
deps: {
|
|
155
166
|
telemetry?: TelemetryClient;
|
|
@@ -205,6 +216,31 @@ export class SequencerPublisher {
|
|
|
205
216
|
this.rollupContract,
|
|
206
217
|
createLogger('sequencer:publisher:price-oracle'),
|
|
207
218
|
);
|
|
219
|
+
|
|
220
|
+
// Initialize failed L1 tx store (optional, for test networks)
|
|
221
|
+
this.failedTxStore = createL1TxFailedStore(config.l1TxFailedStore, this.log);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Backs up a failed L1 transaction to the configured store for debugging.
|
|
226
|
+
* Does nothing if no store is configured.
|
|
227
|
+
*/
|
|
228
|
+
private backupFailedTx(failedTx: Omit<FailedL1Tx, 'timestamp'>): void {
|
|
229
|
+
if (!this.failedTxStore) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const tx: FailedL1Tx = {
|
|
234
|
+
...failedTx,
|
|
235
|
+
timestamp: Date.now(),
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// Fire and forget - don't block on backup
|
|
239
|
+
void this.failedTxStore
|
|
240
|
+
.then(store => store?.saveFailedTx(tx))
|
|
241
|
+
.catch(err => {
|
|
242
|
+
this.log.warn(`Failed to backup failed L1 tx to store`, err);
|
|
243
|
+
});
|
|
208
244
|
}
|
|
209
245
|
|
|
210
246
|
public getRollupContract(): RollupContract {
|
|
@@ -386,6 +422,21 @@ export class SequencerPublisher {
|
|
|
386
422
|
validRequests.sort((a, b) => compareActions(a.action, b.action));
|
|
387
423
|
|
|
388
424
|
try {
|
|
425
|
+
// Capture context for failed tx backup before sending
|
|
426
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
427
|
+
const multicallData = encodeFunctionData({
|
|
428
|
+
abi: multicall3Abi,
|
|
429
|
+
functionName: 'aggregate3',
|
|
430
|
+
args: [
|
|
431
|
+
validRequests.map(r => ({
|
|
432
|
+
target: r.request.to!,
|
|
433
|
+
callData: r.request.data!,
|
|
434
|
+
allowFailure: true,
|
|
435
|
+
})),
|
|
436
|
+
],
|
|
437
|
+
});
|
|
438
|
+
const blobDataHex = blobConfig?.blobs?.map(b => toHex(b)) as Hex[] | undefined;
|
|
439
|
+
|
|
389
440
|
this.log.debug('Forwarding transactions', {
|
|
390
441
|
validRequests: validRequests.map(request => request.action),
|
|
391
442
|
txConfig,
|
|
@@ -398,7 +449,12 @@ export class SequencerPublisher {
|
|
|
398
449
|
this.rollupContract.address,
|
|
399
450
|
this.log,
|
|
400
451
|
);
|
|
401
|
-
const
|
|
452
|
+
const txContext = { multicallData, blobData: blobDataHex, l1BlockNumber };
|
|
453
|
+
const { successfulActions = [], failedActions = [] } = this.callbackBundledTransactions(
|
|
454
|
+
validRequests,
|
|
455
|
+
result,
|
|
456
|
+
txContext,
|
|
457
|
+
);
|
|
402
458
|
return { result, expiredActions, sentActions: validActions, successfulActions, failedActions };
|
|
403
459
|
} catch (err) {
|
|
404
460
|
const viemError = formatViemError(err);
|
|
@@ -418,11 +474,25 @@ export class SequencerPublisher {
|
|
|
418
474
|
|
|
419
475
|
private callbackBundledTransactions(
|
|
420
476
|
requests: RequestWithExpiry[],
|
|
421
|
-
result
|
|
477
|
+
result: { receipt: TransactionReceipt; errorMsg?: string } | FormattedViemError | undefined,
|
|
478
|
+
txContext: { multicallData: Hex; blobData?: Hex[]; l1BlockNumber: bigint },
|
|
422
479
|
) {
|
|
423
480
|
const actionsListStr = requests.map(r => r.action).join(', ');
|
|
424
481
|
if (result instanceof FormattedViemError) {
|
|
425
482
|
this.log.error(`Failed to publish bundled transactions (${actionsListStr})`, result);
|
|
483
|
+
this.backupFailedTx({
|
|
484
|
+
id: keccak256(txContext.multicallData),
|
|
485
|
+
failureType: 'send-error',
|
|
486
|
+
request: { to: MULTI_CALL_3_ADDRESS, data: txContext.multicallData },
|
|
487
|
+
blobData: txContext.blobData,
|
|
488
|
+
l1BlockNumber: txContext.l1BlockNumber.toString(),
|
|
489
|
+
error: { message: result.message, name: result.name },
|
|
490
|
+
context: {
|
|
491
|
+
actions: requests.map(r => r.action),
|
|
492
|
+
requests: requests.map(r => ({ action: r.action, to: r.request.to! as Hex, data: r.request.data! })),
|
|
493
|
+
sender: this.getSenderAddress().toString(),
|
|
494
|
+
},
|
|
495
|
+
});
|
|
426
496
|
return { failedActions: requests.map(r => r.action) };
|
|
427
497
|
} else {
|
|
428
498
|
this.log.verbose(`Published bundled transactions (${actionsListStr})`, { result, requests });
|
|
@@ -435,6 +505,30 @@ export class SequencerPublisher {
|
|
|
435
505
|
failedActions.push(request.action);
|
|
436
506
|
}
|
|
437
507
|
}
|
|
508
|
+
// Single backup for the whole reverted tx
|
|
509
|
+
if (failedActions.length > 0 && result?.receipt?.status === 'reverted') {
|
|
510
|
+
this.backupFailedTx({
|
|
511
|
+
id: result.receipt.transactionHash,
|
|
512
|
+
failureType: 'revert',
|
|
513
|
+
request: { to: MULTI_CALL_3_ADDRESS, data: txContext.multicallData },
|
|
514
|
+
blobData: txContext.blobData,
|
|
515
|
+
l1BlockNumber: result.receipt.blockNumber.toString(),
|
|
516
|
+
receipt: {
|
|
517
|
+
transactionHash: result.receipt.transactionHash,
|
|
518
|
+
blockNumber: result.receipt.blockNumber.toString(),
|
|
519
|
+
gasUsed: (result.receipt.gasUsed ?? 0n).toString(),
|
|
520
|
+
status: 'reverted',
|
|
521
|
+
},
|
|
522
|
+
error: { message: result.errorMsg ?? 'Transaction reverted' },
|
|
523
|
+
context: {
|
|
524
|
+
actions: failedActions,
|
|
525
|
+
requests: requests
|
|
526
|
+
.filter(r => failedActions.includes(r.action))
|
|
527
|
+
.map(r => ({ action: r.action, to: r.request.to! as Hex, data: r.request.data! })),
|
|
528
|
+
sender: this.getSenderAddress().toString(),
|
|
529
|
+
},
|
|
530
|
+
});
|
|
531
|
+
}
|
|
438
532
|
return { successfulActions, failedActions };
|
|
439
533
|
}
|
|
440
534
|
}
|
|
@@ -546,6 +640,8 @@ export class SequencerPublisher {
|
|
|
546
640
|
const request = this.buildInvalidateCheckpointRequest(validationResult);
|
|
547
641
|
this.log.debug(`Simulating invalidate checkpoint ${checkpointNumber}`, { ...logData, request });
|
|
548
642
|
|
|
643
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
644
|
+
|
|
549
645
|
try {
|
|
550
646
|
const { gasUsed } = await this.l1TxUtils.simulate(
|
|
551
647
|
request,
|
|
@@ -597,6 +693,18 @@ export class SequencerPublisher {
|
|
|
597
693
|
|
|
598
694
|
// Otherwise, throw. We cannot build the next checkpoint if we cannot invalidate the previous one.
|
|
599
695
|
this.log.error(`Simulation for invalidate checkpoint ${checkpointNumber} failed`, viemError, logData);
|
|
696
|
+
this.backupFailedTx({
|
|
697
|
+
id: keccak256(request.data!),
|
|
698
|
+
failureType: 'simulation',
|
|
699
|
+
request: { to: request.to!, data: request.data!, value: request.value?.toString() },
|
|
700
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
701
|
+
error: { message: viemError.message, name: viemError.name },
|
|
702
|
+
context: {
|
|
703
|
+
actions: [`invalidate-${reason}`],
|
|
704
|
+
checkpointNumber,
|
|
705
|
+
sender: this.getSenderAddress().toString(),
|
|
706
|
+
},
|
|
707
|
+
});
|
|
600
708
|
throw new Error(`Failed to simulate invalidate checkpoint ${checkpointNumber}`, { cause: viemError });
|
|
601
709
|
}
|
|
602
710
|
}
|
|
@@ -744,11 +852,26 @@ export class SequencerPublisher {
|
|
|
744
852
|
lastValidL2Slot: slotNumber,
|
|
745
853
|
});
|
|
746
854
|
|
|
855
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
856
|
+
|
|
747
857
|
try {
|
|
748
858
|
await this.l1TxUtils.simulate(request, { time: timestamp }, [], mergeAbis([request.abi ?? [], ErrorsAbi]));
|
|
749
859
|
this.log.debug(`Simulation for ${action} at slot ${slotNumber} succeeded`, { request });
|
|
750
860
|
} catch (err) {
|
|
751
|
-
|
|
861
|
+
const viemError = formatViemError(err);
|
|
862
|
+
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError);
|
|
863
|
+
this.backupFailedTx({
|
|
864
|
+
id: keccak256(request.data!),
|
|
865
|
+
failureType: 'simulation',
|
|
866
|
+
request: { to: request.to!, data: request.data!, value: request.value?.toString() },
|
|
867
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
868
|
+
error: { message: viemError.message, name: viemError.name },
|
|
869
|
+
context: {
|
|
870
|
+
actions: [action],
|
|
871
|
+
slot: slotNumber,
|
|
872
|
+
sender: this.getSenderAddress().toString(),
|
|
873
|
+
},
|
|
874
|
+
});
|
|
752
875
|
// Yes, we enqueue the request anyway, in case there was a bug with the simulation itself
|
|
753
876
|
}
|
|
754
877
|
|
|
@@ -1044,6 +1167,8 @@ export class SequencerPublisher {
|
|
|
1044
1167
|
|
|
1045
1168
|
this.log.debug(`Simulating ${action} for slot ${slotNumber}`, logData);
|
|
1046
1169
|
|
|
1170
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1171
|
+
|
|
1047
1172
|
let gasUsed: bigint;
|
|
1048
1173
|
const simulateAbi = mergeAbis([request.abi ?? [], ErrorsAbi]);
|
|
1049
1174
|
try {
|
|
@@ -1053,6 +1178,19 @@ export class SequencerPublisher {
|
|
|
1053
1178
|
const viemError = formatViemError(err, simulateAbi);
|
|
1054
1179
|
this.log.error(`Simulation for ${action} at ${slotNumber} failed`, viemError, logData);
|
|
1055
1180
|
|
|
1181
|
+
this.backupFailedTx({
|
|
1182
|
+
id: keccak256(request.data!),
|
|
1183
|
+
failureType: 'simulation',
|
|
1184
|
+
request: { to: request.to!, data: request.data!, value: request.value?.toString() },
|
|
1185
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1186
|
+
error: { message: viemError.message, name: viemError.name },
|
|
1187
|
+
context: {
|
|
1188
|
+
actions: [action],
|
|
1189
|
+
slot: slotNumber,
|
|
1190
|
+
sender: this.getSenderAddress().toString(),
|
|
1191
|
+
},
|
|
1192
|
+
});
|
|
1193
|
+
|
|
1056
1194
|
return false;
|
|
1057
1195
|
}
|
|
1058
1196
|
|
|
@@ -1136,9 +1274,27 @@ export class SequencerPublisher {
|
|
|
1136
1274
|
kzg,
|
|
1137
1275
|
},
|
|
1138
1276
|
)
|
|
1139
|
-
.catch(err => {
|
|
1140
|
-
const
|
|
1141
|
-
this.log.error(`Failed to validate blobs`, message, { metaMessages });
|
|
1277
|
+
.catch(async err => {
|
|
1278
|
+
const viemError = formatViemError(err);
|
|
1279
|
+
this.log.error(`Failed to validate blobs`, viemError.message, { metaMessages: viemError.metaMessages });
|
|
1280
|
+
const validateBlobsData = encodeFunctionData({
|
|
1281
|
+
abi: RollupAbi,
|
|
1282
|
+
functionName: 'validateBlobs',
|
|
1283
|
+
args: [blobInput],
|
|
1284
|
+
});
|
|
1285
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1286
|
+
this.backupFailedTx({
|
|
1287
|
+
id: keccak256(validateBlobsData),
|
|
1288
|
+
failureType: 'simulation',
|
|
1289
|
+
request: { to: this.rollupContract.address as Hex, data: validateBlobsData },
|
|
1290
|
+
blobData: encodedData.blobs.map(b => toHex(b.data)) as Hex[],
|
|
1291
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1292
|
+
error: { message: viemError.message, name: viemError.name },
|
|
1293
|
+
context: {
|
|
1294
|
+
actions: ['validate-blobs'],
|
|
1295
|
+
sender: this.getSenderAddress().toString(),
|
|
1296
|
+
},
|
|
1297
|
+
});
|
|
1142
1298
|
throw new Error('Failed to validate blobs');
|
|
1143
1299
|
});
|
|
1144
1300
|
}
|
|
@@ -1217,6 +1373,8 @@ export class SequencerPublisher {
|
|
|
1217
1373
|
});
|
|
1218
1374
|
}
|
|
1219
1375
|
|
|
1376
|
+
const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
|
|
1377
|
+
|
|
1220
1378
|
const simulationResult = await this.l1TxUtils
|
|
1221
1379
|
.simulate(
|
|
1222
1380
|
{
|
|
@@ -1250,6 +1408,18 @@ export class SequencerPublisher {
|
|
|
1250
1408
|
};
|
|
1251
1409
|
}
|
|
1252
1410
|
this.log.error(`Failed to simulate propose tx`, viemError);
|
|
1411
|
+
this.backupFailedTx({
|
|
1412
|
+
id: keccak256(rollupData),
|
|
1413
|
+
failureType: 'simulation',
|
|
1414
|
+
request: { to: this.rollupContract.address, data: rollupData },
|
|
1415
|
+
l1BlockNumber: l1BlockNumber.toString(),
|
|
1416
|
+
error: { message: viemError.message, name: viemError.name },
|
|
1417
|
+
context: {
|
|
1418
|
+
actions: ['propose'],
|
|
1419
|
+
slot: Number(args[0].header.slotNumber),
|
|
1420
|
+
sender: this.getSenderAddress().toString(),
|
|
1421
|
+
},
|
|
1422
|
+
});
|
|
1253
1423
|
throw err;
|
|
1254
1424
|
});
|
|
1255
1425
|
|