SkateSpots/src/lib/backers.ts

71 lines
2.7 KiB
TypeScript

/**
* Curated list of Angor supporters shown on /supporters.
*
* Deliberately opt-in: only list people/organisations who are happy to be
* shown. Discover the raw list (privately) with:
* node ~/.config/skatespots/angor/angor-backers.mjs
* → writes ~/.config/skatespots/angor/work/backers.json (npub + txid).
* The amount = the sum of the investment transaction's Taproot stage outputs
* (per-backer `amount` = 99,000 sats here; total matches the app's "0.00198 BTC").
*
* Entries:
* - people: { npub, amount } → links to their profile; add `name` to override
* - shops / orgs: { name, logo, url, amount } (logo: PNG/WebP, transparent, ≥200px)
* - hide identity: { anonymous: true, note }
*
* ⚠️ Don't add someone without their consent — a backer's npub + "backed this
* project" is new, linkable information even though the key is public.
*/
export interface Backer {
/** Display name; falls back to "Anonymous supporter". */
name?: string;
/** Nostr profile — renders a skate placeholder + links to /<npub>. */
npub?: string;
/** Logo for a shop/brand/org (shown instead of the placeholder). */
logo?: string;
/** External link (used when there is no npub). */
url?: string;
/** Investment transaction id — renders a verifiable "on-chain" chip. */
txid?: string;
/** Amount contributed, in satoshis. */
amount?: number;
/** Contribution time (unix seconds). */
at?: number;
/** List without revealing name/logo/npub (privacy opt-out). */
anonymous?: boolean;
/** Small line under the name, e.g. "Founding backer". */
note?: string;
}
export const BACKERS: Backer[] = [
{
npub: 'npub15q3ekfxdvzuc9nhhyh2yv7lwtnfagurllc9rkkrypt40d303jsjsdfujeu',
txid: '4f95d18ff44a86e8302d923f53fe3777c52236ec087b0d374b8e9566995e1bcc',
amount: 99000,
at: 1780930859,
note: 'Founding supporter',
},
{
npub: 'npub1t5yjluyvxatlmmcxccv7tdppmp4ae0j850k63323t7j0fe4lsqlsp7mfyl',
txid: '5dbf872fd8f02ecf2b534857b0613e880a021478c6e8e6483c774e95d2ddc565',
amount: 99000,
at: 1780644182,
note: 'Founding supporter',
},
];
/** Total raised across the listed supporters, in satoshis. */
export const BACKERS_TOTAL_SATS = BACKERS.reduce((sum, b) => sum + (b.amount ?? 0), 0);
export type SupporterTier = 'supporter' | 'patron' | 'legend';
/**
* Tier by amount. The 100,000-sat boundary is the project's Angor penalty
* threshold: at/below it a contribution is donation-like, above it's an
* investment with a recovery path — so the tiers mirror the two rails honestly.
*/
export function tierOf(sats: number | undefined): SupporterTier {
if (!sats || sats < 100_000) return 'supporter';
if (sats < 1_000_000) return 'patron';
return 'legend';
}