@aztec/ethereum 0.0.1-commit.e0f15ab9b → 0.0.1-commit.e304674f1
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/config.d.ts +6 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +5 -9
- package/dest/contracts/inbox.d.ts +3 -3
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +5 -6
- package/dest/contracts/index.d.ts +2 -3
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +1 -2
- package/dest/contracts/rollup.d.ts +28 -11
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +152 -41
- package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
- package/dest/contracts/slashing_proposer.d.ts.map +1 -0
- package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +13 -15
- package/dest/deploy_aztec_l1_contracts.d.ts +3 -6
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_aztec_l1_contracts.js +2 -4
- package/dest/generated/l1-contracts-defaults.d.ts +1 -1
- package/dest/generated/l1-contracts-defaults.js +1 -1
- package/dest/l1_artifacts.d.ts +8176 -15179
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_artifacts.js +9 -24
- package/dest/l1_contract_addresses.d.ts +1 -5
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +0 -6
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +3 -1
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_tx_utils.js +34 -26
- package/dest/queries.js +3 -3
- package/package.json +5 -5
- package/src/config.ts +9 -13
- package/src/contracts/inbox.ts +4 -4
- package/src/contracts/index.ts +1 -2
- package/src/contracts/rollup.ts +171 -35
- package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +14 -16
- package/src/deploy_aztec_l1_contracts.ts +1 -5
- package/src/generated/l1-contracts-defaults.ts +1 -1
- package/src/l1_artifacts.ts +12 -35
- package/src/l1_contract_addresses.ts +0 -7
- package/src/l1_tx_utils/l1_tx_utils.ts +24 -14
- package/src/queries.ts +3 -3
- package/dest/contracts/empire_slashing_proposer.d.ts +0 -69
- package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
- package/dest/contracts/empire_slashing_proposer.js +0 -216
- package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
- package/src/contracts/empire_slashing_proposer.ts +0 -265
package/src/l1_artifacts.ts
CHANGED
|
@@ -3,10 +3,6 @@ import {
|
|
|
3
3
|
CoinIssuerBytecode,
|
|
4
4
|
DateGatedRelayerAbi,
|
|
5
5
|
DateGatedRelayerBytecode,
|
|
6
|
-
EmpireSlasherDeploymentExtLibAbi,
|
|
7
|
-
EmpireSlasherDeploymentExtLibBytecode,
|
|
8
|
-
EmpireSlashingProposerAbi,
|
|
9
|
-
EmpireSlashingProposerBytecode,
|
|
10
6
|
FeeAssetHandlerAbi,
|
|
11
7
|
FeeAssetHandlerBytecode,
|
|
12
8
|
FeeJuicePortalAbi,
|
|
@@ -42,16 +38,14 @@ import {
|
|
|
42
38
|
RollupLinkReferences,
|
|
43
39
|
RollupOperationsExtLibAbi,
|
|
44
40
|
RollupOperationsExtLibBytecode,
|
|
45
|
-
SlashFactoryAbi,
|
|
46
|
-
SlashFactoryBytecode,
|
|
47
41
|
SlasherAbi,
|
|
48
42
|
SlasherBytecode,
|
|
43
|
+
SlasherDeploymentExtLibAbi,
|
|
44
|
+
SlasherDeploymentExtLibBytecode,
|
|
45
|
+
SlashingProposerAbi,
|
|
46
|
+
SlashingProposerBytecode,
|
|
49
47
|
StakingAssetHandlerAbi,
|
|
50
48
|
StakingAssetHandlerBytecode,
|
|
51
|
-
TallySlasherDeploymentExtLibAbi,
|
|
52
|
-
TallySlasherDeploymentExtLibBytecode,
|
|
53
|
-
TallySlashingProposerAbi,
|
|
54
|
-
TallySlashingProposerBytecode,
|
|
55
49
|
TestERC20Abi,
|
|
56
50
|
TestERC20Bytecode,
|
|
57
51
|
ValidatorOperationsExtLibAbi,
|
|
@@ -107,15 +101,10 @@ export const RollupArtifact = {
|
|
|
107
101
|
contractAbi: RewardExtLibAbi,
|
|
108
102
|
contractBytecode: RewardExtLibBytecode as Hex,
|
|
109
103
|
},
|
|
110
|
-
|
|
111
|
-
name: '
|
|
112
|
-
contractAbi:
|
|
113
|
-
contractBytecode:
|
|
114
|
-
},
|
|
115
|
-
EmpireSlasherDeploymentExtLib: {
|
|
116
|
-
name: 'EmpireSlasherDeploymentExtLib',
|
|
117
|
-
contractAbi: EmpireSlasherDeploymentExtLibAbi,
|
|
118
|
-
contractBytecode: EmpireSlasherDeploymentExtLibBytecode as Hex,
|
|
104
|
+
SlasherDeploymentExtLib: {
|
|
105
|
+
name: 'SlasherDeploymentExtLib',
|
|
106
|
+
contractAbi: SlasherDeploymentExtLibAbi,
|
|
107
|
+
contractBytecode: SlasherDeploymentExtLibBytecode as Hex,
|
|
119
108
|
},
|
|
120
109
|
},
|
|
121
110
|
},
|
|
@@ -175,22 +164,10 @@ export const SlasherArtifact = {
|
|
|
175
164
|
contractBytecode: SlasherBytecode as Hex,
|
|
176
165
|
};
|
|
177
166
|
|
|
178
|
-
export const
|
|
179
|
-
name: '
|
|
180
|
-
contractAbi:
|
|
181
|
-
contractBytecode:
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
export const TallySlashingProposerArtifact = {
|
|
185
|
-
name: 'TallySlashingProposer',
|
|
186
|
-
contractAbi: TallySlashingProposerAbi,
|
|
187
|
-
contractBytecode: TallySlashingProposerBytecode as Hex,
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
export const SlashFactoryArtifact = {
|
|
191
|
-
name: 'SlashFactory',
|
|
192
|
-
contractAbi: SlashFactoryAbi,
|
|
193
|
-
contractBytecode: SlashFactoryBytecode as Hex,
|
|
167
|
+
export const SlashingProposerArtifact = {
|
|
168
|
+
name: 'SlashingProposer',
|
|
169
|
+
contractAbi: SlashingProposerAbi,
|
|
170
|
+
contractBytecode: SlashingProposerBytecode as Hex,
|
|
194
171
|
};
|
|
195
172
|
|
|
196
173
|
export const RegisterNewRollupVersionPayloadArtifact = {
|
|
@@ -27,7 +27,6 @@ export const L1ContractsNames = [
|
|
|
27
27
|
export type L1ContractAddresses = {
|
|
28
28
|
[K in (typeof L1ContractsNames)[number]]: EthAddress;
|
|
29
29
|
} & {
|
|
30
|
-
slashFactoryAddress?: EthAddress | undefined;
|
|
31
30
|
feeAssetHandlerAddress?: EthAddress | undefined;
|
|
32
31
|
stakingAssetHandlerAddress?: EthAddress | undefined;
|
|
33
32
|
zkPassportVerifierAddress?: EthAddress | undefined;
|
|
@@ -48,7 +47,6 @@ export const L1ContractAddressesSchema = zodFor<L1ContractAddresses>()(
|
|
|
48
47
|
rewardDistributorAddress: schemas.EthAddress,
|
|
49
48
|
governanceProposerAddress: schemas.EthAddress,
|
|
50
49
|
governanceAddress: schemas.EthAddress,
|
|
51
|
-
slashFactoryAddress: schemas.EthAddress.optional(),
|
|
52
50
|
feeAssetHandlerAddress: schemas.EthAddress.optional(),
|
|
53
51
|
stakingAssetHandlerAddress: schemas.EthAddress.optional(),
|
|
54
52
|
zkPassportVerifierAddress: schemas.EthAddress.optional(),
|
|
@@ -67,11 +65,6 @@ export const l1ContractAddressesMapping: ConfigMappingsType<
|
|
|
67
65
|
description: 'The deployed L1 registry contract address.',
|
|
68
66
|
parseEnv,
|
|
69
67
|
},
|
|
70
|
-
slashFactoryAddress: {
|
|
71
|
-
env: 'SLASH_FACTORY_CONTRACT_ADDRESS',
|
|
72
|
-
description: 'The deployed L1 slashFactory contract address',
|
|
73
|
-
parseEnv,
|
|
74
|
-
},
|
|
75
68
|
feeAssetHandlerAddress: {
|
|
76
69
|
env: 'FEE_ASSET_HANDLER_CONTRACT_ADDRESS',
|
|
77
70
|
description: 'The deployed L1 feeAssetHandler contract address',
|
|
@@ -4,6 +4,7 @@ import { merge, pick } from '@aztec/foundation/collection';
|
|
|
4
4
|
import { InterruptError, TimeoutError } from '@aztec/foundation/error';
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
7
|
+
import { Semaphore } from '@aztec/foundation/queue';
|
|
7
8
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
8
9
|
import { sleep } from '@aztec/foundation/sleep';
|
|
9
10
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
@@ -47,6 +48,8 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
47
48
|
protected txs: L1TxState[] = [];
|
|
48
49
|
/** Last nonce successfully sent to the chain. Used as a lower bound when a fallback RPC node returns a stale count. */
|
|
49
50
|
private lastSentNonce: number | undefined;
|
|
51
|
+
/** Mutex to prevent concurrent sendTransaction calls from racing on the same nonce. */
|
|
52
|
+
private readonly sendMutex = new Semaphore(1);
|
|
50
53
|
/** Tx delayer for testing. Only set when enableDelayer config is true. */
|
|
51
54
|
public delayer?: Delayer;
|
|
52
55
|
/** KZG instance for blob operations. */
|
|
@@ -253,25 +256,32 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
253
256
|
);
|
|
254
257
|
}
|
|
255
258
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const nonce =
|
|
260
|
-
this.lastSentNonce !== undefined && chainNonce <= this.lastSentNonce ? this.lastSentNonce + 1 : chainNonce;
|
|
259
|
+
let txHash: Hex;
|
|
260
|
+
let nonce: number;
|
|
261
|
+
let baseState: Pick<L1TxState, 'request' | 'gasLimit' | 'blobInputs' | 'gasPrice' | 'nonce'>;
|
|
261
262
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
263
|
+
await this.sendMutex.acquire();
|
|
264
|
+
try {
|
|
265
|
+
const chainNonce = await this.client.getTransactionCount({ address: account, blockTag: 'pending' });
|
|
266
|
+
// If a fallback RPC node returns a stale count (lower than what we last sent), use our
|
|
267
|
+
// local lower bound to avoid sending a duplicate of an already-pending transaction.
|
|
268
|
+
nonce =
|
|
269
|
+
this.lastSentNonce !== undefined && chainNonce <= this.lastSentNonce ? this.lastSentNonce + 1 : chainNonce;
|
|
270
|
+
|
|
271
|
+
baseState = { request, gasLimit, blobInputs, gasPrice, nonce };
|
|
272
|
+
const txData = this.makeTxData(baseState, { isCancelTx: false });
|
|
273
|
+
|
|
274
|
+
const signedRequest = await this.prepareSignedTransaction(txData);
|
|
275
|
+
txHash = await this.client.sendRawTransaction({ serializedTransaction: signedRequest });
|
|
276
|
+
this.lastSentNonce = nonce;
|
|
277
|
+
} finally {
|
|
278
|
+
this.sendMutex.release();
|
|
279
|
+
}
|
|
270
280
|
|
|
271
281
|
// Create the new state for monitoring
|
|
272
282
|
const l1TxState: L1TxState = {
|
|
273
283
|
...baseState,
|
|
274
|
-
id: (await this.store?.consumeNextStateId(account)) ?? Math.max(...this.txs.map(tx => tx.id),
|
|
284
|
+
id: (await this.store?.consumeNextStateId(account)) ?? Math.max(...this.txs.map(tx => tx.id), -1) + 1,
|
|
275
285
|
txHashes: [txHash],
|
|
276
286
|
cancelTxHashes: [],
|
|
277
287
|
status: TxUtilsState.IDLE,
|
package/src/queries.ts
CHANGED
|
@@ -76,8 +76,8 @@ export async function getL1ContractsConfig(
|
|
|
76
76
|
slasherProposer?.getRoundSize() ?? 0n,
|
|
77
77
|
slasherProposer?.getLifetimeInRounds() ?? 0n,
|
|
78
78
|
slasherProposer?.getExecutionDelayInRounds() ?? 0n,
|
|
79
|
-
slasherProposer?.
|
|
80
|
-
slasherProposer?.
|
|
79
|
+
slasherProposer?.getSlashOffsetInRounds() ?? 0n,
|
|
80
|
+
slasherProposer?.getSlashingAmounts() ?? [0n, 0n, 0n],
|
|
81
81
|
slasher?.getVetoer() ?? EthAddress.ZERO,
|
|
82
82
|
slasher?.getSlashingDisableDuration() ?? 0,
|
|
83
83
|
rollup.getManaTarget(),
|
|
@@ -114,7 +114,7 @@ export async function getL1ContractsConfig(
|
|
|
114
114
|
rollupVersion: Number(rollupVersion),
|
|
115
115
|
genesisArchiveTreeRoot: genesisArchiveTreeRoot.toString(),
|
|
116
116
|
exitDelaySeconds: Number(exitDelay),
|
|
117
|
-
|
|
117
|
+
slasherEnabled: !!slasherProposer,
|
|
118
118
|
slashingOffsetInRounds: Number(slashingOffsetInRounds),
|
|
119
119
|
slashAmountSmall: slashingAmounts[0],
|
|
120
120
|
slashAmountMedium: slashingAmounts[1],
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
-
import EventEmitter from 'events';
|
|
4
|
-
import { type Hex, type Log, type TypedDataDefinition } from 'viem';
|
|
5
|
-
import type { L1TxRequest, L1TxUtils } from '../l1_tx_utils/index.js';
|
|
6
|
-
import type { ViemClient } from '../types.js';
|
|
7
|
-
import { type IEmpireBase } from './empire_base.js';
|
|
8
|
-
export declare class ProposalAlreadyExecutedError extends Error {
|
|
9
|
-
constructor(round: bigint);
|
|
10
|
-
}
|
|
11
|
-
export declare class EmpireSlashingProposerContract extends EventEmitter implements IEmpireBase {
|
|
12
|
-
readonly client: ViemClient;
|
|
13
|
-
private readonly logger;
|
|
14
|
-
private readonly proposer;
|
|
15
|
-
readonly type: "empire";
|
|
16
|
-
constructor(client: ViemClient, address: Hex | EthAddress);
|
|
17
|
-
get address(): EthAddress;
|
|
18
|
-
getQuorumSize(): Promise<bigint>;
|
|
19
|
-
getRoundSize(): Promise<bigint>;
|
|
20
|
-
getLifetimeInRounds(): Promise<bigint>;
|
|
21
|
-
getExecutionDelayInRounds(): Promise<bigint>;
|
|
22
|
-
getCurrentRound(): Promise<bigint>;
|
|
23
|
-
computeRound(slot: SlotNumber): Promise<bigint>;
|
|
24
|
-
getInstance(): Promise<`0x${string}`>;
|
|
25
|
-
getRoundInfo(rollupAddress: Hex, round: bigint): Promise<{
|
|
26
|
-
lastSignalSlot: SlotNumber;
|
|
27
|
-
payloadWithMostSignals: Hex;
|
|
28
|
-
quorumReached: boolean;
|
|
29
|
-
executed: boolean;
|
|
30
|
-
}>;
|
|
31
|
-
getPayloadSignals(rollupAddress: Hex, round: bigint, payload: Hex): Promise<bigint>;
|
|
32
|
-
createSignalRequest(payload: Hex): L1TxRequest;
|
|
33
|
-
createSignalRequestWithSignature(payload: Hex, slot: SlotNumber, chainId: number, signerAddress: Hex, signer: (msg: TypedDataDefinition) => Promise<Hex>): Promise<L1TxRequest>;
|
|
34
|
-
/** Checks if a payload was ever submitted to governance via submitRoundWinner. */
|
|
35
|
-
hasPayloadBeenProposed(payload: Hex, fromBlock: bigint): Promise<boolean>;
|
|
36
|
-
listenToSubmittablePayloads(callback: (args: {
|
|
37
|
-
payload: `0x${string}`;
|
|
38
|
-
round: bigint;
|
|
39
|
-
}) => unknown): import("viem").WatchContractEventReturnType;
|
|
40
|
-
listenToPayloadSubmitted(callback: (args: {
|
|
41
|
-
round: bigint;
|
|
42
|
-
payload: `0x${string}`;
|
|
43
|
-
}) => unknown): import("viem").WatchContractEventReturnType;
|
|
44
|
-
listenToSignalCasted(callback: (args: {
|
|
45
|
-
round: bigint;
|
|
46
|
-
payload: `0x${string}`;
|
|
47
|
-
signaler: `0x${string}`;
|
|
48
|
-
}) => unknown): import("viem").WatchContractEventReturnType;
|
|
49
|
-
/** Creates an L1TxRequest to submit the round winner for the given round. */
|
|
50
|
-
buildExecuteRoundRequest(round: bigint): L1TxRequest;
|
|
51
|
-
/** Tries to extract a PayloadSubmitted event from the given logs. */
|
|
52
|
-
tryExtractPayloadSubmittedEvent(logs: Log[]): {
|
|
53
|
-
eventName: "PayloadSubmitted";
|
|
54
|
-
args: {
|
|
55
|
-
payload: `0x${string}`;
|
|
56
|
-
round: bigint;
|
|
57
|
-
};
|
|
58
|
-
} | undefined;
|
|
59
|
-
/**
|
|
60
|
-
* Wait for a round to be reached.
|
|
61
|
-
*
|
|
62
|
-
* @param round - The round to wait for.
|
|
63
|
-
* @param pollingIntervalSeconds - The interval in seconds to poll for the round.
|
|
64
|
-
* @returns True if the round was reached, false otherwise.
|
|
65
|
-
*/
|
|
66
|
-
waitForRound(round: bigint, pollingIntervalSeconds?: number): Promise<boolean>;
|
|
67
|
-
executeRound(txUtils: L1TxUtils, round: bigint | number): ReturnType<typeof txUtils.sendAndMonitorTransaction>;
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1waXJlX3NsYXNoaW5nX3Byb3Bvc2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhY3RzL2VtcGlyZV9zbGFzaGluZ19wcm9wb3Nlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSzNELE9BQU8sWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBRUwsS0FBSyxHQUFHLEVBQ1IsS0FBSyxHQUFHLEVBQ1IsS0FBSyxtQkFBbUIsRUFHekIsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBOEQsTUFBTSxrQkFBa0IsQ0FBQztBQUVoSCxxQkFBYSw0QkFBNkIsU0FBUSxLQUFLO0lBQ3JELFlBQVksS0FBSyxFQUFFLE1BQU0sRUFFeEI7Q0FDRjtBQUVELHFCQUFhLDhCQUErQixTQUFRLFlBQWEsWUFBVyxXQUFXO2FBT25FLE1BQU0sRUFBRSxVQUFVO0lBTnBDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUErRDtJQUN0RixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBc0U7SUFFL0YsU0FBZ0IsSUFBSSxXQUFxQjtJQUV6QyxZQUNrQixNQUFNLEVBQUUsVUFBVSxFQUNsQyxPQUFPLEVBQUUsR0FBRyxHQUFHLFVBQVUsRUFRMUI7SUFFRCxJQUFXLE9BQU8sZUFFakI7SUFFTSxhQUFhLG9CQUVuQjtJQUVNLFlBQVksb0JBRWxCO0lBRU0sbUJBQW1CLG9CQUV6QjtJQUVNLHlCQUF5QixvQkFFL0I7SUFFTSxlQUFlLG9CQUVyQjtJQUVNLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFckQ7SUFFTSxXQUFXLDJCQUVqQjtJQUVZLFlBQVksQ0FDdkIsYUFBYSxFQUFFLEdBQUcsRUFDbEIsS0FBSyxFQUFFLE1BQU0sR0FDWixPQUFPLENBQUM7UUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDO1FBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDO1FBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQztRQUFDLFFBQVEsRUFBRSxPQUFPLENBQUE7S0FBRSxDQUFDLENBWWpIO0lBRU0saUJBQWlCLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUV6RjtJQUVNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsV0FBVyxDQU1wRDtJQUVZLGdDQUFnQyxDQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUNaLElBQUksRUFBRSxVQUFVLEVBQ2hCLE9BQU8sRUFBRSxNQUFNLEVBQ2YsYUFBYSxFQUFFLEdBQUcsRUFDbEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLG1CQUFtQixLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FDakQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQWN0QjtJQUVELGtGQUFrRjtJQUNyRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUdyRjtJQUVNLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRTtRQUFFLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEtBQUssT0FBTywrQ0FleEc7SUFFTSx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUU7UUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQUMsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUE7S0FBRSxLQUFLLE9BQU8sK0NBY3JHO0lBRU0sb0JBQW9CLENBQ3pCLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRTtRQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7UUFBQyxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFBO0tBQUUsS0FBSyxPQUFPLCtDQWVoRztJQUVELDZFQUE2RTtJQUN0RSx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLFdBQVcsQ0FVMUQ7SUFFRCxxRUFBcUU7SUFDOUQsK0JBQStCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTs7Ozs7O2tCQUVqRDtJQUVEOzs7Ozs7T0FNRztJQUNJLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixHQUFFLE1BQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBYXZGO0lBRVksWUFBWSxDQUN2QixPQUFPLEVBQUUsU0FBUyxFQUNsQixLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FDckIsVUFBVSxDQUFDLE9BQU8sT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBbUN0RDtDQUNGIn0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"empire_slashing_proposer.d.ts","sourceRoot":"","sources":["../../src/contracts/empire_slashing_proposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
-
import { retryUntil } from '@aztec/foundation/retry';
|
|
5
|
-
import { EmpireSlashingProposerAbi } from '@aztec/l1-artifacts/EmpireSlashingProposerAbi';
|
|
6
|
-
import EventEmitter from 'events';
|
|
7
|
-
import { encodeFunctionData, getContract } from 'viem';
|
|
8
|
-
import { FormattedViemError, tryExtractEvent } from '../utils.js';
|
|
9
|
-
import { encodeSignal, encodeSignalWithSignature, signSignalWithSig } from './empire_base.js';
|
|
10
|
-
export class ProposalAlreadyExecutedError extends Error {
|
|
11
|
-
constructor(round){
|
|
12
|
-
super(`Proposal already executed: ${round}`);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
export class EmpireSlashingProposerContract extends EventEmitter {
|
|
16
|
-
client;
|
|
17
|
-
logger;
|
|
18
|
-
proposer;
|
|
19
|
-
type;
|
|
20
|
-
constructor(client, address){
|
|
21
|
-
super(), this.client = client, this.logger = createLogger('ethereum:contracts:empire_slashing_proposer'), this.type = 'empire';
|
|
22
|
-
this.proposer = getContract({
|
|
23
|
-
address: typeof address === 'string' ? address : address.toString(),
|
|
24
|
-
abi: EmpireSlashingProposerAbi,
|
|
25
|
-
client
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
get address() {
|
|
29
|
-
return EthAddress.fromString(this.proposer.address);
|
|
30
|
-
}
|
|
31
|
-
getQuorumSize() {
|
|
32
|
-
return this.proposer.read.QUORUM_SIZE();
|
|
33
|
-
}
|
|
34
|
-
getRoundSize() {
|
|
35
|
-
return this.proposer.read.ROUND_SIZE();
|
|
36
|
-
}
|
|
37
|
-
getLifetimeInRounds() {
|
|
38
|
-
return this.proposer.read.LIFETIME_IN_ROUNDS();
|
|
39
|
-
}
|
|
40
|
-
getExecutionDelayInRounds() {
|
|
41
|
-
return this.proposer.read.EXECUTION_DELAY_IN_ROUNDS();
|
|
42
|
-
}
|
|
43
|
-
getCurrentRound() {
|
|
44
|
-
return this.proposer.read.getCurrentRound();
|
|
45
|
-
}
|
|
46
|
-
computeRound(slot) {
|
|
47
|
-
return this.proposer.read.computeRound([
|
|
48
|
-
BigInt(slot)
|
|
49
|
-
]);
|
|
50
|
-
}
|
|
51
|
-
getInstance() {
|
|
52
|
-
return this.proposer.read.getInstance();
|
|
53
|
-
}
|
|
54
|
-
async getRoundInfo(rollupAddress, round) {
|
|
55
|
-
const result = await this.proposer.read.getRoundData([
|
|
56
|
-
rollupAddress,
|
|
57
|
-
round
|
|
58
|
-
]);
|
|
59
|
-
const [signalCount, quorum] = await Promise.all([
|
|
60
|
-
this.proposer.read.signalCount([
|
|
61
|
-
rollupAddress,
|
|
62
|
-
round,
|
|
63
|
-
result.payloadWithMostSignals
|
|
64
|
-
]),
|
|
65
|
-
this.getQuorumSize()
|
|
66
|
-
]);
|
|
67
|
-
return {
|
|
68
|
-
lastSignalSlot: SlotNumber.fromBigInt(result.lastSignalSlot),
|
|
69
|
-
payloadWithMostSignals: result.payloadWithMostSignals,
|
|
70
|
-
quorumReached: signalCount >= quorum,
|
|
71
|
-
executed: result.executed
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
getPayloadSignals(rollupAddress, round, payload) {
|
|
75
|
-
return this.proposer.read.signalCount([
|
|
76
|
-
rollupAddress,
|
|
77
|
-
round,
|
|
78
|
-
payload
|
|
79
|
-
]);
|
|
80
|
-
}
|
|
81
|
-
createSignalRequest(payload) {
|
|
82
|
-
return {
|
|
83
|
-
to: this.address.toString(),
|
|
84
|
-
abi: EmpireSlashingProposerAbi,
|
|
85
|
-
data: encodeSignal(payload)
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
async createSignalRequestWithSignature(payload, slot, chainId, signerAddress, signer) {
|
|
89
|
-
const signature = await signSignalWithSig(signer, payload, slot, await this.getInstance(), this.address.toString(), chainId);
|
|
90
|
-
return {
|
|
91
|
-
to: this.address.toString(),
|
|
92
|
-
abi: EmpireSlashingProposerAbi,
|
|
93
|
-
data: encodeSignalWithSignature(payload, signature)
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
/** Checks if a payload was ever submitted to governance via submitRoundWinner. */ async hasPayloadBeenProposed(payload, fromBlock) {
|
|
97
|
-
const events = await this.proposer.getEvents.PayloadSubmitted({
|
|
98
|
-
payload
|
|
99
|
-
}, {
|
|
100
|
-
fromBlock,
|
|
101
|
-
strict: true
|
|
102
|
-
});
|
|
103
|
-
return events.length > 0;
|
|
104
|
-
}
|
|
105
|
-
listenToSubmittablePayloads(callback) {
|
|
106
|
-
return this.proposer.watchEvent.PayloadSubmittable({}, {
|
|
107
|
-
strict: true,
|
|
108
|
-
onLogs: (logs)=>{
|
|
109
|
-
for (const log of logs){
|
|
110
|
-
const { payload, round } = log.args;
|
|
111
|
-
if (payload && round) {
|
|
112
|
-
callback({
|
|
113
|
-
payload,
|
|
114
|
-
round
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
listenToPayloadSubmitted(callback) {
|
|
122
|
-
return this.proposer.watchEvent.PayloadSubmitted({}, {
|
|
123
|
-
onLogs: (logs)=>{
|
|
124
|
-
for (const log of logs){
|
|
125
|
-
const { payload, round } = log.args;
|
|
126
|
-
if (round && payload) {
|
|
127
|
-
callback({
|
|
128
|
-
round,
|
|
129
|
-
payload
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
listenToSignalCasted(callback) {
|
|
137
|
-
return this.proposer.watchEvent.SignalCast({}, {
|
|
138
|
-
onLogs: (logs)=>{
|
|
139
|
-
for (const log of logs){
|
|
140
|
-
const { round, payload, signaler } = log.args;
|
|
141
|
-
if (round && payload && signaler) {
|
|
142
|
-
callback({
|
|
143
|
-
round,
|
|
144
|
-
payload,
|
|
145
|
-
signaler
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
/** Creates an L1TxRequest to submit the round winner for the given round. */ buildExecuteRoundRequest(round) {
|
|
153
|
-
return {
|
|
154
|
-
to: this.address.toString(),
|
|
155
|
-
abi: EmpireSlashingProposerAbi,
|
|
156
|
-
data: encodeFunctionData({
|
|
157
|
-
abi: EmpireSlashingProposerAbi,
|
|
158
|
-
functionName: 'submitRoundWinner',
|
|
159
|
-
args: [
|
|
160
|
-
round
|
|
161
|
-
]
|
|
162
|
-
})
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
/** Tries to extract a PayloadSubmitted event from the given logs. */ tryExtractPayloadSubmittedEvent(logs) {
|
|
166
|
-
return tryExtractEvent(logs, this.address.toString(), EmpireSlashingProposerAbi, 'PayloadSubmitted');
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Wait for a round to be reached.
|
|
170
|
-
*
|
|
171
|
-
* @param round - The round to wait for.
|
|
172
|
-
* @param pollingIntervalSeconds - The interval in seconds to poll for the round.
|
|
173
|
-
* @returns True if the round was reached, false otherwise.
|
|
174
|
-
*/ waitForRound(round, pollingIntervalSeconds = 1) {
|
|
175
|
-
return retryUntil(async ()=>{
|
|
176
|
-
const currentRound = await this.proposer.read.getCurrentRound().catch((e)=>{
|
|
177
|
-
this.logger.error('Error getting current round', e);
|
|
178
|
-
return undefined;
|
|
179
|
-
});
|
|
180
|
-
return currentRound !== undefined && currentRound >= round;
|
|
181
|
-
}, `Waiting for round ${round} to be reached`, 0, pollingIntervalSeconds).catch(()=>false);
|
|
182
|
-
}
|
|
183
|
-
async executeRound(txUtils, round) {
|
|
184
|
-
if (typeof round === 'number') {
|
|
185
|
-
round = BigInt(round);
|
|
186
|
-
}
|
|
187
|
-
const request = this.buildExecuteRoundRequest(round);
|
|
188
|
-
const response = await txUtils.sendAndMonitorTransaction(request, {
|
|
189
|
-
// Gas estimation is way off for this, likely because we are creating the contract/selector to call
|
|
190
|
-
// for the actual slashing dynamically.
|
|
191
|
-
gasLimitBufferPercentage: 50
|
|
192
|
-
}).catch((err)=>{
|
|
193
|
-
if (err instanceof FormattedViemError && err.message.includes('ProposalAlreadyExecuted')) {
|
|
194
|
-
throw new ProposalAlreadyExecutedError(round);
|
|
195
|
-
}
|
|
196
|
-
throw err;
|
|
197
|
-
});
|
|
198
|
-
if (response.receipt.status === 'reverted') {
|
|
199
|
-
const args = {
|
|
200
|
-
abi: EmpireSlashingProposerAbi,
|
|
201
|
-
functionName: 'submitRoundWinner',
|
|
202
|
-
args: [
|
|
203
|
-
round
|
|
204
|
-
],
|
|
205
|
-
address: this.address.toString()
|
|
206
|
-
};
|
|
207
|
-
const error = await txUtils.tryGetErrorFromRevertedTx(request.data, args, undefined, []);
|
|
208
|
-
if (error?.includes('ProposalAlreadyExecuted')) {
|
|
209
|
-
throw new ProposalAlreadyExecutedError(round);
|
|
210
|
-
}
|
|
211
|
-
const errorMessage = `Failed to execute round ${round}, TxHash: ${response.receipt.transactionHash}, Error: ${error ?? 'Unknown error'}`;
|
|
212
|
-
throw new Error(errorMessage);
|
|
213
|
-
}
|
|
214
|
-
return response;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tally_slashing_proposer.d.ts","sourceRoot":"","sources":["../../src/contracts/tally_slashing_proposer.ts"],"names":[],"mappings":"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"}
|