123 lines
3.9 KiB
Solidity
123 lines
3.9 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity >=0.6.2 <0.9.0;
|
|
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
abstract contract StdInvariant {
|
|
struct FuzzSelector {
|
|
address addr;
|
|
bytes4[] selectors;
|
|
}
|
|
|
|
struct FuzzArtifactSelector {
|
|
string artifact;
|
|
bytes4[] selectors;
|
|
}
|
|
|
|
struct FuzzInterface {
|
|
address addr;
|
|
string[] artifacts;
|
|
}
|
|
|
|
address[] private _excludedContracts;
|
|
address[] private _excludedSenders;
|
|
address[] private _targetedContracts;
|
|
address[] private _targetedSenders;
|
|
|
|
string[] private _excludedArtifacts;
|
|
string[] private _targetedArtifacts;
|
|
|
|
FuzzArtifactSelector[] private _targetedArtifactSelectors;
|
|
|
|
FuzzSelector[] private _excludedSelectors;
|
|
FuzzSelector[] private _targetedSelectors;
|
|
|
|
FuzzInterface[] private _targetedInterfaces;
|
|
|
|
// Functions for users:
|
|
// These are intended to be called in tests.
|
|
|
|
function excludeContract(address newExcludedContract_) internal {
|
|
_excludedContracts.push(newExcludedContract_);
|
|
}
|
|
|
|
function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {
|
|
_excludedSelectors.push(newExcludedSelector_);
|
|
}
|
|
|
|
function excludeSender(address newExcludedSender_) internal {
|
|
_excludedSenders.push(newExcludedSender_);
|
|
}
|
|
|
|
function excludeArtifact(string memory newExcludedArtifact_) internal {
|
|
_excludedArtifacts.push(newExcludedArtifact_);
|
|
}
|
|
|
|
function targetArtifact(string memory newTargetedArtifact_) internal {
|
|
_targetedArtifacts.push(newTargetedArtifact_);
|
|
}
|
|
|
|
function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {
|
|
_targetedArtifactSelectors.push(newTargetedArtifactSelector_);
|
|
}
|
|
|
|
function targetContract(address newTargetedContract_) internal {
|
|
_targetedContracts.push(newTargetedContract_);
|
|
}
|
|
|
|
function targetSelector(FuzzSelector memory newTargetedSelector_) internal {
|
|
_targetedSelectors.push(newTargetedSelector_);
|
|
}
|
|
|
|
function targetSender(address newTargetedSender_) internal {
|
|
_targetedSenders.push(newTargetedSender_);
|
|
}
|
|
|
|
function targetInterface(FuzzInterface memory newTargetedInterface_) internal {
|
|
_targetedInterfaces.push(newTargetedInterface_);
|
|
}
|
|
|
|
// Functions for forge:
|
|
// These are called by forge to run invariant tests and don't need to be called in tests.
|
|
|
|
function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {
|
|
excludedArtifacts_ = _excludedArtifacts;
|
|
}
|
|
|
|
function excludeContracts() public view returns (address[] memory excludedContracts_) {
|
|
excludedContracts_ = _excludedContracts;
|
|
}
|
|
|
|
function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {
|
|
excludedSelectors_ = _excludedSelectors;
|
|
}
|
|
|
|
function excludeSenders() public view returns (address[] memory excludedSenders_) {
|
|
excludedSenders_ = _excludedSenders;
|
|
}
|
|
|
|
function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {
|
|
targetedArtifacts_ = _targetedArtifacts;
|
|
}
|
|
|
|
function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {
|
|
targetedArtifactSelectors_ = _targetedArtifactSelectors;
|
|
}
|
|
|
|
function targetContracts() public view returns (address[] memory targetedContracts_) {
|
|
targetedContracts_ = _targetedContracts;
|
|
}
|
|
|
|
function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {
|
|
targetedSelectors_ = _targetedSelectors;
|
|
}
|
|
|
|
function targetSenders() public view returns (address[] memory targetedSenders_) {
|
|
targetedSenders_ = _targetedSenders;
|
|
}
|
|
|
|
function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {
|
|
targetedInterfaces_ = _targetedInterfaces;
|
|
}
|
|
}
|