Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for GovernorAccessControl in the BatchBuilder #132

Open
wants to merge 38 commits into
base: feat/sb-support
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
398fdb9
mega cluster [WIP]
kasperpawlowski Sep 30, 2024
d35fb6b
mega cluster [WIP]
kasperpawlowski Sep 30, 2024
ca532ab
mega cluster [WIP]
kasperpawlowski Oct 2, 2024
fd48951
feat: safe support [WIP]
kasperpawlowski Oct 3, 2024
b741a32
MEGA Cluster refactoring
kasperpawlowski Oct 3, 2024
6dd6d1b
chore: update oracle providers used
kasperpawlowski Oct 3, 2024
f9d1401
feat: SafeUtil
kasperpawlowski Oct 3, 2024
014303f
fix: remove redundant dependency
kasperpawlowski Oct 3, 2024
0e966d7
feat: add mega cluster overrides
kasperpawlowski Oct 3, 2024
33ddb72
define IRM classes
kasperpawlowski Oct 3, 2024
168b9a2
rename & refactor
kasperpawlowski Oct 4, 2024
d9e2cf5
improve comments
kasperpawlowski Oct 7, 2024
9cc3dd0
chore: rename
kasperpawlowski Oct 7, 2024
85a3177
chore: rename
kasperpawlowski Oct 7, 2024
d8f8772
feat: improve permit2 handling
kasperpawlowski Oct 7, 2024
d2d45ad
cluster refactor
kasperpawlowski Oct 7, 2024
d747435
cluster maintenance scripts refactor
kasperpawlowski Oct 7, 2024
62e64aa
feat: add escrow vault deployment script
kasperpawlowski Oct 8, 2024
1a33486
cluster maintenance scripts refactor [WIP]
kasperpawlowski Oct 8, 2024
89ee6d3
cluster maintenance scripts refactor [WIP]
kasperpawlowski Oct 10, 2024
2ae5b8e
add manual safe delegate management options
kasperpawlowski Oct 10, 2024
5a9d7c2
add batch dump
kasperpawlowski Oct 10, 2024
8556561
decouple safe interactions from the deployer account
kasperpawlowski Oct 10, 2024
52ed372
make the safe pk optional for manual operations
kasperpawlowski Oct 10, 2024
23b2330
finalize prime cluster
kasperpawlowski Oct 10, 2024
d3a43a6
improve batch dump
kasperpawlowski Oct 10, 2024
4449a46
readme formatting
kasperpawlowski Oct 10, 2024
5abebad
improve safe tx simulation
kasperpawlowski Oct 11, 2024
8bb165b
safe nonce overrides
kasperpawlowski Oct 11, 2024
e4c949f
chore: update README
kasperpawlowski Oct 11, 2024
27d9430
chore: update Prime cluster
kasperpawlowski Oct 14, 2024
6423d2a
feat: stringToAddress and oracle provider by address-string
kasperpawlowski Oct 14, 2024
c516754
define mTBILL oracle
kasperpawlowski Oct 14, 2024
73649fe
fix: typo
kasperpawlowski Oct 14, 2024
e2ea218
fix: typo
kasperpawlowski Oct 14, 2024
44144d7
Prime updates, change caps encoding
kasperpawlowski Oct 15, 2024
a97c021
Merge branch 'feat/sb-support' into batch-builder-governor-access-con…
kasperpawlowski Oct 15, 2024
2c9fef3
feat: detect GovernorAccessControl installed on a vault while buildin…
kasperpawlowski Oct 15, 2024
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
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
FORK_RPC_URL=
DEPLOYMENT_RPC_URL=
DEPLOYER_KEY=
SAFE_KEY=
SAFE_ADDRESS=
SAFE_NONCE=
VERIFIER_URL=
VERIFIER_API_KEY=
ADDRESSES_DIR_PATH=
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
[submodule "lib/euler-vault-kit"]
path = lib/euler-vault-kit
url = https://github.com/euler-xyz/euler-vault-kit
[submodule "lib/surl"]
path = lib/surl
url = https://github.com/memester-xyz/surl
[submodule "lib/openzeppelin-contracts-upgradeable"]
path = lib/openzeppelin-contracts-upgradeable
url = https://github.com/openzeppelin/openzeppelin-contracts-upgradeable
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,6 @@ No warranties are provided and no liability will be accepted for any loss incurr

