From 888267cd2bc0ab4e352eabb1a5b78e32d3b69b1c Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Tue, 17 Dec 2024 12:51:36 +0100 Subject: [PATCH 1/9] feat: add utils dependency --- .gitignore | 1 + bun.lockb | Bin 190158 -> 197148 bytes contracts/Disputer.sol | 2 +- foundry.toml | 10 ++++--- package.json | 9 ++++--- remappings.txt | 2 +- scripts/Disputer.s.sol | 2 +- scripts/DistributionCreator.s.sol | 2 +- scripts/Distributor.s.sol | 2 +- scripts/MockToken.s.sol | 8 +++--- scripts/merklDeploy.s.sol | 2 +- scripts/utils/Base.s.sol | 39 ++++++++++++++++++++++++++++ test/DistributionCreator.t.sol | 2 +- test/unit/DistributionCreator.t.sol | 2 +- 14 files changed, 64 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 61df11c..d18d846 100644 --- a/.gitignore +++ b/.gitignore @@ -47,4 +47,5 @@ bin # foundry /out +/zkout /cache-forge diff --git a/bun.lockb b/bun.lockb index 744563c83c019048d1b11d99dca13b5b56cb3fd5..17580e39fc6eda7e31d59861fe726b8e82d69381 100755 GIT binary patch delta 44022 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 H%ys_;<mcL8 delta 40171 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 diff --git a/contracts/Disputer.sol b/contracts/Disputer.sol index 282fa5a..5ef17f4 100644 --- a/contracts/Disputer.sol +++ b/contracts/Disputer.sol @@ -33,7 +33,7 @@ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ */ -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; diff --git a/foundry.toml b/foundry.toml index 3c328cf..eee7172 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,13 +3,17 @@ auto_detect_solc = false src = 'contracts' out = 'out' test = 'test' -libs = ["node_modules", "lib"] +libs = ["node_modules"] script = 'scripts' cache_path = 'cache-forge' gas_reports = ["*"] optimizer_runs = 100 -fs_permissions = [{ access = "read", path = "./node_modules/@angleprotocol/sdk/dist/src/registry/registry.json" }] -solc = "0.8.24" +fs_permissions = [ + { access = "read", path = "./node_modules/@angleprotocol/sdk/dist/src/registry/registry.json" }, + { access = "write", path = "./transaction.json" }, + { access = "write", path = "./transactions.json" } +] +solc = "0.8.25" ffi = true diff --git a/package.json b/package.json index 3c47200..76a1f5d 100644 --- a/package.json +++ b/package.json @@ -31,14 +31,15 @@ }, "devDependencies": { "@angleprotocol/sdk": "2.34.5", - "@openzeppelin/contracts": "^4.8.1", - "@openzeppelin/contracts-upgradeable": "4.8.1", + "@openzeppelin/contracts": "^4.9.0", + "@openzeppelin/contracts-upgradeable": "4.9.0", "prettier": "^2.0.0", "prettier-plugin-solidity": "^1.1.3", "solhint": "^3.5.1", "solhint-plugin-prettier": "^0.0.5", "solidity-coverage": "^0.8.2", - "forge-std": "github:foundry-rs/forge-std#v1.9.4" + "forge-std": "github:foundry-rs/forge-std#v1.9.4", + "utils": "github:AngleProtocol/utils#refactor/utils" }, "dependencies": {} -} \ No newline at end of file +} diff --git a/remappings.txt b/remappings.txt index 79003cf..9cd779e 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,4 +1,4 @@ @openzeppelin/=node_modules/@openzeppelin/ forge-std/=node_modules/forge-std/src oz/=node_modules/@openzeppelin/contracts/ -utils/=lib/utils \ No newline at end of file +@utils/=node_modules/utils/src \ No newline at end of file diff --git a/scripts/Disputer.s.sol b/scripts/Disputer.s.sol index 1b6d08a..ca90e80 100644 --- a/scripts/Disputer.s.sol +++ b/scripts/Disputer.s.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.17; import { console } from "forge-std/console.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { BaseScript } from "./utils/Base.s.sol"; -import { JsonReader } from "./utils/JsonReader.sol"; import { Disputer } from "../contracts/Disputer.sol"; import { Distributor } from "../contracts/Distributor.sol"; diff --git a/scripts/DistributionCreator.s.sol b/scripts/DistributionCreator.s.sol index 309b897..c710d0c 100644 --- a/scripts/DistributionCreator.s.sol +++ b/scripts/DistributionCreator.s.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.17; import { console } from "forge-std/console.sol"; import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { BaseScript } from "./utils/Base.s.sol"; -import { JsonReader } from "./utils/JsonReader.sol"; import { DistributionCreator } from "../contracts/DistributionCreator.sol"; import { IAccessControlManager } from "../contracts/interfaces/IAccessControlManager.sol"; import { CampaignParameters } from "../contracts/struct/CampaignParameters.sol"; diff --git a/scripts/Distributor.s.sol b/scripts/Distributor.s.sol index 96caab5..d72aa32 100644 --- a/scripts/Distributor.s.sol +++ b/scripts/Distributor.s.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.17; import { console } from "forge-std/console.sol"; import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { BaseScript } from "./utils/Base.s.sol"; -import { JsonReader } from "./utils/JsonReader.sol"; import { Distributor, MerkleTree } from "../contracts/Distributor.sol"; import { IAccessControlManager } from "../contracts/interfaces/IAccessControlManager.sol"; diff --git a/scripts/MockToken.s.sol b/scripts/MockToken.s.sol index 699413e..acdaf39 100644 --- a/scripts/MockToken.s.sol +++ b/scripts/MockToken.s.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.17; import { console } from "forge-std/console.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { BaseScript } from "./utils/Base.s.sol"; -import { JsonReader } from "./utils/JsonReader.sol"; import { MockToken } from "../contracts/mock/MockToken.sol"; // Base contract with shared utilities @@ -45,9 +45,9 @@ contract Deploy is MockTokenScript { contract Mint is MockTokenScript { function run() external broadcast { // MODIFY THESE VALUES TO SET YOUR DESIRED MINT PARAMETERS - address token = address(0); - address recipient = address(0); - uint256 amount = 0; + address token = 0xb5eCAa1a867FeCCD6d87604bc16a2b6B53D706BF; + address recipient = 0x103eC7cF86CC6f1DAada07830C84f43B42Bf1eB3; + uint256 amount = 1e18; _run(token, recipient, amount); } diff --git a/scripts/merklDeploy.s.sol b/scripts/merklDeploy.s.sol index 8cfe1ce..ad5e53c 100644 --- a/scripts/merklDeploy.s.sol +++ b/scripts/merklDeploy.s.sol @@ -7,9 +7,9 @@ import { ProxyAdmin } from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { console } from "forge-std/console.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { CreateXConstants } from "./utils/CreateXConstants.sol"; -import { JsonReader } from "./utils/JsonReader.sol"; import { TokensUtils } from "./utils/TokensUtils.sol"; import { AccessControlManager } from "../contracts/AccessControlManager.sol"; diff --git a/scripts/utils/Base.s.sol b/scripts/utils/Base.s.sol index fc8e829..87c3b9d 100644 --- a/scripts/utils/Base.s.sol +++ b/scripts/utils/Base.s.sol @@ -16,6 +16,11 @@ abstract contract BaseScript is Script { /// @dev Used to derive the broadcaster's address if $DEPLOYER_ADDRESS is not defined. string internal mnemonic; + enum Operation { + Call, + DelegateCall + } + /// @dev Initializes the transaction broadcaster like this: /// /// - If $DEPLOYER_ADDRESS is defined, use it. @@ -38,4 +43,38 @@ abstract contract BaseScript is Script { _; vm.stopBroadcast(); } + + function _serializeJson( + uint256 chainId, + address to, + uint256 value, + bytes memory data, + Operation operation, + bytes memory additionalData + ) internal { + _serializeJson(chainId, to, value, data, operation, additionalData, address(0)); + } + + function _serializeJson( + uint256 chainId, + address to, + uint256 value, + bytes memory data, + Operation operation, + bytes memory additionalData, + address safe + ) internal { + string memory json = ""; + vm.serializeUint(json, "chainId", chainId); + vm.serializeAddress(json, "to", to); + vm.serializeUint(json, "value", value); + vm.serializeUint(json, "operation", uint256(operation)); + vm.serializeBytes(json, "additionalData", additionalData); + if (safe != address(0)) { + vm.serializeAddress(json, "safe", safe); + } + string memory finalJson = vm.serializeBytes(json, "data", data); + + vm.writeJson(finalJson, "./transaction.json"); + } } diff --git a/test/DistributionCreator.t.sol b/test/DistributionCreator.t.sol index 84d57d8..a095f6a 100644 --- a/test/DistributionCreator.t.sol +++ b/test/DistributionCreator.t.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.17; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { Test } from "forge-std/Test.sol"; import { console } from "forge-std/console.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { DistributionCreator, DistributionParameters, CampaignParameters } from "../contracts/DistributionCreator.sol"; import { Distributor, MerkleTree } from "../contracts/Distributor.sol"; import { Fixture, IERC20 } from "./Fixture.t.sol"; import { Errors } from "../contracts/utils/Errors.sol"; import { IAccessControlManager } from "../contracts/interfaces/IAccessControlManager.sol"; -import { JsonReader } from "../scripts/utils/JsonReader.sol"; import { MockToken } from "../contracts/mock/MockToken.sol"; contract DistributionCreatorCreateCampaignTest is Fixture { diff --git a/test/unit/DistributionCreator.t.sol b/test/unit/DistributionCreator.t.sol index 4d1f60c..0f67b16 100644 --- a/test/unit/DistributionCreator.t.sol +++ b/test/unit/DistributionCreator.t.sol @@ -3,12 +3,12 @@ pragma solidity ^0.8.17; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { Test } from "forge-std/Test.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { DistributionCreator, DistributionParameters, CampaignParameters, RewardTokenAmounts } from "../../contracts/DistributionCreator.sol"; import { Errors } from "../../contracts/utils/Errors.sol"; import { Fixture, IERC20 } from "../Fixture.t.sol"; import { IAccessControlManager } from "../../contracts/interfaces/IAccessControlManager.sol"; -import { JsonReader } from "../../scripts/utils/JsonReader.sol"; contract DistributionCreatorTest is Fixture { using SafeERC20 for IERC20; From 82094af4135938490c718a11bd56576bed3ab932 Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Tue, 17 Dec 2024 12:52:01 +0100 Subject: [PATCH 2/9] refactor: remove unused JsonReader.sol --- scripts/utils/JsonReader.sol | 108 ----------------------------------- 1 file changed, 108 deletions(-) delete mode 100644 scripts/utils/JsonReader.sol diff --git a/scripts/utils/JsonReader.sol b/scripts/utils/JsonReader.sol deleted file mode 100644 index 6e5e81d..0000000 --- a/scripts/utils/JsonReader.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.17; - -import { Script } from "forge-std/Script.sol"; -import { stdJson } from "forge-std/StdJson.sol"; - -contract JsonReader is Script { - using stdJson for string; - - error FileNotFound(string path); - error ValueNotFound(string path, string key); - error ChainNotSupported(uint256 chainId); - - // Mapping of chain IDs to their names - mapping(uint256 => string) internal chainNames; - - /// @notice Gets the network-specific config path - /// @return The full path to the network config file - function getPath() public view returns (string memory) { - string memory root = vm.projectRoot(); - return string.concat(root, "/node_modules/@angleprotocol/sdk/dist/src/registry/registry.json"); - } - - /// @notice Reads an address value from the network's JSON file - /// @param chainId The chain ID - /// @param key The JSON key to read - /// @return The address value - function readAddress(uint256 chainId, string memory key) public view returns (address) { - string memory path = getPath(); - return readAddressFromPath(path, string.concat(vm.toString(chainId), ".", key)); - } - - /// @notice Reads a string value from the network's JSON file - /// @param chainId The chain ID - /// @param key The JSON key to read - /// @return The string value - function readString(uint256 chainId, string memory key) public view returns (string memory) { - string memory path = getPath(); - return readStringFromPath(path, string.concat(vm.toString(chainId), ".", key)); - } - - /// @notice Reads a uint256 value from the network's JSON file - /// @param chainId The chain ID - /// @param key The JSON key to read - /// @return The uint256 value - function readUint(uint256 chainId, string memory key) public view returns (uint256) { - string memory path = getPath(); - return readUintFromPath(path, string.concat(vm.toString(chainId), ".", key)); - } - - /// @notice Reads a string array from the network's JSON file - /// @param chainId The chain ID - /// @param key The JSON key to read - /// @return The string array - function readStringArray(uint256 chainId, string memory key) public view returns (string[] memory) { - string memory path = getPath(); - return readStringArrayFromPath(path, string.concat(vm.toString(chainId), ".", key)); - } - - // Direct path reading functions - function readAddressFromPath(string memory path, string memory key) public view returns (address) { - string memory json = readJsonFile(path); - bytes memory raw = json.parseRaw(string.concat(".", key)); - if (raw.length == 0) revert ValueNotFound(path, key); - return bytesToAddress(raw); - } - - function readStringFromPath(string memory path, string memory key) public view returns (string memory) { - string memory json = readJsonFile(path); - bytes memory raw = json.parseRaw(string.concat(".", key)); - if (raw.length == 0) revert ValueNotFound(path, key); - return string(raw); - } - - function readUintFromPath(string memory path, string memory key) public view returns (uint256) { - string memory json = readJsonFile(path); - bytes memory raw = json.parseRaw(string.concat(".", key)); - if (raw.length == 0) revert ValueNotFound(path, key); - return abi.decode(raw, (uint256)); - } - - function readStringArrayFromPath(string memory path, string memory key) public view returns (string[] memory) { - string memory json = readJsonFile(path); - bytes memory raw = json.parseRaw(string.concat(".", key)); - if (raw.length == 0) revert ValueNotFound(path, key); - return abi.decode(raw, (string[])); - } - - /// @notice Reads a JSON file from the given path - /// @param path The path to the JSON file - /// @return The JSON content as a string - function readJsonFile(string memory path) public view returns (string memory) { - try vm.readFile(path) returns (string memory json) { - return json; - } catch { - revert FileNotFound(path); - } - } - - /// @notice Utility function to convert bytes to address - /// @param bys Bytes to convert - /// @return addr Resulting address - function bytesToAddress(bytes memory bys) private pure returns (address addr) { - assembly { - addr := mload(add(bys, 32)) - } - } -} From b46d7f2a0fd0158282a6a921e40ca6a1f3b5dbc3 Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Fri, 20 Dec 2024 08:15:12 +0100 Subject: [PATCH 3/9] feat: add upgrade script --- bash/foundryMultiChainScript.sh | 228 ++++++++++++++++++++++++++++++ foundry.toml | 18 ++- scripts/DistributionCreator.s.sol | 45 +++++- 3 files changed, 279 insertions(+), 12 deletions(-) create mode 100755 bash/foundryMultiChainScript.sh diff --git a/bash/foundryMultiChainScript.sh b/bash/foundryMultiChainScript.sh new file mode 100755 index 0000000..f200242 --- /dev/null +++ b/bash/foundryMultiChainScript.sh @@ -0,0 +1,228 @@ +#! /bin/bash + +function usage { + echo "bash foundryMultiChainScript.sh <foundry-script-path>" + echo "Lists all chains where Merkl DistributionCreator is deployed and allows selection" + echo "Example: bash foundryMultiChainScript.sh ./scripts/DistributionCreator.s.sol:UpgradeAndBuildUpgradeToPayload" + echo "" +} + +# Get list of chain IDs where DistributionCreator is deployed +function get_available_chains() { + local registry_file="node_modules/@angleprotocol/sdk/dist/src/registry/registry.json" + if [ ! -f "$registry_file" ]; then + echo "Registry file not found!" + exit 1 + fi + + jq -r 'to_entries | .[] | select(.value.Merkl.DistributionCreator != null) | .key' "$registry_file" +} + +# Get list of chains to deploy to, handling exclusions +function get_selected_chains() { + local chain_ids=("$@") + local selected_chains=() + local exclude_chain_ids=(314) # Default exclusions: filecoin + + read -p "Do you want to run the script on all chains? (y/n) -- Note: ChainIDs 314 and 324 is already excluded by default: " deploy_all + + if [[ "$deploy_all" == "y" ]]; then + for chain_id in "${chain_ids[@]}"; do + if [[ ! " ${exclude_chain_ids[@]} " =~ " ${chain_id} " ]]; then + selected_chains+=("$chain_id") + fi + done + else + read -p "Enter chain IDs to exclude (space-separated), or press enter to continue: " -a additional_exclude + exclude_chain_ids+=("${additional_exclude[@]}") + + for chain_id in "${chain_ids[@]}"; do + if [[ ! " ${exclude_chain_ids[@]} " =~ " ${chain_id} " ]]; then + selected_chains+=("$chain_id") + fi + done + fi + + printf "%s " "${selected_chains[@]}" +} + +# Get verification string for a specific chain +function get_verify_string() { + local chain_id=$1 + local verify_string="" + + local verifier_type_var="VERIFIER_TYPE_${chain_id}" + local verifier_type=$(eval "echo \$$verifier_type_var") + + if [ ! -z "${verifier_type}" ]; then + verify_string="--verify --verifier ${verifier_type}" + + # Add verifier URL if present + local verifier_url_var="VERIFIER_URL_${chain_id}" + local verifier_url=$(eval "echo \$$verifier_url_var") + if [ ! -z "${verifier_url}" ]; then + verify_string="${verify_string} --verifier-url ${verifier_url}" + fi + + # Add API key if present + local verifier_api_key_var="VERIFIER_API_KEY_${chain_id}" + local verifier_api_key=$(eval "echo \$$verifier_api_key_var") + if [ ! -z "${verifier_api_key}" ]; then + if [ "${verifier_type}" == "etherscan" ]; then + verify_string="${verify_string} --etherscan-api-key ${verifier_api_key}" + else + verify_string="${verify_string} --verifier-api-key ${verifier_api_key}" + fi + fi + fi + + echo "$verify_string" +} + +# Get compilation flags for a specific chain +function get_compile_flags() { + local chain_id=$1 + + london_chain_ids=(30 122 592 1284 1923 10242 108 250 42220 59144) + legacy_chain_ids=(196 250 1329 3776 480 2046399126 42793) + zk_chain_ids=(324) + if [[ " ${london_chain_ids[@]} " =~ " ${chain_id} " ]]; then + echo "--evm-version london" + elif [[ " ${legacy_chain_ids[@]} " =~ " ${chain_id} " ]]; then + echo "--legacy" + elif [[ " ${zk_chain_ids[@]} " =~ " ${chain_id} " ]]; then + echo "--zksync" + else + echo "" + fi +} + +function main { + # Check if script path is provided + if [ -z "$1" ]; then + usage + exit 1 + fi + + FOUNDRY_SCRIPT="$1" + + # Verify the script exists + if [ ! -f "$FOUNDRY_SCRIPT" ]; then + echo "Error: Script file '$FOUNDRY_SCRIPT' not found!" + exit 1 + fi + + # Path to the registry file + registry_file="node_modules/@angleprotocol/sdk/dist/src/registry/registry.json" + + if [ ! -f "$registry_file" ]; then + echo "Registry file not found!" + exit 1 + fi + + + # Store chain IDs in an array + chain_ids=() + while IFS= read -r chain_id; do + chain_ids+=("$chain_id") + done <<< "$(jq -r 'to_entries | .[] | select(.value.Merkl.DistributionCreator != null) | .key' "$registry_file")" + + # Display all chains + echo "Chain IDs where Merkl DistributionCreator is deployed: ${chain_ids[@]}" + + echo "" + selected_chains=($(get_selected_chains "${chain_ids[@]}")) + + source .env + rm -f ./transaction.json + + # Initialize arrays for tracking deployment status + successful_chains=() + failed_chains=() + + # Prompt user for broadcast and verify options + read -p "Do you want to broadcast the transaction? (y/n): " broadcast_choice + + # Set flags based on user input + if [ "$broadcast_choice" == "y" ]; then + broadcast_flag="--broadcast" + read -p "Do you want to verify the transaction? (y/n): " verify_choice + else + broadcast_flag="" + fi + + # Run forge script for each selected chain + for chain_id in "${selected_chains[@]}"; do + echo "Running forge script for chain ID: $chain_id" + rpc_url_var="ETH_NODE_URI_${chain_id}" + rpc_url=$(eval "echo \$$rpc_url_var") + + # Check if chain ID already exists in transactions.json + if [ -f "./transactions.json" ] && jq -e "has(\"$chain_id\")" ./transactions.json > /dev/null; then + echo "Chain ID $chain_id already exists in transactions.json, skipping..." + continue + fi + + # Verification string based on chain-specific environment variables + if [ "$verify_choice" == "y" ]; then + verify_string=$(get_verify_string "$chain_id") + else + verify_string="" + fi + + # Compilation specific flags + compile_flags=$(get_compile_flags "$chain_id") + + cmd="forge script $FOUNDRY_SCRIPT $broadcast_flag --rpc-url $rpc_url $compile_flags $verify_string --force" + echo "Running command: $cmd" + if eval $cmd && [ -f "./transaction.json" ]; then + successful_chains+=("$chain_id") + else + failed_chains+=("$chain_id") + fi + + # Create a new JSON object with chain ID as key and transaction data as value + if [ -f "./transaction.json" ]; then + jq -s '.[0] * {("'$chain_id'"): .[1]}' \ + ./transactions.json \ + ./transaction.json > ./transactions.json.tmp + + mv ./transactions.json.tmp ./transactions.json + rm -f ./transaction.json + fi + + # Add verification step if verification was requested + if [ "$verify_choice" == "y" ]; then + echo "Attempting contract verification..." + # Extract contract address from the data field (removing 0x3659cfe6 prefix and any leading zeros) + contract_address=$(jq -r --arg chainid "$chain_id" '.[$chainid].data' ./transactions.json | sed 's/^0x3659cfe6000000000000000000000000//') + + if [ ! -z "$contract_address" ] && [ "$contract_address" != "null" ]; then + # Get verification parameters from environment variables + verify_flag=$(get_verify_string "$chain_id" | sed 's/--verify //') + compile_flags=$(get_compile_flags "$chain_id" | sed 's/--legacy //') + verify_cmd="forge verify-contract --rpc-url $rpc_url 0x$contract_address contracts/DistributionCreator.sol:DistributionCreator $verify_flag $compile_flags --watch" + echo "Running verification command: $verify_cmd" + if eval $verify_cmd; then + echo "✅ Contract verification successful" + else + echo "❌ Contract verification failed" + fi + fi + fi + + echo "Safe to cancel job for 5 seconds" + sleep 5 + echo "Starting next chain" + done + + # Display final deployment status + if [ ${#successful_chains[@]} -gt 0 ]; then + echo -e "\n✅ Deployment successful on chains: ${successful_chains[*]}" + fi + if [ ${#failed_chains[@]} -gt 0 ]; then + echo -e "\n❌ Deployment issues on chains: ${failed_chains[*]}" + fi +} + +main "$@" \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index eee7172..85357db 100644 --- a/foundry.toml +++ b/foundry.toml @@ -43,7 +43,6 @@ bob = "${BOB_NODE_URI}" linea = "${LINEA_NODE_URI}" zksync = "${ZKSYNC_NODE_URI}" mantle = "${MANTLE_NODE_URI}" -filecoin = "${FILECOIN_NODE_URI}" blast = "${BLAST_NODE_URI}" mode = "${MODE_NODE_URI}" thundercore = "${THUNDERCORE_NODE_URI}" @@ -70,13 +69,13 @@ swell = "${SWELL_NODE_URI}" fork = "${ETH_NODE_URI_FORK}" [etherscan] -localhost = { url = "http://localhost:4000", key = "${LOCALHOST_ETHERSCAN_API_KEY}" } +localhost = { url = "http://localhost:4000", key = "none" } mainnet = { chainId = 1, key = "${MAINNET_ETHERSCAN_API_KEY}", url = "https://api.etherscan.io/api" } polygon = { chainId = 137, key = "${POLYGON_ETHERSCAN_API_KEY}", url = "https://api.polygonscan.com/api" } fantom = { chainId = 250, key = "${FANTOM_ETHERSCAN_API_KEY}", url = "https://api.ftmscan.com/api" } optimism = { chainId = 10, key = "${OPTIMISM_ETHERSCAN_API_KEY}", url = "https://api-optimistic.etherscan.io/api" } arbitrum = { chainId = 42161, key = "${ARBITRUM_ETHERSCAN_API_KEY}", url = "https://api.arbiscan.io/api" } -avalanche = { chainId = 43114, key = "${AVALANCHE_ETHERSCAN_API_KEY}", url = "api.avascan.info/v2/network/mainnet/evm/43114/etherscan" } +avalanche = { chainId = 43114, key = "${AVALANCHE_ETHERSCAN_API_KEY}", url = "https://api.avascan.info/v2/network/mainnet/evm/43114/etherscan" } aurora = { chainId = 1313161554, key = "${AURORA_ETHERSCAN_API_KEY}", url = "http://localhost:4000" } bsc = { chainId = 56, key = "${BSC_ETHERSCAN_API_KEY}", url = "https://api.bscscan.com/api" } gnosis = { chainId = 100, key = "${GNOSIS_ETHERSCAN_API_KEY}", url = "https://api.gnosisscan.io/api" } @@ -86,7 +85,6 @@ bob = { chainId = 60808, key = "${BOB_ETHERSCAN_API_KEY}", url = "https://explor linea = { chainId = 59144, key = "${LINEA_ETHERSCAN_API_KEY}", url = "https://api.lineascan.build/api" } zksync = { chainId = 324, key = "${ZKSYNC_ETHERSCAN_API_KEY}", url = "https://explorer.sepolia.era.zksync.dev/contract_verification" } mantle = { chainId = 5000, key = "${MANTLE_ETHERSCAN_API_KEY}", url = "https://api.routescan.io/v2/network/mainnet/evm/43114/etherscan" } -filecoin = { chainId = 314, key = "${FILECOIN_ETHERSCAN_API_KEY}", url = "" } blast = { chainId = 81457, key = "${BLAST_ETHERSCAN_API_KEY}", url = "https://api.blastscan.io/api" } mode = { chainId = 34443, key = "${MODE_ETHERSCAN_API_KEY}", url = "https://api.routescan.io/v2/network/mainnet/evm/34443/etherscan/api" } thundercore = { chainId = 108, key = "${THUNDERCORE_ETHERSCAN_API_KEY}", url = "" } @@ -96,14 +94,14 @@ taiko = { chainId = 167000, key = "${TAIKO_ETHERSCAN_API_KEY}", url = "https://a fuse = { chainId = 122, key = "${FUSE_ETHERSCAN_API_KEY}", url = "https://explorer.fuse.io/api" } immutable = { chainId = 13371, key = "${IMMUTABLE_ETHERSCAN_API_KEY}", url = "https://immutable-mainnet.blockscout.com/api" } scroll = { chainId = 534352, key = "${SCROLL_ETHERSCAN_API_KEY}", url = "https://api.scrollscan.com/api" } -manta = { chainId = 169, key = "${MANTA_ETHERSCAN_API_KEY}", url = "" } -sei = { chainId = 1329, key = "${SEI_ETHERSCAN_API_KEY}", url = "" } +manta = { chainId = 169, key = "${MANTA_ETHERSCAN_API_KEY}", url = "https://pacific-explorer.manta.network/api" } +sei = { chainId = 1329, key = "${SEI_ETHERSCAN_API_KEY}", url = "https://seitrace.com/pacific-1/api" } celo = { chainId = 42220, key = "${CELO_ETHERSCAN_API_KEY}", url = "https://api.celoscan.io/api" } fraxtal = { chainId = 252, key = "${FRAXTAL_ETHERSCAN_API_KEY}", url = "https://api.fraxscan.io/api" } -astar = { chainId = 592, key = "${ASTAR_ETHERSCAN_API_KEY}", url = "" } -astarzkevm = { chainId = 3776, key = "${ASTARZKEVM_ETHERSCAN_API_KEY}", url = "" } -rootstock = { chainId = 30, key = "${ROOTSTOCK_ETHERSCAN_API_KEY}", url = "" } -moonbeam = { chainId = 1284, key = "${MOONBEAM_ETHERSCAN_API_KEY}", url = "" } +astar = { chainId = 592, key = "${ASTAR_ETHERSCAN_API_KEY}", url = "https://astar.blockscout.com/api/" } +astarzkevm = { chainId = 3776, key = "${ASTARZKEVM_ETHERSCAN_API_KEY}", url = "https://astar-zkevm.explorer.startale.com/api" } +rootstock = { chainId = 30, key = "${ROOTSTOCK_ETHERSCAN_API_KEY}", url = "https://rootstock.blockscout.com/api/" } +moonbeam = { chainId = 1284, key = "${MOONBEAM_ETHERSCAN_API_KEY}", url = "https://api-moonbase.moonscan.io/api" } skale = { chainId = 2046399126, key = "${SKALE_ETHERSCAN_API_KEY}", url = "https://internal-hubs.explorer.mainnet.skalenodes.com:10001/api" } worldchain = { chainId = 480, key = "${WORLDCHAIN_ETHERSCAN_API_KEY}", url = "https://worldchain-mainnet.explorer.alchemy.com/api" } lisk = { chainId = 1135, key = "${LISK_ETHERSCAN_API_KEY}", url = "https://blockscout.lisk.com/api/" } diff --git a/scripts/DistributionCreator.s.sol b/scripts/DistributionCreator.s.sol index c710d0c..3c4eb67 100644 --- a/scripts/DistributionCreator.s.sol +++ b/scripts/DistributionCreator.s.sol @@ -3,8 +3,10 @@ pragma solidity ^0.8.17; import { console } from "forge-std/console.sol"; import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { JsonReader } from "@utils/JsonReader.sol"; +import { CommonUtils } from "@utils/CommonUtils.sol"; +import { ContractType } from "@utils/Constants.sol"; import { BaseScript } from "./utils/Base.s.sol"; import { DistributionCreator } from "../contracts/DistributionCreator.sol"; @@ -13,7 +15,7 @@ import { CampaignParameters } from "../contracts/struct/CampaignParameters.sol"; import { MockToken } from "../contracts/mock/MockToken.sol"; // Base contract with shared utilities -contract DistributionCreatorScript is BaseScript, JsonReader { +contract DistributionCreatorScript is BaseScript, CommonUtils { struct CampaignInput { address creator; address rewardToken; @@ -255,6 +257,19 @@ contract SetMessage is DistributionCreatorScript { } } +// GetMessage script +contract GetMessage is DistributionCreatorScript { + function run() external broadcast { + uint256 chainId = block.chainid; + address creatorAddress = readAddress(chainId, "Merkl.DistributionCreator"); + + console.log("Creator address:", creatorAddress); + string memory message = DistributionCreator(creatorAddress).message(); + + console.log("Message is:", message); + } +} + // ToggleSigningWhitelist script contract ToggleSigningWhitelist is DistributionCreatorScript { function run() external { @@ -506,3 +521,29 @@ contract SignAndCreateCampaign is DistributionCreatorScript { console.log("Message signed and campaign created with ID:", vm.toString(campaignId)); } } + +contract UpgradeAndBuildUpgradeToPayload is DistributionCreatorScript { + function run() external { + uint256 chainId = block.chainid; + address distributionCreator = this.chainToContract(chainId, ContractType.DistributionCreator); + + address distributionCreatorImpl = address(new DistributionCreator()); + + bytes memory payload = abi.encodeWithSelector( + ITransparentUpgradeableProxy.upgradeTo.selector, + distributionCreatorImpl + ); + + try this.chainToContract(chainId, ContractType.AngleLabsMultisig) returns (address safe) { + _serializeJson( + chainId, + distributionCreator, // target address (the proxy) + 0, // value + payload, // direct upgrade call + Operation.Call, // standard call (not delegate) + hex"", // signature + safe // safe address + ); + } catch {} + } +} From 73316e5283fc6c9de44a16872946dba9bbb3fd1e Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Fri, 20 Dec 2024 08:15:35 +0100 Subject: [PATCH 4/9] feat: set dumper as fee recipient --- scripts/merklDeploy.s.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/merklDeploy.s.sol b/scripts/merklDeploy.s.sol index ad5e53c..4501cb7 100644 --- a/scripts/merklDeploy.s.sol +++ b/scripts/merklDeploy.s.sol @@ -157,7 +157,7 @@ contract MainDeployScript is Script, JsonReader, TokensUtils, CreateXConstants { vm.startBroadcast(DEPLOYER_PRIVATE_KEY); // Set params and transfer ownership - setDistributionCreatorParams(address(creator.proxy), aglaMerkl, KEEPER); + setDistributionCreatorParams(address(creator.proxy), aglaMerkl, DUMPER); setDistributorParams(address(distributor.proxy), DISPUTE_TOKEN, KEEPER); // Deploy Disputer @@ -354,7 +354,7 @@ contract MainDeployScript is Script, JsonReader, TokensUtils, CreateXConstants { SETTERS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/ - function setDistributionCreatorParams(address _distributionCreator, address aglaMerkl, address keeper) public { + function setDistributionCreatorParams(address _distributionCreator, address aglaMerkl, address dumper) public { console.log("\n=== Setting DistributionCreator params ==="); DistributionCreator distributionCreator = DistributionCreator(_distributionCreator); @@ -368,8 +368,8 @@ contract MainDeployScript is Script, JsonReader, TokensUtils, CreateXConstants { distributionCreator.setRewardTokenMinAmounts(tokens, minAmounts); // Set keeper as fee recipient - console.log("Setting keeper as fee recipient:", keeper); - distributionCreator.setFeeRecipient(keeper); + console.log("Setting dumper as fee recipient:", dumper); + distributionCreator.setFeeRecipient(dumper); // Set campaign fees to 5% for airdrop campaigns console.log("Setting campaign fees to 5% for airdrop campaigns"); From 28550c55fdbb66810c6fdb0be5da7bd12579c705 Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Fri, 20 Dec 2024 09:13:30 +0100 Subject: [PATCH 5/9] refactor: script in helpers --- {bash => helpers}/foundryMultiChainScript.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {bash => helpers}/foundryMultiChainScript.sh (100%) diff --git a/bash/foundryMultiChainScript.sh b/helpers/foundryMultiChainScript.sh similarity index 100% rename from bash/foundryMultiChainScript.sh rename to helpers/foundryMultiChainScript.sh From 9ef4f4a0dd54f57be5289d55447178954874c838 Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Fri, 20 Dec 2024 12:12:10 +0100 Subject: [PATCH 6/9] refactor: revert to JsonReader to fix build issue --- bun.lockb | Bin 197148 -> 196134 bytes package.json | 2 +- scripts/DistributionCreator.s.sol | 12 ++++++++---- test/DistributionCreator.t.sol | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/bun.lockb b/bun.lockb index 17580e39fc6eda7e31d59861fe726b8e82d69381..eb67f44f89a74189122f95e3e4d7c7ff05d71c45 100755 GIT binary patch delta 2429 zcmdUv`%~0a7{<Tn3nH-K0;WJ-SQbz$S~VyEB^S*Ji44U?j2XwKk(?dFY_hB-7Y7p< zwWvi78b6rRI9`4zhnaRtB~+ZI>ttREFO7y{sNCcdi|$s>v-|!Ny~D$K&gYyx-*b7- zY1tlg&~IsQ%&LFU@q;V+;Ek7Ko1+q}T|YJ!_w?P&o4veaMa1hR$zugg0n=a%ezYpZ zJkoP)OS82#DXzh)&#hC=)`64@?|M4&b3DFJay>SCc<UQ2yR5CRwKP~;_aARMvhdKC zA0EBiIa;+j|FejDZKZdzTyHx(le23!@4oa-V_#<1;)dJ<XZKmR9PUodzP<Czr!!Y? zJM}_k-Hy*soZGV`^A)|hQdQ^+>(o;3+FE5%o;kK~Z}ocBp5dvpXX1lVEZH_-{(t}L z>aD6WxS+Tb^P>lPRB*!^hxD;t<<!HyYJq!F5E;f-XybW=LsNwv7d8&{H^V~kBp8Q@ zfKEw!o0Q|h&ax5Fj*>PK`c@eG(?&txhgg+y8ipT^hJFe`qXQ+a1^QVS2j=8rpkIW2 zhmtlH`c)VQ=Hw<ojl$TU)~e_BtBLM7SSQ5c_%k-eL(?I~d0`3gO;|VAe?izp_*D=; zaZ%Vq@a4iT3FE$2;<wzB-@v%U$xv~au_(AHozgK8uv9kpvalquA~5dB6=BKn)4{kW zSM@!tqu`n}O#!k=(;r~`7SAw4*mdbQ4J;0fTX;hk4qz+(l%^D*Z4jeNm<_&$0C5wH z+m#A!CqQ&dKRY~^$ha*m4gPmwcZ8*bafOV#A?7wRP~j38%um`G5a-P36*d$820V|t zPgo}WEn)pAu{2{A^cOs1Q2IRrKPqepCHLo1$fw-+j~J1TS@2`h@o!;|fz`uXQF0JA zJD_2R;S)9+-UTtaI0pO8fu4mJ_W?M;xljefL<+d2<Kw6>tC%(a2+M|NR+0THEC)Uj zqcD@W3}E94sGK7sl&~k^%fOgirm%VNPA(l0CQO$Os&IFq&~Tx7=rIq!X3C8dmJiP_ zGlwFC&4=Fs*`V>l7QojEixgIXx>aTv1xEW6)CrGp8!^&xA!?UH(1;c01iLD1g0Moc zYr?F;7J*%aXF|mZTMXX@&qRqA_B8xA!V-cEC%XjjIfw@~QNJ{V%QXpY_%oh?cwRiB z#9)8iP56!QTv(E@rSNY40FkVZVF>pWX<`c0O4C$fC169srU~N=m<628bYaWjnFVAi z!k&jOgBUhprSK==IknUft1y<Mau^lP%`P2Rz#o7wMwupzgVn)vqUpj`!gJl6REDs2 z-X27`U-u2G;$jOtACp*!?=9~L^Pi6?A5Z2uA4jGzQ<mw-w~dMQFf;|?Lp9CtZXHn{ zt5m+ge2Q#PDrAS!AU+*D*csl~QB|XKvrny!Vw&<)vh|2hUD4OaRJ;D-zG~D(4^)Y6 zd7#R*5C7tMp;kh?#k`?edbM9Ij%VgFQ|q95=zYD{ujcD+zjBV-jrvZV5m0Fn9a#Hm zQ@aAnp$`R=%~I#bIEZwMsr!dj2JV;len9P;5M6FTU&Jz(z7=B@=HSMqqKZ{lmqiqn zCco9UH&U(1apXCWXSry>(yD#ui_RpxH}Z9)3O0BvV$Gv#qMKczp>j9qo3ENqZ)TOb iUs={~2+<D$ruY0t)8C--^rk(gea~Q6mfo~gHU9_dX_n#u delta 2554 zcmXw*2~d?)7>3XJS=4)hi@4wdak+{M0s<mPf`XbNnM<ytW&;9FluMbk>ZQqXDV<Sq zJfx<Mj+vUKp<T7o%5`cg3sgjz)XdDm1%bc->wV$#8{T`~|2gOUXZy~tpETJwFZEj! z)A#hM6Bj2`bl!M9GUvql8>1WUooyIfTHW#1fvDocA<d;PtkPbJQL}bxn6>Nf!8eN? zJ`OwwmG}o1Ioh5&7WHDcrv3BHtGPO@<XTwSJ4J_L6N+wc8dT(Tw)O9|R;fIt3N7?- z6&-Z-FX_2?m7{3eUT+;#61utQiB0|Lqdi0ITME6pMW2}y<;pmIc#<PF^_RNc^>5S$ zOgV8Qe!i>Aj*%r5^Aft}-rG7o+=|}*+L9$RKfH9ueWmo|yDz2P`ncS5%F{C@YxUUi zSS$4qdJ^7cl{4E^UO3<TxTAPr%9PiA*DPARuW7;AOy|zgFPHkfZQJ-(x5W!5%?zx6 ze{5DsN>%Qrd55>>?C6@1vvb0Lg|qJzb9H0PwgP>MKclcTZ_l|o`rC+ggFBj|t96_Q zKh?8X8E1QNw{_^7wdPQjPBYb2dZ@dd%;hNRSnUlRY~5LP41gQt1050ewJ=|>0%6Cc zZyT`hr2d4IZNW~%GgwE<G0(O#xB6b74e*Cns7|8fz;@^-VSEX#AM~@ZGblM>f9Sk0 zzJoRZ`c2r6D7gsc$9iFGua#S=K)_`Je{F$EwFgUs*oiM;br7@xE9S~eg>`_R3UTFS z!aBlF6LvvZCp_n&FL&c27#G(W${Yd6?I@Rq!SLf{TQ3Xi0+s>B-KY@O75*tO?#2~U zeNT5ty((4Rft*rR3C6KPpa@~VOS@38Krn9JHIsf{cW_^qsxYAUAjS=0PWVgkj6Z~h z!*k}0o5Ec1oF(H=VLjll2)iY$C)hP%f3-5ViU8y!czCy^VJ~=gBKsR9rmT8H?8K;& zc75RMg)!5)?!Hiiu=~<366}$%2g3S+g)$i!)qp(sC}<@-6XYLh7!6+wF*q3hR1B04 zF=;p$S%2tRh{3@)=~!q6#H4AGc5(1bASOt&TVOmMm_da6WZ+K?fP(QBX3c-X65yxt z%?vD;?FK><!I(%|SR#BHw*z4bOM*`q<|WLGuh!n~B=lx_c?(U3=g7<#A7M|!J7i>E zFxtV;Wq3wAX_o?DA<QN$73``oyRac(m95OJ`~(gKya3+=rN6K=_@^KqSb(r}c&9Lj zuwi%(7ZxaNIG&kxjP_vsa*TkObc{}57QYeC;NdxlhZt<K9^!I!ZK+dg6cEpl=hj`` zn*l!`o|_UPY&5(Zo)Kye;uY>NsbX3zmnx^QF<>>q!i8}LOf62^C2TA_XGPXS*f@Bm zR?G5)jmI<dyk&W<%&jH>FxR-eUefS+c%~XzZ($SRDMlY*li<IB=UV#;n+(4jo@<R1 zHU)k=d?w0%!Z_v%3%7|Yj}pj1xsjYyw6MTBX0TG{n$4CPojG!smr|cXyP-YMUg$Gu zAG9C(96A8;->Wa666g?g82S?OKu5eh@wIxL_S~-1h1!?bDO8!fdYx^`>UFvQGK{wz zS^=#zyBqY$02gczh`AD>O#UOiL9aH=kMuZS-pm2YWd5tCTQ+63qii<`ujFSU-}pD` z;U=e14+>(6@+0bm!l7QuY;4rS%*{sabn&~wOT}x+1LlG90GU%fw0_FinsiLSlQwK0 zrA%UzcG(-6F%sgcpJlez=m_hf_I%K!HwKtPO*+FC$a{jQm}_F}R=OT&7TB%ekfa!V zJ_dnfS%nRy87G4l*BxuC6Jk)|*<rW#&hixaS!LSRXI^XnbMwu#d@GGNM0twyt!+BE zfhmqyD*x}Yr7RjW#2IJO>{b`goL8*!H72{za+$1VE847{Yo$aE?4L9{D>gAHCpj-E lHaRXgJ9~Cga!yuWLVR9wUUG6=*6jF1{Km&+nY9JF_<uzXkgxy% diff --git a/package.json b/package.json index 76a1f5d..af7e1f2 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "url": "https://github.com/AngleProtocol/merkl-contracts/issues" }, "devDependencies": { - "@angleprotocol/sdk": "2.34.5", + "@angleprotocol/sdk": "2.34.7", "@openzeppelin/contracts": "^4.9.0", "@openzeppelin/contracts-upgradeable": "4.9.0", "prettier": "^2.0.0", diff --git a/scripts/DistributionCreator.s.sol b/scripts/DistributionCreator.s.sol index 3c4eb67..5b17e78 100644 --- a/scripts/DistributionCreator.s.sol +++ b/scripts/DistributionCreator.s.sol @@ -5,7 +5,7 @@ import { console } from "forge-std/console.sol"; import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { CommonUtils } from "@utils/CommonUtils.sol"; +import { JsonReader } from "@utils/JsonReader.sol"; import { ContractType } from "@utils/Constants.sol"; import { BaseScript } from "./utils/Base.s.sol"; @@ -15,7 +15,7 @@ import { CampaignParameters } from "../contracts/struct/CampaignParameters.sol"; import { MockToken } from "../contracts/mock/MockToken.sol"; // Base contract with shared utilities -contract DistributionCreatorScript is BaseScript, CommonUtils { +contract DistributionCreatorScript is BaseScript, JsonReader { struct CampaignInput { address creator; address rewardToken; @@ -525,7 +525,7 @@ contract SignAndCreateCampaign is DistributionCreatorScript { contract UpgradeAndBuildUpgradeToPayload is DistributionCreatorScript { function run() external { uint256 chainId = block.chainid; - address distributionCreator = this.chainToContract(chainId, ContractType.DistributionCreator); + address distributionCreator = readAddress(chainId, "Merkl.DistributionCreator"); address distributionCreatorImpl = address(new DistributionCreator()); @@ -534,7 +534,7 @@ contract UpgradeAndBuildUpgradeToPayload is DistributionCreatorScript { distributionCreatorImpl ); - try this.chainToContract(chainId, ContractType.AngleLabsMultisig) returns (address safe) { + try this.externalReadAddress(chainId, "Merkl.AngleLabs") returns (address safe) { _serializeJson( chainId, distributionCreator, // target address (the proxy) @@ -546,4 +546,8 @@ contract UpgradeAndBuildUpgradeToPayload is DistributionCreatorScript { ); } catch {} } + + function externalReadAddress(uint256 chainId, string memory key) external view returns (address) { + return readAddress(chainId, key); + } } diff --git a/test/DistributionCreator.t.sol b/test/DistributionCreator.t.sol index a095f6a..5c1dbe2 100644 --- a/test/DistributionCreator.t.sol +++ b/test/DistributionCreator.t.sol @@ -853,7 +853,7 @@ contract DistributionCreatorOverrideTest is Fixture { // Silo distrib address[] memory whitelist = new address[](1); whitelist[0] = 0x8095806d8753C0443C118D1C5e5eEC472e30BFeC; - bytes memory campaignData = abi.encode( + campaignData = abi.encode( 0x04C0599Ae5A44757c0af6F9eC3b93da8976c150A, 2, 0xa42001D6d2237d2c74108FE360403C4b796B7170, From b38f7275fcf72f707d3d97945a208b56e60e4baf Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Fri, 20 Dec 2024 12:23:54 +0100 Subject: [PATCH 7/9] feat: bump utils --- bun.lockb | Bin 196134 -> 196105 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index eb67f44f89a74189122f95e3e4d7c7ff05d71c45..1417aac17fbd9fca83ba16c6859ee849fe9f9aaf 100755 GIT binary patch delta 17689 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 Ygz4Y>g~ev{?VFyFwSP^a^3=Nj1sm&Ak^lez delta 17735 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 diff --git a/package.json b/package.json index af7e1f2..3378173 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "solhint-plugin-prettier": "^0.0.5", "solidity-coverage": "^0.8.2", "forge-std": "github:foundry-rs/forge-std#v1.9.4", - "utils": "github:AngleProtocol/utils#refactor/utils" + "utils": "github:AngleProtocol/utils" }, "dependencies": {} } From f3e5ef0a2296813f409470b22dfa6477392d0300 Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Fri, 20 Dec 2024 12:30:43 +0100 Subject: [PATCH 8/9] chore: ignore forked Base test for ci --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3378173..f7b2bdf 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "foundry:run": "docker run -it --rm -v $(pwd):/app -w /app ghcr.io/foundry-rs/foundry sh", "foundry:setup": "curl -L https://foundry.paradigm.xyz | bash && foundryup && git submodule update --init --recursive", "foundry:size": "forge build --skip test --sizes", - "foundry:test": "FOUNDRY_PROFILE=dev forge test -vvv", + "foundry:test": "FOUNDRY_PROFILE=dev forge test -vvv forge --no-match-contract UpgradeDistributionCreatorTest", "impersonate": "cast rpc anvil_impersonateAccount", "impersonate:script": "FOUNDRY_PROFILE=dev forge script --skip test --fork-url fork --broadcast -vvvv --gas-price 0 --priority-gas-price 0 --unlocked --sender", "impersonate:setBalance": "cast rpc anvil_setBalance 0x0022228a2cc5E7eF0274A7Baa600d44da5aB5776 1000000000000000000 && cast rpc anvil_setBalance 0x15775b23340C0f50E0428D674478B0e9D3D0a759 1000000000000000000 && cast rpc anvil_setBalance 0x19c41f6607b2c0e80e84baadaf886b17565f278e 1000000000000000000 && cast rpc anvil_setBalance 0xA9DdD91249DFdd450E81E1c56Ab60E1A62651701 1000000000000000000", From afa6c827e74d51e75fb0fcc7c53f2d3c0285ddcf Mon Sep 17 00:00:00 2001 From: Nicolas Lecouflet <lecoufletnicolas@gmail.com> Date: Fri, 20 Dec 2024 12:37:40 +0100 Subject: [PATCH 9/9] fix: package.json foundry:test script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f7b2bdf..7b2744f 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "foundry:run": "docker run -it --rm -v $(pwd):/app -w /app ghcr.io/foundry-rs/foundry sh", "foundry:setup": "curl -L https://foundry.paradigm.xyz | bash && foundryup && git submodule update --init --recursive", "foundry:size": "forge build --skip test --sizes", - "foundry:test": "FOUNDRY_PROFILE=dev forge test -vvv forge --no-match-contract UpgradeDistributionCreatorTest", + "foundry:test": "FOUNDRY_PROFILE=dev forge test -vvv --no-match-contract \"UpgradeDistributionCreatorTest\"", "impersonate": "cast rpc anvil_impersonateAccount", "impersonate:script": "FOUNDRY_PROFILE=dev forge script --skip test --fork-url fork --broadcast -vvvv --gas-price 0 --priority-gas-price 0 --unlocked --sender", "impersonate:setBalance": "cast rpc anvil_setBalance 0x0022228a2cc5E7eF0274A7Baa600d44da5aB5776 1000000000000000000 && cast rpc anvil_setBalance 0x15775b23340C0f50E0428D674478B0e9D3D0a759 1000000000000000000 && cast rpc anvil_setBalance 0x19c41f6607b2c0e80e84baadaf886b17565f278e 1000000000000000000 && cast rpc anvil_setBalance 0xA9DdD91249DFdd450E81E1c56Ab60E1A62651701 1000000000000000000",