Goon — self-hosted aggregator for adult-content scene metadata. Indexes scenes from TPDB, StashDB, and 30+ public adult tube sites. Cross-source deduplication via perceptual hash + Levenshtein distance. FastAPI backend + APScheduler worker + React Native (Expo) mobile client. FOSS, ad-free, donation-funded. See README for details.
71 lines
2.6 KiB
TypeScript
71 lines
2.6 KiB
TypeScript
// Donation addresses for the project. These are PUBLIC by design — the app ships
|
|
// them in plaintext so users can verify them on-screen + cross-reference against
|
|
// the project README before sending crypto.
|
|
//
|
|
// To swap addresses: regenerate in your wallet, paste new value here, rebuild APK.
|
|
// (We do NOT fetch addresses from backend — that would let a compromised server
|
|
// swap addresses mid-donation. Hardcoding pins the address to the signed APK.)
|
|
|
|
export type DonateCoin = {
|
|
/** Internal key, used for analytics + storage. */
|
|
id: 'xmr' | 'btc' | 'ltc';
|
|
/** Short ticker shown in UI chip. */
|
|
ticker: string;
|
|
/** Full name shown on detail card. */
|
|
name: string;
|
|
/** One-line value prop shown under the name. */
|
|
blurb: string;
|
|
/** Receive address — generate fresh, never re-use across projects. */
|
|
address: string;
|
|
/** Hex color used as the coin's accent in the UI. */
|
|
color: string;
|
|
/** Optional URI scheme prefix for QR codes (most wallets recognize these). */
|
|
qrScheme?: string;
|
|
};
|
|
|
|
// PLACEHOLDER ADDRESSES — replace before publishing.
|
|
// Workflow:
|
|
// 1. Install Cake Wallet from github.com/cake-tech/cake_wallet/releases (NOT Play Store)
|
|
// 2. Generate XMR + BTC + LTC wallets, store each seed offline on its own paper
|
|
// 3. Tap "Receive" per wallet → copy address → paste below
|
|
// 4. Rebuild APK + publish update
|
|
export const DONATE_COINS: DonateCoin[] = [
|
|
{
|
|
id: 'xmr',
|
|
ticker: 'XMR',
|
|
name: 'Monero',
|
|
blurb: 'Privacy by default. Untraceable on-chain. Recommended.',
|
|
address: '47cXcrsYUsk81rDY3wp7ASUQtpkMHyrt4WHpqef9nSUugqxqFRaE13QBd1wviGpJHJ9Vt82GsyncNEKHQizXkoVMUVMEh1c',
|
|
color: '#F26822',
|
|
qrScheme: 'monero:',
|
|
},
|
|
{
|
|
id: 'btc',
|
|
ticker: 'BTC',
|
|
name: 'Bitcoin',
|
|
blurb: 'Mainstream, easy to send. On-chain is public — use a fresh wallet to donate anonymously.',
|
|
address: 'bc1qcaa4rv89rtt39y92rpff5rlysmtkful9ck6mml',
|
|
color: '#F7931A',
|
|
qrScheme: 'bitcoin:',
|
|
},
|
|
{
|
|
id: 'ltc',
|
|
ticker: 'LTC',
|
|
name: 'Litecoin',
|
|
blurb: 'Fast and cheap (~$0.01 fee). Lower adoption than BTC but friendlier for small donations.',
|
|
address: 'ltc1qlqe0f7nmt4se82adgj8z6vcz2zeqfrlwz0n85s',
|
|
color: '#345D9D',
|
|
qrScheme: 'litecoin:',
|
|
},
|
|
];
|
|
|
|
/** Returns the value to encode in the QR code — wallet URI when supported. */
|
|
export function qrPayload(coin: DonateCoin): string {
|
|
if (coin.qrScheme) return `${coin.qrScheme}${coin.address}`;
|
|
return coin.address;
|
|
}
|
|
|
|
/** True when an address still equals its placeholder — used to gate the screen. */
|
|
export function isPlaceholder(addr: string): boolean {
|
|
return addr.startsWith('REPLACE_WITH_');
|
|
}
|