all files / interfaces/ IMain.sol

100% Statements 0/0
100% Branches 0/0
100% Functions 0/0
100% Lines 0/0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182                                                                                                                                                                                                                                                                                                                                                                           
// SPDX-License-Identifier: BlueOak-1.0.0
pragma solidity 0.8.17;
 
import "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./IAssetRegistry.sol";
import "./IBasketHandler.sol";
import "./IBackingManager.sol";
import "./IBroker.sol";
import "./IGnosis.sol";
import "./IFurnace.sol";
import "./IDistributor.sol";
import "./IRToken.sol";
import "./IRevenueTrader.sol";
import "./IStRSR.sol";
import "./ITrading.sol";
import "./IVersioned.sol";
 
// === Auth roles ===
 
bytes32 constant OWNER = bytes32(bytes("OWNER"));
bytes32 constant SHORT_FREEZER = bytes32(bytes("SHORT_FREEZER"));
bytes32 constant LONG_FREEZER = bytes32(bytes("LONG_FREEZER"));
bytes32 constant PAUSER = bytes32(bytes("PAUSER"));
 
/**
 * Main is a central hub that maintains a list of Component contracts.
 *
 * Components:
 *   - perform a specific function
 *   - defer auth to Main
 *   - usually (but not always) contain sizeable state that require a proxy
 */
struct Components {
    // Definitely need proxy
    IRToken rToken;
    IStRSR stRSR;
    IAssetRegistry assetRegistry;
    IBasketHandler basketHandler;
    IBackingManager backingManager;
    IDistributor distributor;
    IFurnace furnace;
    IBroker broker;
    IRevenueTrader rsrTrader;
    IRevenueTrader rTokenTrader;
}
 
interface IAuth is IAccessControlUpgradeable {
    /// Emitted when `unfreezeAt` is changed
    /// @param oldVal The old value of `unfreezeAt`
    /// @param newVal The new value of `unfreezeAt`
    event UnfreezeAtSet(uint48 indexed oldVal, uint48 indexed newVal);
 
    /// Emitted when the short freeze duration governance param is changed
    /// @param oldDuration The old short freeze duration
    /// @param newDuration The new short freeze duration
    event ShortFreezeDurationSet(uint48 indexed oldDuration, uint48 indexed newDuration);
 
    /// Emitted when the long freeze duration governance param is changed
    /// @param oldDuration The old long freeze duration
    /// @param newDuration The new long freeze duration
    event LongFreezeDurationSet(uint48 indexed oldDuration, uint48 indexed newDuration);
 
    /// Emitted when the system is paused or unpaused
    /// @param oldVal The old value of `paused`
    /// @param newVal The new value of `paused`
    event PausedSet(bool indexed oldVal, bool indexed newVal);
 
    /**
     * Paused: Disable everything except for OWNER actions, RToken.redeem, StRSR.stake,
     * and StRSR.payoutRewards
     * Frozen: Disable everything except for OWNER actions + StRSR.stake (for governance)
     */
 
    function pausedOrFrozen() external view returns (bool);
 
    function frozen() external view returns (bool);
 
    function shortFreeze() external view returns (uint48);
 
    function longFreeze() external view returns (uint48);
 
    // ====
 
    // onlyRole(OWNER)
    function freezeForever() external;
 
    // onlyRole(SHORT_FREEZER)
    function freezeShort() external;
 
    // onlyRole(LONG_FREEZER)
    function freezeLong() external;
 
    // onlyRole(OWNER)
    function unfreeze() external;
 
    function pause() external;
 
    function unpause() external;
}
 
interface IComponentRegistry {
    // === Component setters/getters ===
 
    event RTokenSet(IRToken indexed oldVal, IRToken indexed newVal);
 
    function rToken() external view returns (IRToken);
 
    event StRSRSet(IStRSR indexed oldVal, IStRSR indexed newVal);
 
    function stRSR() external view returns (IStRSR);
 
    event AssetRegistrySet(IAssetRegistry indexed oldVal, IAssetRegistry indexed newVal);
 
    function assetRegistry() external view returns (IAssetRegistry);
 
    event BasketHandlerSet(IBasketHandler indexed oldVal, IBasketHandler indexed newVal);
 
    function basketHandler() external view returns (IBasketHandler);
 
    event BackingManagerSet(IBackingManager indexed oldVal, IBackingManager indexed newVal);
 
    function backingManager() external view returns (IBackingManager);
 
    event DistributorSet(IDistributor indexed oldVal, IDistributor indexed newVal);
 
    function distributor() external view returns (IDistributor);
 
    event RSRTraderSet(IRevenueTrader indexed oldVal, IRevenueTrader indexed newVal);
 
    function rsrTrader() external view returns (IRevenueTrader);
 
    event RTokenTraderSet(IRevenueTrader indexed oldVal, IRevenueTrader indexed newVal);
 
    function rTokenTrader() external view returns (IRevenueTrader);
 
    event FurnaceSet(IFurnace indexed oldVal, IFurnace indexed newVal);
 
    function furnace() external view returns (IFurnace);
 
    event BrokerSet(IBroker indexed oldVal, IBroker indexed newVal);
 
    function broker() external view returns (IBroker);
}
 
/**
 * @title IMain
 * @notice The central hub for the entire system. Maintains components and an owner singleton role
 */
interface IMain is IVersioned, IAuth, IComponentRegistry {
    function poke() external; // not used in p1
 
    // === Initialization ===
 
    event MainInitialized();
 
    function init(
        Components memory components,
        IERC20 rsr_,
        uint48 shortFreeze_,
        uint48 longFreeze_
    ) external;
 
    function rsr() external view returns (IERC20);
}
 
interface TestIMain is IMain {
    /// @custom:governance
    function setShortFreeze(uint48) external;
 
    /// @custom:governance
    function setLongFreeze(uint48) external;
 
    function shortFreeze() external view returns (uint48);
 
    function longFreeze() external view returns (uint48);
 
    function longFreezes(address account) external view returns (uint256);
 
    function paused() external view returns (bool);
}