Skip to content

feat: add Marmot Protocol relay support (MIPs 00-03)#602

Merged
cameri merged 2 commits intocameri:mainfrom
CKodidela:feat/marmot-protocol-v2
May 3, 2026
Merged

feat: add Marmot Protocol relay support (MIPs 00-03)#602
cameri merged 2 commits intocameri:mainfrom
CKodidela:feat/marmot-protocol-v2

Conversation

@CKodidela
Copy link
Copy Markdown
Collaborator

Description

Adds relay support for the Marmot Protocol, the emerging standard for
E2EE group messaging on Nostr (MIPs 00–03).

The relay stays fully transport-only no MLS logic, all cryptographic complexity lives on the client side.

Kind Role Handling
443 Legacy KeyPackage DefaultEventStrategy (regular storage)
10051 KeyPackage relay list ReplaceableEventStrategy
30443 KeyPackage (addressable) ParameterizedReplaceableEventStrategy (d-tag deduplication)
444 Welcome rumor Blocked from direct publishing per MIP-02; delivered via existing kind:1059 gift wrap
infrastructure
445 Group Event New GroupEventStrategy validates required h tag (nostr_group_id) before storing

#h tag subscriptions for group filtering work via the existing generic single-character tag index no migration
needed. NIP-11 relay info now advertises supported_mips: [0, 1, 2, 3].

Related Issue

Closes #579

Motivation and Context

Nostream has no support for the Marmot Protocol. Adding relay support makes nostream one of the first relays to
explicitly support it, and pairs naturally with the NIP-17+44 work from #458.

How Has This Been Tested?

  • 26 new unit tests covering: GroupEventStrategy (valid event, missing h tag, multiple h tags, malformed group
    ID), factory routing for all 5 Marmot kinds, kind:444 direct-publish blocking, and
    isWelcomeRumorEvent/isMarmotGroupEvent helpers
  • Full suite: 1238 tests passing (was 1212)
  • pnpm run build clean
  • pnpm run lint clean (285 files, no issues)

Types of changes

  • New feature (non-breaking change which adds functionality)

Checklist:

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have read the CONTRIBUTING document.
  • I have added tests to cover my code changes.
  • I added a changeset, or this is docs-only and I added an empty changeset.
  • All new and existing tests passed.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 3, 2026

🦋 Changeset detected

Latest commit: aacefe6

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
nostream Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coveralls
Copy link
Copy Markdown
Collaborator

coveralls commented May 3, 2026

Coverage Status

coverage: 64.775% (+0.2%) from 64.591% — CKodidela:feat/marmot-protocol-v2 into cameri:main

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds first-class Marmot Protocol relay support so the relay can accept Marmot-related event kinds, advertise that support in its relay info document, and enforce protocol-specific handling for welcome rumors and group events.

Changes:

  • Added Marmot event kind/tag constants and helper predicates, plus routing for kind 445 to a new GroupEventStrategy.
  • Blocked direct publication of kind 444 welcome rumors and exposed supported_mips in the NIP-11 relay info document.
  • Added Marmot-focused tests for event helpers, event validation, strategy factory routing, and the new group-event strategy.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
test/unit/utils/event.spec.ts Adds unit tests for Marmot event-kind helper predicates.
test/unit/handlers/event-strategies/group-event-strategy.spec.ts Adds coverage for kind 445 validation and persistence behavior.
test/unit/handlers/event-message-handler.spec.ts Adds tests for blocking kind 444 and allowing kind 445.
test/unit/factories/event-strategy-factory.spec.ts Verifies strategy selection for Marmot kinds.
src/utils/event.ts Adds helper functions for Marmot welcome rumor and group event detection.
src/handlers/request-handlers/root-request-handler.ts Advertises supported_mips in the relay information document.
src/handlers/event-strategies/group-event-strategy.ts Introduces validation/storage flow for Marmot group events.
src/handlers/event-message-handler.ts Blocks direct publishing of kind 444 welcome rumors.
src/factories/event-strategy-factory.ts Routes kind 445 events to the new strategy.
src/constants/base.ts Defines Marmot event kinds and the h group tag.
resources/default-settings.yaml Adds a specific rate limit entry for kind 445 group events.
package.json Declares supported MIPs metadata.
.changeset/marmot-protocol-support.md Documents the feature for release notes/versioning.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

if (isSealEvent(event) || isDirectMessageEvent(event) || isFileMessageEvent(event)) {
// Marmot MIP-02: kind 444 (Welcome rumor) is similarly an inner event that
// must only be delivered inside a kind 1059 gift wrap.
if (isSealEvent(event) || isDirectMessageEvent(event) || isFileMessageEvent(event) || isWelcomeRumorEvent(event)) {
Comment on lines +21 to +23
const reason = this.validateGroupEvent(event)
if (reason) {
this.webSocket.emit(WebSocketAdapterEvent.Message, createCommandResult(event.id, false, `invalid: ${reason}`))
contact,
supported_nips: packageJson.supportedNips,
supported_nip_extensions: packageJson.supportedNipExtensions,
supported_mips: packageJson.supportedMips,
@CKodidela
Copy link
Copy Markdown
Collaborator Author

Integration tests to be added

@cameri cameri merged commit d3ba328 into cameri:main May 3, 2026
19 of 20 checks passed
@CKodidela CKodidela deleted the feat/marmot-protocol-v2 branch May 3, 2026 20:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add Marmot Protocol relay support (kind 443/444/445)

4 participants