Livros e cursos multivaltos
1) O que são os «livros multivaltos»
O livro (ledger) é um candeeiro de transação duplo (fios de dois lados) em várias moedas ao mesmo tempo:- Livro Wallet: conta do jogador (moeda de jogo/moeda).
- Livro Senslement: cálculos com PSP/Equire (moeda de setlment).
- Treasury book, contas bancárias, conversões, transações de hedge.
- Reporting Book: conjunto em moeda relatada (EUR, por exemplo) sem revalidação retrospectiva de métricas alimentares.
Cada livro registra a moeda da transação, a moeda da representação e a taxa de câmbio no momento do reconhecimento.
2) Hierarquia de moedas e políticas
1. Base/Reporting Currency é uma moeda única (EUR, por exemplo).
2. Wallet Currencies - moedas (USD/EUR/TRY/UAH etc.).
3. Senslement Currencies - O que o PSP envia (por exemplo, USD).
4. O Banco Currencies é a moeda da conta Merchant/Tesouro.
- Métricas de alimentos (ND/NGR/ARPU) - através do curso histórico do evento (normalmente 'sensled _ at').
- Finanças/Trejeri - Adicionalmente registram o curso para 'funded _ at' e 'payout _ at'.
- É proibida a reavaliação «oculta» nas vitrines de alimentos.
3) Cursos e suas fontes
Intraday reference (tick/minuto): Refinitiv/ECB/bancos - para normalizar os eventos.
EOD (fim do dia): para reavaliação de resíduos (unrealized FX).
Efetive FX: a partir de um arquivo PSP/banco (fato de conversão).
Triangulation: por meio de âncora (EUR ou USD) sem cotação direta.
Quote policy: `mid` либо `bid/ask` → `mid ± spread_bps`. O spread está separado.
Guarde «fx _ fonte», «fx _ pair», «fx _ rate», «fx _ timestamp», «quete _ tipo», «spread _ bps», e a trilha de triangulação.
4) Pontos de reconhecimento e camadas de cursos
'autorize _ at' - O curso não é fixado (sem a captura, não há reconhecimento).
'captured/setled _ at' é um curso histórico para camada de alimentos e ND.
'funded _ at' é um curso de entrada bancária (realizador FX para FI/treasury).
'payout _ at' é um curso para pagar ao jogador.
'eod' é o curso final do dia para reavaliação de sobras (unrealizável FX).
5) Precisão, arredondados, unidades mínimas
Dinheiro - minor units inteiros (int) + 'scale' no guia de moedas.
Os cursos são de 8 a 10 caracteres após a vírgula.
Arredondamentos: bancário (half-even) para relatórios; em UI - regras locais.
Manter os campos separados: 'amount _ original', 'amount _ wallet', 'amount _ reporting', 'amount _ efetive'.
6) Duplo registro e cartão GL (simplificado)
Exemplos de fio:6. 1. DEPOSIT _ CAPTURED (GBP, EUR)
DT: AR: PSP (GBP)
KT: Player Balanço (GBP/EUR por carteira)
Paralelamente, registramos 'fx _ rate _ setle (GBP→EUR)' e 'amount _ reporting'.
6. 2. FUNDING _ RECEIVED (USD por banco)
Dt: Bank USD
T: AR: PSP GBP (fechando por equivalente; diferença → Realized FX).
6. 3. WITHDRAWAL_PAID (TRY)
Дт: Liability: Player (TRY)
TC: Bank TRY (ou Bank EUR + Conversão; diferença - realização FX).
7) Arquitetura de dados (modelo mínimo)
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) Fluxo de normalização (ETL/ELT)
1. Ingest matéria-prima → normalização de estatais PSP.
2. Atribuir o curso histórico a 'massled _ at' de 'fx _ rates _ intraday'.
3. Gravar duplamente para o livro que deseja.
4. Importação separada de funding e efetiva FX.
5. Revalidação diária de sobras de 'fx _ rates _ eod' (treasury-book).
6. Construção de vitrines (ND/NGR/LTV) sem reavaliação retrô.
9) Confecção e consistência
Tx→File: Todos os captured/sensled estão no arquivo PSP (somas/moedas/datas).
File→Tx: Tudo no arquivo está refletido nos livros/cabos.
FX Reference vs Efetive: contar 'slippage _ bps'; Um alert para sair do limiar.
Teste de triangulação: 'A→B B→C' ≈ 'A→C' dentro do bps tolerance.
Idempotidade: 'event _ id' e 'idempotency _ key' - proteção contra suplementos.
10) Cenários frequentes e como conduzi-los
Multi-wallet: a carteira de um jogador pode ser em uma moeda diferente do depósito - faça uma conversão interna no seu curso (política 'conversion _ owner =' MERCHANT ').
PSP-conversion: guarde 'fx _ efetiva', 'fx _ reference' e 'spread _ bps' para analisar a margem PSP.
Kripto: avaliação sobre a janela VWAP; funding em steaebles - segunda camada FX.
Cross-wallet transfer: movimento dentro da plataforma - sem renda FX, apenas transferência entre livros.
11) Modelos SQL
11. 1. Normalização do valor em moeda histórica
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. Medição do spread PSP (effectiva 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. Reavaliação de sobras EOD (unrealized 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 dashboards
FX Slippage (bps) por PSP/método/MID.
Realized FX P&L (funding/payout) и Unrealized FX (EOD/EOM).
Open FX Position vs limites de política.
Hit-rate cursos «a tempo» (stale-rates incidentes).
Parte PSP-conversion verss Merchant-conversion e seu TCO.
Precisão arredondada (desvios de quantia ≥ 1 menor unit - bandeira).
13) Alertas e liminares
State rate: nenhum curso no momento do evento → fonte/retrai fallback.
Triangulation mismatch: discrepância> X bps.
Spread spike: 'spread _ bps' acima do limite de maiorias/mainers.
Open position breach: ultrapassar o limite de qualquer moeda.
Choque Reval: Revalidação diária <- Xaely> + Xg- Revezamento.
14) Best pratices (curta)
1. Separe rigorosamente a camada de alimentos (histórico FX) e FI/treasury (funding/payout/reval).
2. Use o menor units e guarde cursos com alta precisão.
3. Logue a conversion _ owner e mede a margem PSP (effectiva vs reference).
4. Execute a idempotação dos eventos e o cruzamento bilateral (Tx→File e File→Tx).
5. Mantenha a moeda anchor para triangulação e valorize as divergências em bps.
6. Reavaliar resíduos faça um procedimento EOD com um GL separado.
7. Leve em conta o DST/temporizons ao atribuir os cursos para o setle/funding.
8. Teste regularmente o arredondamento (property-based tests nas fronteiras scale).
15) Folha de cheque de implementação
- Definida a relating currency e política histórica FX.
- Fontes de cursos: intraday + EOD, fallback e SLA atualizações.
- Modelos 'ledger. entries`, `fx_rates_`, `funding_receipts`, `balances`, витрина `transactions_flat`.
- Mecanismo de triangulação e logs de rota.
- Алерты: stale-rates, spread spike, triangulation mismatch, open position breach.
- Dashboards KPI e acertos de acerto com PSP/banco.
- Procedimentos reval e GL separados para realização/unrealização FX.
- Conjuntos de testes de arredondamento e precisão de armazenamento.
Currículo
Os livros multivalentes são uma disciplina de separação de camadas: histórico FX para o produto, real para os trechos, reavaliação EOD para os balanços. Com fontes de cursos transparentes, um modelo de dados exato, um registro duplo e um cruzamento automatizado, você excluirá o «ruído de moeda» dos analistas, fornecerá uma auditoria e terá um risco FX gerenciado na monetização global.