Change verifier statement kind to 14672

This commit is contained in:
Alex Gleason
2026-06-12 12:55:00 -05:00
parent b271c4e889
commit 59c0d25fa6
4 changed files with 13 additions and 13 deletions
+8 -8
View File
@@ -15,7 +15,7 @@
| 33863 | Campaign | Self-authored fundraising campaign with a single Bitcoin wallet endpoint (`bc1...` or `sp1...`) |
| 30385 | Community Stats Snapshot | Pre-computed per-country / global community leaderboards |
| 36639 | Pledge | Donor pledge for concrete submissions, stored as sats |
| 15063 | Verifier Statement | Self-authored statement describing how the author verifies campaigns (one per user) |
| 14672 | Verifier Statement | Self-authored statement describing how the author verifies campaigns (one per user) |
### Agora Protocols
@@ -741,7 +741,7 @@ Fold by `(coord, moderator)`, keeping the newest label per pair. A campaign is "
---
## Kind 15063: Verifier Statement
## Kind 14672: Verifier Statement
### Summary
@@ -749,13 +749,13 @@ Replaceable event kind for a **self-authored statement describing how the author
Exactly one statement per user (replaceable, no `d` tag): publishing a new event replaces the previous one. Clients surface the statement prominently on the author's profile page.
This kind is **distinct from** the `agora.verified` campaign-verification labels (kind 1985, see Kind 33863 above). Those are moderator-signed, gated by the Team Soapbox follow pack, and vouch for one specific campaign. A kind 15063 statement is an open, self-published description of an author's *general* verification methodology and confers no special authority — it is a reputation signal donors read, not an access-control mechanism.
This kind is **distinct from** the `agora.verified` campaign-verification labels (kind 1985, see Kind 33863 above). Those are moderator-signed, gated by the Team Soapbox follow pack, and vouch for one specific campaign. A kind 14672 statement is an open, self-published description of an author's *general* verification methodology and confers no special authority — it is a reputation signal donors read, not an access-control mechanism.
### Event Structure
```json
{
"kind": 15063,
"kind": 14672,
"pubkey": "<author-pubkey>",
"content": "I personally visit each campaign organizer over video call, confirm their identity against a government ID, and cross-check the cause with at least two independent local sources before I vouch for it. ...",
"tags": [
@@ -776,24 +776,24 @@ The `content` field is the verifier statement, formatted as **Markdown**. Client
| `alt` | Recommended | NIP-31 human-readable fallback describing the event's purpose. |
| `t` | Optional | Agora content marker (`t:agora`). Added at publish time via `withAgoraTag`. |
The statement carries no queryable fields beyond the author and kind — it is identified entirely by `(15063, pubkey)`.
The statement carries no queryable fields beyond the author and kind — it is identified entirely by `(14672, pubkey)`.
### Querying
**Fetch a user's verifier statement:**
```json
{ "kinds": [15063], "authors": ["<pubkey>"], "limit": 1 }
{ "kinds": [14672], "authors": ["<pubkey>"], "limit": 1 }
```
Clients MUST filter by `authors` — a verifier statement only describes the diligence of the pubkey that signed it, so an unfiltered query would be meaningless (and would let anyone's statement be attributed to anyone).
### Client Behavior
- **Becoming a verifier:** a user publishes a kind 15063 event with their statement in `content`. No approval, allowlist, or moderation gate applies.
- **Becoming a verifier:** a user publishes a kind 14672 event with their statement in `content`. No approval, allowlist, or moderation gate applies.
- **Withdrawing:** a user republishes the event with empty `content`, or publishes a NIP-09 kind 5 deletion referencing the event. Either way clients stop rendering the verifier section.
- **Rendering:** clients SHOULD surface the statement prominently on the author's profile (e.g. a dedicated "Verifier" section in the profile overview), rendering the Markdown content sanitized.
- **Editing:** because the kind is replaceable, the latest event per `(15063, pubkey)` wins. Clients performing an edit SHOULD pass the previous event as `prev` so `published_at` is preserved (NIP-23 convention).
- **Editing:** because the kind is replaceable, the latest event per `(14672, pubkey)` wins. Clients performing an edit SHOULD pass the previous event as `prev` so `published_at` is preserved (NIP-23 convention).
---
@@ -390,7 +390,7 @@ export function ProfileOverviewSections({
const { t } = useTranslation();
return (
<div className={cn('flex flex-col gap-5', className)}>
{/* Verifier statement (kind 15063) — surfaced first so donors can
{/* Verifier statement (kind 14672) — surfaced first so donors can
immediately see how this account verifies campaigns. Renders
nothing when the profile has not published a statement. */}
<ProfileVerifierSection pubkey={pubkey} />
@@ -12,7 +12,7 @@ interface ProfileVerifierSectionProps {
}
/**
* Renders a profile's kind 15063 verifier statement — a self-published
* Renders a profile's kind 14672 verifier statement — a self-published
* explanation of how the account verifies campaigns. Surfaced prominently
* in the profile overview so donors can judge whether to trust the
* account's verifications.
+3 -3
View File
@@ -7,16 +7,16 @@ import { fetchFreshEvent } from '@/lib/fetchFreshEvent';
import { withAgoraTag } from '@/lib/agoraNoteTags';
/**
* Kind 15063 — Verifier Statement (see NIP.md).
* Kind 14672 — Verifier Statement (see NIP.md).
*
* A replaceable event (one per user) whose `content` is a freeform Markdown
* statement describing how the author verifies campaigns. Anyone can publish
* one to "become a verifier"; empty content means the author has withdrawn.
*/
export const VERIFIER_STATEMENT_KIND = 15063;
export const VERIFIER_STATEMENT_KIND = 14672;
/**
* Query a user's verifier statement (kind 15063).
* Query a user's verifier statement (kind 14672).
*
* Returns the trimmed Markdown statement, or `null` when the user has no
* statement or has withdrawn it (empty content).