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 }