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 }