Always include thorough tests when using EVK Periphery to ensure it interacts correctly with your code.

EVK Periphery is currently unaudited and should not be used in production.

## License

(c) 2024 Euler Labs Ltd.
Expand Down
3 changes: 2 additions & 1 deletion foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ number_underscore = "preserve"
override_spacing = true
wrap_comments = true
ignore = [
"script/production/mainnet/DeployCBBTC.s.sol"
"script/production/mainnet/clusters/MEGACluster.s.sol",
"script/production/mainnet/clusters/PrimeCluster.s.sol"
]

[profile.default.fuzz]
Expand Down
1 change: 1 addition & 0 deletions lib/surl
Submodule surl added at 034c91
3 changes: 2 additions & 1 deletion remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ euler-price-oracle/=lib/euler-price-oracle/src/
euler-price-oracle-test/=lib/euler-price-oracle/test/
fee-flow/=lib/fee-flow/src/
reward-streams/=lib/reward-streams/src/
surl/=lib/surl/src/
@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/
@openzeppelin/contracts/utils/structs/=lib/openzeppelin-contracts/contracts/utils/structs/
@openzeppelin/contracts/utils/introspection/=lib/openzeppelin-contracts/contracts/utils/introspection/
@openzeppelin/contracts/access/=lib/openzeppelin-contracts/contracts/access/
@openzeppelin/contracts/token/=lib/openzeppelin-contracts/contracts/token/
@openzeppelin/contracts/token/=lib/openzeppelin-contracts/contracts/token/
28 changes: 19 additions & 9 deletions script/01_Integrations.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ contract Integrations is ScriptUtils {
broadcast
returns (address evc, address protocolConfig, address sequenceRegistry, address balanceTracker, address permit2)
{
string memory inputScriptFileName = "01_Integrations_input.json";
string memory outputScriptFileName = "01_Integrations_output.json";
string memory json = getInputConfig(inputScriptFileName);
permit2 = abi.decode(vm.parseJson(json, ".permit2"), (address));

(evc, protocolConfig, sequenceRegistry, balanceTracker, permit2) = execute();
(evc, protocolConfig, sequenceRegistry, balanceTracker, permit2) = execute(permit2);

string memory object;
object = vm.serializeAddress("integrations", "evc", evc);
Expand All @@ -30,29 +33,36 @@ contract Integrations is ScriptUtils {
vm.writeJson(object, string.concat(vm.projectRoot(), "/script/", outputScriptFileName));
}

function deploy()
function deploy(address permit2)
public
broadcast
returns (address evc, address protocolConfig, address sequenceRegistry, address balanceTracker, address permit2)
returns (address evc, address protocolConfig, address sequenceRegistry, address balanceTracker, address)
{
(evc, protocolConfig, sequenceRegistry, balanceTracker, permit2) = execute();
(evc, protocolConfig, sequenceRegistry, balanceTracker, permit2) = execute(permit2);
return (evc, protocolConfig, sequenceRegistry, balanceTracker, permit2);
}

function execute()
function execute(address permit2)
public
returns (address evc, address protocolConfig, address sequenceRegistry, address balanceTracker, address permit2)
returns (address evc, address protocolConfig, address sequenceRegistry, address balanceTracker, address)
{
address deployer = getDeployer();

evc = address(new EthereumVaultConnector());
protocolConfig = address(new ProtocolConfig(deployer, deployer));
sequenceRegistry = address(new SequenceRegistry());
balanceTracker = address(new TrackingRewardStreams(evc, 14 days));
permit2 = PERMIT2_ADDRESS;

if (permit2.code.length == 0) {
DeployPermit2 deployPermit2 = new DeployPermit2();
deployPermit2.deployPermit2();
if (isLocalForkDeployment()) {
DeployPermit2 deployPermit2 = new DeployPermit2();
deployPermit2.deployPermit2();
permit2 = PERMIT2_ADDRESS;
} else {
revert("Permit2 not deployed yet under the specified address");
}
}

return (evc, protocolConfig, sequenceRegistry, balanceTracker, permit2);
}
}
69 changes: 69 additions & 0 deletions script/07_EVault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ pragma solidity ^0.8.0;
import {ScriptUtils} from "./utils/ScriptUtils.s.sol";
import {GenericFactory} from "evk/GenericFactory/GenericFactory.sol";
import {EulerRouter} from "euler-price-oracle/EulerRouter.sol";
import {IEVC} from "ethereum-vault-connector/interfaces/IEthereumVaultConnector.sol";
import {IEVault} from "evk/EVault/IEVault.sol";
import {EulerRouterFactory} from "../src/EulerRouterFactory/EulerRouterFactory.sol";
import {EscrowedCollateralPerspective} from "../src/Perspectives/deployed/EscrowedCollateralPerspective.sol";

contract EVaultDeployer is ScriptUtils {
function run() public broadcast returns (address oracleRouter, address eVault) {
Expand Down Expand Up @@ -81,6 +84,72 @@ contract EVaultDeployer is ScriptUtils {
}
}

contract EVaultSingletonEscrowDeployer is ScriptUtils {
function run() public broadcast returns (address eVault) {
string memory inputScriptFileName = "07_EVaultSingletonEscrow_input.json";
string memory outputScriptFileName = "07_EVaultSingletonEscrow_output.json";
string memory json = getInputConfig(inputScriptFileName);
address evc = abi.decode(vm.parseJson(json, ".evc"), (address));
address escrowedCollateralPerspective =
abi.decode(vm.parseJson(json, ".escrowedCollateralPerspective"), (address));
address eVaultFactory = abi.decode(vm.parseJson(json, ".eVaultFactory"), (address));
address asset = abi.decode(vm.parseJson(json, ".asset"), (address));

eVault = execute(evc, escrowedCollateralPerspective, eVaultFactory, asset);

string memory object;
object = vm.serializeAddress("eVault", "eVaultSingletonEscrow", eVault);
vm.writeJson(object, string.concat(vm.projectRoot(), "/script/", outputScriptFileName));
}

function deploy(address evc, address escrowedCollateralPerspective, address eVaultFactory, address asset)
public
broadcast
returns (address eVault)
{
eVault = execute(evc, escrowedCollateralPerspective, eVaultFactory, asset);
}

function execute(address evc, address escrowedCollateralPerspective, address eVaultFactory, address asset)
public
returns (address eVault)
{
eVault = EscrowedCollateralPerspective(escrowedCollateralPerspective).singletonLookup(asset);

if (eVault == address(0)) {
eVault = address(
GenericFactory(eVaultFactory).createProxy(
address(0), true, abi.encodePacked(asset, address(0), address(0))
)
);

address deployer = getDeployer();
IEVC.BatchItem[] memory items = new IEVC.BatchItem[](3);
items[0] = IEVC.BatchItem({
targetContract: eVault,
onBehalfOfAccount: deployer,
value: 0,
data: abi.encodeCall(IEVault(eVault).setHookConfig, (address(0), 0))
});
items[1] = IEVC.BatchItem({
targetContract: eVault,
onBehalfOfAccount: deployer,
value: 0,
data: abi.encodeCall(IEVault(eVault).setGovernorAdmin, (address(0)))
});
items[2] = IEVC.BatchItem({
targetContract: escrowedCollateralPerspective,
onBehalfOfAccount: deployer,
value: 0,
data: abi.encodeCall(
EscrowedCollateralPerspective(escrowedCollateralPerspective).perspectiveVerify, (eVault, true)
)
});
IEVC(evc).batch(items);
}
}
}

contract OracleRouterDeployer is ScriptUtils {
function run() public broadcast returns (address oracleRouter) {
string memory inputScriptFileName = "07_OracleRouter_input.json";
Expand Down
111 changes: 79 additions & 32 deletions script/interactiveDeployment.sh
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,15 @@ while true; do
baseName=01_Integrations
scriptName=${baseName}.s.sol
jsonName=$baseName

read -p "Enter the PERMIT2 contract address (default: 0x000000000022D473030F116dDEE9F6B43aC78BA3): " permit2
permit2=${permit2:-0x000000000022D473030F116dDEE9F6B43aC78BA3}

jq -n \
--arg permit2 "$permit2" \
'{
permit2: $permit2
}' --indent 4 > script/${jsonName}_input.json
;;
2)
echo "Deploying periphery factories..."
Expand Down Expand Up @@ -593,43 +602,81 @@ while true; do
;;
7)
echo "Deploying EVault..."
echo "Select the type of EVault to deploy:"
echo "0. Vanilla EVault"
echo "1. Singleton Escrow EVault"
read -p "Enter your choice (0-1): " vault_choice

baseName=07_EVault
scriptName=${baseName}.s.sol:EVaultDeployer
jsonName=$baseName

read -p "Should deploy a new router for the oracle? (y/n) (default: y): " deploy_router_for_oracle
deploy_router_for_oracle=${deploy_router_for_oracle:-y}
case $vault_choice in
0)
echo "Deploying vanilla EVault..."

