diff --git a/packages/contracts-bedrock/contracts/libraries/Encoding.sol b/packages/contracts-bedrock/contracts/libraries/Encoding.sol index b554bab0fb6a1..985d6c1a580e7 100644 --- a/packages/contracts-bedrock/contracts/libraries/Encoding.sol +++ b/packages/contracts-bedrock/contracts/libraries/Encoding.sol @@ -13,6 +13,8 @@ library Encoding { /** * @notice RLP encodes the L2 transaction that would be generated when a given deposit is sent * to the L2 system. Useful for searching for a deposit in the L2 system. + * This currently only supports user deposits and not system + * transactions. * * @param _tx User deposit transaction to encode. * @@ -31,7 +33,7 @@ library Encoding { raw[3] = RLPWriter.writeUint(_tx.mint); raw[4] = RLPWriter.writeUint(_tx.value); raw[5] = RLPWriter.writeUint(uint256(_tx.gasLimit)); - raw[6] = RLPWriter.writeBool(_tx.isSystemTransaction); + raw[6] = RLPWriter.writeBool(false); raw[7] = RLPWriter.writeBytes(_tx.data); return abi.encodePacked(uint8(0x7e), RLPWriter.writeList(raw)); } diff --git a/packages/contracts-bedrock/contracts/libraries/Types.sol b/packages/contracts-bedrock/contracts/libraries/Types.sol index cfc12b2779400..98887e6922b47 100644 --- a/packages/contracts-bedrock/contracts/libraries/Types.sol +++ b/packages/contracts-bedrock/contracts/libraries/Types.sol @@ -38,7 +38,6 @@ library Types { uint256 value; uint256 mint; uint64 gasLimit; - bool isSystemTransaction; bytes data; bytes32 l1BlockHash; uint256 logIndex; diff --git a/packages/contracts-bedrock/contracts/test/CommonTest.t.sol b/packages/contracts-bedrock/contracts/test/CommonTest.t.sol index 71e7e073aabb8..5f0813ce8cc1f 100644 --- a/packages/contracts-bedrock/contracts/test/CommonTest.t.sol +++ b/packages/contracts-bedrock/contracts/test/CommonTest.t.sol @@ -561,11 +561,10 @@ contract FFIInterface is Test { uint256 _mint, uint256 _value, uint64 _gas, - bool _isSystemTransaction, bytes memory _data, uint256 _logIndex ) external returns (bytes32) { - string[] memory cmds = new string[](12); + string[] memory cmds = new string[](11); cmds[0] = "node"; cmds[1] = "dist/scripts/differential-testing.js"; cmds[2] = "hashDepositTransaction"; @@ -576,13 +575,33 @@ contract FFIInterface is Test { cmds[7] = vm.toString(_mint); cmds[8] = vm.toString(_value); cmds[9] = vm.toString(_gas); - cmds[10] = _isSystemTransaction ? "1" : "0"; - cmds[11] = vm.toString(_data); - bytes memory result = vm.ffi(cmds); + cmds[10] = vm.toString(_data); + bytes memory result = vm.ffi(cmds); return abi.decode(result, (bytes32)); } + function encodeDepositTransaction( + Types.UserDepositTransaction calldata txn + ) external returns (bytes memory) { + string[] memory cmds = new string[](12); + cmds[0] = "node"; + cmds[1] = "dist/scripts/differential-testing.js"; + cmds[2] = "encodeDepositTransaction"; + cmds[3] = vm.toString(txn.from); + cmds[4] = vm.toString(txn.to); + cmds[5] = vm.toString(txn.value); + cmds[6] = vm.toString(txn.mint); + cmds[7] = vm.toString(txn.gasLimit); + cmds[8] = vm.toString(txn.isCreation); + cmds[9] = vm.toString(txn.data); + cmds[10] = vm.toString(txn.l1BlockHash); + cmds[11] = vm.toString(txn.logIndex); + + bytes memory result = vm.ffi(cmds); + return abi.decode(result, (bytes)); + } + function encodeCrossDomainMessage( uint256 _nonce, address _sender, diff --git a/packages/contracts-bedrock/contracts/test/Encoding.t.sol b/packages/contracts-bedrock/contracts/test/Encoding.t.sol index 0c3ba6cb873ec..17a8daf5a8af2 100644 --- a/packages/contracts-bedrock/contracts/test/Encoding.t.sol +++ b/packages/contracts-bedrock/contracts/test/Encoding.t.sol @@ -65,4 +65,34 @@ contract Encoding_Test is CommonTest { assertEq(encoding, _encoding); } + + function test_encodeDepositTransaction_differential( + address _from, + address _to, + uint256 _mint, + uint256 _value, + uint64 _gas, + bytes memory _data, + uint256 _logIndex + ) external { + Types.UserDepositTransaction memory t = Types.UserDepositTransaction( + _from, + _to, + false, // isCreate + _value, + _mint, + _gas, + _data, + bytes32(uint256(0)), + _logIndex + ); + + bytes memory txn = Encoding.encodeDepositTransaction(t); + bytes memory _txn = ffi.encodeDepositTransaction(t); + + assertEq( + txn, + _txn + ); + } } diff --git a/packages/contracts-bedrock/contracts/test/Hashing.t.sol b/packages/contracts-bedrock/contracts/test/Hashing.t.sol index eebd22222d2c1..81f1fedebcd26 100644 --- a/packages/contracts-bedrock/contracts/test/Hashing.t.sol +++ b/packages/contracts-bedrock/contracts/test/Hashing.t.sol @@ -120,7 +120,6 @@ contract Hashing_Test is CommonTest { uint256 _mint, uint256 _value, uint64 _gas, - bool _isSystemTransaction, bytes memory _data, uint256 _logIndex ) external { @@ -132,7 +131,6 @@ contract Hashing_Test is CommonTest { _value, _mint, _gas, - _isSystemTransaction, _data, bytes32(uint256(0)), _logIndex @@ -145,7 +143,6 @@ contract Hashing_Test is CommonTest { _mint, _value, _gas, - _isSystemTransaction, _data, _logIndex ); diff --git a/packages/contracts-bedrock/scripts/differential-testing.ts b/packages/contracts-bedrock/scripts/differential-testing.ts index 42f84dfbe3cf0..11b8d1c732e89 100644 --- a/packages/contracts-bedrock/scripts/differential-testing.ts +++ b/packages/contracts-bedrock/scripts/differential-testing.ts @@ -95,14 +95,44 @@ const command = args[0] gas, isSystemTransaction, data, + isSystemTransaction: false, domain: SourceHashDomain.UserDeposit, }) const digest = tx.hash() + const output = utils.defaultAbiCoder.encode(['bytes32'], [digest]) process.stdout.write(output) break } + case 'encodeDepositTransaction': { + const from = args[1] + const to = args[2] + const value = BigNumber.from(args[3]) + const mint = BigNumber.from(args[4]) + const gasLimit = BigNumber.from(args[5]) + const isCreate = Boolean(args[6]) + const data = args[7] + const l1BlockHash = args[8] + const logIndex = BigNumber.from(args[9]) + + const tx = new DepositTx({ + from, + to: isCreate ? constants.AddressZero : to, + value, + mint, + gas: gasLimit, + data, + l1BlockHash, + logIndex, + domain: SourceHashDomain.UserDeposit, + }) + + const raw = tx.encode() + const output = utils.defaultAbiCoder.encode(['bytes'], [raw]) + process.stdout.write(output) + break + } case 'hashWithdrawal': { const nonce = BigNumber.from(args[1]) const sender = args[2] diff --git a/packages/core-utils/src/optimism/deposit-transaction.ts b/packages/core-utils/src/optimism/deposit-transaction.ts index 899f74a1a3388..f234872eb5aca 100644 --- a/packages/core-utils/src/optimism/deposit-transaction.ts +++ b/packages/core-utils/src/optimism/deposit-transaction.ts @@ -98,7 +98,7 @@ export class DepositTx { this.mint = opts.mint! this.value = opts.value! this.gas = opts.gas! - this.isSystemTransaction = opts.isSystemTransaction! + this.isSystemTransaction = opts.isSystemTransaction || false this.data = opts.data! this.domain = opts.domain this.l1BlockHash = opts.l1BlockHash