Skip to content
Open
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
2 changes: 0 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,8 @@ DEPLOY_SALT=""

# Localhost (chainId: X)
LOCALHOST_NODE_URI="http://127.0.0.1:8545"
LOCALHOST_MNEMONIC=""
LOCALHOST_ETHERSCAN_API_KEY=""

# <NETWORK> (chainId: <CHAIN_ID>)
<NETWORK>_NODE_URI=""
<NETWORK>_MNEMONIC=""
<NETWORK>_ETHERSCAN_API_KEY=""
6 changes: 3 additions & 3 deletions .github/workflows/ci-deep.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,4 @@ bin
/out
/zkout
/cache-forge
/transactions
111 changes: 53 additions & 58 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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}"
Expand All @@ -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}"
Expand All @@ -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/" }
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}" }
106 changes: 106 additions & 0 deletions scripts/DistributionCreator.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
}
}
7 changes: 6 additions & 1 deletion scripts/utils/Base.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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"));
}
}
2 changes: 1 addition & 1 deletion test/unit/DistributionCreator.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down