scriptName=${baseName}.s.sol:EVaultDeployer
jsonName=07_EVault

oracle_router_factory=0x0000000000000000000000000000000000000000
if [[ $deploy_router_for_oracle != "n" ]]; then
read -p "Enter the Oracle Router Factory address: " oracle_router_factory
fi

read -p "Enter the EVault Factory address: " evault_factory
read -p "Should the vault be upgradable? (y/n) (default: n): " upgradable
upgradable=${upgradable:-n}
read -p "Enter the Asset address: " asset
read -p "Enter the Oracle address: " oracle
read -p "Enter the Unit of Account address: " unit_of_account
read -p "Should deploy a new router for the oracle? (y/n) (default: y): " deploy_router_for_oracle
deploy_router_for_oracle=${deploy_router_for_oracle:-y}

jq -n \
--argjson deployRouterForOracle "$(jq -n --argjson val \"$deploy_router_for_oracle\" 'if $val != "n" then true else false end')" \
--arg oracleRouterFactory "$oracle_router_factory" \
--arg eVaultFactory "$evault_factory" \
--argjson upgradable "$(jq -n --argjson val \"$upgradable\" 'if $val == "y" then true else false end')" \
--arg asset "$asset" \
--arg oracle "$oracle" \
--arg unitOfAccount "$unit_of_account" \
'{
deployRouterForOracle: $deployRouterForOracle,
oracleRouterFactory: $oracleRouterFactory,
eVaultFactory: $eVaultFactory,
upgradable: $upgradable,
asset: $asset,
oracle: $oracle,
unitOfAccount: $unitOfAccount
}' --indent 4 > script/${jsonName}_input.json
oracle_router_factory=0x0000000000000000000000000000000000000000
if [[ $deploy_router_for_oracle != "n" ]]; then
read -p "Enter the Oracle Router Factory address: " oracle_router_factory
fi

