contract ExternalStub is Ownable {
    bool private initialized;

    address public ValueHolder;

    address public enterToken; //= DAI_ADDRESS;
    uint256 private PoolValue;

    event LogValueHolderUpdated(address Manager);

    /**
     * @dev main init function
     */

    function init(address _enterToken) external {
        require(!initialized, "Initialized");
        initialized = true;
        Ownable.initialize(); // Do not forget this call!
        _init(_enterToken);
    }

    /**
     * @dev internal variable initialization
     */
    function _init(address _enterToken) internal {
        enterToken = _enterToken;
        ValueHolder = msg.sender;
    }

    /**
     * @dev re-initializer might be helpful for the cases where proxy's storage is corrupted by an old contact, but we cannot run init as we have the owner address already.
     * This method might help fixing the storage state.
     */
    function reInit(address _enterToken) external onlyOwner {
        _init(_enterToken);
    }

    /**
     * @dev this modifier is only for methods that should be called by ValueHolder contract
     */
    modifier onlyValueHolder() {
        require(msg.sender == ValueHolder, "Not Value Holder");
        _;
    }

    /**
     * @dev Sets new ValueHolder address
     */
    function setValueHolder(address _ValueHolder) external onlyOwner {
        ValueHolder = _ValueHolder;
        emit LogValueHolderUpdated(_ValueHolder);
    }

    /**
     * @dev Main function to enter Compound supply/borrow position using the available [DAI] token balance
     */
    function addPosition() external pure {
        revert("Stub");
    }

    /**
     * @dev Main function to exit position - partially or completely
     */
    function exitPosition(uint256) external pure {
        revert("Stub");
    }

    /**
     * @dev Get the total amount of enterToken value of the pool
     */
    function getTokenStaked() external view returns (uint256) {
        return (PoolValue);
    }

    /**
     * @dev Get the total value the Pool in [denominateTo] tokens [DAI?]
     */

    function getPoolValue(address) external view returns (uint256 totalValue) {
        return (PoolValue);
    }

    /**
     * @dev Get the total value the Pool in [denominateTo] tokens [DAI?]
     */

    function setPoolValue(uint256 _PoolValue) external onlyValueHolder {
        PoolValue = _PoolValue;
    }

    /**
     * @dev Claim all available CRV from compound and convert to DAI as needed
     */
    function claimValue() external pure {
        revert("Stub");
    }
}
/**
 * @title Stub for BSC connection
 * @dev Can be accessed by an authorized bridge/ValueHolder
 */
function getPoolValue(address) external view returns (uint256 totalValue) {
    return (PoolValue);
}

/**
 * @dev Get the total value the Pool in [denominateTo] tokens [DAI?]
 */