Zum Inhalt

08 - CharityVaultV2

Charity Fund Management, On-Chain Ledger


Übersicht

CharityVaultV2 ist einer von zwei Contracts, die tatsächlich USDT halten (neben ReserveVault). Er empfängt den Charity-Anteil aus dem Settlement und führt ein on-chain Ledger für Compliance und Nachvollziehbarkeit.

Datei: contracts/contracts/CharityVaultV2.sol


State Variables

IERC20 public immutable usdt;                              // USDT Token (unveränderlich)
mapping(address => bool) public isAuthorizedSettlement;     // Multi-Auth

// Accounting
uint256 public totalReceived;                               // Gesamt empfangen
uint256 public totalPaid;                                   // Gesamt ausgezahlt
mapping(uint256 => uint256) public receivedByDay;           // Empfangen pro Tag

// Payout Ledger
struct CharityPayout {
    address project;     // Empfänger-Adresse
    uint256 amount;      // Betrag
    uint256 ts;          // Timestamp
    string reason;       // Buchungsgrund
}
mapping(uint256 => CharityPayout) public payouts;
uint256 public payoutCount;

recordIncome()

function recordIncome(uint256 dayId, uint256 amount)
    external onlyAuthorizedSettlement
  • Aufgerufen von: Settlement während commitMerkleSettlement()
  • Wichtig: Die USDT-Überweisung erfolgt vorher durch Settlement via reserveVault.payCharity()
  • Diese Funktion ist nur Accounting (kein Token-Transfer)
  • Updates: totalReceived += amount, receivedByDay[dayId] = amount

payout()

function payout(address project, uint256 amount, string calldata reason)
    external onlyOwner nonReentrant
  • Aufgerufen von: SAFE (Owner) - manueller Charity-Payout
  • Token-Transfer: usdt.safeTransfer(project, amount)
  • Ledger-Eintrag:
    payouts[payoutCount] = CharityPayout({
        project: project,
        amount: amount,
        ts: block.timestamp,
        reason: reason
    });
    payoutCount++;
    totalPaid += amount;
    
  • Event: CharityPayoutExecuted(project, amount, reason, payoutCount)

Access Control

Funktion Owner (SAFE) Settlement
recordIncome -
payout -
addSettlement -
removeSettlement -

Events

event CharityIncomeRecorded(uint256 dayId, uint256 amount);
event CharityPayoutExecuted(address project, uint256 amount, string reason, uint256 payoutId);

Compliance-Relevanz

Der CharityVault bietet einen vollständigen Audit Trail:

Datenpunkt Quelle
Tägliche Einnahmen receivedByDay[dayId]
Gesamt empfangen totalReceived
Gesamt ausgezahlt totalPaid
Aktueller Saldo usdt.balanceOf(charityVault)
Jede Auszahlung payouts[id] mit Empfänger, Betrag, Timestamp, Grund

Invariante: totalReceived - totalPaid == usdt.balanceOf(charityVault)


Audit-Hinweise

Hält tatsächlich USDT

Anders als PrizeVault und AffiliateVault hält CharityVault tatsächlich USDT. Der Saldo muss regelmäßig geprüft werden.

SAFE kontrolliert Auszahlungen

Charity-Auszahlungen erfordern eine SAFE Multisig-Transaktion. Der reason-String dient als Buchungsgrund für Compliance.

Multi-Auth

Mehrere Settlement-Contracts können autorisiert sein (für Migrationen). Alte Settlements können de-autorisiert werden.