read -p "Enter the EVault Factory address: " evault_factory
read -p "Should the vault be upgradable? (y/n) (default: n): " upgradable
upgradable=${upgradable:-n}
read -p "Enter the Asset address: " asset
read -p "Enter the Oracle address: " oracle
read -p "Enter the Unit of Account address: " unit_of_account

jq -n \
--argjson deployRouterForOracle "$(jq -n --argjson val \"$deploy_router_for_oracle\" 'if $val != "n" then true else false end')" \
--arg oracleRouterFactory "$oracle_router_factory" \
--arg eVaultFactory "$evault_factory" \
--argjson upgradable "$(jq -n --argjson val \"$upgradable\" 'if $val == "y" then true else false end')" \
--arg asset "$asset" \
--arg oracle "$oracle" \
--arg unitOfAccount "$unit_of_account" \
'{
deployRouterForOracle: $deployRouterForOracle,
oracleRouterFactory: $oracleRouterFactory,
eVaultFactory: $eVaultFactory,
upgradable: $upgradable,
asset: $asset,
oracle: $oracle,
unitOfAccount: $unitOfAccount
}' --indent 4 > script/${jsonName}_input.json
;;
1)
echo "Deploying singleton escrow EVault..."

scriptName=${baseName}.s.sol:EVaultSingletonEscrowDeployer
jsonName=07_EVaultSingletonEscrow

