diff --git a/.env.example b/.env.example index 058cde7..50871ed 100644 --- a/.env.example +++ b/.env.example @@ -11,10 +11,8 @@ DEPLOY_SALT="" # Localhost (chainId: X) LOCALHOST_NODE_URI="http://127.0.0.1:8545" -LOCALHOST_MNEMONIC="" LOCALHOST_ETHERSCAN_API_KEY="" # (chainId: ) _NODE_URI="" -_MNEMONIC="" _ETHERSCAN_API_KEY="" diff --git a/.github/workflows/ci-deep.yml b/.github/workflows/ci-deep.yml index f445ece..5c5cfed 100644 --- a/.github/workflows/ci-deep.yml +++ b/.github/workflows/ci-deep.yml @@ -89,9 +89,9 @@ jobs: - name: Run Foundry tests run: bun foundry:test env: - ETH_NODE_URI_OPTIMISM: ${{ secrets.ETH_NODE_URI_OPTIMISM }} - ETH_NODE_URI_ARBITRUM: ${{ secrets.ETH_NODE_URI_ARBITRUM }} - ETH_NODE_URI_MAINNET: ${{ secrets.ETH_NODE_URI_MAINNET }} + OPTIMISM_NODE_URI: ${{ secrets.ETH_NODE_URI_OPTIMISM }} + ARBITRUM_NODE_URI: ${{ secrets.ETH_NODE_URI_ARBITRUM }} + BASE_NODE_URI: ${{ secrets.ETH_NODE_URI_MAINNET }} FOUNDRY_FUZZ_RUNS: ${{ github.event.inputs.fuzzRuns || '10000' }} - name: 'Add test summary' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d786e7e..5534195 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,9 +72,9 @@ jobs: run: bun foundry:test env: FOUNDRY_FUZZ_RUNS: '5000' - ETH_NODE_URI_OPTIMISM: ${{ secrets.ETH_NODE_URI_OPTIMISM }} - ETH_NODE_URI_ARBITRUM: ${{ secrets.ETH_NODE_URI_ARBITRUM }} - ETH_NODE_URI_MAINNET: ${{ secrets.ETH_NODE_URI_MAINNET }} + OPTIMISM_NODE_URI: ${{ secrets.ETH_NODE_URI_OPTIMISM }} + ARBITRUM_NODE_URI: ${{ secrets.ETH_NODE_URI_ARBITRUM }} + BASE_NODE_URI: ${{ secrets.ETH_NODE_URI_MAINNET }} - name: 'Add test summary' run: | diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 0126b89..9d32172 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -24,9 +24,9 @@ jobs: - name: 'Generate the coverage report using the unit and the integration tests' run: 'bun ci:coverage' env: - ETH_NODE_URI_OPTIMISM: ${{ secrets.ETH_NODE_URI_OPTIMISM }} - ETH_NODE_URI_ARBITRUM: ${{ secrets.ETH_NODE_URI_ARBITRUM }} - ETH_NODE_URI_MAINNET: ${{ secrets.ETH_NODE_URI_MAINNET }} + OPTIMISM_NODE_URI: ${{ secrets.ETH_NODE_URI_OPTIMISM }} + ARBITRUM_NODE_URI: ${{ secrets.ETH_NODE_URI_ARBITRUM }} + BASE_NODE_URI: ${{ secrets.ETH_NODE_URI_MAINNET }} - name: 'Upload coverage report to Codecov' uses: 'codecov/codecov-action@v3' diff --git a/.gitignore b/.gitignore index d18d846..2ea1717 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ bin /out /zkout /cache-forge +/transactions diff --git a/foundry.toml b/foundry.toml index 8acf6a2..7977cc4 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,8 +10,7 @@ gas_reports = ["*"] optimizer_runs = 100 fs_permissions = [ { access = "read", path = "./node_modules/@angleprotocol/sdk/dist/src/registry/registry.json" }, - { access = "write", path = "./transaction.json" }, - { access = "write", path = "./transactions.json" } + { access = "write", path = "./transactions" }, ] solc = "0.8.25" @@ -49,9 +48,8 @@ mainnet = "${MAINNET_NODE_URI}" polygon = "${POLYGON_NODE_URI}" fantom = "${FANTOM_NODE_URI}" optimism = "${OPTIMISM_NODE_URI}" -arbitrum = "${ETH_NODE_URI_ARBITRUM}" +arbitrum = "${ARBITRUM_NODE_URI}" avalanche = "${AVALANCHE_NODE_URI}" -aurora = "${AURORA_NODE_URI}" bsc = "${BSC_NODE_URI}" gnosis = "${GNOSIS_NODE_URI}" polygonzkevm = "${POLYGONZKEVM_NODE_URI}" @@ -74,16 +72,14 @@ sei = "${SEI_NODE_URI}" celo = "${CELO_NODE_URI}" fraxtal = "${FRAXTAL_NODE_URI}" astar = "${ASTAR_NODE_URI}" -astarzkevm = "${ASTARZKEVM_NODE_URI}" rootstock = "${ROOTSTOCK_NODE_URI}" moonbeam = "${MOONBEAM_NODE_URI}" skale = "${SKALE_NODE_URI}" worldchain = "${WORLDCHAIN_NODE_URI}" lisk = "${LISK_NODE_URI}" etherlink = "${ETHERLINK_NODE_URI}" -arthera = "${ARTHERA_NODE_URI}" swell = "${SWELL_NODE_URI}" -fork = "${ETH_NODE_URI_FORK}" +fork = "${FORK_NODE_URI}" sonic = "${SONIC_NODE_URI}" corn = "${CORN_NODE_URI}" ink = "${INK_NODE_URI}" @@ -97,57 +93,56 @@ hyperevm = "${HYPEREVM_NODE_URI}" hemi="${HEMI_NODE_URI}" xdc="${XDC_NODE_URI}" katana="${KATANA_NODE_URI}" +tac="${TAC_NODE_URI}" [etherscan] 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 = "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" } -polygonzkevm = { chainId = 1101, key = "${POLYGONZKEVM_ETHERSCAN_API_KEY}", url = "https://api-zkevm.polygonscan.com/api" } -base = { chainId = 8453, key = "${BASE_ETHERSCAN_API_KEY}", url = "https://api.basescan.org/api" } -bob = { chainId = 60808, key = "${BOB_ETHERSCAN_API_KEY}", url = "https://explorer.gobob.xyz/api" } -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://explorer.mantle.xyz/api" } -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 = "" } -coredao = { chainId = 1116, key = "${COREDAO_ETHERSCAN_API_KEY}", url = "https://openapi.coredao.org/api" } -xlayer = { chainId = 196, key = "${XLAYER_ETHERSCAN_API_KEY}", url = "https://www.oklink.com/api/v5/explorer/contract/verify-source-code-plugin/XLAYER" } -taiko = { chainId = 167000, key = "${TAIKO_ETHERSCAN_API_KEY}", url = "https://api.taikoscan.io/api" } -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 = "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 = "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/" } -etherlink = { chainId = 42793, key = "${ETHERLINK_ETHERSCAN_API_KEY}", url= "https://explorer.etherlink.com/api" } -arthera = { chainId = 10242, key = "${ARTHERA_ETHERSCAN_API_KEY}", url = "https://explorer.arthera.net/api/" } -swell = { chainId = 1923, key = "${SWELL_ETHERSCAN_API_KEY}", url = "https://explorer.swellnetwork.io:443/api/" } -sonic = { chainId = 146, key = "${SONIC_ETHERSCAN_API_KEY}", url = "https://api.sonicscan.org/api/" } -corn = { chainId = 21000000, key = "${CORN_ETHERSCAN_API_KEY}", url = "https://api.routescan.io/v2/network/mainnet/evm/21000000/etherscan"} -ink = { chainId = 57073, key = "${INK_ETHERSCAN_API_KEY}", url = "https://explorer.inkonchain.com/api" } -ronin = { chainId = 2020, key = "${RONIN_ETHERSCAN_API_KEY}", url = "https://sourcify.roninchain.com/server/" } -flow = { chainId = 747, key = "${FLOW_ETHERSCAN_API_KEY}", url = "https://api.flowscan.io/api" } -berachain = { chainId = 80094, key = "${BERACHAIN_ETHERSCAN_API_KEY}", url = "https://api.berascan.com/api" } -nibiru = { chainId = 6900, key = "${NIBIRU_ETHERSCAN_API_KEY}", url = "https://api.routescan.io/v2/network/mainnet/evm/6900/etherscan/api" } -zircuit = { chainId = 48900, key = "${ZIRCUIT_ETHERSCAN_API_KEY}", url = "https://sourcify.dev/server" } -apechain = { chainId = 33139, key = "${APECHAIN_ETHERSCAN_API_KEY}", url = "https://api.apescan.io/api" } -hyperevm = { chainId = 999, key = "${HYPEREVM_ETHERSCAN_API_KEY}", url = "https://hyperliquid.cloud.blockscout.com/api" } -hemi = { chainId = 43111, key = "${HEMI_ETHERSCAN_API_KEY}", url = "https://explorer.hemi.xyz/api/" } -xdc = { chainId = 50, key = "${XDC_ETHERSCAN_API_KEY}", url = "https://api.xdcscan.com/api/" } -katana = {chainId = 747474, key = "${$KATANA_ETHERSCAN_API_KEY}", url = "https://explorer.katanarpc.com/" } \ No newline at end of file +mainnet = { chainId = 1, key = "${MAINNET_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_1}" } +polygon = { chainId = 137, key = "${POLYGON_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_137}" } +fantom = { chainId = 250, key = "${FANTOM_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_250}" } +optimism = { chainId = 10, key = "${OPTIMISM_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_10}" } +arbitrum = { chainId = 42161, key = "${ARBITRUM_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_42161}" } +avalanche = { chainId = 43114, key = "${AVALANCHE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_43114}" } +bsc = { chainId = 56, key = "${BSC_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_56}" } +gnosis = { chainId = 100, key = "${GNOSIS_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_100}" } +polygonzkevm = { chainId = 1101, key = "${POLYGONZKEVM_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_1101}" } +base = { chainId = 8453, key = "${BASE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_8453}" } +bob = { chainId = 60808, key = "${BOB_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_60808}" } +linea = { chainId = 59144, key = "${LINEA_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_59144}" } +zksync = { chainId = 324, key = "${ZKSYNC_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_324}" } +mantle = { chainId = 5000, key = "${MANTLE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_5000}" } +blast = { chainId = 81457, key = "${BLAST_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_81457}" } +mode = { chainId = 34443, key = "${MODE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_34443}" } +thundercore = { chainId = 108, key = "${THUNDERCORE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_108}" } +coredao = { chainId = 1116, key = "${COREDAO_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_1116}" } +xlayer = { chainId = 196, key = "${XLAYER_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_196}" } +taiko = { chainId = 167000, key = "${TAIKO_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_167000}" } +fuse = { chainId = 122, key = "${FUSE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_122}" } +immutable = { chainId = 13371, key = "${IMMUTABLE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_13371}" } +scroll = { chainId = 534352, key = "${SCROLL_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_534352}" } +manta = { chainId = 169, key = "${MANTA_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_169}" } +sei = { chainId = 1329, key = "${SEI_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_1329}" } +celo = { chainId = 42220, key = "${CELO_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_42220}" } +fraxtal = { chainId = 252, key = "${FRAXTAL_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_252}" } +astar = { chainId = 592, key = "${ASTAR_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_592}" } +rootstock = { chainId = 30, key = "${ROOTSTOCK_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_30}" } +moonbeam = { chainId = 1284, key = "${MOONBEAM_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_1284}" } +skale = { chainId = 2046399126, key = "${SKALE_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_2046399126}" } +worldchain = { chainId = 480, key = "${WORLDCHAIN_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_480}" } +lisk = { chainId = 1135, key = "${LISK_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_1135}" } +etherlink = { chainId = 42793, key = "${ETHERLINK_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_42793}" } +swell = { chainId = 1923, key = "${SWELL_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_1923}" } +sonic = { chainId = 146, key = "${SONIC_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_146}" } +corn = { chainId = 21000000, key = "${CORN_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_21000000}" } +ink = { chainId = 57073, key = "${INK_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_57073}" } +ronin = { chainId = 2020, key = "${RONIN_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_2020}" } +flow = { chainId = 747, key = "${FLOW_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_747}" } +berachain = { chainId = 80094, key = "${BERACHAIN_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_80094}" } +nibiru = { chainId = 6900, key = "${NIBIRU_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_6900}" } +zircuit = { chainId = 48900, key = "${ZIRCUIT_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_48900}" } +apechain = { chainId = 33139, key = "${APECHAIN_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_33139}" } +hyperevm = { chainId = 999, key = "${HYPEREVM_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_999}" } +hemi = { chainId = 43111, key = "${HEMI_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_43111}" } +xdc = { chainId = 50, key = "${XDC_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_50}" } +katana = {chainId = 747474, key = "${KATANA_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_747474}" } +tac = {chainId = 239, key = "${TAC_ETHERSCAN_API_KEY}", url = "${VERIFIER_URL_239}" } \ No newline at end of file diff --git a/scripts/DistributionCreator.s.sol b/scripts/DistributionCreator.s.sol index 1e02f97..0e92958 100644 --- a/scripts/DistributionCreator.s.sol +++ b/scripts/DistributionCreator.s.sol @@ -890,3 +890,109 @@ contract SetRewardTokenMinAmountsDistributor is DistributionCreatorScript { DistributionCreator(creatorAddress).setRewardTokenMinAmounts(tokens, minAmounts); } } + +// SetFeesMultichain script +contract SetFeesMultichain is DistributionCreatorScript { + struct FailedChain { + string network; + uint256 chainId; + string reason; + } + + function externalReadAddress(uint256 chainId, string memory key) public view returns (address) { + return readAddress(chainId, key); + } + + function run() external { + // Set default fees to 0 and campaign fees to 3% (30,000,000 in 9 decimals) + uint256 defaultFees = 0; + uint256 campaignFees = 5000000; // 0.5% + + // Get all networks from foundry.toml + string[2][] memory networks = vm.rpcUrls(); + + // Track failed chains + FailedChain[] memory failedChains = new FailedChain[](networks.length); + uint256 failedCount = 0; + uint256 successCount = 0; + + for (uint256 i = 0; i < networks.length; i++) { + string memory network = networks[i][0]; + + // Skip localhost and fork + if ( + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("localhost")) || + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("fork")) || + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("zksync")) || + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("nibiru")) // No multisig deployed + ) { + continue; + } + + // // Create fork for this network + vm.createSelectFork(network); + uint256 chainId = block.chainid; + address creatorAddress = readAddress(chainId, "Merkl.DistributionCreator"); + + // Create contract instances to reuse existing logic + // SetFees setFeesContract = new SetFees(); + // SetCampaignFees setCampaignFeesContract = new SetCampaignFees(); + + // Set default fees using existing contract + // TODO: Instead of broadcasting, we should just write the transaction to the json file + bytes memory setFeesPayload = abi.encodeWithSelector(DistributionCreator.setFees.selector, defaultFees); + + // address safe = readAddress(chainId, "AngleLabs"); + // console.log("Safe address: %s", safe); + address safe = readAddress(chainId, "AngleLabs"); + _serializeJson( + chainId, + creatorAddress, // target address (the DistributionCreator proxy) + 0, // value + setFeesPayload, // setFees call + Operation.Call, // standard call (not delegate) + hex"", // signature + safe // safe address + ); + console.log("Default fees transaction serialized for %s (chain %s)", network, chainId); + successCount++; + + // // Set campaign fees for each type using existing contract + // if (DistributionCreator(creatorAddress).campaignSpecificFees(27) != campaignFees) { + // console.log("Setting campaign fees for type 27 to %s", campaignFees); + // try setCampaignFeesContract.run(27, campaignFees) { + // // Success + // console.log("Fees updated on %s (chain %s)", network, chainId); + // successCount++; + // } catch (bytes memory err) { + // console.log("Failed to set campaign fees for type %s on %s", 27, network); + // failedChains[failedCount] = FailedChain(network, chainId, string(err)); + // failedCount++; + // vm.stopBroadcast(); + // } + // } + } + + // Display summary + console.log(""); + console.log("=== MULTICHAIN FEE SETTING SUMMARY ==="); + console.log("Successful chains: %s", successCount); + console.log("Failed chains: %s", failedCount); + + if (failedCount > 0) { + console.log(""); + console.log("Failed chains details:"); + for (uint256 i = 0; i < failedCount; i++) { + console.log( + "- %s (Chain ID: %s) - Reason: %s", + failedChains[i].network, + failedChains[i].chainId, + failedChains[i].reason + ); + } + } + + console.log(""); + console.log("Multichain fee setting completed!"); + } +} diff --git a/scripts/utils/Base.s.sol b/scripts/utils/Base.s.sol index 6f23005..eaf2928 100644 --- a/scripts/utils/Base.s.sol +++ b/scripts/utils/Base.s.sol @@ -58,6 +58,11 @@ abstract contract BaseScript is Script { vm.stopBroadcast(); } + modifier fork(string memory network) { + vm.createSelectFork(vm.rpcUrl(network)); + _; + } + function _serializeJson( uint256 chainId, address to, @@ -89,6 +94,6 @@ abstract contract BaseScript is Script { } string memory finalJson = vm.serializeBytes(json, "data", data); - vm.writeJson(finalJson, "./transaction.json"); + vm.writeJson(finalJson, string.concat("./transactions/", vm.toString(chainId), ".json")); } } diff --git a/test/unit/DistributionCreator.t.sol b/test/unit/DistributionCreator.t.sol index 0f67b16..437dd83 100644 --- a/test/unit/DistributionCreator.t.sol +++ b/test/unit/DistributionCreator.t.sol @@ -950,7 +950,7 @@ contract DistributionCreatorForkTest is Test { DistributionCreator public creator; function setUp() public { - vm.createSelectFork(vm.envString("ETH_NODE_URI_ARBITRUM")); + vm.createSelectFork(vm.envString("ARBITRUM_NODE_URI")); creator = DistributionCreator(0x8BB4C975Ff3c250e0ceEA271728547f3802B36Fd); }