SlotDerivation.t.sol 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. // SPDX-License-Identifier: MIT
  2. // This file was procedurally generated from scripts/generate/templates/SlotDerivation.t.js.
  3. pragma solidity ^0.8.20;
  4. import {Test} from "forge-std/Test.sol";
  5. import {SlotDerivation} from "@openzeppelin/contracts/utils/SlotDerivation.sol";
  6. contract SlotDerivationTest is Test {
  7. using SlotDerivation for bytes32;
  8. bytes[] private _array;
  9. function testDeriveArray(uint256 length, uint256 offset) public {
  10. length = bound(length, 1, type(uint256).max);
  11. offset = bound(offset, 0, length - 1);
  12. bytes32 baseSlot;
  13. assembly {
  14. baseSlot := _array.slot
  15. sstore(baseSlot, length) // store length so solidity access does not revert
  16. }
  17. bytes storage derived = _array[offset];
  18. bytes32 derivedSlot;
  19. assembly {
  20. derivedSlot := derived.slot
  21. }
  22. assertEq(baseSlot.deriveArray().offset(offset), derivedSlot);
  23. }
  24. mapping(address => bytes) private _addressMapping;
  25. function testDeriveMappingAddress(address key) public {
  26. bytes32 baseSlot;
  27. assembly {
  28. baseSlot := _addressMapping.slot
  29. }
  30. bytes storage derived = _addressMapping[key];
  31. bytes32 derivedSlot;
  32. assembly {
  33. derivedSlot := derived.slot
  34. }
  35. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  36. }
  37. mapping(bool => bytes) private _boolMapping;
  38. function testDeriveMappingBoolean(bool key) public {
  39. bytes32 baseSlot;
  40. assembly {
  41. baseSlot := _boolMapping.slot
  42. }
  43. bytes storage derived = _boolMapping[key];
  44. bytes32 derivedSlot;
  45. assembly {
  46. derivedSlot := derived.slot
  47. }
  48. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  49. }
  50. mapping(bytes32 => bytes) private _bytes32Mapping;
  51. function testDeriveMappingBytes32(bytes32 key) public {
  52. bytes32 baseSlot;
  53. assembly {
  54. baseSlot := _bytes32Mapping.slot
  55. }
  56. bytes storage derived = _bytes32Mapping[key];
  57. bytes32 derivedSlot;
  58. assembly {
  59. derivedSlot := derived.slot
  60. }
  61. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  62. }
  63. mapping(bytes4 => bytes) private _bytes4Mapping;
  64. function testDeriveMappingBytes4(bytes4 key) public {
  65. bytes32 baseSlot;
  66. assembly {
  67. baseSlot := _bytes4Mapping.slot
  68. }
  69. bytes storage derived = _bytes4Mapping[key];
  70. bytes32 derivedSlot;
  71. assembly {
  72. derivedSlot := derived.slot
  73. }
  74. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  75. }
  76. mapping(uint256 => bytes) private _uint256Mapping;
  77. function testDeriveMappingUint256(uint256 key) public {
  78. bytes32 baseSlot;
  79. assembly {
  80. baseSlot := _uint256Mapping.slot
  81. }
  82. bytes storage derived = _uint256Mapping[key];
  83. bytes32 derivedSlot;
  84. assembly {
  85. derivedSlot := derived.slot
  86. }
  87. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  88. }
  89. mapping(uint32 => bytes) private _uint32Mapping;
  90. function testDeriveMappingUint32(uint32 key) public {
  91. bytes32 baseSlot;
  92. assembly {
  93. baseSlot := _uint32Mapping.slot
  94. }
  95. bytes storage derived = _uint32Mapping[key];
  96. bytes32 derivedSlot;
  97. assembly {
  98. derivedSlot := derived.slot
  99. }
  100. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  101. }
  102. mapping(int256 => bytes) private _int256Mapping;
  103. function testDeriveMappingInt256(int256 key) public {
  104. bytes32 baseSlot;
  105. assembly {
  106. baseSlot := _int256Mapping.slot
  107. }
  108. bytes storage derived = _int256Mapping[key];
  109. bytes32 derivedSlot;
  110. assembly {
  111. derivedSlot := derived.slot
  112. }
  113. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  114. }
  115. mapping(int32 => bytes) private _int32Mapping;
  116. function testDeriveMappingInt32(int32 key) public {
  117. bytes32 baseSlot;
  118. assembly {
  119. baseSlot := _int32Mapping.slot
  120. }
  121. bytes storage derived = _int32Mapping[key];
  122. bytes32 derivedSlot;
  123. assembly {
  124. derivedSlot := derived.slot
  125. }
  126. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  127. }
  128. mapping(string => bytes) private _stringMapping;
  129. function testDeriveMappingString(string memory key) public {
  130. bytes32 baseSlot;
  131. assembly {
  132. baseSlot := _stringMapping.slot
  133. }
  134. bytes storage derived = _stringMapping[key];
  135. bytes32 derivedSlot;
  136. assembly {
  137. derivedSlot := derived.slot
  138. }
  139. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  140. }
  141. mapping(bytes => bytes) private _bytesMapping;
  142. function testDeriveMappingBytes(bytes memory key) public {
  143. bytes32 baseSlot;
  144. assembly {
  145. baseSlot := _bytesMapping.slot
  146. }
  147. bytes storage derived = _bytesMapping[key];
  148. bytes32 derivedSlot;
  149. assembly {
  150. derivedSlot := derived.slot
  151. }
  152. assertEq(baseSlot.deriveMapping(key), derivedSlot);
  153. }
  154. }