Skip to content

Commit 8d07e2d

Browse files
committed
feat: implement DiscoveryHandler contract for invariant testing
1 parent dc01f07 commit 8d07e2d

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity 0.8.25;
3+
4+
import {HandlerBase} from "./HandlerBase.sol";
5+
import {FlyoverDiscovery} from "../../../src/FlyoverDiscovery.sol";
6+
import {CollateralManagementContract} from "../../../src/CollateralManagement.sol";
7+
import {Flyover} from "../../../src/libraries/Flyover.sol";
8+
9+
/// @title Discovery Invariant Handler
10+
/// @notice Provides fuzzable handler functions for FlyoverDiscovery invariant testing
11+
contract DiscoveryHandler is HandlerBase {
12+
FlyoverDiscovery public discovery;
13+
CollateralManagementContract public collateralManagement;
14+
address public owner;
15+
16+
struct ProviderInfo {
17+
address addr;
18+
uint256 providerId;
19+
Flyover.ProviderType providerType;
20+
bool statusSet;
21+
}
22+
23+
ProviderInfo[] public registeredProviders;
24+
25+
uint256 public ghost_totalRegistered;
26+
uint256 public ghost_lastProviderId;
27+
28+
constructor(
29+
FlyoverDiscovery discovery_,
30+
CollateralManagementContract collateralManagement_,
31+
address owner_
32+
) {
33+
discovery = discovery_;
34+
collateralManagement = collateralManagement_;
35+
owner = owner_;
36+
}
37+
38+
function registerProvider(
39+
uint256 seed,
40+
uint8 providerTypeSeed,
41+
uint256 extraCollateral
42+
) external {
43+
handlerCalls["registerProvider"] += 1;
44+
45+
Flyover.ProviderType providerType = _getProviderType(providerTypeSeed);
46+
uint256 requiredCollateral = _getRequiredCollateral(providerType);
47+
extraCollateral = bound(extraCollateral, 0, 5 ether);
48+
uint256 collateral = requiredCollateral + extraCollateral;
49+
50+
address provider = address(
51+
uint160(
52+
uint256(
53+
keccak256(
54+
abi.encode(seed, ghost_totalRegistered, block.timestamp)
55+
)
56+
)
57+
)
58+
);
59+
vm.deal(provider, collateral + 1 ether);
60+
61+
string memory name = _generateName(seed);
62+
string memory url = _generateUrl(seed);
63+
64+
vm.prank(provider, provider);
65+
try
66+
discovery.register{value: collateral}(name, url, true, providerType)
67+
returns (uint256 id) {
68+
ghost_totalRegistered++;
69+
ghost_lastProviderId = id;
70+
registeredProviders.push(
71+
ProviderInfo({
72+
addr: provider,
73+
providerId: id,
74+
providerType: providerType,
75+
statusSet: true
76+
})
77+
);
78+
} catch {}
79+
}
80+
81+
function toggleStatus(uint256 providerSeed, bool status) external {
82+
handlerCalls["toggleStatus"] += 1;
83+
84+
if (registeredProviders.length == 0) return;
85+
86+
uint256 idx = providerSeed % registeredProviders.length;
87+
ProviderInfo storage info = registeredProviders[idx];
88+
89+
vm.prank(info.addr);
90+
try discovery.setProviderStatus(info.providerId, status) {
91+
info.statusSet = status;
92+
} catch {}
93+
}
94+
95+
function updateProviderInfo(
96+
uint256 providerSeed,
97+
uint256 nameSeed,
98+
uint256 urlSeed
99+
) external {
100+
handlerCalls["updateProviderInfo"] += 1;
101+
102+
if (registeredProviders.length == 0) return;
103+
104+
uint256 idx = providerSeed % registeredProviders.length;
105+
ProviderInfo storage info = registeredProviders[idx];
106+
107+
string memory name = _generateName(nameSeed);
108+
string memory url = _generateUrl(urlSeed);
109+
110+
vm.prank(info.addr);
111+
try discovery.updateProvider(name, url) {} catch {}
112+
}
113+
114+
function getRegisteredCount() external view returns (uint256) {
115+
return registeredProviders.length;
116+
}
117+
118+
function getProviderInfo(
119+
uint256 idx
120+
)
121+
external
122+
view
123+
returns (
124+
address addr,
125+
uint256 providerId,
126+
Flyover.ProviderType providerType,
127+
bool statusSet
128+
)
129+
{
130+
ProviderInfo storage info = registeredProviders[idx];
131+
return (info.addr, info.providerId, info.providerType, info.statusSet);
132+
}
133+
}

0 commit comments

Comments
 (0)