code: func (d *Downloader) Progress() ethereum.SyncProgress {
  	// Lock the current stats and return the progress
  	d.syncStatsLock.RLock()
  	defer d.syncStatsLock.RUnlock()
  
  	current := uint64(0)
  	switch d.mode {
  	case FullSync:
  		current = d.blockchain.CurrentBlock().NumberU64()
  	case FastSync:
  		current = d.blockchain.CurrentFastBlock().NumberU64()
  	case LightSync:
  		current = d.lightchain.CurrentHeader().Number.Uint64()
  	}
  	return ethereum.SyncProgress{
  		StartingBlock: d.syncStatsChainOrigin,
  		CurrentBlock:  current,
  		HighestBlock:  d.syncStatsChainHeight,
  		PulledStates:  d.syncStatsState.processed,
  		KnownStates:   d.syncStatsState.processed + d.syncStatsState.pending,
  	}
  }
docs: // Progress retrieves the synchronisation boundaries, specifically the origin
  // block where synchronisation started at (may have failed/suspended); the block
  // or header sync is currently at; and the latest known block which the sync targets.
  //
  // In addition, during the state download phase of fast synchronisation the number
  // of processed and the total number of known states are also returned. Otherwise
  // these are zero.