read -p "Enter the EVC address: " evc
read -p "Enter the Escrowed Collateral Perspective address: " escrowed_collateral_perspective
read -p "Enter the EVault Factory address: " evault_factory
read -p "Enter the Asset address: " asset

jq -n \
--arg evc "$evc" \
--arg escrowedCollateralPerspective "$escrowed_collateral_perspective" \
--arg eVaultFactory "$evault_factory" \
--arg asset "$asset" \
'{
evc: $evc,
escrowedCollateralPerspective: $escrowedCollateralPerspective,
eVaultFactory: $eVaultFactory,
asset: $asset
}' --indent 4 > script/${jsonName}_input.json
;;
*)
echo "Invalid EVault choice. Exiting."
exit 1
;;
esac
;;
8)
echo "Deploying lenses..."
Expand Down
43 changes: 33 additions & 10 deletions script/production/ExecuteSolidityScript.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,53 @@ verify_contracts=${verify_contracts:-n}

if [[ $verify_contracts == "y" ]]; then
verify_contracts="--verify"
else
verify_contracts=""
fi

read -p "Provide the deployment name used to save results (default: default): " deployment_name
deployment_name=${deployment_name:-default}

if ! script/utils/checkEnvironment.sh $verify_contracts; then
echo "Environment check failed. Exiting."
exit 1
if [[ "$@" == *"--batch-via-safe"* ]]; then
batch_via_safe="--batch-via-safe"
fi

if [[ "$@" == *"--dry-run"* ]]; then
dry_run="--dry-run"
fi

if script/utils/executeForgeScript.sh "$scriptPath" $verify_contracts $dry_run; then
if [[ $dry_run == "" ]]; then
deployment_dir="script/deployments/$deployment_name"
chainId=$(cast chain-id --rpc-url $DEPLOYMENT_RPC_URL)
if ! script/utils/checkEnvironment.sh $verify_contracts $batch_via_safe; then
echo "Environment check failed. Exiting."
exit 1
fi

if script/utils/executeForgeScript.sh "$scriptPath" $verify_contracts $batch_via_safe $dry_run; then
chainId=$(cast chain-id --rpc-url $DEPLOYMENT_RPC_URL)
deployment_dir="script/deployments/$deployment_name"

if [[ $dry_run == "" ]]; then
mkdir -p "$deployment_dir/broadcast" "$deployment_dir/output"
cp "broadcast/${scriptName}/$chainId/run-latest.json" "$deployment_dir/broadcast/${scriptName}.json"

[ -f "script/CoreAddresses.json" ] && mv "script/CoreAddresses.json" "$deployment_dir/output/CoreAddresses.json"
[ -f "script/PeripheryAddresses.json" ] && mv "script/PeripheryAddresses.json" "$deployment_dir/output/PeripheryAddresses.json"
[ -f "script/LensAddresses.json" ] && mv "script/LensAddresses.json" "$deployment_dir/output/LensAddresses.json"
for json_file in script/*.json; do
jsonFileName=$(basename "$json_file")
counter=$(script/utils/getFileNameCounter.sh "$deployment_dir/output/$jsonFileName")

mv "$json_file" "$deployment_dir/output/${jsonFileName%.json}_$counter.json"
done
else
mkdir -p "$deployment_dir/dry-run/broadcast"
cp "broadcast/${scriptName}/$chainId/dry-run/run-latest.json" "$deployment_dir/dry-run/broadcast/${scriptName}.json"

for json_file in script/*.json; do
jsonFileName=$(basename "$json_file")
counter=$(script/utils/getFileNameCounter.sh "$deployment_dir/dry-run/$jsonFileName")

mv "$json_file" "$deployment_dir/dry-run/${jsonFileName%.json}_$counter.json"
done
fi
else
for json_file in script/*.json; do
rm "$json_file"
done
fi
Loading