using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using PolyTrader.Modules.Accounting.Models; namespace PolyTrader.Modules.Accounting.Services { /// /// Unabhängige Polymarket-Activity-Quelle (Data-API /activity, ALLE Typen). Interface, damit die /// Buchungslogik ohne Live-API testbar/offline lauffähig ist; die Live-Implementierung (Zielland) /// mappt die reale API-JSON auf und speichert den Rohschnappschuss. /// public interface IActivitySource { /// Activity ab (null = volle Historie/Backfill), paginiert. Task> GetActivityAsync(string wallet, DateTime? since, CancellationToken ct); } /// On-Chain-USDC-Transfers des Safe-Wallets (ERC-20-Logs). Live-Impl über Alchemy (Zielland). public interface ITransferSource { Task> GetTransfersAsync(string wallet, DateTime? since, CancellationToken ct); } /// On-Chain-USDC-Saldo als Balance-Anker (Soll-Ist). Live-Impl über GetUsdcBalanceAsync. public interface IBalanceAnchorSource { Task GetBalanceAsync(string wallet, CancellationToken ct); } /// /// Offline-Stubs: das Modul läuft ohne Live-Anbindung vollständig (Ingest bucht dann korrekt nichts). /// Im Zielland werden die echten Quellen registriert (Muster wie NullFarmingMarketSource). /// public sealed class NullActivitySource : IActivitySource { public Task> GetActivityAsync(string wallet, DateTime? since, CancellationToken ct) => Task.FromResult((IReadOnlyList)Array.Empty()); } public sealed class NullTransferSource : ITransferSource { public Task> GetTransfersAsync(string wallet, DateTime? since, CancellationToken ct) => Task.FromResult((IReadOnlyList)Array.Empty()); } public sealed class NullBalanceAnchorSource : IBalanceAnchorSource { public Task GetBalanceAsync(string wallet, CancellationToken ct) => Task.FromResult((decimal?)null); } /// /// Whitelist der Polymarket-System-Contract-Adressen (lowercased). Transfers zu/von diesen Adressen /// sind interne Trading-Bewegungen (bereits in der Activity), KEINE Ein-/Auszahlungen. Wird im /// Zielland aus Config/Docs befüllt/verifiziert (CTF-Adresse liegt bereits im Core; Exchange/ /// NegRisk-Adapter/USDC ergänzen). Default leer → ohne Live-Transfers unkritisch. /// public sealed class AccountingSystemContracts { public HashSet Addresses { get; } = new(StringComparer.OrdinalIgnoreCase); public AccountingSystemContracts(IEnumerable? addresses = null) { if (addresses == null) return; foreach (var a in addresses) if (!string.IsNullOrWhiteSpace(a)) Addresses.Add(a.Trim().ToLowerInvariant()); } } }