Skip to content

Commit 9322e3e

Browse files
authored
Merge pull request #13 from symbioticfi/add-simple-integration-mock
Add integration mock
2 parents 29f7977 + 7cfb1a5 commit 9322e3e

19 files changed

+841
-11
lines changed

.env.example

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
ETH_RPC_URL=
2+
ETH_RPC_URL_HOLESKY=
23
ETHERSCAN_API_KEY=

.gitignore

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Compiler files
22
cache/
3-
out/
3+
out/**/
4+
!out/DefaultStakerRewardsFactory.sol/
5+
!out/DefaultStakerRewards.sol/
6+
!out/DefaultOperatorRewardsFactory.sol/
7+
!out/DefaultOperatorRewards.sol/
48

59
# Ignores development broadcast logs
610
!/broadcast

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ Create `.env` file using a template:
2020

2121
```
2222
ETH_RPC_URL=
23+
ETH_RPC_URL_HOLESKY=
2324
ETHERSCAN_API_KEY=
2425
```
2526

26-
\* ETH_RPC_URL is optional.
27-
28-
\* ETHERSCAN_API_KEY is optional.
27+
\* ETH_RPC_URL is optional.<br/>\* ETH_RPC_URL_HOLESKY is optional.<br/>\* ETHERSCAN_API_KEY is optional.
2928

3029
### Build
3130

foundry.toml

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
[profile.default]
2+
evm_version = "cancun"
23
solc = "0.8.25"
4+
optimizer = true
5+
optimizer_runs = 200
36
via_ir = true
47
src = "src"
58
out = "out"
69
libs = ["lib"]
710
fs_permissions = [{ access = "read-write", path = "./"}]
811
gas_reports = ["*"]
12+
gas_limit = "18446744073709551615"
913

1014
[rpc_endpoints]
1115
mainnet = "${ETH_RPC_URL}"
16+
holesky = "${ETH_RPC_URL_HOLESKY}"
1217

1318
[fmt]
1419
bracket_spacing = false
@@ -20,7 +25,7 @@ quote_style = "double"
2025
tab_width = 4
2126

2227
[fuzz]
23-
runs = 2048
28+
runs = 4096
2429
max_test_rejects = 262144
2530

2631

lib/core

Submodule core updated 214 files

out/DefaultOperatorRewards.sol/DefaultOperatorRewards.json

+1
Large diffs are not rendered by default.

out/DefaultOperatorRewardsFactory.sol/DefaultOperatorRewardsFactory.json

+1
Large diffs are not rendered by default.

out/DefaultStakerRewards.sol/DefaultStakerRewards.json

+1
Large diffs are not rendered by default.

out/DefaultStakerRewardsFactory.sol/DefaultStakerRewardsFactory.json

+1
Large diffs are not rendered by default.

remappings.txt

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
forge-std/=lib/forge-std/src/
22
@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/
33
@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/
4-
@symbioticfi/core/src/contracts/=lib/core/src/contracts/
5-
@symbioticfi/core/src/interfaces/=lib/core/src/interfaces/
6-
@symbioticfi/core/test/mocks/=lib/core/test/mocks/
4+
@symbioticfi/core/=lib/core/

src/interfaces/defaultOperatorRewards/IDefaultOperatorRewardsFactory.sol

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.0;
33

