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

     1  // SPDX-License-Identifier: MIT
     2  pragma solidity 0.8.15;
     3  
     4  import { RLPWriter } from "src/libraries/rlp/RLPWriter.sol";
     5  import { Test } from "forge-std/Test.sol";
     6  
     7  contract RLPWriter_writeString_Test is Test {
     8      function test_writeString_empty_succeeds() external {
     9          assertEq(RLPWriter.writeString(""), hex"80");
    10      }
    11  
    12      function test_writeString_bytestring00_succeeds() external {
    13          assertEq(RLPWriter.writeString("\u0000"), hex"00");
    14      }
    15  
    16      function test_writeString_bytestring01_succeeds() external {
    17          assertEq(RLPWriter.writeString("\u0001"), hex"01");
    18      }
    19  
    20      function test_writeString_bytestring7f_succeeds() external {
    21          assertEq(RLPWriter.writeString("\u007F"), hex"7f");
    22      }
    23  
    24      function test_writeString_shortstring_succeeds() external {
    25          assertEq(RLPWriter.writeString("dog"), hex"83646f67");
    26      }
    27  
    28      function test_writeString_shortstring2_succeeds() external {
    29          assertEq(
    30              RLPWriter.writeString("Lorem ipsum dolor sit amet, consectetur adipisicing eli"),
    31              hex"b74c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c69"
    32          );
    33      }
    34  
    35      function test_writeString_longstring_succeeds() external {
    36          assertEq(
    37              RLPWriter.writeString("Lorem ipsum dolor sit amet, consectetur adipisicing elit"),
    38              hex"b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974"
    39          );
    40      }
    41  
    42      function test_writeString_longstring2_succeeds() external {
    43          assertEq(
    44              RLPWriter.writeString(
    45                  "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris magna, suscipit sed vehicula non, iaculis faucibus tortor. Proin suscipit ultricies malesuada. Duis tortor elit, dictum quis tristique eu, ultrices at risus. Morbi a est imperdiet mi ullamcorper aliquet suscipit nec lorem. Aenean quis leo mollis, vulputate elit varius, consequat enim. Nulla ultrices turpis justo, et posuere urna consectetur nec. Proin non convallis metus. Donec tempor ipsum in mauris congue sollicitudin. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse convallis sem vel massa faucibus, eget lacinia lacus tempor. Nulla quis ultricies purus. Proin auctor rhoncus nibh condimentum mollis. Aliquam consequat enim at metus luctus, a eleifend purus egestas. Curabitur at nibh metus. Nam bibendum, neque at auctor tristique, lorem libero aliquet arcu, non interdum tellus lectus sit amet eros. Cras rhoncus, metus ac ornare cursus, dolor justo ultrices metus, at ullamcorper volutpat"
    46              ),
    47              hex"b904004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e20437572616269747572206d6175726973206d61676e612c20737573636970697420736564207665686963756c61206e6f6e2c20696163756c697320666175636962757320746f72746f722e2050726f696e20737573636970697420756c74726963696573206d616c6573756164612e204475697320746f72746f7220656c69742c2064696374756d2071756973207472697374697175652065752c20756c7472696365732061742072697375732e204d6f72626920612065737420696d70657264696574206d6920756c6c616d636f7270657220616c6971756574207375736369706974206e6563206c6f72656d2e2041656e65616e2071756973206c656f206d6f6c6c69732c2076756c70757461746520656c6974207661726975732c20636f6e73657175617420656e696d2e204e756c6c6120756c74726963657320747572706973206a7573746f2c20657420706f73756572652075726e6120636f6e7365637465747572206e65632e2050726f696e206e6f6e20636f6e76616c6c6973206d657475732e20446f6e65632074656d706f7220697073756d20696e206d617572697320636f6e67756520736f6c6c696369747564696e2e20566573746962756c756d20616e746520697073756d207072696d697320696e206661756369627573206f726369206c756374757320657420756c74726963657320706f737565726520637562696c69612043757261653b2053757370656e646973736520636f6e76616c6c69732073656d2076656c206d617373612066617563696275732c2065676574206c6163696e6961206c616375732074656d706f722e204e756c6c61207175697320756c747269636965732070757275732e2050726f696e20617563746f722072686f6e637573206e69626820636f6e64696d656e74756d206d6f6c6c69732e20416c697175616d20636f6e73657175617420656e696d206174206d65747573206c75637475732c206120656c656966656e6420707572757320656765737461732e20437572616269747572206174206e696268206d657475732e204e616d20626962656e64756d2c206e6571756520617420617563746f72207472697374697175652c206c6f72656d206c696265726f20616c697175657420617263752c206e6f6e20696e74657264756d2074656c6c7573206c65637475732073697420616d65742065726f732e20437261732072686f6e6375732c206d65747573206163206f726e617265206375727375732c20646f6c6f72206a7573746f20756c747269636573206d657475732c20617420756c6c616d636f7270657220766f6c7574706174"
    48          );
    49      }
    50  }
    51  
    52  contract RLPWriter_writeUint_Test is Test {
    53      function test_writeUint_zero_succeeds() external {
    54          assertEq(RLPWriter.writeUint(0x0), hex"80");
    55      }
    56  
    57      function test_writeUint_smallint_succeeds() external {
    58          assertEq(RLPWriter.writeUint(1), hex"01");
    59      }
    60  
    61      function test_writeUint_smallint2_succeeds() external {
    62          assertEq(RLPWriter.writeUint(16), hex"10");
    63      }
    64  
    65      function test_writeUint_smallint3_succeeds() external {
    66          assertEq(RLPWriter.writeUint(79), hex"4f");
    67      }
    68  
    69      function test_writeUint_smallint4_succeeds() external {
    70          assertEq(RLPWriter.writeUint(127), hex"7f");
    71      }
    72  
    73      function test_writeUint_mediumint_succeeds() external {
    74          assertEq(RLPWriter.writeUint(128), hex"8180");
    75      }
    76  
    77      function test_writeUint_mediumint2_succeeds() external {
    78          assertEq(RLPWriter.writeUint(1000), hex"8203e8");
    79      }
    80  
    81      function test_writeUint_mediumint3_succeeds() external {
    82          assertEq(RLPWriter.writeUint(100000), hex"830186a0");
    83      }
    84  }
    85  
    86  contract RLPWriter_writeList_Test is Test {
    87      function test_writeList_empty_succeeds() external {
    88          assertEq(RLPWriter.writeList(new bytes[](0)), hex"c0");
    89      }
    90  
    91      function test_writeList_stringList_succeeds() external {
    92          bytes[] memory list = new bytes[](3);
    93          list[0] = RLPWriter.writeString("dog");
    94          list[1] = RLPWriter.writeString("god");
    95          list[2] = RLPWriter.writeString("cat");
    96  
    97          assertEq(RLPWriter.writeList(list), hex"cc83646f6783676f6483636174");
    98      }
    99  
   100      function test_writeList_multiList_succeeds() external {
   101          bytes[] memory list = new bytes[](3);
   102          bytes[] memory list2 = new bytes[](1);
   103          list2[0] = RLPWriter.writeUint(4);
   104  
   105          list[0] = RLPWriter.writeString("zw");
   106          list[1] = RLPWriter.writeList(list2);
   107          list[2] = RLPWriter.writeUint(1);
   108  
   109          assertEq(RLPWriter.writeList(list), hex"c6827a77c10401");
   110      }
   111  
   112      function test_writeList_shortListMax1_succeeds() external {
   113          bytes[] memory list = new bytes[](11);
   114          list[0] = RLPWriter.writeString("asdf");
   115          list[1] = RLPWriter.writeString("qwer");
   116          list[2] = RLPWriter.writeString("zxcv");
   117          list[3] = RLPWriter.writeString("asdf");
   118          list[4] = RLPWriter.writeString("qwer");
   119          list[5] = RLPWriter.writeString("zxcv");
   120          list[6] = RLPWriter.writeString("asdf");
   121          list[7] = RLPWriter.writeString("qwer");
   122          list[8] = RLPWriter.writeString("zxcv");
   123          list[9] = RLPWriter.writeString("asdf");
   124          list[10] = RLPWriter.writeString("qwer");
   125  
   126          assertEq(
   127              RLPWriter.writeList(list),
   128              hex"f784617364668471776572847a78637684617364668471776572847a78637684617364668471776572847a78637684617364668471776572"
   129          );
   130      }
   131  
   132      function test_writeList_longlist1_succeeds() external {
   133          bytes[] memory list = new bytes[](4);
   134          bytes[] memory list2 = new bytes[](3);
   135  
   136          list2[0] = RLPWriter.writeString("asdf");
   137          list2[1] = RLPWriter.writeString("qwer");
   138          list2[2] = RLPWriter.writeString("zxcv");
   139  
   140          list[0] = RLPWriter.writeList(list2);
   141          list[1] = RLPWriter.writeList(list2);
   142          list[2] = RLPWriter.writeList(list2);
   143          list[3] = RLPWriter.writeList(list2);
   144  
   145          assertEq(
   146              RLPWriter.writeList(list),
   147              hex"f840cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376"
   148          );
   149      }
   150  
   151      function test_writeList_longlist2_succeeds() external {
   152          bytes[] memory list = new bytes[](32);
   153          bytes[] memory list2 = new bytes[](3);
   154  
   155          list2[0] = RLPWriter.writeString("asdf");
   156          list2[1] = RLPWriter.writeString("qwer");
   157          list2[2] = RLPWriter.writeString("zxcv");
   158  
   159          for (uint256 i = 0; i < 32; i++) {
   160              list[i] = RLPWriter.writeList(list2);
   161          }
   162  
   163          assertEq(
   164              RLPWriter.writeList(list),
   165              hex"f90200cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376"
   166          );
   167      }
   168  
   169      function test_writeList_listoflists_succeeds() external {
   170          // [ [ [], [] ], [] ]
   171          bytes[] memory list = new bytes[](2);
   172          bytes[] memory list2 = new bytes[](2);
   173  
   174          list2[0] = RLPWriter.writeList(new bytes[](0));
   175          list2[1] = RLPWriter.writeList(new bytes[](0));
   176  
   177          list[0] = RLPWriter.writeList(list2);
   178          list[1] = RLPWriter.writeList(new bytes[](0));
   179  
   180          assertEq(RLPWriter.writeList(list), hex"c4c2c0c0c0");
   181      }
   182  
   183      function test_writeList_listoflists2_succeeds() external {
   184          // [ [], [[]], [ [], [[]] ] ]
   185          bytes[] memory list = new bytes[](3);
   186          list[0] = RLPWriter.writeList(new bytes[](0));
   187  
   188          bytes[] memory list2 = new bytes[](1);
   189          list2[0] = RLPWriter.writeList(new bytes[](0));
   190  
   191          list[1] = RLPWriter.writeList(list2);
   192  
   193          bytes[] memory list3 = new bytes[](2);
   194          list3[0] = RLPWriter.writeList(new bytes[](0));
   195          list3[1] = RLPWriter.writeList(list2);
   196  
   197          list[2] = RLPWriter.writeList(list3);
   198  
   199          assertEq(RLPWriter.writeList(list), hex"c7c0c1c0c3c0c1c0");
   200      }
   201  
   202      function test_writeList_dictTest1_succeeds() external {
   203          bytes[] memory list = new bytes[](4);
   204  
   205          bytes[] memory list1 = new bytes[](2);
   206          list1[0] = RLPWriter.writeString("key1");
   207          list1[1] = RLPWriter.writeString("val1");
   208  
   209          bytes[] memory list2 = new bytes[](2);
   210          list2[0] = RLPWriter.writeString("key2");
   211          list2[1] = RLPWriter.writeString("val2");
   212  
   213          bytes[] memory list3 = new bytes[](2);
   214          list3[0] = RLPWriter.writeString("key3");
   215          list3[1] = RLPWriter.writeString("val3");
   216  
   217          bytes[] memory list4 = new bytes[](2);
   218          list4[0] = RLPWriter.writeString("key4");
   219          list4[1] = RLPWriter.writeString("val4");
   220  
   221          list[0] = RLPWriter.writeList(list1);
   222          list[1] = RLPWriter.writeList(list2);
   223          list[2] = RLPWriter.writeList(list3);
   224          list[3] = RLPWriter.writeList(list4);
   225  
   226          assertEq(
   227              RLPWriter.writeList(list),
   228              hex"ecca846b6579318476616c31ca846b6579328476616c32ca846b6579338476616c33ca846b6579348476616c34"
   229          );
   230      }
   231  }