diff --git a/packages/rollup-contracts/contracts/testing-contracts/L1ToL2TransactionEvents.sol b/packages/rollup-contracts/contracts/testing-contracts/RollupTransactionEvents.sol similarity index 100% rename from packages/rollup-contracts/contracts/testing-contracts/L1ToL2TransactionEvents.sol rename to packages/rollup-contracts/contracts/testing-contracts/RollupTransactionEvents.sol diff --git a/packages/rollup-core/src/app/l1-to-l2-event-handling/block-batch-submitter.ts b/packages/rollup-core/src/app/l1-to-l2-event-handling/block-batch-submitter.ts index 5829f1708119d..a4aba9867c8e7 100644 --- a/packages/rollup-core/src/app/l1-to-l2-event-handling/block-batch-submitter.ts +++ b/packages/rollup-core/src/app/l1-to-l2-event-handling/block-batch-submitter.ts @@ -10,9 +10,9 @@ import { BlockBatches, BlockBatchListener } from '../../types' const log: Logger = getLogger('block-batch-submitter') export class BlockBatchSubmitter implements BlockBatchListener { - // params: [timestampHex, batchesArrayJSON, signedBatchesArrayJSON] - public static readonly sendBlockBatchesMethod: string = - 'optimism_sendBlockBatches' + // params: [blockBatchesJSONString, signedBlockBatchesJSONString] + // -- note all numbers are replaces with hex strings when serialized + public static readonly sendBlockBatchesMethod: string = 'eth_sendBlockBatches' private readonly l2Provider: JsonRpcProvider @@ -35,24 +35,17 @@ export class BlockBatchSubmitter implements BlockBatchListener { return } - const timestamp: string = numberToHexString(blockBatches.timestamp) - const txs = JSON.stringify( - blockBatches.batches.map((y) => - y.map((x) => { - return { - nonce: x.nonce >= 0 ? numberToHexString(x.nonce) : undefined, - sender: x.sender, - target: x.target, - calldata: x.calldata, - } - }) - ) - ) - const signedTxsArray: string = await this.l2Wallet.signMessage(txs) + const payload = JSON.stringify(blockBatches, (k, v) => { + if (typeof v === 'number') { + return v >= 0 ? numberToHexString(v) : undefined + } + return v + }) + + const signedPayload: string = await this.l2Wallet.signMessage(payload) await this.l2Provider.send(BlockBatchSubmitter.sendBlockBatchesMethod, [ - timestamp, - txs, - signedTxsArray, + payload, + signedPayload, ]) } } diff --git a/packages/rollup-core/src/types/types.ts b/packages/rollup-core/src/types/types.ts index 4100cd69468da..0e841d896fda9 100644 --- a/packages/rollup-core/src/types/types.ts +++ b/packages/rollup-core/src/types/types.ts @@ -22,6 +22,7 @@ export interface L2ToL1Message { export interface RollupTransaction { nonce: number + gasLimit: number sender: Address target: Address calldata: string diff --git a/packages/rollup-core/test/app/block-batch-processor.spec.ts b/packages/rollup-core/test/app/block-batch-processor.spec.ts index f4365d8875794..6262a0808d6c8 100644 --- a/packages/rollup-core/test/app/block-batch-processor.spec.ts +++ b/packages/rollup-core/test/app/block-batch-processor.spec.ts @@ -4,6 +4,7 @@ import '../setup' import { newInMemoryDB } from '@eth-optimism/core-db' import { add0x, + BigNumber, keccak256, sleep, TestUtils, @@ -86,6 +87,7 @@ const getTransactionResponse = ( timestamp: number, data: string, hash: string, + _gasLimit: number, blockNumber: number = 1, blockHash: string = getHashFromString('block hash') ): TransactionResponse => { @@ -95,10 +97,10 @@ const getTransactionResponse = ( hash, blockNumber, blockHash, + gasLimit: new BigNumber(_gasLimit, 10) as any, confirmations: 1, from: ZERO_ADDRESS, nonce: 1, - gasLimit: undefined, gasPrice: undefined, value: undefined, chainId: CHAIN_ID, @@ -127,6 +129,7 @@ const getBlock = (timestamp: number, number: number = 1) => { const throwOnParsing: L1Batch = [ { nonce: -1, + gasLimit: -1, sender: ZERO_ADDRESS, target: ZERO_ADDRESS, calldata: '0xdeadbeef', @@ -160,22 +163,26 @@ const singleTxLogContext: BatchLogParserContext = { } const nonce: number = 0 +const gasLimit: number = 10_000 const sender: string = Wallet.createRandom().address const target: string = Wallet.createRandom().address const calldata: string = keccak256(Buffer.from('calldata').toString('hex')) const rollupTx: RollupTransaction = { nonce, + gasLimit, sender, target, calldata, } const nonce2: number = 1 +const gasLimit2: number = 20_000 const sender2: string = Wallet.createRandom().address const target2: string = Wallet.createRandom().address const calldata2: string = keccak256(Buffer.from('calldata 2').toString('hex')) const rollupTx2: RollupTransaction = { nonce: nonce2, + gasLimit: gasLimit2, sender: sender2, target: target2, calldata: calldata2, @@ -238,7 +245,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) mockedLogsProvider.logsToReturn.push([ @@ -283,7 +290,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) const txHash2 = getHashFromString('derp derp derp2') @@ -291,7 +298,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash2, - getTransactionResponse(timestamp, calldata2, txHash2) + getTransactionResponse(timestamp, calldata2, txHash2, gasLimit2) ) mockedLogsProvider.logsToReturn.push([ @@ -347,7 +354,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) const txHash2 = getHashFromString('derp derp derp2') @@ -355,7 +362,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash2, - getTransactionResponse(timestamp, calldata2, txHash2) + getTransactionResponse(timestamp, calldata2, txHash2, gasLimit2) ) mockedLogsProvider.logsToReturn.push([ @@ -411,7 +418,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) mockedLogsProvider.logsToReturn.push([ @@ -429,7 +436,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash2, - getTransactionResponse(timestamp2, calldata2, txHash2) + getTransactionResponse(timestamp2, calldata2, txHash2, gasLimit2) ) mockedLogsProvider.logsToReturn.push([ @@ -499,7 +506,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash2, - getTransactionResponse(timestamp2, calldata2, txHash2) + getTransactionResponse(timestamp2, calldata2, txHash2, gasLimit2) ) mockedLogsProvider.logsToReturn.push([ @@ -517,7 +524,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) mockedLogsProvider.logsToReturn.push([ @@ -587,7 +594,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) mockedLogsProvider.logsToReturn.push([ @@ -612,7 +619,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) mockedLogsProvider.logsToReturn.push([ @@ -637,7 +644,7 @@ describe('Block Batch Processor', () => { mockedLogsProvider.transactionsByHash.set( txHash, - getTransactionResponse(timestamp, calldata, txHash) + getTransactionResponse(timestamp, calldata, txHash, gasLimit) ) mockedLogsProvider.logsToReturn.push([ diff --git a/packages/rollup-core/test/app/block-batch-submitter.spec.ts b/packages/rollup-core/test/app/block-batch-submitter.spec.ts index c6e83cd6dbfa7..482a834084202 100644 --- a/packages/rollup-core/test/app/block-batch-submitter.spec.ts +++ b/packages/rollup-core/test/app/block-batch-submitter.spec.ts @@ -7,7 +7,7 @@ import { Wallet } from 'ethers' import { JsonRpcProvider } from 'ethers/providers' /* Internal Imports */ -import { RollupTransaction } from '../../src/types' +import { BlockBatches, RollupTransaction } from '../../src/types' import { BlockBatchSubmitter } from '../../src/app' import { verifyMessage } from 'ethers/utils' @@ -37,10 +37,12 @@ const blockNumber: number = 0 const blockNumber2: number = 1 const nonce: number = 0 +const gasLimit: number = 10_000 const sender: string = Wallet.createRandom().address const target: string = Wallet.createRandom().address const calldata: string = keccak256(Buffer.from('calldata').toString('hex')) const rollupTx: RollupTransaction = { + gasLimit, nonce, sender, target, @@ -48,10 +50,12 @@ const rollupTx: RollupTransaction = { } const nonce2: number = 1 +const gasLimit2: number = 20_000 const sender2: string = Wallet.createRandom().address const target2: string = Wallet.createRandom().address const calldata2: string = keccak256(Buffer.from('calldata 2').toString('hex')) const rollupTx2: RollupTransaction = { + gasLimit: gasLimit2, nonce: nonce2, sender: sender2, target: target2, @@ -65,6 +69,20 @@ const rollupTxsEqual = ( return JSON.stringify(one) === JSON.stringify(two) } +const deserializeBlockBatches = (serialized: string): BlockBatches => { + return JSON.parse(serialized, (k, v) => { + switch (k) { + case 'blockNumber': + case 'timestamp': + case 'gasLimit': + case 'nonce': + return hexStrToNumber(v) + default: + return v + } + }) +} + describe('L2 Transaction Batch Submitter', () => { let blockBatchSubmitter: BlockBatchSubmitter let mockedSendProvider: MockedProvider @@ -125,20 +143,20 @@ describe('L2 Transaction Batch Submitter', () => { 'Incorrect params type!' ) const paramsArray = mockedSendProvider.sent[0].params as string[] - paramsArray.length.should.equal(3, 'Incorrect params length') - const [timestampStr, batchesStr, signature] = paramsArray - - hexStrToNumber(timestampStr).should.equal(timestamp, 'Incorrect timestamp!') - const parsedBatches = JSON.parse(batchesStr) as any[] - parsedBatches.length.should.equal(1, 'Incorrect num batches!') - parsedBatches[0].length.should.equal(1, 'Incorrect num txs!') - parsedBatches[0][0].nonce = hexStrToNumber(parsedBatches[0][0].nonce) - rollupTxsEqual(parsedBatches[0][0], rollupTx).should.equal( + paramsArray.length.should.equal(2, 'Incorrect params length') + const [payloadStr, signature] = paramsArray + + const blockBatches: BlockBatches = deserializeBlockBatches(payloadStr) + + blockBatches.timestamp.should.equal(timestamp, 'Incorrect timestamp!') + blockBatches.batches.length.should.equal(1, 'Incorrect num batches!') + blockBatches.batches[0].length.should.equal(1, 'Incorrect num txs!') + rollupTxsEqual(blockBatches.batches[0][0], rollupTx).should.equal( true, 'Incorrect transaction received!' ) - verifyMessage(batchesStr, signature).should.equal( + verifyMessage(payloadStr, signature).should.equal( wallet.address, 'IncorrectSignature!' ) @@ -161,28 +179,28 @@ describe('L2 Transaction Batch Submitter', () => { 'Incorrect params type!' ) const paramsArray = mockedSendProvider.sent[0].params as string[] - paramsArray.length.should.equal(3, 'Incorrect params length') - const [timestampStr, txsStr, signature] = paramsArray - - hexStrToNumber(timestampStr).should.equal(timestamp, 'Incorrect timestamp!') - const parsedBatches = JSON.parse(txsStr) as any[] - parsedBatches.length.should.equal(1, 'Incorrect num batches!') - parsedBatches[0].length.should.equal(2, 'Incorrect num transactions!') - parsedBatches[0] = parsedBatches[0].map((x) => { - x.nonce = hexStrToNumber(x.nonce) - return x - }) - rollupTxsEqual(parsedBatches[0][0], rollupTx).should.equal( + paramsArray.length.should.equal(2, 'Incorrect params length') + const [payloadStr, signature] = paramsArray + + const blockBatches: BlockBatches = deserializeBlockBatches(payloadStr) + + blockBatches.timestamp.should.equal(timestamp, 'Incorrect timestamp!') + blockBatches.batches.length.should.equal(1, 'Incorrect num batches!') + blockBatches.batches[0].length.should.equal( + 2, + 'Incorrect num transactions!' + ) + rollupTxsEqual(blockBatches.batches[0][0], rollupTx).should.equal( true, 'Incorrect transaction received!' ) - rollupTxsEqual(parsedBatches[0][1], rollupTx2).should.equal( + rollupTxsEqual(blockBatches.batches[0][1], rollupTx2).should.equal( true, 'Incorrect transaction 2 received!' ) - verifyMessage(txsStr, signature).should.equal( + verifyMessage(payloadStr, signature).should.equal( wallet.address, 'IncorrectSignature!' ) diff --git a/packages/rollup-full-node/test/app/web-rpc-handler.spec.ts b/packages/rollup-full-node/test/app/web-rpc-handler.spec.ts index 5be95de494f12..cf4f31557ee3b 100644 --- a/packages/rollup-full-node/test/app/web-rpc-handler.spec.ts +++ b/packages/rollup-full-node/test/app/web-rpc-handler.spec.ts @@ -633,6 +633,7 @@ describe('Web3Handler', () => { ) await web3Handler.handleL1ToL2Transaction({ nonce: 0, + gasLimit: 0, calldata: callData, sender: wallet.address, target: simpleStorage.address, @@ -653,6 +654,7 @@ describe('Web3Handler', () => { ) await web3Handler.handleL1ToL2Transaction({ nonce: 0, + gasLimit: 0, calldata: callData, sender: wallet.address, target: simpleStorage.address,