@godzillaba/mutest 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.devcontainer/Dockerfile +117 -0
  2. package/.devcontainer/devcontainer.json +62 -0
  3. package/.devcontainer/init-firewall.sh +118 -0
  4. package/.github/workflows/test.yml +38 -0
  5. package/.gitmodules +3 -0
  6. package/CLAUDE.md +39 -0
  7. package/README.md +33 -0
  8. package/foundry.lock +8 -0
  9. package/foundry.toml +6 -0
  10. package/index.ts +97 -0
  11. package/lib/forge-std/.gitattributes +1 -0
  12. package/lib/forge-std/.github/CODEOWNERS +1 -0
  13. package/lib/forge-std/.github/dependabot.yml +6 -0
  14. package/lib/forge-std/.github/workflows/ci.yml +125 -0
  15. package/lib/forge-std/.github/workflows/sync.yml +36 -0
  16. package/lib/forge-std/CONTRIBUTING.md +193 -0
  17. package/lib/forge-std/LICENSE-APACHE +203 -0
  18. package/lib/forge-std/LICENSE-MIT +25 -0
  19. package/lib/forge-std/README.md +314 -0
  20. package/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
  21. package/lib/forge-std/foundry.toml +18 -0
  22. package/lib/forge-std/package.json +16 -0
  23. package/lib/forge-std/scripts/vm.py +636 -0
  24. package/lib/forge-std/src/Base.sol +48 -0
  25. package/lib/forge-std/src/Config.sol +60 -0
  26. package/lib/forge-std/src/LibVariable.sol +477 -0
  27. package/lib/forge-std/src/Script.sol +28 -0
  28. package/lib/forge-std/src/StdAssertions.sol +779 -0
  29. package/lib/forge-std/src/StdChains.sol +303 -0
  30. package/lib/forge-std/src/StdCheats.sol +825 -0
  31. package/lib/forge-std/src/StdConfig.sol +632 -0
  32. package/lib/forge-std/src/StdConstants.sol +30 -0
  33. package/lib/forge-std/src/StdError.sol +15 -0
  34. package/lib/forge-std/src/StdInvariant.sol +140 -0
  35. package/lib/forge-std/src/StdJson.sol +275 -0
  36. package/lib/forge-std/src/StdMath.sol +47 -0
  37. package/lib/forge-std/src/StdStorage.sol +475 -0
  38. package/lib/forge-std/src/StdStyle.sol +333 -0
  39. package/lib/forge-std/src/StdToml.sol +275 -0
  40. package/lib/forge-std/src/StdUtils.sol +200 -0
  41. package/lib/forge-std/src/Test.sol +32 -0
  42. package/lib/forge-std/src/Vm.sol +2533 -0
  43. package/lib/forge-std/src/console.sol +1551 -0
  44. package/lib/forge-std/src/console2.sol +4 -0
  45. package/lib/forge-std/src/interfaces/IERC1155.sol +105 -0
  46. package/lib/forge-std/src/interfaces/IERC165.sol +12 -0
  47. package/lib/forge-std/src/interfaces/IERC20.sol +43 -0
  48. package/lib/forge-std/src/interfaces/IERC4626.sol +190 -0
  49. package/lib/forge-std/src/interfaces/IERC6909.sol +72 -0
  50. package/lib/forge-std/src/interfaces/IERC721.sol +164 -0
  51. package/lib/forge-std/src/interfaces/IERC7540.sol +144 -0
  52. package/lib/forge-std/src/interfaces/IERC7575.sol +241 -0
  53. package/lib/forge-std/src/interfaces/IMulticall3.sol +68 -0
  54. package/lib/forge-std/src/safeconsole.sol +13248 -0
  55. package/lib/forge-std/test/CommonBase.t.sol +44 -0
  56. package/lib/forge-std/test/Config.t.sol +381 -0
  57. package/lib/forge-std/test/LibVariable.t.sol +452 -0
  58. package/lib/forge-std/test/StdAssertions.t.sol +141 -0
  59. package/lib/forge-std/test/StdChains.t.sol +227 -0
  60. package/lib/forge-std/test/StdCheats.t.sol +638 -0
  61. package/lib/forge-std/test/StdConstants.t.sol +38 -0
  62. package/lib/forge-std/test/StdError.t.sol +119 -0
  63. package/lib/forge-std/test/StdJson.t.sol +49 -0
  64. package/lib/forge-std/test/StdMath.t.sol +202 -0
  65. package/lib/forge-std/test/StdStorage.t.sol +485 -0
  66. package/lib/forge-std/test/StdStyle.t.sol +110 -0
  67. package/lib/forge-std/test/StdToml.t.sol +49 -0
  68. package/lib/forge-std/test/StdUtils.t.sol +342 -0
  69. package/lib/forge-std/test/Vm.t.sol +18 -0
  70. package/lib/forge-std/test/compilation/CompilationScript.sol +8 -0
  71. package/lib/forge-std/test/compilation/CompilationScriptBase.sol +8 -0
  72. package/lib/forge-std/test/compilation/CompilationTest.sol +8 -0
  73. package/lib/forge-std/test/compilation/CompilationTestBase.sol +8 -0
  74. package/lib/forge-std/test/fixtures/broadcast.log.json +187 -0
  75. package/lib/forge-std/test/fixtures/config.toml +81 -0
  76. package/lib/forge-std/test/fixtures/test.json +8 -0
  77. package/lib/forge-std/test/fixtures/test.toml +6 -0
  78. package/package.json +10 -0
  79. package/script/Counter.s.sol +19 -0
  80. package/src/Counter.sol +14 -0
  81. package/test/Counter.t.sol +24 -0
