pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; // Inheritance import "./Owned.sol"; import "./MixinResolver.sol"; import "./MixinSystemSettings.sol"; import "./interfaces/IBaseOikosBridge.sol"; // Internal references import "./interfaces/IOikos.sol"; import "./interfaces/IRewardEscrowV2.sol"; import "./interfaces/IFeePool.sol"; import "@eth-optimism/contracts/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol"; contract BaseOikosBridge is Owned, MixinSystemSettings, IBaseOikosBridge { /* ========== ADDRESS RESOLVER CONFIGURATION ========== */ bytes32 private constant CONTRACT_EXT_MESSENGER = "ext:Messenger"; bytes32 internal constant CONTRACT_SYNTHETIX = "Oikos"; bytes32 private constant CONTRACT_REWARDESCROW = "RewardEscrowV2"; bytes32 private constant CONTRACT_FEEPOOL = "FeePool"; bool public initiationActive; // ========== CONSTRUCTOR ========== constructor(address _owner, address _resolver) public Owned(_owner) MixinSystemSettings(_resolver) { initiationActive = true; } // ========== INTERNALS ============ function messenger() internal view returns (iAbs_BaseCrossDomainMessenger) { return iAbs_BaseCrossDomainMessenger(requireAndGetAddress(CONTRACT_EXT_MESSENGER)); } function oikos() internal view returns (IOikos) { return IOikos(requireAndGetAddress(CONTRACT_SYNTHETIX)); } function rewardEscrowV2() internal view returns (IRewardEscrowV2) { return IRewardEscrowV2(requireAndGetAddress(CONTRACT_REWARDESCROW)); } function feePool() internal view returns (IFeePool) { return IFeePool(requireAndGetAddress(CONTRACT_FEEPOOL)); } function initiatingActive() internal view { require(initiationActive, "Initiation deactivated"); } /* ========== VIEWS ========== */ function resolverAddressesRequired() public view returns (bytes32[] memory addresses) { bytes32[] memory existingAddresses = MixinSystemSettings.resolverAddressesRequired(); bytes32[] memory newAddresses = new bytes32[](4); newAddresses[0] = CONTRACT_EXT_MESSENGER; newAddresses[1] = CONTRACT_SYNTHETIX; newAddresses[2] = CONTRACT_REWARDESCROW; newAddresses[3] = CONTRACT_FEEPOOL; addresses = combineArrays(existingAddresses, newAddresses); } // ========== MODIFIERS ============ modifier requireInitiationActive() { initiatingActive(); _; } // ========= RESTRICTED FUNCTIONS ============== function suspendInitiation() external onlyOwner { require(initiationActive, "Initiation suspended"); initiationActive = false; emit InitiationSuspended(); } function resumeInitiation() external onlyOwner { require(!initiationActive, "Initiation not suspended"); initiationActive = true; emit InitiationResumed(); } // ========== EVENTS ========== event InitiationSuspended(); event InitiationResumed(); }