library Constants {
    /* Chain */
    uint256 private constant CHAIN_ID = 1; // Mainnet

    /* Oracle */
    address private constant USDC = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);
    uint256 private constant ORACLE_RESERVE_MINIMUM = 1e10; // 10,000 USDC

    /* Price Peg */
    address private constant PEG_REGULATOR = 0xCEe3101c0A8167f083F34B95A2f243c9b0BEF6a6;

    /* Bonding */
    uint256 private constant INITIAL_STAKE_MULTIPLE = 1e6; // 100 AOX -> 100M Phantom

    /* Epoch */
    struct EpochStrategy {
        uint256 offset;
        uint256 start;
        uint256 period;
    }

    uint256 private constant EPOCH_OFFSET = 0;
    uint256 private constant EPOCH_START = 1613921400;
    uint256 private constant EPOCH_PERIOD = 1800;

    /* Governance */
    uint256 private constant GOVERNANCE_PERIOD = 672;
    uint256 private constant GOVERNANCE_QUORUM = 15e16; // 15%
    uint256 private constant GOVERNANCE_PROPOSAL_THRESHOLD = 10e15; // 1.0%
    uint256 private constant GOVERNANCE_SUPER_MAJORITY = 66e16; // 66%
    uint256 private constant GOVERNANCE_EMERGENCY_DELAY = 48; // 6 epochs

    /* DAO */
    uint256 private constant ADVANCE_INCENTIVE = 100e18; // 100 AOX
    uint256 private constant DAO_EXIT_LOCKUP_EPOCHS = 288; // 288 epochs fluid

    /* Pool */
    uint256 private constant POOL_EXIT_LOCKUP_EPOCHS = 144; // 144 epochs fluid
    uint256 private constant POOL_STAKING_FEE = 10; //10% staking fee

    /* Locker */
    uint256 private constant LOCKER_BOND_LOCKUP_EPOCHS = 192; // 192 epochs fluid

    /* Staker */
    uint256 private constant SHARE_SUPPLY_PER_EPOCH = 4000e18; //4000 per epoch
    uint256 private constant STAKER_EXIT_LOCKUP_EPOCHS = 288; //288 epochs fluid
    address private constant STAKING_REGULATOR = 0xCEe3101c0A8167f083F34B95A2f243c9b0BEF6a6;
    uint256 private constant STAKER_STAKING_FEE = 10; //10% staking fee

    /* Market */
    uint256 private constant COUPON_EXPIRATION = 672; //672 epochs fluid
    uint256 private constant DEBT_RATIO_CAP = 35e16; // 35%
    uint256 private constant INITIAL_COUPON_REDEMPTION_PENALTY = 50e16; // 50%
    uint256 private constant COUPON_REDEMPTION_PENALTY_DECAY = 900; // 15 mins

    /* Regulator */
    uint256 private constant SUPPLY_CHANGE_LIMIT = 7e16; // 7%
    uint256 private constant DAO_RATIO = 15; //15%
    uint256 private constant ORACLE_POOL_RATIO = 60; // 60%
    uint256 private constant TREASURY_RATIO = 10; // 10%

    /* Treasury */
    address private constant TREASURY_ADDRESS = 0x79a4Df20B4CE64Cdeb38f4Ed6f74f4F87906082e;

    /**
     * Getters
     */
    function getUsdcAddress() internal pure returns (address) {
        return USDC;
    }

    function getOracleReserveMinimum() internal pure returns (uint256) {
        return ORACLE_RESERVE_MINIMUM;
    }

    function getEpochStrategy() internal pure returns (EpochStrategy memory) {
        return EpochStrategy({
            offset: EPOCH_OFFSET,
            start: EPOCH_START,
            period: EPOCH_PERIOD
        });
    }

    function getInitialStakeMultiple() internal pure returns (uint256) {
        return INITIAL_STAKE_MULTIPLE;
    }

    function getGovernancePeriod() internal pure returns (uint256) {
        return GOVERNANCE_PERIOD;
    }

    function getGovernanceQuorum() internal pure returns (Decimal.D256 memory) {
        return Decimal.D256({value: GOVERNANCE_QUORUM});
    }

    function getGovernanceProposalThreshold() internal pure returns (Decimal.D256 memory) {
        return Decimal.D256({value: GOVERNANCE_PROPOSAL_THRESHOLD});
    }

    function getGovernanceSuperMajority() internal pure returns (Decimal.D256 memory) {
        return Decimal.D256({value: GOVERNANCE_SUPER_MAJORITY});
    }

    function getGovernanceEmergencyDelay() internal pure returns (uint256) {
        return GOVERNANCE_EMERGENCY_DELAY;
    }

    function getAdvanceIncentive() internal pure returns (uint256) {
        return ADVANCE_INCENTIVE;
    }

    function getDAOExitLockupEpochs() internal pure returns (uint256) {
        return DAO_EXIT_LOCKUP_EPOCHS;
    }

    function getPoolExitLockupEpochs() internal pure returns (uint256) {
        return POOL_EXIT_LOCKUP_EPOCHS;
    }

    function getPoolStakingFee() internal pure returns (uint256) {
        return POOL_STAKING_FEE;
    }

    function getLockerBondLockupEpochs() internal pure returns (uint256) {
        return LOCKER_BOND_LOCKUP_EPOCHS;
    }

    function getShareSupplyPerEpoch() internal pure returns (uint256) {
        return SHARE_SUPPLY_PER_EPOCH;
    }

    function getStakerExitLockupEpochs() internal pure returns (uint256) {
        return STAKER_EXIT_LOCKUP_EPOCHS;
    }

    function getStakingRegulator() internal pure returns (address) {
        return STAKING_REGULATOR;
    }

    function getStakerStakingFee() internal pure returns (uint256) {
        return STAKER_STAKING_FEE;
    }

    function getCouponExpiration() internal pure returns (uint256) {
        return COUPON_EXPIRATION;
    }

    function getDebtRatioCap() internal pure returns (Decimal.D256 memory) {
        return Decimal.D256({value: DEBT_RATIO_CAP});
    }
    
    function getInitialCouponRedemptionPenalty() internal pure returns (Decimal.D256 memory) {
        return Decimal.D256({value: INITIAL_COUPON_REDEMPTION_PENALTY});
    }

    function getCouponRedemptionPenaltyDecay() internal pure returns (uint256) {
        return COUPON_REDEMPTION_PENALTY_DECAY;
    }

    function getSupplyChangeLimit() internal pure returns (Decimal.D256 memory) {
        return Decimal.D256({value: SUPPLY_CHANGE_LIMIT});
    }

    function getDAORatio() internal pure returns (uint256) {
        return DAO_RATIO;
    }

    function getOraclePoolRatio() internal pure returns (uint256) {
        return ORACLE_POOL_RATIO;
    }

    function getTreasuryRatio() internal pure returns (uint256) {
        return TREASURY_RATIO;
    }

    function getPegRegulator() internal pure returns (address) {
        return PEG_REGULATOR;
    }

    function getTreasuryAddress() internal pure returns (address) {
        return TREASURY_ADDRESS;
    }

    function getChainId() internal pure returns (uint256) {
        return CHAIN_ID;
    }
}
/*
 Copyright 2020 Apollo Dev, based on the works of the Empty Set Squad
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
 http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */
function getUsdcAddress() internal pure returns (address) {
        return USDC;
    }
/**
 * Getters
 */