github.com/ethereum-optimism/optimism@v1.7.2/packages/contracts-bedrock/test/libraries/rlp/RLPReader.t.sol (about)

     1  // SPDX-License-Identifier: MIT
     2  pragma solidity 0.8.15;
     3  
     4  import { stdError } from "forge-std/Test.sol";
     5  import { Test } from "forge-std/Test.sol";
     6  import { RLPReader } from "src/libraries/rlp/RLPReader.sol";
     7  
     8  contract RLPReader_readBytes_Test is Test {
     9      function test_readBytes_bytestring00_succeeds() external {
    10          assertEq(RLPReader.readBytes(hex"00"), hex"00");
    11      }
    12  
    13      function test_readBytes_bytestring01_succeeds() external {
    14          assertEq(RLPReader.readBytes(hex"01"), hex"01");
    15      }
    16  
    17      function test_readBytes_bytestring7f_succeeds() external {
    18          assertEq(RLPReader.readBytes(hex"7f"), hex"7f");
    19      }
    20  
    21      function test_readBytes_revertListItem_reverts() external {
    22          vm.expectRevert("RLPReader: decoded item type for bytes is not a data item");
    23          RLPReader.readBytes(hex"c7c0c1c0c3c0c1c0");
    24      }
    25  
    26      function test_readBytes_invalidStringLength_reverts() external {
    27          vm.expectRevert("RLPReader: length of content must be > than length of string length (long string)");
    28          RLPReader.readBytes(hex"b9");
    29      }
    30  
    31      function test_readBytes_invalidListLength_reverts() external {
    32          vm.expectRevert("RLPReader: length of content must be > than length of list length (long list)");
    33          RLPReader.readBytes(hex"ff");
    34      }
    35  
    36      function test_readBytes_invalidRemainder_reverts() external {
    37          vm.expectRevert("RLPReader: bytes value contains an invalid remainder");
    38          RLPReader.readBytes(hex"800a");
    39      }
    40  
    41      function test_readBytes_invalidPrefix_reverts() external {
    42          vm.expectRevert("RLPReader: invalid prefix, single byte < 0x80 are not prefixed (short string)");
    43          RLPReader.readBytes(hex"810a");
    44      }
    45  }
    46  
    47  contract RLPReader_readList_Test is Test {
    48      function test_readList_empty_succeeds() external {
    49          RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c0");
    50          assertEq(list.length, 0);
    51      }
    52  
    53      function test_readList_multiList_succeeds() external {
    54          RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c6827a77c10401");
    55          assertEq(list.length, 3);
    56  
    57          assertEq(RLPReader.readRawBytes(list[0]), hex"827a77");
    58          assertEq(RLPReader.readRawBytes(list[1]), hex"c104");
    59          assertEq(RLPReader.readRawBytes(list[2]), hex"01");
    60      }
    61  
    62      function test_readList_shortListMax1_succeeds() external {
    63          RLPReader.RLPItem[] memory list = RLPReader.readList(
    64              hex"f784617364668471776572847a78637684617364668471776572847a78637684617364668471776572847a78637684617364668471776572"
    65          );
    66  
    67          assertEq(list.length, 11);
    68          assertEq(RLPReader.readRawBytes(list[0]), hex"8461736466");
    69          assertEq(RLPReader.readRawBytes(list[1]), hex"8471776572");
    70          assertEq(RLPReader.readRawBytes(list[2]), hex"847a786376");
    71          assertEq(RLPReader.readRawBytes(list[3]), hex"8461736466");
    72          assertEq(RLPReader.readRawBytes(list[4]), hex"8471776572");
    73          assertEq(RLPReader.readRawBytes(list[5]), hex"847a786376");
    74          assertEq(RLPReader.readRawBytes(list[6]), hex"8461736466");
    75          assertEq(RLPReader.readRawBytes(list[7]), hex"8471776572");
    76          assertEq(RLPReader.readRawBytes(list[8]), hex"847a786376");
    77          assertEq(RLPReader.readRawBytes(list[9]), hex"8461736466");
    78          assertEq(RLPReader.readRawBytes(list[10]), hex"8471776572");
    79      }
    80  
    81      function test_readList_longList1_succeeds() external {
    82          RLPReader.RLPItem[] memory list = RLPReader.readList(
    83              hex"f840cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376"
    84          );
    85  
    86          assertEq(list.length, 4);
    87          assertEq(RLPReader.readRawBytes(list[0]), hex"cf84617364668471776572847a786376");
    88          assertEq(RLPReader.readRawBytes(list[1]), hex"cf84617364668471776572847a786376");
    89          assertEq(RLPReader.readRawBytes(list[2]), hex"cf84617364668471776572847a786376");
    90          assertEq(RLPReader.readRawBytes(list[3]), hex"cf84617364668471776572847a786376");
    91      }
    92  
    93      function test_readList_longList2_succeeds() external {
    94          RLPReader.RLPItem[] memory list = RLPReader.readList(
    95              hex"f90200cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376"
    96          );
    97          assertEq(list.length, 32);
    98  
    99          for (uint256 i = 0; i < 32; i++) {
   100              assertEq(RLPReader.readRawBytes(list[i]), hex"cf84617364668471776572847a786376");
   101          }
   102      }
   103  
   104      function test_readList_listLongerThan32Elements_reverts() external {
   105          vm.expectRevert(stdError.indexOOBError);
   106          RLPReader.readList(hex"e1454545454545454545454545454545454545454545454545454545454545454545");
   107      }
   108  
   109      function test_readList_listOfLists_succeeds() external {
   110          RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c4c2c0c0c0");
   111          assertEq(list.length, 2);
   112          assertEq(RLPReader.readRawBytes(list[0]), hex"c2c0c0");
   113          assertEq(RLPReader.readRawBytes(list[1]), hex"c0");
   114      }
   115  
   116      function test_readList_listOfLists2_succeeds() external {
   117          RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c7c0c1c0c3c0c1c0");
   118          assertEq(list.length, 3);
   119  
   120          assertEq(RLPReader.readRawBytes(list[0]), hex"c0");
   121          assertEq(RLPReader.readRawBytes(list[1]), hex"c1c0");
   122          assertEq(RLPReader.readRawBytes(list[2]), hex"c3c0c1c0");
   123      }
   124  
   125      function test_readList_dictTest1_succeeds() external {
   126          RLPReader.RLPItem[] memory list = RLPReader.readList(
   127              hex"ecca846b6579318476616c31ca846b6579328476616c32ca846b6579338476616c33ca846b6579348476616c34"
   128          );
   129          assertEq(list.length, 4);
   130  
   131          assertEq(RLPReader.readRawBytes(list[0]), hex"ca846b6579318476616c31");
   132          assertEq(RLPReader.readRawBytes(list[1]), hex"ca846b6579328476616c32");
   133          assertEq(RLPReader.readRawBytes(list[2]), hex"ca846b6579338476616c33");
   134          assertEq(RLPReader.readRawBytes(list[3]), hex"ca846b6579348476616c34");
   135      }
   136  
   137      function test_readList_invalidShortList_reverts() external {
   138          vm.expectRevert("RLPReader: length of content must be greater than list length (short list)");
   139          RLPReader.readList(hex"efdebd");
   140      }
   141  
   142      function test_readList_longStringLength_reverts() external {
   143          vm.expectRevert("RLPReader: length of content must be greater than list length (short list)");
   144          RLPReader.readList(hex"efb83600");
   145      }
   146  
   147      function test_readList_notLongEnough_reverts() external {
   148          vm.expectRevert("RLPReader: length of content must be greater than list length (short list)");
   149          RLPReader.readList(hex"efdebdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
   150      }
   151  
   152      function test_readList_int32Overflow_reverts() external {
   153          vm.expectRevert("RLPReader: length of content must be greater than total length (long string)");
   154          RLPReader.readList(hex"bf0f000000000000021111");
   155      }
   156  
   157      function test_readList_int32Overflow2_reverts() external {
   158          vm.expectRevert("RLPReader: length of content must be greater than total length (long list)");
   159          RLPReader.readList(hex"ff0f000000000000021111");
   160      }
   161  
   162      function test_readList_incorrectLengthInArray_reverts() external {
   163          vm.expectRevert("RLPReader: length of content must not have any leading zeros (long string)");
   164          RLPReader.readList(hex"b9002100dc2b275d0f74e8a53e6f4ec61b27f24278820be3f82ea2110e582081b0565df0");
   165      }
   166  
   167      function test_readList_leadingZerosInLongLengthArray1_reverts() external {
   168          vm.expectRevert("RLPReader: length of content must not have any leading zeros (long string)");
   169          RLPReader.readList(
   170              hex"b90040000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
   171          );
   172      }
   173  
   174      function test_readList_leadingZerosInLongLengthArray2_reverts() external {
   175          vm.expectRevert("RLPReader: length of content must not have any leading zeros (long string)");
   176          RLPReader.readList(hex"b800");
   177      }
   178  
   179      function test_readList_leadingZerosInLongLengthList1_reverts() external {
   180          vm.expectRevert("RLPReader: length of content must not have any leading zeros (long list)");
   181          RLPReader.readList(
   182              hex"fb00000040000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
   183          );
   184      }
   185  
   186      function test_readList_nonOptimalLongLengthArray1_reverts() external {
   187          vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long string)");
   188          RLPReader.readList(hex"b81000112233445566778899aabbccddeeff");
   189      }
   190  
   191      function test_readList_nonOptimalLongLengthArray2_reverts() external {
   192          vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long string)");
   193          RLPReader.readList(hex"b801ff");
   194      }
   195  
   196      function test_readList_invalidValue_reverts() external {
   197          vm.expectRevert("RLPReader: length of content must be greater than string length (short string)");
   198          RLPReader.readList(hex"91");
   199      }
   200  
   201      function test_readList_invalidRemainder_reverts() external {
   202          vm.expectRevert("RLPReader: list item has an invalid data remainder");
   203          RLPReader.readList(hex"c000");
   204      }
   205  
   206      function test_readList_notEnoughContentForString1_reverts() external {
   207          vm.expectRevert("RLPReader: length of content must be greater than total length (long string)");
   208          RLPReader.readList(hex"ba010000aabbccddeeff");
   209      }
   210  
   211      function test_readList_notEnoughContentForString2_reverts() external {
   212          vm.expectRevert("RLPReader: length of content must be greater than total length (long string)");
   213          RLPReader.readList(hex"b840ffeeddccbbaa99887766554433221100");
   214      }
   215  
   216      function test_readList_notEnoughContentForList1_reverts() external {
   217          vm.expectRevert("RLPReader: length of content must be greater than total length (long list)");
   218          RLPReader.readList(hex"f90180");
   219      }
   220  
   221      function test_readList_notEnoughContentForList2_reverts() external {
   222          vm.expectRevert("RLPReader: length of content must be greater than total length (long list)");
   223          RLPReader.readList(hex"ffffffffffffffffff0001020304050607");
   224      }
   225  
   226      function test_readList_longStringLessThan56Bytes_reverts() external {
   227          vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long string)");
   228          RLPReader.readList(hex"b80100");
   229      }
   230  
   231      function test_readList_longListLessThan56Bytes_reverts() external {
   232          vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long list)");
   233          RLPReader.readList(hex"f80100");
   234      }
   235  }