From 0b5a9448b5f1f78c3e6bf6f8af68af1320d9b268 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 07:53:22 +0000 Subject: [PATCH] feat: Trump-Signal-Watchlist (WLFI-Multisig, verifizierte ERC-20-Contracts, Truth-Keywords) Co-Authored-By: Claude Fable 5 --- src/server/signals/watchlist.test.ts | 20 ++++++++++ src/server/signals/watchlist.ts | 56 ++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/server/signals/watchlist.test.ts create mode 100644 src/server/signals/watchlist.ts diff --git a/src/server/signals/watchlist.test.ts b/src/server/signals/watchlist.test.ts new file mode 100644 index 0000000..2addd32 --- /dev/null +++ b/src/server/signals/watchlist.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, test } from 'bun:test'; +import { TRACKED_TOKENS, COIN_KEYWORDS, WATCHED_WALLETS } from './watchlist'; +import { TRUMP_PAIRS } from '../types'; + +describe('watchlist', () => { + test('alle Token-Instrumente liegen im Trump-Universum', () => { + for (const t of TRACKED_TOKENS) { + if (t.instrument) expect(TRUMP_PAIRS).toContain(t.instrument); + } + }); + test('Contract-Adressen und Wallets sind lowercase (getLogs-Vergleich)', () => { + for (const t of TRACKED_TOKENS) expect(t.contract).toBe(t.contract.toLowerCase()); + for (const w of WATCHED_WALLETS) expect(w.address).toBe(w.address.toLowerCase()); + }); + test('Keyword-Instrumente liegen im Trump-Universum oder sind null', () => { + for (const c of COIN_KEYWORDS) { + if (c.instrument) expect(TRUMP_PAIRS).toContain(c.instrument); + } + }); +}); diff --git a/src/server/signals/watchlist.ts b/src/server/signals/watchlist.ts new file mode 100644 index 0000000..f301813 --- /dev/null +++ b/src/server/signals/watchlist.ts @@ -0,0 +1,56 @@ +import type { Pair } from '../types'; + +/** + * Kuratierte Trump-Signal-Config. Aufnahme-Kriterium Watchlist: + * öffentlich dokumentierte Attribution (Etherscan-Label oder Presse mit Tx-Beleg), + * Quelle als Kommentar an jedem Eintrag. Alle Adressen lowercase. + */ +export interface TrackedToken { + symbol: string; + contract: string; + decimals: number; + instrument: Pair | null; // null = Event nur loggen, nicht handeln +} + +export const WATCHED_WALLETS: { address: string; label: string }[] = [ + // Etherscan-Label „World Liberty: Multisig"; hält ONDO + Reste LINK/AAVE/ENA/WBTC (on-chain verifiziert 2026-06-12) + { address: '0x5be9a4959308a0d0c7bc0870e319314d8d957dbb', label: 'World Liberty: Multisig' }, +]; + +// Contracts + decimals on-chain verifiziert via eth_call symbol()/decimals() am 2026-06-12 +export const TRACKED_TOKENS: TrackedToken[] = [ + { symbol: 'WBTC', contract: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', decimals: 8, instrument: 'BTC_USDT' }, + { symbol: 'WETH', contract: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', decimals: 18, instrument: 'ETH_USDT' }, + { symbol: 'LINK', contract: '0x514910771af9ca656af840dff83e8264ecf986ca', decimals: 18, instrument: 'LINK_USDT' }, + { symbol: 'AAVE', contract: '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9', decimals: 18, instrument: 'AAVE_USDT' }, + { symbol: 'ONDO', contract: '0xfaba6f8e4a5e8ab82f62fe7c39859fa577269be3', decimals: 18, instrument: 'ONDO_USDT' }, + { symbol: 'ENA', contract: '0x57e114b691db790c35207b2e685d4a43181e6061', decimals: 18, instrument: 'ENA_USDT' }, +]; + +export const TOKEN_BY_CONTRACT = new Map(TRACKED_TOKENS.map((t) => [t.contract, t])); + +/** Truth-Social-Matching: names case-insensitive, tickers nur in Großschreibung (False-Positive-Schutz). */ +export const COIN_KEYWORDS: { symbol: string; instrument: Pair | null; names: string[]; tickers: string[] }[] = [ + { symbol: 'BTC', instrument: 'BTC_USDT', names: ['bitcoin'], tickers: ['BTC'] }, + { symbol: 'ETH', instrument: 'ETH_USDT', names: ['ethereum', 'ether'], tickers: ['ETH'] }, + { symbol: 'XRP', instrument: 'XRP_USDT', names: ['ripple'], tickers: ['XRP'] }, + { symbol: 'SOL', instrument: 'SOL_USDT', names: ['solana'], tickers: ['SOL'] }, + { symbol: 'LINK', instrument: 'LINK_USDT', names: ['chainlink'], tickers: ['LINK'] }, + { symbol: 'AAVE', instrument: 'AAVE_USDT', names: ['aave'], tickers: ['AAVE'] }, + { symbol: 'ONDO', instrument: 'ONDO_USDT', names: ['ondo'], tickers: ['ONDO'] }, + { symbol: 'ENA', instrument: 'ENA_USDT', names: ['ethena'], tickers: ['ENA'] }, + { symbol: 'SUI', instrument: 'SUI_USDT', names: [], tickers: ['SUI'] }, // 'sui' lowercase zu generisch + { symbol: 'SEI', instrument: 'SEI_USDT', names: [], tickers: ['SEI'] }, + { symbol: 'TRX', instrument: null, names: ['tron'], tickers: ['TRX'] }, // kein USDT-Paar auf Crypto.com +]; + +/** RPC-Endpunkte ohne Account; Reihenfolge = Priorität. */ +export const RPC_URLS = [ + 'https://ethereum-rpc.publicnode.com', + 'https://eth.llamarpc.com', + 'https://cloudflare-eth.com', +]; + +export const TRUTH_FEED_URL = 'https://trumpstruth.org/feed'; +export const MIN_NOTIONAL_USD = 50_000; // Spam-/Dust-Schutz on-chain +export const TRUTH_DEDUPE_MS = 72 * 3600_000; // max. 1 Truth-Event je Coin pro 72 h