feat: Trump-Signal-Watchlist (WLFI-Multisig, verifizierte ERC-20-Contracts, Truth-Keywords)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
20
src/server/signals/watchlist.test.ts
Normal file
20
src/server/signals/watchlist.test.ts
Normal file
@@ -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);
|
||||
}
|
||||
});
|
||||
});
|
||||
56
src/server/signals/watchlist.ts
Normal file
56
src/server/signals/watchlist.ts
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user