Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .env.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
HOODI_RPC_URL=
MAINNET_RPC_URL=
ETHERSCAN_API_KEY=
DEPLOYER_PRIVATE_KEY=
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,11 @@ These functions verify balances and authorize the caller to retrieve their accum

### How to Deploy

**1)** Run the deployment script `DeployProxy.s.sol` defined in `scripts/`:
**2)** Set the environment variables in the `.env` file.

__`❍ npm run deploy:holesky`__: verification is done automatically.
**1)** Run the deployment script `DeployAllHoodi.s.sol` defined in `script/`:

__`❍ npm run deploy:hoodi`__: verification needs to be done manually for now.
__`❍ npm run deploy:hoodi-stage`__: verification is done automatically.

### How to Update Module Contracts

Expand Down
13 changes: 13 additions & 0 deletions artifacts/deploy-hoodi-stage.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"addresses": {
"BAppsModule": "0xF2b0c91b5256aD75585438C2722d5E7119666288",
"ProtocolModule": "0x5C08fb73Ba1E8Fd2894e0A3706C1e4CfBEA3F833",
"SSVBasedAppsImpl": "0x7E438E9264B431Fb62fbE2BFa350b9860cf7E8AA",
"SSVBasedAppsProxy": "0x1F3d4e4aEeA5406e3A7119d8daa31C67Ed3B13de",
"StrategyModule": "0x4b4638B067946c395C32CD0DFE5399E0899C7542"
},
"chainInfo": {
"chainId": 560048,
"deploymentBlock": 253405
}
}
9 changes: 9 additions & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ optimizer = true
optimizer_runs = 10_000
gas_reports = ["*"]
gas_reports_ignore = ["ERC20Mock", "BasedAppMock", "BasedAppMock2", "BasedAppMock3", "ERC1967Proxy"]
fs_permissions = [{ access = "read", path = "./script/config/"}, { access = "write", path = "./artifacts/"}]

[rpc_endpoints]
hoodi = "${HOODI_RPC_URL}"
mainnet = "${MAINNET_RPC_URL}"

[etherscan]
hoodi = { key = "${ETHERSCAN_API_KEY}" }
mainnet = { key = "${ETHERSCAN_API_KEY}" }

