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  }