ipfs/kubo · error

unsupported Pubsub.SeenMessagesStrategy %q

Error message

unsupported Pubsub.SeenMessagesStrategy %q

What it means

`Pubsub.SeenMessagesStrategy` selects how pubsub deduplicates already-seen message IDs (timecache strategy). Only "last-seen" and "first-seen" are accepted; any other string aborts libp2p node construction with fx.Error.

Source

Thrown at core/node/groups.go:79

	if bcfg.getOpt("pubsub") || bcfg.getOpt("ipnsps") {
		disc = fx.Provide(libp2p.TopicDiscovery())

		var pubsubOptions []pubsub.Option
		pubsubOptions = append(
			pubsubOptions,
			pubsub.WithMessageSigning(!cfg.Pubsub.DisableSigning),
			pubsub.WithSeenMessagesTTL(cfg.Pubsub.SeenMessagesTTL.WithDefault(pubsub.TimeCacheDuration)),
		)

		var seenMessagesStrategy timecache.Strategy
		configSeenMessagesStrategy := cfg.Pubsub.SeenMessagesStrategy.WithDefault(config.DefaultSeenMessagesStrategy)
		switch configSeenMessagesStrategy {
		case config.LastSeenMessagesStrategy:
			seenMessagesStrategy = timecache.Strategy_LastSeen
		case config.FirstSeenMessagesStrategy:
			seenMessagesStrategy = timecache.Strategy_FirstSeen
		default:
			return fx.Error(fmt.Errorf("unsupported Pubsub.SeenMessagesStrategy %q", configSeenMessagesStrategy))
		}
		pubsubOptions = append(pubsubOptions, pubsub.WithSeenMessagesStrategy(seenMessagesStrategy))

		switch cfg.Pubsub.Router {
		case "":
			fallthrough
		case "gossipsub":
			ps = fx.Provide(libp2p.GossipSub(pubsubOptions...))
		case "floodsub":
			ps = fx.Provide(libp2p.FloodSub(pubsubOptions...))
		default:
			return fx.Error(fmt.Errorf("unknown pubsub router %s", cfg.Pubsub.Router))
		}
	}

	autonat := fx.Options()

	switch cfg.AutoNAT.ServiceMode {

View on GitHub (pinned to 329838acdf)

Solutions

  1. Set the strategy to exactly "first-seen" or "last-seen" via `ipfs config Pubsub.SeenMessagesStrategy first-seen`
  2. Remove the SeenMessagesStrategy key to use the default
  3. Consult docs/config.md for exact accepted strings

Example fix

// before (config.json)
"SeenMessagesStrategy": "lastseen"
// after
"SeenMessagesStrategy": "last-seen"
Defensive patterns

Strategy: validation

Validate before calling

if s := cfg.Pubsub.SeenMessagesStrategy; s != "" && s != "last-seen" && s != "first-seen" {
	return fmt.Errorf("Pubsub.SeenMessagesStrategy %q unsupported", s)
}

Prevention

When it happens

Trigger: `Pubsub.SeenMessagesStrategy` config set to a value other than the constants defined in the config package (LastSeenMessagesStrategy/FirstSeenMessagesStrategy) while pubsub options are being assembled in the LibP2P group.

Common situations: Typo like "lastseen" or "Last-Seen"; config copied from docs of a different tool; hand-edited JSON with wrong casing.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of ipfs/kubo@329838acdf (2026-09-03). Data as JSON: /api/errors/9bf0124e097f4d3e. Report an issue: GitHub.