Libri e corsi multivalori
1) Cos'è un libro multivalotto?
Book (ledger) - Un lettore transazionale a doppia voce (cablaggio a due facce) che si trova in più valute contemporaneamente:- Il libro Wallet è il conto del giocatore (valuta di gioco/valuta).
- Libro Settlement - Calcoli con PSP/Equairer (valuta settlement).
- Treasury book: conti bancari, conversioni, hedge deal.
- Report Book: una raccolta in valuta di report (ad esempio, EUR) senza rivalutazione retrospettiva delle metriche alimentari.
Ogni libro registra la valuta dell'operazione, la valuta della rappresentazione e il tasso di cambio al momento del riconoscimento.
2) Gerarchia delle valute e delle regole
1. Base/Reporting Currency è una valuta unica (ad esempio EUR).
2. Wallet Currencies - valute portafogli (USD/EUR/TRY/UAH, ecc.).
3. Settlement Currencies - Cosa invia a PSP (ad esempio USD).
4. Bank Currencies è la valuta del conto Merchant/Tesoro.
- Metriche alimentari (ND/NGR/ARPPU) - Corso storico evento (solitamente «settled _ at»).
- Finanza/Sovrapprezzo - Registrano ulteriormente il corso per «funded _ at» e «payout _ at».
- È vietata la rivalutazione «nascosta» nelle vetrine alimentari.
3) Corsi e loro fonti
Intraday reference (tick/minute): Refinitive/ECB/banche - per la normalizzazione degli eventi.
EOD (fine giornata) - per la rivalutazione dei saldi (unrealization FX).
Effettiva FX dal file PSP/banca (fatto di conversione).
Triangulation: attraverso l'ancoraggio (EUR o USD) in assenza di una quotazione diretta.
Quote policy: `mid` либо `bid/ask` → `mid ± spread_bps`. Lo spread è conservato separatamente.
Memorizza «fx _ source», «fx _ pair», «fx _ rate», «fx _ timestamp», «quete _ type», «spread _ bps», e il percorso di triangolazione.
4) Punti di riconoscimento e livelli di corso
«authorize _ at» - Il corso non viene registrato (nessun riconoscimento senza cattura).
«captured/settled _ at» è un corso storico per i livelli alimentari e ND.
«funded _ at» - Tasso di ingresso bancario (realization FX per FI/treasury).
«payout _ at» è il corso per il pagamento al giocatore.
«eod» è il corso di fine giornata per la rivalutazione dei residui (unrealization FX).
5) Precisione, arrotondamento, unità minime
I soldi sono minor units (int) + «scale» nell'elenco delle valute.
Corsi - Almeno 8-10 caratteri dopo virgola.
Arrotondamenti: bancario (half-even) per report; L'UI è una regola locale.
Mantieni i campi separati: 'amount _ originale',' amount _ wallet ',' amount _ reporting ',' amount _ effective '.
6) Doppia voce e carta GL (semplificata)
Esempi di cablaggio:6. 1. DEPOSIT _ CAPTURED (GBP, report - EUR)
DT: AR: PSP (GBP)
Tac: Player Balance (GBP/EUR per portafoglio)
In parallelo, fissiamo «fx _ rate _ settle (GBP→EUR)» e «amount _ reporting».
6. 2. FUNDING _ RECEIVED (USD per banca)
DT: Banca USD
KT: AR: PSP GBP (chiudiamo per equivalente; differenza → Realization FX).
6. 3. WITHDRAWAL_PAID (TRY)
Дт: Liability: Player (TRY)
TC: Bank TRY (o Bank EUR + conversione; differenza - realization FX).
7) Architettura dei dati (modello minimo)
ref. currencies (
code PK, scale, symbol, is_crypto, is_active
)
ref. fx_rates_intraday (
pair PK, ts PK, rate, quote_type, source, spread_bps, triangulation_meta
)
ref. fx_rates_eod (
pair PK, date PK, rate, source
)
ledger. entries (
entry_id PK, book, -- WALLET SETTLEMENT TREASURY REPORTING debit_account, credit_account,
amount_original, currency_original,
amount_reporting, reporting_currency,
fx_rate_at_settle, fx_source, fx_pair, fx_timestamp,
event_type, event_id, user_id, provider, method,
occurred_at, created_at, meta
)
treasury. funding_receipts (
funding_id PK, provider, bank_account,
currency, amount, fx_to_reporting, amount_reporting,
received_at, value_date, meta
)
treasury. balances (
date PK, account PK, currency PK, amount
)
dw. transactions_flat (
tx_id PK, user_id, provider, method, type, status,
amount_original, currency_original,
amount_reporting, reporting_currency, fx_rate_at_settle,
settled_at, funded_at, conversion_owner, meta
)
8) Flusso di normalizzazione (ETL/ELT)
1. L'ingest delle materie prime stabilisce la normalizzazione degli stati PSP.
2. Assegnazione del corso storico a «settled _ at» da «fx _ rates _ intraday».
3. Scrivi un doppio cablaggio nella cartella di lavoro desiderata.
4. Importazione separata di funding ed effettiva FX.
5. Reval quotidiano dei residui per «fx _ rates _ eod» (treasury book).
6. Costruzione di vetrine (ND/NGR/LTV) senza rivalutazione retro.
9) Compressione e consistenza
Tx→File Tutti i captured/settled sono finiti in un file PSP (per importi, valute/date).
File→Tx: tutto nel file è riflesso nei libri/fili.
FX Reference vs Efficient: conti'slippage _ bps '; alert per uscire dalla porta.
Controllo triangulazione: « » « » all'interno del bps toleranense.
Idampotenza: «event _ id» e «idempotency _ key» - Protezione dalle prese.
10) Script frequenti e come gestirli
Multi-wallet - Il portafoglio del giocatore può essere in una valuta diversa da quella del deposito - fai una conversione interna al tuo tasso di cambio (criterio "conversion _ owner =" MERCHANT ").
PSP-conversione: memorizza «fx _ effettiva», «fx _ reference» e «spread _ bps» per analizzare i margini PSP.
Crypto: valutazione della finestra VWAP; funding in pile - secondo livello FX.
Cross-wallet transfer - Movimento all'interno della piattaforma - senza reddito FX, semplicemente trasferimento tra libri.
11) Modelli SQL
11. 1. Regolarizzazione dell'importo in valuta storica
sql
SELECT t. tx_id,
t. amount_original,
t. currency_original,
r. rate AS fx_rate_at_settle,
ROUND(t. amount_original r. rate, rep. scale) AS amount_reporting
FROM raw. transactions t
JOIN ref. fx_rates_intraday r
ON r. pair = CONCAT(t. currency_original, '/',:reporting_ccy)
AND r. ts = (
SELECT MAX(ts) FROM ref. fx_rates_intraday
WHERE pair = r. pair AND ts <= t. settled_at
)
JOIN ref. currencies rep ON rep. code =:reporting_ccy
WHERE t. settled_at BETWEEN:from AND:to;
11. 2. Misura dello spread PSP (effettiva vs reference)
sql
SELECT provider, method, DATE(settled_at) AS d,
SUM(original_amount fx_reference_rate) AS ref_in_reporting,
SUM(settlement_amount_in_reporting) AS eff_in_reporting,
10000 (SUM(settlement_amount_in_reporting) /
NULLIF(SUM(original_amount fx_reference_rate),0) - 1) AS spread_bps
FROM dw. fx_settlement_view
WHERE settled_at BETWEEN:from AND:to
GROUP BY 1,2,3;
11. 3. Rivalutazione EOD dei saldi (unrealization FX)
sql
INSERT INTO treasury. fx_reval_ledger (date, currency, position_amount, rate_eod, amount_reporting_eod, reval_diff, type)
SELECT
:eod AS date, b. currency, b. amount,
e. rate AS rate_eod,
b. amount e. rate AS amount_reporting_eod,
b. amount (e. rate - COALESCE(l. rate_eod, e. rate)) AS reval_diff,
'UNREALIZED'
FROM treasury. balances b
JOIN ref. fx_rates_eod e
ON e. pair = CONCAT(b. currency, '/',:reporting_ccy) AND e. date =:eod
LEFT JOIN LATERAL (
SELECT rate_eod FROM treasury. fx_reval_ledger
WHERE currency=b. currency AND date=:eod - INTERVAL '1 day'
ORDER BY date DESC LIMIT 1
) l ON TRUE;
12) KPI e dashboard
FX Slippage (bps) con metodo PSP/MID.
Realized FX P&L (funding/payout) и Unrealized FX (EOD/EOM).
Open FX Position per valute vs limiti di criterio.
Corsi hit-rate «puntuali» ricevuti (incidenti stale-rates).
Quota di PSP-conversion vs Merchant-conversion e del suo TCO.
Precisione arrotondamenti (deviazioni di importo ≥ 1 minor unit - flag).
13) Alerti e soglie
State rate: nessun corso al momento dell'evento di origine/retrai fallback.
Triangulazione mismatch: soluzione temporanea> X bps.
Spread spike: 'spread _ bps', sopra la soglia maggiore/mainner.
Open position breach - Supera il limite a qualsiasi valuta.
Reval Shock: rivalutazione diurna <- X > + X .
14) Best practices (breve)
1. Separare rigorosamente lo strato di prodotto (FX storico) e FI/treasury (funding/payout/reval).
2. Utilizzare minor units e mantenere i corsi con precisione.
3. Logica conversion _ owner e misura il margine PSP (effettiva vs reference).
4. Implementare l'idimpotenza degli eventi e la riconciliazione bidirezionale (Tx→File e File→Tx).
5. Tieni la moneta anchor per la triangolazione e valuta le discrepanze in bps.
6. Rivalutare i residui fare una procedura EOD con GL separata.
7. Tieni conto di DST/Timsons durante l'assegnazione dei corsi al settle/funding.
8. Testare regolarmente gli arrotondamenti (test property-based ai limiti scale).
15) Assegno-foglio di implementazione
- Definito il reporting currency e la politica della FX storica.
- Fonti di corso: intraday + EOD, fallback e SLA aggiornamenti.
- Modelli dì ledger. entries`, `fx_rates_`, `funding_receipts`, `balances`, витрина `transactions_flat`.
- Meccanismo di triangolazione e login del percorso.
- Алерты: stale-rates, spread spike, triangulation mismatch, open position breach.
- Dashboard KPI e controlli con PSP/banca.
- Procedure reval e GL separate per realization/unrealization FX.
- Set di test di arrotondamento e precisione dello storage.
Riepilogo
I libri multivalori sono la disciplina della divisione dei livelli, la FX storica per il prodotto, la rivalutazione EOD effettiva per i bilanci. Con sorgenti di corso trasparenti, un modello di dati accurato, un doppio record e una combinazione automatizzata, è possibile eliminare il rumore di valuta dagli analisti, fornire un controllo e ottenere il rischio FX gestito durante la monetizzazione globale.