unionlabs/union · error
plugin not found
Error message
plugin not found
What it means
Under 'voyager plugin interest', voyager loads the config, resolves each plugin entry's name via get_plugin_info (spawning/inspecting the plugin binary), and linearly searches for the user-supplied plugin_name. If no configured plugin's resolved name equals the argument, it errors 'plugin not found'. The comparison uses the plugin's self-reported name, not the config key or file name, which is why mismatches are common.
Source
Thrown at voyager/src/main.rs:190
.build()
.await?;
info!("starting relay service");
voyager.run().await;
}
Command::Plugin(cmd) => match cmd {
PluginCmd::Interest {
plugin_name,
message,
} => {
let plugin_config = get_voyager_config()?
.plugins
.into_iter()
.try_find(|plugin_config| {
<anyhow::Result<_>>::Ok(plugin_name == get_plugin_info(plugin_config)?.name)
})?
.ok_or(anyhow!("plugin not found"))?;
let (filter, plugin_name) = make_filter(get_plugin_info(&plugin_config)?)?;
let result = run_filter(
&filter,
plugin_name,
serde_json::from_str::<serde_json::Value>(&message)?.into(),
);
match result {
Ok(JaqFilterResult::Take(tag)) => {
println!("interest (take, {tag})");
}
Ok(JaqFilterResult::Copy(tag)) => {
println!("interest (copy, {tag})");
}
Ok(JaqFilterResult::NoInterest) => println!("no interest"),
Err(()) => println!("failed"),View on GitHub (pinned to 031785bb6d)
Solutions
- List the actual plugin names first (e.g. 'voyager plugin list' / the list subcommand) and use the exact resolved name.
- Open your config file and check the plugins array; ensure the plugin you meant is present and its name matches what you pass.
- If the plugin is missing, add its entry (path + config) to the config's plugins list.
- Re-run with the corrected name; note the match is exact and case-sensitive.
Example fix
# before
voyager --config cfg.json plugin interest --plugin-name voyager-client-eth --message '{...}'
# after — use the resolved plugin name shown by `plugin list`
voyager --config cfg.json plugin list
voyager --config cfg.json plugin interest --plugin-name client-eth --message '{...}' Defensive patterns
Strategy: validation
Validate before calling
# validate the name against the config before invoking
jq -e --arg n "$PLUGIN" '.plugins[] | select(.name == $n)' voyager-config.json >/dev/null \
|| { echo "plugin $PLUGIN not in config"; exit 1; }
voyager --config voyager-config.json plugin interest --plugin-name "$PLUGIN" --message "$MSG" Type guard
fn plugin_configured(config: &serde_json::Value, name: &str) -> bool {
config["plugins"].as_array().map(|ps| ps.iter().any(|p| p["name"] == name)).unwrap_or(false)
} Try / catch
let plugin = get_voyager_config()?.plugins.into_iter().find(|p| resolved_name(p)? == plugin_name)
.with_context(|| format!("plugin {plugin_name:?} not found — check `plugin list` for exact names"))?; Prevention
- Call plugin list once per environment and source names from it in scripts.
- Note the lookup uses the plugin's self-reported name — not the binary filename.
When it happens
Trigger: Running 'voyager plugin interest --plugin-name <name> --message <json>' where <name> does not match get_plugin_info(plugin_config)?.name for any entry in config.plugins — e.g. using the binary filename, the config key, or a renamed plugin.
Common situations: Plugin renamed between versions while scripts keep the old name; using the plugin's crate/binary name instead of its registered name; a plugin binary missing on disk so its info resolution fails differently; typos.
Related errors
- config file must be specified
- no database set in config, queue commands require the `pg-qu
- unknown IBC spec `{ibc_spec_id}`
- client info not found
- no ucs03 deployment for {chain_id}
AI-assisted analysis of unionlabs/union@031785bb6d (2026-08-16).
Data as JSON: /api/errors/3a2c6801b99a3d23.
Report an issue: GitHub.