@@ -0,0 +1,140 @@
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
+ pragma solidity >=0.8.13 <0.9.0;
3
+
4
+ abstract contract StdInvariant {
5
+ struct FuzzSelector {
6
+ address addr;
7
+ bytes4[] selectors;
8
+ }
9
+
10
+ struct FuzzArtifactSelector {
11
+ string artifact;
12
+ bytes4[] selectors;
13
+ }
14
+
15
+ struct FuzzInterface {
16
+ address addr;
17
+ string[] artifacts;
18
+ }
19
+
20
+ address[] private _excludedContracts;
21
+ address[] private _excludedSenders;
22
+ address[] private _targetedContracts;
23
+ address[] private _targetedSenders;
24
+
25
+ string[] private _excludedArtifacts;
26
+ string[] private _targetedArtifacts;
27
+
28
+ FuzzArtifactSelector[] private _targetedArtifactSelectors;
29
+
30
+ FuzzSelector[] private _excludedSelectors;
31
+ FuzzSelector[] private _targetedSelectors;
32
+
33
+ FuzzInterface[] private _targetedInterfaces;
34
+
35
+ // Functions for users:
36
+ // These are intended to be called in tests.
37
+
38
+ /// @dev Excludes a contract address from invariant target selection.
39
+ function excludeContract(address newExcludedContract_) internal {
40
+ _excludedContracts.push(newExcludedContract_);
41
+ }
42
+
43
+ /// @dev Excludes specific selectors on a contract from invariant fuzzing.
44
+ function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {
45
+ _excludedSelectors.push(newExcludedSelector_);
46
+ }
47
+
48
+ /// @dev Excludes a sender from invariant fuzzing; exclusion takes precedence over targeted senders.
49
+ function excludeSender(address newExcludedSender_) internal {
50
+ _excludedSenders.push(newExcludedSender_);
51
+ }
52
+
53
+ /// @dev Excludes an artifact identifier from invariant target selection.
54
+ function excludeArtifact(string memory newExcludedArtifact_) internal {
55
+ _excludedArtifacts.push(newExcludedArtifact_);
56
+ }
57
+
58
+ /// @dev Targets an artifact identifier for invariant fuzzing.
59
+ function targetArtifact(string memory newTargetedArtifact_) internal {
60
+ _targetedArtifacts.push(newTargetedArtifact_);
61
+ }
62
+
63
+ /// @dev Targets specific selectors for an artifact identifier during invariant fuzzing.
64
+ function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {
65
+ _targetedArtifactSelectors.push(newTargetedArtifactSelector_);
66
+ }
67
+
68
+ /// @dev Targets a contract address for invariant fuzzing.
69
+ function targetContract(address newTargetedContract_) internal {
70
+ _targetedContracts.push(newTargetedContract_);
71
+ }
72
+
73
+ /// @dev Targets specific selectors on a contract for invariant fuzzing.
74
+ function targetSelector(FuzzSelector memory newTargetedSelector_) internal {
75
+ _targetedSelectors.push(newTargetedSelector_);
76
+ }
77
+
78
+ /// @dev Adds a sender to the invariant sender allowlist; when non-empty, fuzzing uses only targeted non-excluded senders.
79
+ function targetSender(address newTargetedSender_) internal {
80
+ _targetedSenders.push(newTargetedSender_);
81
+ }
82
+
83
+ /// @dev Targets an address plus artifact interfaces for invariant fuzzing.
84
+ function targetInterface(FuzzInterface memory newTargetedInterface_) internal {
85
+ _targetedInterfaces.push(newTargetedInterface_);
86
+ }
87
+
88
+ // Functions for forge:
89
+ // These are called by forge to run invariant tests and don't need to be called in tests.
90
+
91
+ /// @dev Returns artifact identifiers configured via `excludeArtifact`.
92
+ function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {
93
+ excludedArtifacts_ = _excludedArtifacts;
94
+ }
95
+
96
+ /// @dev Returns contract addresses configured via `excludeContract`.
97
+ function excludeContracts() public view returns (address[] memory excludedContracts_) {
98
+ excludedContracts_ = _excludedContracts;
99
+ }
100
+
101
+ /// @dev Returns selector exclusions configured via `excludeSelector`.
102
+ function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {
103
+ excludedSelectors_ = _excludedSelectors;
104
+ }
105
+
106
+ /// @dev Returns senders configured via `excludeSender`.
107
+ function excludeSenders() public view returns (address[] memory excludedSenders_) {
108
+ excludedSenders_ = _excludedSenders;
109
+ }
110
+
111
+ /// @dev Returns artifact identifiers configured via `targetArtifact`.
112
+ function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {
113
+ targetedArtifacts_ = _targetedArtifacts;
114
+ }
115
+
116
+ /// @dev Returns artifact-selector targets configured via `targetArtifactSelector`.
117
+ function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {
118
+ targetedArtifactSelectors_ = _targetedArtifactSelectors;
119
+ }
120
+
121
+ /// @dev Returns contract addresses configured via `targetContract`.
122
+ function targetContracts() public view returns (address[] memory targetedContracts_) {
123
+ targetedContracts_ = _targetedContracts;
124
+ }
125
+
126
+ /// @dev Returns selector targets configured via `targetSelector`.
127
+ function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {
128
+ targetedSelectors_ = _targetedSelectors;
129
+ }
130
+
131
+ /// @dev Returns sender allowlist configured via `targetSender` (empty means no sender allowlist).
132
+ function targetSenders() public view returns (address[] memory targetedSenders_) {
133
+ targetedSenders_ = _targetedSenders;
134
+ }
135
+
136
+ /// @dev Returns address-interface targets configured via `targetInterface`.
137
+ function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {
138
+ targetedInterfaces_ = _targetedInterfaces;
139
+ }
140
+ }
@@ -0,0 +1,275 @@
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
+ pragma solidity >=0.8.13 <0.9.0;
3
+
4
+ import {VmSafe} from "./Vm.sol";
5
+
6
+ // Helpers for parsing and writing JSON files
7
+ // To parse:
8
+ // ```
9
+ // using stdJson for string;
10
+ // string memory json = vm.readFile("<some_path>");
11
+ // json.readUint("<json_path>");
12
+ // ```
13
+ // To write:
14
+ // ```
15
+ // using stdJson for string;
16
+ // string memory json = "json";
17
+ // json.serialize("a", uint256(123));
18
+ // string memory semiFinal = json.serialize("b", string("test"));
19
+ // string memory finalJson = json.serialize("c", semiFinal);
20
+ // finalJson.write("<some_path>");
21
+ // ```
22
+
23
+ library stdJson {
24
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
25
+
26
+ function keyExists(string memory json, string memory key) internal view returns (bool) {
27
+ return vm.keyExistsJson(json, key);
28
+ }
29
+
30
+ function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {
31
+ return vm.parseJson(json, key);
32
+ }
33
+
34
+ function readUint(string memory json, string memory key) internal pure returns (uint256) {
35
+ return vm.parseJsonUint(json, key);
36
+ }
37
+
38
+ function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {
39
+ return vm.parseJsonUintArray(json, key);
40
+ }
41
+
42
+ function readInt(string memory json, string memory key) internal pure returns (int256) {
43
+ return vm.parseJsonInt(json, key);
44
+ }
45
+
46
+ function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {
47
+ return vm.parseJsonIntArray(json, key);
48
+ }
49
+
50
+ function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {
51
+ return vm.parseJsonBytes32(json, key);
52
+ }
53
+
54
+ function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {
55
+ return vm.parseJsonBytes32Array(json, key);
56
+ }
57
+
58
+ function readString(string memory json, string memory key) internal pure returns (string memory) {
59
+ return vm.parseJsonString(json, key);
60
+ }
61
+
62
+ function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {
63
+ return vm.parseJsonStringArray(json, key);
64
+ }
65
+
66
+ function readAddress(string memory json, string memory key) internal pure returns (address) {
67
+ return vm.parseJsonAddress(json, key);
68
+ }
69
+
70
+ function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {
71
+ return vm.parseJsonAddressArray(json, key);
72
+ }
73
+
74
+ function readBool(string memory json, string memory key) internal pure returns (bool) {
75
+ return vm.parseJsonBool(json, key);
76
+ }
77
+
78
+ function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {
79
+ return vm.parseJsonBoolArray(json, key);
80
+ }
81
+
82
+ function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {
83
+ return vm.parseJsonBytes(json, key);
84
+ }
85
+
86
+ function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {
87
+ return vm.parseJsonBytesArray(json, key);
88
+ }
89
+
90
+ function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {
91
+ return keyExists(json, key) ? readUint(json, key) : defaultValue;
92
+ }
93
+
94
+ function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)
95
+ internal
96
+ view
97
+ returns (uint256[] memory)
98
+ {
99
+ return keyExists(json, key) ? readUintArray(json, key) : defaultValue;
100
+ }
101
+
102
+ function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {
103
+ return keyExists(json, key) ? readInt(json, key) : defaultValue;
104
+ }
105
+
106
+ function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)
107
+ internal
108
+ view
109
+ returns (int256[] memory)
110
+ {
111
+ return keyExists(json, key) ? readIntArray(json, key) : defaultValue;
112
+ }
113
+
114
+ function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)
115
+ internal
116
+ view
117
+ returns (bytes32)
118
+ {
119
+ return keyExists(json, key) ? readBytes32(json, key) : defaultValue;
120
+ }
121
+
122
+ function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)
123
+ internal
124
+ view
125
+ returns (bytes32[] memory)
126
+ {
127
+ return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;
128
+ }
129
+
130
+ function readStringOr(string memory json, string memory key, string memory defaultValue)
131
+ internal
132
+ view
133
+ returns (string memory)
134
+ {
135
+ return keyExists(json, key) ? readString(json, key) : defaultValue;
136
+ }
137
+
138
+ function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)
139
+ internal
140
+ view
141
+ returns (string[] memory)
142
+ {
143
+ return keyExists(json, key) ? readStringArray(json, key) : defaultValue;
144
+ }
145
+
146
+ function readAddressOr(string memory json, string memory key, address defaultValue)
147
+ internal
148
+ view
149
+ returns (address)
150
+ {
151
+ return keyExists(json, key) ? readAddress(json, key) : defaultValue;
152
+ }
153
+
154
+ function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)
155
+ internal
156
+ view
157
+ returns (address[] memory)
158
+ {
159
+ return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;
160
+ }
161
+
162
+ function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {
163
+ return keyExists(json, key) ? readBool(json, key) : defaultValue;
164
+ }
165
+
166
+ function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)
167
+ internal
168
+ view
169
+ returns (bool[] memory)
170
+ {
171
+ return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;
172
+ }
173
+
174
+ function readBytesOr(string memory json, string memory key, bytes memory defaultValue)
175
+ internal
176
+ view
177
+ returns (bytes memory)
178
+ {
179
+ return keyExists(json, key) ? readBytes(json, key) : defaultValue;
180
+ }
181
+
182
+ function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)
183
+ internal
184
+ view
185
+ returns (bytes[] memory)
186
+ {
187
+ return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;
188
+ }
189
+
190
+ function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {
191
+ return vm.serializeJson(jsonKey, rootObject);
192
+ }
193
+
194
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
195
+ return vm.serializeBool(jsonKey, key, value);
196
+ }
197
+
198
+ function serialize(string memory jsonKey, string memory key, bool[] memory value) internal returns (string memory) {
199
+ return vm.serializeBool(jsonKey, key, value);
200
+ }
201
+
202
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
203
+ return vm.serializeUint(jsonKey, key, value);
204
+ }
205
+
206
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
207
+ internal
208
+ returns (string memory)
209
+ {
210
+ return vm.serializeUint(jsonKey, key, value);
211
+ }
212
+
213
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
214
+ return vm.serializeInt(jsonKey, key, value);
215
+ }
216
+
217
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
218
+ internal
219
+ returns (string memory)
220
+ {
221
+ return vm.serializeInt(jsonKey, key, value);
222
+ }
223
+
224
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
225
+ return vm.serializeAddress(jsonKey, key, value);
226
+ }
227
+
228
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
229
+ internal
230
+ returns (string memory)
231
+ {
232
+ return vm.serializeAddress(jsonKey, key, value);
233
+ }
234
+
235
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
236
+ return vm.serializeBytes32(jsonKey, key, value);
237
+ }
238
+
239
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
240
+ internal
241
+ returns (string memory)
242
+ {
243
+ return vm.serializeBytes32(jsonKey, key, value);
244
+ }
245
+
246
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
247
+ return vm.serializeBytes(jsonKey, key, value);
248
+ }
249
+
250
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
251
+ internal
252
+ returns (string memory)
253
+ {
254
+ return vm.serializeBytes(jsonKey, key, value);
255
+ }
256
+
257
+ function serialize(string memory jsonKey, string memory key, string memory value) internal returns (string memory) {
258
+ return vm.serializeString(jsonKey, key, value);
259
+ }
260
+
261
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
262
+ internal
263
+ returns (string memory)
264
+ {
265
+ return vm.serializeString(jsonKey, key, value);
266
+ }
267
+
268
+ function write(string memory jsonKey, string memory path) internal {
269
+ vm.writeJson(jsonKey, path);
270
+ }
271
+
272
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
273
+ vm.writeJson(jsonKey, path, valueKey);
274
+ }
275
+ }
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
+ pragma solidity >=0.8.13 <0.9.0;
3
+
4
+ library stdMath {
5
+ int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;
6
+
7
+ function abs(int256 a) internal pure returns (uint256) {
8
+ // Required or it will fail when `a = type(int256).min`
9
+ if (a == INT256_MIN) {
10
+ return 57896044618658097711785492504343953926634992332820282019728792003956564819968;
11
+ }
12
+
13
+ return uint256(a > 0 ? a : -a);
14
+ }
15
+
16
+ function delta(uint256 a, uint256 b) internal pure returns (uint256) {
17
+ return a > b ? a - b : b - a;
18
+ }
19
+
20
+ function delta(int256 a, int256 b) internal pure returns (uint256) {
21
+ // a and b are of the same sign
22
+ // this works thanks to two's complement, the left-most bit is the sign bit
23
+ if ((a ^ b) > -1) {
24
+ return delta(abs(a), abs(b));
25
+ }
26
+
27
+ // a and b are of opposite signs
28
+ return abs(a) + abs(b);
29
+ }
30
+
31
+ function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {
32
+ // Prevent division by zero
33
+ require(b != 0, "stdMath percentDelta(uint256,uint256): Divisor is zero");
34
+ uint256 absDelta = delta(a, b);
35
+
36
+ return absDelta * 1e18 / b;
37
+ }
38
+
39
+ function percentDelta(int256 a, int256 b) internal pure returns (uint256) {
40
+ uint256 absDelta = delta(a, b);
41
+ uint256 absB = abs(b);
42
+ // Prevent division by zero
43
+ require(absB != 0, "stdMath percentDelta(int256,int256): Divisor is zero");
44
+
45
+ return absDelta * 1e18 / absB;
46
+ }
47
+ }