@nostr-dev-kit/ndk
Version:
NDK - Nostr Development Kit. Includes AI Guardrails to catch common mistakes during development.
80 lines (72 loc) • 3.88 kB
text/typescript
export enum NutzapValidationCode {
// Critical errors - make the nutzap invalid
NO_PROOFS = "NO_PROOFS",
INVALID_PROOF_COUNT = "INVALID_PROOF_COUNT",
MULTIPLE_RECIPIENTS = "MULTIPLE_RECIPIENTS",
NO_RECIPIENT = "NO_RECIPIENT",
MULTIPLE_MINTS = "MULTIPLE_MINTS",
NO_MINT = "NO_MINT",
MULTIPLE_EVENT_TAGS = "MULTIPLE_EVENT_TAGS",
MALFORMED_PROOF_SECRET = "MALFORMED_PROOF_SECRET",
// Non-critical warnings - suggest improvements but don't invalidate
MISSING_EVENT_TAG_IN_PROOF = "MISSING_EVENT_TAG_IN_PROOF",
MISMATCHED_EVENT_TAG_IN_PROOF = "MISMATCHED_EVENT_TAG_IN_PROOF",
MISSING_SENDER_TAG_IN_PROOF = "MISSING_SENDER_TAG_IN_PROOF",
MISMATCHED_SENDER_TAG_IN_PROOF = "MISMATCHED_SENDER_TAG_IN_PROOF",
NO_EVENT_TAG_IN_EVENT = "NO_EVENT_TAG_IN_EVENT",
}
export enum NutzapValidationSeverity {
ERROR = "ERROR",
WARNING = "WARNING",
}
export type NutzapValidationIssue = {
code: NutzapValidationCode;
severity: NutzapValidationSeverity;
message: string;
proofIndex?: number;
};
export type NutzapValidationResult = {
valid: boolean;
issues: NutzapValidationIssue[];
};
const SEVERITY_MAP: Record<NutzapValidationCode, NutzapValidationSeverity> = {
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.ERROR,
[]: NutzapValidationSeverity.WARNING,
[]: NutzapValidationSeverity.WARNING,
[]: NutzapValidationSeverity.WARNING,
[]: NutzapValidationSeverity.WARNING,
[]: NutzapValidationSeverity.WARNING,
};
const ERROR_MESSAGES: Record<NutzapValidationCode, string> = {
[]: "Nutzap must contain at least one proof",
[]: "Invalid proof count",
[]: "Nutzap must have exactly one recipient (p tag)",
[]: "Nutzap must have a recipient (p tag)",
[]: "Nutzap must specify exactly one mint (u tag)",
[]: "Nutzap must specify a mint (u tag)",
[]: "Nutzap must have at most one event tag (e tag)",
[]: "Proof secret is malformed and cannot be parsed",
[]: "Proof secret missing 'e' tag for replay protection",
[]: "Proof secret 'e' tag does not match event being zapped",
[]: "Proof secret missing 'P' tag for sender verification",
[]: "Proof secret 'P' tag does not match sender pubkey",
[]: "Nutzap event missing 'e' tag (recommended for replay protection)",
};
export function createValidationIssue(
code: NutzapValidationCode,
proofIndex?: number
): NutzapValidationIssue {
return {
code,
severity: SEVERITY_MAP[code],
message: ERROR_MESSAGES[code],
proofIndex,
};
}