Skip to content

Commit 81d5964

Browse files
committed
fix(unip-01): resolve marked owner by latest event; null-safe marker check
Addresses review feedback on #6: - queryWithFirstSeenWins: read the UNIP-01 marker from each author's latest (per NIP-33 replaceable) event rather than a separately tracked latestMarked, so a newer unmarked update correctly drops the author from the marked set. Removed the latestMarked field/tracking (AuthorState back to 2-arg). - hasNametagOwnershipMarker: null-check tag entries to avoid an NPE on a malformed tags list.
1 parent 16a1bf1 commit 81d5964

2 files changed

Lines changed: 12 additions & 18 deletions

File tree

src/main/java/org/unicitylabs/nostr/client/NostrClient.java

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -778,13 +778,16 @@ private <T> CompletableFuture<T> queryWithFirstSeenWins(Filter filter,
778778
return null;
779779
}
780780
// UNIP-01: prefer marker-carrying (relay-vetted single-owner)
781-
// bindings, ignoring the self-asserted created_at. Exactly one
782-
// marked owner is the relay-enforced norm; more than one distinct
783-
// marked author means cross-relay disagreement — do not guess.
781+
// bindings, ignoring the self-asserted created_at. The marker is
782+
// read from each author's CURRENT (latest, per NIP-33 replaceable)
783+
// event, so a newer unmarked update correctly drops the author from
784+
// the marked set. Exactly one marked owner is the relay-enforced
785+
// norm; more than one distinct marked author means cross-relay
786+
// disagreement — do not guess.
784787
List<Event> marked = new ArrayList<>();
785788
for (AuthorState state : authorState.values()) {
786-
if (state.latestMarked != null) {
787-
marked.add(state.latestMarked);
789+
if (NametagBinding.hasNametagOwnershipMarker(state.latestEvent)) {
790+
marked.add(state.latestEvent);
788791
}
789792
}
790793
if (!marked.isEmpty()) {
@@ -819,22 +822,16 @@ public void onEvent(Event event) {
819822

820823
String pubkey = event.getPubkey();
821824
long createdAt = event.getCreatedAt();
822-
boolean marked = NametagBinding.hasNametagOwnershipMarker(event);
823825

824826
authorState.compute(pubkey, (k, prev) -> {
825827
if (prev == null) {
826-
return new AuthorState(createdAt, event, marked ? event : null);
828+
return new AuthorState(createdAt, event);
827829
}
828830
long firstSeen = Math.min(prev.firstSeen, createdAt);
829831
Event latest = createdAt > prev.latestEvent.getCreatedAt()
830832
? event
831833
: prev.latestEvent;
832-
Event latestMarked = prev.latestMarked;
833-
if (marked && (latestMarked == null
834-
|| createdAt > latestMarked.getCreatedAt())) {
835-
latestMarked = event;
836-
}
837-
return new AuthorState(firstSeen, latest, latestMarked);
834+
return new AuthorState(firstSeen, latest);
838835
});
839836
}
840837

@@ -1730,13 +1727,10 @@ private static class QueuedEvent {
17301727
private static class AuthorState {
17311728
final long firstSeen;
17321729
final Event latestEvent;
1733-
/** UNIP-01: latest marker-carrying (single-owner) binding, or null. */
1734-
final Event latestMarked;
17351730

1736-
AuthorState(long firstSeen, Event latestEvent, Event latestMarked) {
1731+
AuthorState(long firstSeen, Event latestEvent) {
17371732
this.firstSeen = firstSeen;
17381733
this.latestEvent = latestEvent;
1739-
this.latestMarked = latestMarked;
17401734
}
17411735
}
17421736
}

src/main/java/org/unicitylabs/nostr/nametag/NametagBinding.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ public static boolean hasNametagOwnershipMarker(Event event) {
420420
return false;
421421
}
422422
for (List<String> tag : event.getTags()) {
423-
if (tag.size() >= 2 && "L".equals(tag.get(0))
423+
if (tag != null && tag.size() >= 2 && "L".equals(tag.get(0))
424424
&& UNICITY_NAMETAG_NAMESPACE.equals(tag.get(1))) {
425425
return true;
426426
}

0 commit comments

Comments
 (0)