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
- Set the strategy to exactly "first-seen" or "last-seen" via `ipfs config Pubsub.SeenMessagesStrategy first-seen`
- Remove the SeenMessagesStrategy key to use the default
- 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
- Use only "last-seen" or "first-seen" for SeenMessagesStrategy
- Keep config values lowercase as documented in docs/config.md
- Set config via `ipfs config` to avoid typos
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
- experimental pubsub feature not enabled, run daemon with --e
- unknown pubsub router %s
- private networking (swarm.key / LIBP2P_FORCE_PNET) does not
- Routing.AcceleratedDHTClient option is set even tho Routing.
- serveHTTPApi: GetConfig() failed: %s
AI-assisted analysis of ipfs/kubo@329838acdf (2026-09-03).
Data as JSON: /api/errors/9bf0124e097f4d3e.
Report an issue: GitHub.