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()¶
- 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:
- 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.