Use of address instead of specific contract types  Acknowledged
Rather than using a low-level `address` type and then casting to the safer contract type, it's better to use the best type available by default so the compiler can eventually check for type safety and contract existence and only downcast to less secure low-level types (address) when necessary.\\n`RocketStorageInterface _rocketStorage` should be declared in the arguments, removing the need to cast the address explicitly.\\n```\\n/// @notice Sets up starting delegate contract and then delegates initialisation to it\\nfunction initialise(address \\_rocketStorage, address \\_nodeAddress) external override notSelf {\\n    // Check input\\n    require(\\_nodeAddress != address(0), "Invalid node address");\\n    require(storageState == StorageState.Undefined, "Already initialised");\\n    // Set storage state to uninitialised\\n    storageState = StorageState.Uninitialised;\\n    // Set rocketStorage\\n    rocketStorage = RocketStorageInterface(\\_rocketStorage);\\n```\\n\\n`RocketMinipoolInterface _minipoolAddress` should be declared in the arguments, removing the need to cast the address explicitly. Downcast to low-level address if needed. The event can be redeclared with the contract type.\\n```\\nfunction beginReduceBondAmount(address \\_minipoolAddress, uint256 \\_newBondAmount) override external onlyLatestContract("rocketMinipoolBondReducer", address(this)) {\\n    RocketMinipoolInterface minipool = RocketMinipoolInterface(\\_minipoolAddress);\\n```\\n\\n```\\n/// @notice Returns whether owner of given minipool can reduce bond amount given the waiting period constraint\\n/// @param \\_minipoolAddress Address of the minipool\\nfunction canReduceBondAmount(address \\_minipoolAddress) override public view returns (bool) {\\n    RocketMinipoolInterface minipool = RocketMinipoolInterface(\\_minipoolAddress);\\n    RocketDAONodeTrustedSettingsMinipoolInterface rocketDAONodeTrustedSettingsMinipool = RocketDAONodeTrustedSettingsMinipoolInterface(getContractAddress("rocketDAONodeTrustedSettingsMinipool"));\\n    uint256 reduceBondTime = getUint(keccak256(abi.encodePacked("minipool.bond.reduction.time", \\_minipoolAddress)));\\n    return rocketDAONodeTrustedSettingsMinipool.isWithinBondReductionWindow(block.timestamp.sub(reduceBondTime));\\n}\\n```\\n\\n```\\nfunction voteCancelReduction(address \\_minipoolAddress) override external onlyTrustedNode(msg.sender) onlyLatestContract("rocketMinipoolBondReducer", address(this)) {\\n    // Prevent calling if consensus has already been reached\\n    require(!getReduceBondCancelled(\\_minipoolAddress), "Already cancelled");\\n    // Get contracts\\n    RocketMinipoolInterface minipool = RocketMinipoolInterface(\\_minipoolAddress);\\n```\\n\\nNote that `abi.encode*(contractType)` assumes `address` for contract types by default. An explicit downcast is not required.\\n```\\n »  Test example = Test(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)\\n »  abi.encodePacked("hi", example)\\n0x68695b38da6a701c568545dcfcb03fcb875f56beddc4\\n »  abi.encodePacked("hi", address(example))\\n0x68695b38da6a701c568545dcfcb03fcb875f56beddc4\\n```\\n\\nMore examples of `address _minipool` declarations:\\n```\\n/// @dev Internal logic to set a minipool's pubkey\\n/// @param \\_pubkey The pubkey to set for the calling minipool\\nfunction \\_setMinipoolPubkey(address \\_minipool, bytes calldata \\_pubkey) private {\\n    // Load contracts\\n    AddressSetStorageInterface addressSetStorage = AddressSetStorageInterface(getContractAddress("addressSetStorage"));\\n    // Initialize minipool & get properties\\n    RocketMinipoolInterface minipool = RocketMinipoolInterface(\\_minipool);\\n```\\n\\n```\\nfunction getMinipoolDetails(address \\_minipoolAddress) override external view returns (MinipoolDetails memory) {\\n    // Get contracts\\n    RocketMinipoolInterface minipoolInterface = RocketMinipoolInterface(\\_minipoolAddress);\\n    RocketMinipoolBase minipool = RocketMinipoolBase(payable(\\_minipoolAddress));\\n    RocketNetworkPenaltiesInterface rocketNetworkPenalties = RocketNetworkPenaltiesInterface(getContractAddress("rocketNetworkPenalties"));\\n```\\n\\nMore examples of `RocketStorageInterface _rocketStorage` casts:\\n```\\ncontract RocketNodeDistributor is RocketNodeDistributorStorageLayout {\\n    bytes32 immutable distributorStorageKey;\\n\\n    constructor(address \\_nodeAddress, address \\_rocketStorage) {\\n        rocketStorage = RocketStorageInterface(\\_rocketStorage);\\n        nodeAddress = \\_nodeAddress;\\n```\\n
We recommend using more specific types instead of `address` where possible. Downcast if necessary. This goes for parameter types as well as state variable types.
```\\n/// @notice Sets up starting delegate contract and then delegates initialisation to it\\nfunction initialise(address \\_rocketStorage, address \\_nodeAddress) external override notSelf {\\n    // Check input\\n    require(\\_nodeAddress != address(0), "Invalid node address");\\n    require(storageState == StorageState.Undefined, "Already initialised");\\n    // Set storage state to uninitialised\\n    storageState = StorageState.Uninitialised;\\n    // Set rocketStorage\\n    rocketStorage = RocketStorageInterface(\\_rocketStorage);\\n```\\n