[fmt]
bracket_spacing = false
Expand Down
2 changes: 1 addition & 1 deletion lib/openzeppelin-contracts
2 changes: 1 addition & 1 deletion lib/openzeppelin-contracts-upgradeable
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@
"scripts": {
"compile": "forge compile",
"build": "npm run lint:fix && forge clean && forge build",
"deploy:holesky": "npm run build && forge script scripts/DeployProxy.s.sol --rpc-url $HOLESKY_RPC_URL --private-key $PRIVATE_KEY --verify -vvv --broadcast",
"deploy:hoodi": "npm run build && forge script scripts/DeployProxy.s.sol --rpc-url $HOODI_RPC_URL --private-key $PRIVATE_KEY --etherscan-api-key $ETHERSCAN_API_KEY --verify -vvv --broadcast",
"verify:hoodi": "forge verify-contract --rpc-url https://hoodi.cloud.blockscout.com/api/eth-rpc --verifier blockscout --verifier-url 'https://hoodi.cloud.blockscout.com/api/' $IMPLEMENTATION_ADDRESS src/SSVBasedApps.sol:SSVBasedApps",
"deploy:hoodi-stage": "source .env && forge script script/DeployAllHoodi.s.sol false --sig 'run(bool)' --rpc-url $HOODI_RPC_URL --private-key $DEPLOYER_PRIVATE_KEY --verify -vvv --broadcast",
"deploy:hoodi-prod": "source .env && forge script script/DeployAllHoodi.s.sol true --sig 'run(bool)' --rpc-url $HOODI_RPC_URL --private-key $DEPLOYER_PRIVATE_KEY --verify -vvv --broadcast",
"deploy:mainnet": "source .env && forge script script/DeployAllMainnet.s.sol --rpc-url $MAINNET_RPC_URL --private-key $DEPLOYER_PRIVATE_KEY --verify -vvv --broadcast",
"gas-report": "forge test --gas-report",
"generate-docs": "solc --include-path node_modules --base-path . --combined-json userdoc,devdoc src/SSVBasedApps.sol --output-dir ./docs --overwrite",
"prepare": "husky",
"lint:solhint": "solhint './src/**/*.sol'",
"lint:check": "prettier --check **.sol",
"lint:fix": "prettier --write **.sol",
"test": "forge test",
"test-coverage": "forge coverage --no-match-coverage \"(scripts|test)\"",
"test-coverage-report": "forge coverage --no-match-coverage \"(scripts|test)\" --report debug > test.txt"
"test-coverage": "forge coverage --no-match-coverage \"(script|test)\"",
"test-coverage-report": "forge coverage --no-match-coverage \"(script|test)\" --report debug > test.txt"
},
"devDependencies": {
"@openzeppelin/contracts-upgradeable": "^5.3.0",
Expand Down
6 changes: 2 additions & 4 deletions remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@
@ssv/src/middleware=src/middleware
@ssv/lib/=lib/
@ssv/test/=test/
@ssv/scripts/=scripts/
@ssv/forge-std/=lib/forge-std/src/
@ssv/script/=script/
@ssv/src/core=src/core
@ssv/src/core/interfaces=src/core/interfaces
@ssv/src/core/libraries=src/core/libraries
@ssv/src/core/modules=src/core/modules

@ssv/src/core/modules=src/core/modules
146 changes: 146 additions & 0 deletions script/DeployAll.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.29;

import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import { Script, console } from "forge-std/Script.sol";
import { stdJson } from "forge-std/StdJson.sol";

import { StrategyManager } from "src/core/modules/StrategyManager.sol";
import { BasedAppsManager } from "src/core/modules/BasedAppsManager.sol";
import { ProtocolManager } from "src/core/modules/ProtocolManager.sol";
import { SSVBasedApps } from "src/core/SSVBasedApps.sol";
import { ProtocolStorageLib } from "src/core/libraries/ProtocolStorageLib.sol";

contract DeployAll is Script {
using stdJson for string;

function _deployAll(string memory raw) internal returns (string memory) {
vm.startBroadcast();

SSVBasedApps impl = new SSVBasedApps();
StrategyManager strategyMod = new StrategyManager();
BasedAppsManager bAppsMod = new BasedAppsManager();
ProtocolManager protocolMod = new ProtocolManager();

ERC1967Proxy proxy = deployProxy(
impl,
strategyMod,
bAppsMod,
protocolMod,
raw
);

vm.stopBroadcast();

console.log("SSVBasedApps Impl: ", address(impl));
console.log("StrategyModule: ", address(strategyMod));
console.log("BAppsModule: ", address(bAppsMod));
console.log("ProtocolModule: ", address(protocolMod));
console.log("SSVBasedApps Proxy: ", address(proxy));

return saveToJson(impl, proxy, strategyMod, bAppsMod, protocolMod);
}

function saveToJson(
SSVBasedApps impl,
ERC1967Proxy proxy,
StrategyManager strategyMod,
BasedAppsManager bAppsMod,
ProtocolManager protocolMod
) internal returns (string memory) {
string memory parent = "parent";

string memory deployed_addresses = "addresses";
vm.serializeAddress(
deployed_addresses,
"SSVBasedAppsProxy",
address(proxy)
);
vm.serializeAddress(
deployed_addresses,
"SSVBasedAppsImpl",
address(impl)
);
vm.serializeAddress(
deployed_addresses,
"StrategyModule",
address(strategyMod)
);
vm.serializeAddress(
deployed_addresses,
"BAppsModule",
address(bAppsMod)
);

string memory deployed_addresses_output = vm.serializeAddress(
deployed_addresses,
"ProtocolModule",
address(protocolMod)
);

string memory chain_info = "chainInfo";
vm.serializeUint(chain_info, "deploymentBlock", block.number);
string memory chain_info_output = vm.serializeUint(
chain_info,
"chainId",
block.chainid
);

// serialize all the data
vm.serializeString(
parent,
deployed_addresses,
deployed_addresses_output
);

return vm.serializeString(parent, chain_info, chain_info_output);
}

function deployProxy(
SSVBasedApps impl,
StrategyManager strategyMod,
BasedAppsManager bAppsMod,
ProtocolManager protocolMod,
string memory raw
) internal returns (ERC1967Proxy proxy) {
return
new ERC1967Proxy(
address(impl),
abi.encodeWithSelector(
impl.initialize.selector,
msg.sender,
address(bAppsMod),
address(strategyMod),
address(protocolMod),
ProtocolStorageLib.Data({
feeTimelockPeriod: uint32(
raw.readUint(".feeTimelockPeriod")
),
feeExpireTime: uint32(raw.readUint(".feeExpireTime")),
withdrawalTimelockPeriod: uint32(
raw.readUint(".withdrawalTimelockPeriod")
),
withdrawalExpireTime: uint32(
raw.readUint(".withdrawalExpireTime")
),
obligationTimelockPeriod: uint32(
raw.readUint(".obligationTimelockPeriod")
),
obligationExpireTime: uint32(
raw.readUint(".obligationExpireTime")
),
tokenUpdateTimelockPeriod: uint32(
raw.readUint(".tokenUpdateTimelockPeriod")
),
maxShares: raw.readUint(".maxShares"),
maxFeeIncrement: uint32(
raw.readUint(".maxFeeIncrement")
),
disabledFeatures: uint32(
raw.readUint(".disabledFeatures")
)
})
)
);
}
}
27 changes: 27 additions & 0 deletions script/DeployAllHoodi.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.29;

import { Script } from "forge-std/Script.sol";
import { DeployAll } from "./DeployAll.sol";

contract DeployAllHoodi is Script, DeployAll {
function run(bool isProd) external {
if (block.chainid != 560_048) {
revert("This script is only for the Hoodi prod");
}

string memory cfgPath;
string memory outPath;
if (isProd) {
cfgPath = "script/config/hoodi-prod.json";
outPath = "artifacts/deploy-hoodi-prod.json";
} else {
cfgPath = "script/config/hoodi-stage.json";
outPath = "artifacts/deploy-hoodi-stage.json";
}

string memory finalJson = _deployAll(vm.readFile(cfgPath));

vm.writeJson(finalJson, outPath);
}
}
19 changes: 19 additions & 0 deletions script/DeployAllMainnet.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.29;

import { Script, console } from "forge-std/Script.sol";
import { DeployAll } from "./DeployAll.sol";

contract DeployAllHoodi is Script, DeployAll {
function run() external {
if (block.chainid != 1) {
revert("This script is only for Mainnet");
}

string memory finalJson = _deployAll(
vm.readFile("script/config/mainnet.json")
);

vm.writeJson(finalJson, "artifacts/deploy-mainnet.json");
}
}
12 changes: 12 additions & 0 deletions script/config/hoodi-prod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"feeTimelockPeriod": 86400,
"feeExpireTime": 3600,
"withdrawalTimelockPeriod": 172800,
"withdrawalExpireTime": 86400,
"obligationTimelockPeriod": 172800,
"obligationExpireTime": 86400,
"tokenUpdateTimelockPeriod": 3600,
"maxShares": "1e50",
"maxFeeIncrement": 500,
"disabledFeatures": 0
}
12 changes: 12 additions & 0 deletions script/config/hoodi-stage.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"feeTimelockPeriod": 86400,
"feeExpireTime": 3600,
"withdrawalTimelockPeriod": 172800,
"withdrawalExpireTime": 86400,
"obligationTimelockPeriod": 172800,
"obligationExpireTime": 86400,
"tokenUpdateTimelockPeriod": 3600,
"maxShares": "1e50",
"maxFeeIncrement": 500,
"disabledFeatures": 0
}
12 changes: 12 additions & 0 deletions script/config/mainnet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"feeTimelockPeriod": 604800,
"feeExpireTime": 86400,
"withdrawalTimelockPeriod": 1209600,
"withdrawalExpireTime": 259200,
"obligationTimelockPeriod": 1209600,
"obligationExpireTime": 259200,
"tokenUpdateTimelockPeriod": 1209600,
"maxShares": "1e50",
"maxFeeIncrement": 500,
"disabledFeatures": 3
}
Loading
Loading