4-
interface IDefaultOperatorRewardsFactory {
4+
import {IRegistry} from "@symbioticfi/core/src/interfaces/common/IRegistry.sol";
5+
6+
interface IDefaultOperatorRewardsFactory is IRegistry {
57
/**
68
* @notice Create a default operator rewards contract.
79
* @return address of the created operator rewards contract

src/interfaces/defaultStakerRewards/IDefaultStakerRewardsFactory.sol

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ pragma solidity ^0.8.0;
33

44
import {IDefaultStakerRewards} from "./IDefaultStakerRewards.sol";
55

6-
interface IDefaultStakerRewardsFactory {
6+
import {IRegistry} from "@symbioticfi/core/src/interfaces/common/IRegistry.sol";
7+
8+
interface IDefaultStakerRewardsFactory is IRegistry {
79
/**
810
* @notice Create a default staker rewards contract for a given vault.
911
* @param params initial parameters needed for a staker rewards contract deployment
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.0;
3+
4+
import "./SymbioticRewardsImports.sol";
5+
6+
import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
7+
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
8+
9+
import {Test} from "forge-std/Test.sol";
10+
11+
contract SymbioticRewardsBindings is Test {
12+
using SafeERC20 for IERC20;
13+
14+
function _createDefaultStakerRewards_SymbioticRewards(
15+
ISymbioticDefaultStakerRewardsFactory symbioticDefaultStakerRewardsFactory,
16+
address who,
17+
address vault,
18+
uint256 adminFee,
19+
address defaultAdminRoleHolder,
20+
address adminFeeClaimRoleHolder,
21+
address adminFeeSetRoleHolder
22+
) internal virtual returns (address defaultStakerRewards) {
23+
vm.startPrank(who);
24+
defaultStakerRewards = symbioticDefaultStakerRewardsFactory.create(
25+
ISymbioticDefaultStakerRewards.InitParams({
26+
vault: vault,
27+
adminFee: adminFee,
28+
defaultAdminRoleHolder: defaultAdminRoleHolder,
29+
adminFeeClaimRoleHolder: adminFeeClaimRoleHolder,
30+
adminFeeSetRoleHolder: adminFeeSetRoleHolder
31+
})
32+
);
33+
vm.stopPrank();
34+
}
35+
36+
function _createDefaultOperatorRewards_SymbioticRewards(
37+
ISymbioticDefaultOperatorRewardsFactory symbioticDefaultOperatorRewardsFactory,
38+
address who
39+
) internal virtual returns (address defaultOperatorRewards) {
40+
vm.startPrank(who);
41+
defaultOperatorRewards = symbioticDefaultOperatorRewardsFactory.create();
42+
vm.stopPrank();
43+
}
44+
45+
function _distributeRewards_SymbioticRewards(
46+
address who,
47+
address defaultStakerRewards,
48+
address network,
49+
address token,
50+
uint256 amount,
51+
uint48 captureTimestamp
52+
) internal virtual {
53+
vm.startPrank(who);
54+
IERC20(token).forceApprove(defaultStakerRewards, amount);
55+
ISymbioticDefaultStakerRewards(defaultStakerRewards).distributeRewards(
56+
network,
57+
token,
58+
amount,
59+
abi.encode(
60+
captureTimestamp,
61+
ISymbioticDefaultStakerRewards(defaultStakerRewards).ADMIN_FEE_BASE(),
62+
new bytes(0),
63+
new bytes(0)
64+
)
65+
);
66+
vm.stopPrank();
67+
}
68+
69+
function _claimRewards_SymbioticRewards(
70+
address who,
71+
address defaultStakerRewards,
72+
address recipient,
73+
address token,
74+
address network
75+
) internal virtual {
76+
vm.startPrank(who);
77+
uint256 maxRewards = 1000;
78+
ISymbioticDefaultStakerRewards(defaultStakerRewards).claimRewards(
79+
recipient, token, abi.encode(network, maxRewards, new bytes[](0))
80+
);
81+
vm.stopPrank();
82+
}
83+
84+
function _claimRewards_SymbioticRewards(
85+
address who,
86+
address defaultStakerRewards,
87+
address token,
88+
address network
89+
) internal virtual {
90+
_claimRewards_SymbioticRewards(who, defaultStakerRewards, who, token, network);
91+
}
92+
93+
function _claimAdminFee_SymbioticRewards(
94+
address who,
95+
address defaultStakerRewards,
96+
address recipient,
97+
address token
98+
) internal virtual {
99+
vm.startPrank(who);
100+
ISymbioticDefaultStakerRewards(defaultStakerRewards).claimAdminFee(recipient, token);
101+
vm.stopPrank();
102+
}
103+
104+
function _claimAdminFee_SymbioticRewards(
105+
address who,
106+
address defaultStakerRewards,
107+
address token
108+
) internal virtual {
109+
_claimAdminFee_SymbioticRewards(who, defaultStakerRewards, who, token);
110+
}
111+
112+
function _setAdminFee_SymbioticRewards(
113+
address who,
114+
address defaultStakerRewards,
115+
uint256 adminFee
116+
) internal virtual {
117+
vm.startPrank(who);
118+
ISymbioticDefaultStakerRewards(defaultStakerRewards).setAdminFee(adminFee);
119+
vm.stopPrank();
120+
}
121+
122+
function _distributeRewards_SymbioticRewards(
123+
address who,
124+
address defaultOperatorRewards,
125+
address network,
126+
address token,
127+
uint256 amount,
128+
bytes32 root
129+
) internal virtual {
130+
vm.startPrank(who);
131+
IERC20(token).forceApprove(defaultOperatorRewards, amount);
132+
ISymbioticDefaultOperatorRewards(defaultOperatorRewards).distributeRewards(network, token, amount, root);
133+
vm.stopPrank();
134+
}
135+
136+
function _claimRewards_SymbioticRewards(
137+
address who,
138+
address defaultOperatorRewards,
139+
address recipient,
140+
address network,
141+
address token,
142+
uint256 totalClaimable,
143+
bytes32[] memory proof
144+
) internal virtual {
145+
vm.startPrank(who);
146+
ISymbioticDefaultOperatorRewards(defaultOperatorRewards).claimRewards(
147+
recipient, network, token, totalClaimable, proof
148+
);
149+
vm.stopPrank();
150+
}
151+
152+
function _claimRewards_SymbioticRewards(
153+
address who,
154+
address defaultOperatorRewards,
155+
address network,
156+
address token,
157+
uint256 totalClaimable,
158+
bytes32[] memory proof
159+
) internal virtual {
160+
_claimRewards_SymbioticRewards(who, defaultOperatorRewards, who, network, token, totalClaimable, proof);
161+
}
162+
163+
function _grantRole_SymbioticRewards(address who, address where, bytes32 role, address account) internal virtual {
164+
vm.startPrank(who);
165+
AccessControl(where).grantRole(role, account);
166+
vm.stopPrank();
167+
}
168+
169+
function _grantRoleDefaultAdmin_SymbioticRewards(address who, address where, address account) internal virtual {
170+
_grantRole_SymbioticRewards(who, where, AccessControl(where).DEFAULT_ADMIN_ROLE(), account);
171+
}
172+
173+
function _grantRoleAdminFeeClaim_SymbioticRewards(address who, address where, address account) internal virtual {
174+
_grantRole_SymbioticRewards(who, where, ISymbioticDefaultStakerRewards(where).ADMIN_FEE_CLAIM_ROLE(), account);
175+
}
176+
177+
function _grantRoleAdminFeeSet_SymbioticRewards(address who, address where, address account) internal virtual {
178+
_grantRole_SymbioticRewards(who, where, ISymbioticDefaultStakerRewards(where).ADMIN_FEE_SET_ROLE(), account);
179+
}
180+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.0;
3+
4+
import "./SymbioticRewardsImports.sol";
5+
6+
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
7+
8+
library SymbioticRewardsConstants {
9+
using Strings for string;
10+
11+
function defaultStakerRewardsFactory() internal view returns (ISymbioticDefaultStakerRewardsFactory) {
12+
if (block.chainid == 1) {
13+
// mainnet
14+
revert("SymbioticRewardsConstants.defaultStakerRewardsFactory(): mainnet not supported yet");
15+
} else if (block.chainid == 17_000) {
16+
// holesky
17+
return ISymbioticDefaultStakerRewardsFactory(0x698C36DE44D73AEfa3F0Ce3c0255A8667bdE7cFD);
18+
} else if (block.chainid == 11_155_111) {
19+
// sepolia
20+
return ISymbioticDefaultStakerRewardsFactory(0x70C618a13D1A57f7234c0b893b9e28C5cA8E7f37);
21+
} else {
22+
revert("SymbioticRewardsConstants.defaultStakerRewardsFactory(): chainid not supported");
23+
}
24+
}
25+
26+
function defaultOperatorRewardsFactory() internal view returns (ISymbioticDefaultOperatorRewardsFactory) {
27+
if (block.chainid == 1) {
28+
// mainnet
29+
revert("SymbioticRewardsConstants.defaultOperatorRewardsFactory(): mainnet not supported yet");
30+
} else if (block.chainid == 17_000) {
31+
// holesky
32+
return ISymbioticDefaultOperatorRewardsFactory(0x00055dee9933F578340db42AA978b9c8B25640f6);
33+
} else if (block.chainid == 11_155_111) {
34+
// sepolia
35+
return ISymbioticDefaultOperatorRewardsFactory(0x8D6C873cb7ffa6BE615cE1D55801a9417Ed55f9B);
36+
} else {
37+
revert("SymbioticRewardsConstants.defaultOperatorRewardsFactory(): chainid not supported");
38+
}
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.0;
3+
4+
import {
5+
IDefaultStakerRewards as ISymbioticDefaultStakerRewards,
6+
IStakerRewards as ISymbioticStakerRewards
7+
} from "../../src/interfaces/defaultStakerRewards/IDefaultStakerRewards.sol";
8+
import {IDefaultStakerRewardsFactory as ISymbioticDefaultStakerRewardsFactory} from
9+
"../../src/interfaces/defaultStakerRewards/IDefaultStakerRewardsFactory.sol";
10+
import {IDefaultOperatorRewards as ISymbioticDefaultOperatorRewards} from
11+
"../../src/interfaces/defaultOperatorRewards/IDefaultOperatorRewards.sol";
12+
import {IDefaultOperatorRewardsFactory as ISymbioticDefaultOperatorRewardsFactory} from
13+
"../../src/interfaces/defaultOperatorRewards/IDefaultOperatorRewardsFactory.sol";
14+
15+
interface SymbioticRewardsImports {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.25;
3+
4+
import {DefaultStakerRewards as SymbioticDefaultStakerRewards} from
5+
"../../src/contracts/defaultStakerRewards/DefaultStakerRewards.sol";
6+
import {DefaultStakerRewardsFactory as SymbioticDefaultStakerRewardsFactory} from
7+
"../../src/contracts/defaultStakerRewards/DefaultStakerRewardsFactory.sol";
8+
import {DefaultOperatorRewards as SymbioticDefaultOperatorRewards} from
9+
"../../src/contracts/defaultOperatorRewards/DefaultOperatorRewards.sol";
10+
import {DefaultOperatorRewardsFactory as SymbioticDefaultOperatorRewardsFactory} from
11+
"../../src/contracts/defaultOperatorRewards/DefaultOperatorRewardsFactory.sol";
12+
13+
interface SymbioticRewardsImportsContracts {}

0 commit comments

Comments
 (0)