datahaven/contracts/script/utils/ELScriptStorage.s.sol
Steve Degosserie 387c056912
fix: Resolve Foundry build errors and apply code formatting (#241)
## Summary

Fixes the CI build failure in the `task-ts-build` workflow caused by
Foundry v1.4.2's Solar linter not being able to resolve Snowbridge's
context-specific import remappings.

## Problem

The Snowbridge submodule uses context-specific remappings (prefixed with
`:`) for its dependencies:
- `lib/snowbridge/contracts/:openzeppelin/` → OpenZeppelin contracts
- `lib/snowbridge/contracts/:prb/math/` → PRB Math library

Foundry v1.4.2's Solar linter doesn't understand these context-specific
remappings and fails with errors like:
```
error: file openzeppelin/utils/cryptography/MerkleProof.sol not found
error: file prb/math/src/UD60x18.sol not found
```

## Solution

Added global remappings that the linter can understand:
```toml
"openzeppelin/=lib/snowbridge/contracts/lib/openzeppelin-contracts/contracts/",
"prb/math/=lib/snowbridge/contracts/lib/prb-math/",
```

### Why This Works
- The linter can now resolve `openzeppelin/` and `prb/math/` imports
globally
- These global remappings take **lower precedence** than
context-specific ones during compilation
- The compiler still uses the context-specific remappings (with `:`)
when compiling Snowbridge contracts
- The linter uses the global remappings when checking all files

## Changes

### Commit 1: Add global remappings
- `contracts/foundry.toml`: Added 2 global remapping entries

### Commit 2: Apply forge fmt
- Applied automatic formatting via `forge fmt` to ensure code style
consistency
- Multi-line formatting for long import statements and function
signatures
- No functional changes - purely formatting updates

## Testing

 Local build succeeds with `forge build`
 No Snowbridge import resolution errors
 `forge fmt --check` passes with no formatting issues
 Only linting notes/warnings remain (not errors)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-20 11:20:59 +03:00

95 lines
4.3 KiB
Solidity

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.27;
// Testing imports
import {Script} from "forge-std/Script.sol";
// EigenLayer imports
import {RewardsCoordinator} from "eigenlayer-contracts/src/contracts/core/RewardsCoordinator.sol";
import {
PermissionController
} from "eigenlayer-contracts/src/contracts/permissions/PermissionController.sol";
import {AllocationManager} from "eigenlayer-contracts/src/contracts/core/AllocationManager.sol";
import {DelegationManager} from "eigenlayer-contracts/src/contracts/core/DelegationManager.sol";
import {StrategyManager} from "eigenlayer-contracts/src/contracts/core/StrategyManager.sol";
import {AVSDirectory} from "eigenlayer-contracts/src/contracts/core/AVSDirectory.sol";
import {EigenPodManager} from "eigenlayer-contracts/src/contracts/pods/EigenPodManager.sol";
import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import {EigenPod} from "eigenlayer-contracts/src/contracts/pods/EigenPod.sol";
import {
StrategyBaseTVLLimits
} from "eigenlayer-contracts/src/contracts/strategies/StrategyBaseTVLLimits.sol";
import {IETHPOSDeposit} from "eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol";
// Struct used in the deployment JSON file to store detailed strategy information
struct DeployedStrategyJson {
address strategyAddress;
address strategyUnderlyingToken;
address strategyTokenCreator;
}
// Struct used here to store strategy information
struct DeployedStrategyInfo {
StrategyBaseTVLLimits strategy;
address strategyTokenCreator;
}
/**
* @title ELScriptStorage
* @notice This contract is a utility for scripts that need to interact with EigenLayer contracts.
*/
contract ELScriptStorage is Script {
// EigenLayer Contract declarations
RewardsCoordinator public rewardsCoordinator;
PermissionController public permissionController;
AllocationManager public allocationManager;
DelegationManager public delegation;
StrategyManager public strategyManager;
EigenPodManager public eigenPodManager;
EigenPod public eigenPodBeacon;
StrategyBaseTVLLimits public baseStrategy;
DeployedStrategyInfo[] public deployedStrategies;
IETHPOSDeposit public ethPOSDeposit;
// EigenLayer required semver
string public constant SEMVER = "v1.0.0";
/**
* @notice Loads the EigenLayer contracts from the deployment file.
*/
function _loadELContracts(
string memory network
) internal {
// Load the deployment file
string memory deploymentFile =
vm.readFile(string.concat("./deployments/", network, ".json"));
// Store the contract addresses
rewardsCoordinator =
RewardsCoordinator(vm.parseJsonAddress(deploymentFile, ".RewardsCoordinator"));
permissionController =
PermissionController(vm.parseJsonAddress(deploymentFile, ".PermissionController"));
allocationManager =
AllocationManager(vm.parseJsonAddress(deploymentFile, ".AllocationManager"));
delegation = DelegationManager(vm.parseJsonAddress(deploymentFile, ".DelegationManager"));
strategyManager = StrategyManager(vm.parseJsonAddress(deploymentFile, ".StrategyManager"));
eigenPodManager = EigenPodManager(vm.parseJsonAddress(deploymentFile, ".EigenPodManager"));
eigenPodBeacon = EigenPod(payable(vm.parseJsonAddress(deploymentFile, ".EigenPodBeacon")));
baseStrategy = StrategyBaseTVLLimits(
vm.parseJsonAddress(deploymentFile, ".BaseStrategyImplementation")
);
ethPOSDeposit = IETHPOSDeposit(vm.parseJsonAddress(deploymentFile, ".ETHPOSDeposit"));
bytes memory deployedStrategiesArrayData =
vm.parseJson(deploymentFile, ".DeployedStrategies");
DeployedStrategyJson[] memory strategies =
abi.decode(deployedStrategiesArrayData, (DeployedStrategyJson[]));
for (uint256 i = 0; i < strategies.length; i++) {
address strategyAddress = strategies[i].strategyAddress;
address strategyTokenCreator = strategies[i].strategyTokenCreator;
DeployedStrategyInfo memory strategyInfo;
strategyInfo.strategy = StrategyBaseTVLLimits(strategyAddress);
strategyInfo.strategyTokenCreator = strategyTokenCreator;
deployedStrategies.push(strategyInfo);
}
}
}