near-protocol-rewards
Version:
A transparent, metric-based rewards system for NEAR projects
119 lines (118 loc) • 2.65 kB
TypeScript
import { ValidationResult } from "./validation";
export type MetricsSource = "github";
export interface Score {
total: number;
breakdown: {
commits: number;
pullRequests: number;
reviews: number;
issues: number;
};
}
export interface MetricsMetadata {
source: MetricsSource;
projectId: string;
collectionTimestamp: number;
periodStart: number;
periodEnd: number;
}
export interface GitHubMetrics {
commits: {
count: number;
frequency: {
daily: number[];
weekly: number;
monthly: number;
};
authors: Array<{
login: string;
count: number;
}>;
};
pullRequests: {
open: number;
merged: number;
closed: number;
authors: string[];
};
reviews: {
count: number;
authors: string[];
};
issues: {
open: number;
closed: number;
participants: string[];
};
metadata: {
collectionTimestamp: number;
source: MetricsSource;
projectId: string;
};
}
export interface WalletActivity {
timestamp: number;
transactionHash: string;
type: 'incoming' | 'outgoing';
details: {
signerId: string;
receiverId: string;
actions: any[];
};
}
export interface NearMetrics {
activities: WalletActivity[];
timestamp: number;
}
export interface ProcessedMetrics {
github: GitHubMetrics;
near?: NearMetrics;
score: {
total: number;
breakdown: {
commits: number;
pullRequests: number;
reviews: number;
issues: number;
};
};
timestamp: number;
collectionTimestamp: number;
validation: ValidationResult;
metadata: {
source: 'github' | 'github+near';
projectId: string;
collectionTimestamp: number;
periodStart: number;
periodEnd: number;
};
periodStart: number;
periodEnd: number;
}
export interface RewardCalculation {
score: Score;
breakdown: {
commits: number;
pullRequests: number;
reviews: number;
issues: number;
};
level: {
name: string;
minScore: number;
maxScore: number;
color: string;
};
achievements: Array<{
id: string;
name: string;
description: string;
earnedAt: string;
category: "commit" | "pr" | "review" | "issue";
}>;
metadata: {
timestamp: number;
periodStart: number;
periodEnd: number;
};
}