diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol index 1b0acc852c41c1bfc1df17379c6d52e359426248..9df6f9820c07ba42a84b1d9518d7df03f995e5df 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol @@ -34,7 +34,7 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_Ad uint256 constant internal BATCH_CONTEXT_LENGTH_POS = 12; uint256 constant internal BATCH_CONTEXT_START_POS = 15; uint256 constant internal TX_DATA_HEADER_SIZE = 3; - uint256 constant internal BYTES_TILL_TX_DATA = 66; + uint256 constant internal BYTES_TILL_TX_DATA = 65; /************* @@ -548,10 +548,14 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_Ad assembly { let chainElementStart := add(chainElement, 0x20) + // Set the first byte equal to `1` to indicate this is a sequencer chain element. + // This distinguishes sequencer ChainElements from queue ChainElements because + // all queue ChainElements are ABI encoded and the first byte of ABI encoded + // elements is always zero mstore8(chainElementStart, 1) - mstore(add(chainElementStart, 2), ctxTimestamp) - mstore(add(chainElementStart, 34), ctxBlockNumber) + mstore(add(chainElementStart, 1), ctxTimestamp) + mstore(add(chainElementStart, 33), ctxBlockNumber) calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_nextTransactionPtr, 3), _txDataLength) @@ -586,12 +590,16 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, Lib_Ad assembly { let chainElementStart := add(chainElement, 0x20) + // Set the first byte equal to `1` to indicate this is a sequencer chain element. + // This distinguishes sequencer ChainElements from queue ChainElements because + // all queue ChainElements are ABI encoded and the first byte of ABI encoded + // elements is always zero mstore8(chainElementStart, 1) - mstore(add(chainElementStart, 2), ctxTimestamp) - mstore(add(chainElementStart, 34), ctxBlockNumber) + mstore(add(chainElementStart, 1), ctxTimestamp) + mstore(add(chainElementStart, 33), ctxBlockNumber) - pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, 66), txDataLength)) + pop(staticcall(gas(), 0x04, add(txData, 0x20), txDataLength, add(chainElementStart, BYTES_TILL_TX_DATA), txDataLength)) leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, txDataLength)) } diff --git a/packages/contracts/test/contracts/OVM/chain/OVM_CanonicalTransactionChain.spec.ts b/packages/contracts/test/contracts/OVM/chain/OVM_CanonicalTransactionChain.spec.ts index 994deecd9554c7748535499aa6dc93bb8cde0409..ff4013817f148067b202708f8b18f0d9585affd6 100644 --- a/packages/contracts/test/contracts/OVM/chain/OVM_CanonicalTransactionChain.spec.ts +++ b/packages/contracts/test/contracts/OVM/chain/OVM_CanonicalTransactionChain.spec.ts @@ -41,7 +41,7 @@ const getSequencerLeafHash = ( data: string ): string => { return keccak256( - '0x0100' + + '0x01' + remove0x(BigNumber.from(timestamp).toHexString()).padStart(64, '0') + remove0x(BigNumber.from(blockNumber).toHexString()).padStart(64, '0') + remove0x(data)