github.com/ethereum-optimism/optimism@v1.7.2/packages/contracts-bedrock/test/libraries/Encoding.t.sol (about) 1 // SPDX-License-Identifier: MIT 2 pragma solidity 0.8.15; 3 4 // Testing utilities 5 import { CommonTest } from "test/setup/CommonTest.sol"; 6 7 // Libraries 8 import { Types } from "src/libraries/Types.sol"; 9 import { LegacyCrossDomainUtils } from "src/libraries/LegacyCrossDomainUtils.sol"; 10 11 // Target contract 12 import { Encoding } from "src/libraries/Encoding.sol"; 13 14 contract Encoding_Test is CommonTest { 15 /// @dev Tests encoding and decoding a nonce and version. 16 function testFuzz_nonceVersioning_succeeds(uint240 _nonce, uint16 _version) external { 17 (uint240 nonce, uint16 version) = Encoding.decodeVersionedNonce(Encoding.encodeVersionedNonce(_nonce, _version)); 18 assertEq(version, _version); 19 assertEq(nonce, _nonce); 20 } 21 22 /// @dev Tests decoding a versioned nonce. 23 function testDiff_decodeVersionedNonce_succeeds(uint240 _nonce, uint16 _version) external { 24 uint256 nonce = uint256(Encoding.encodeVersionedNonce(_nonce, _version)); 25 (uint256 decodedNonce, uint256 decodedVersion) = ffi.decodeVersionedNonce(nonce); 26 27 assertEq(_version, uint16(decodedVersion)); 28 29 assertEq(_nonce, uint240(decodedNonce)); 30 } 31 32 /// @dev Tests cross domain message encoding. 33 function testDiff_encodeCrossDomainMessage_succeeds( 34 uint240 _nonce, 35 uint8 _version, 36 address _sender, 37 address _target, 38 uint256 _value, 39 uint256 _gasLimit, 40 bytes memory _data 41 ) 42 external 43 { 44 uint8 version = _version % 2; 45 uint256 nonce = Encoding.encodeVersionedNonce(_nonce, version); 46 47 bytes memory encoding = Encoding.encodeCrossDomainMessage(nonce, _sender, _target, _value, _gasLimit, _data); 48 49 bytes memory _encoding = ffi.encodeCrossDomainMessage(nonce, _sender, _target, _value, _gasLimit, _data); 50 51 assertEq(encoding, _encoding); 52 } 53 54 /// @dev Tests legacy cross domain message encoding. 55 function testFuzz_encodeCrossDomainMessageV0_matchesLegacy_succeeds( 56 uint240 _nonce, 57 address _sender, 58 address _target, 59 bytes memory _data 60 ) 61 external 62 { 63 uint8 version = 0; 64 uint256 nonce = Encoding.encodeVersionedNonce(_nonce, version); 65 66 bytes memory legacyEncoding = LegacyCrossDomainUtils.encodeXDomainCalldata(_target, _sender, _data, nonce); 67 68 bytes memory bedrockEncoding = Encoding.encodeCrossDomainMessageV0(_target, _sender, _data, nonce); 69 70 assertEq(legacyEncoding, bedrockEncoding); 71 } 72 73 /// @dev Tests deposit transaction encoding. 74 function testDiff_encodeDepositTransaction_succeeds( 75 address _from, 76 address _to, 77 uint256 _mint, 78 uint256 _value, 79 uint64 _gas, 80 bool isCreate, 81 bytes memory _data, 82 uint64 _logIndex 83 ) 84 external 85 { 86 Types.UserDepositTransaction memory t = Types.UserDepositTransaction( 87 _from, _to, isCreate, _value, _mint, _gas, _data, bytes32(uint256(0)), _logIndex 88 ); 89 90 bytes memory txn = Encoding.encodeDepositTransaction(t); 91 bytes memory _txn = ffi.encodeDepositTransaction(t); 92 93 assertEq(txn, _txn); 94 } 95 }