Create ledger accounts in Modern Treasury for each currency you support (e.g., USD, EUR, GBP), each with the appropriate currency and normal balance side set
When a cross-currency payment is initiated, create two ledger transactions: one that debits the source currency account at the pre-conversion amount, and one that credits the destination currency account at the converted amount using the agreed FX rate
Post the FX spread or realized gain/loss to a separate FX P&L ledger account: if the spot rate differs from the locked rate, the difference is a realized gain (credit) or loss (debit) against the P&L account
Record the FX rate, trade date, and value date on each ledger transaction as custom metadata to support audit and revaluation
At each period end, run an unrealized revaluation job: for any open FX positions (currency accounts with non-zero balances), compute the mark-to-market difference using the current spot rate and post revaluation entries to an unrealized FX P&L account
Reverse the unrealized entries at the start of the next period and replace them with new mark-to-market entries to keep the ledger clean
Known gotchas
Modern Treasury ledger accounts are currency-specific; you cannot post a EUR debit to a USD ledger account — the currency must match at the account level, not just at the transaction level
Realized vs. unrealized FX gain/loss treatment differs under GAAP and IFRS; confirm with your accounting team which standard applies before designing the P&L account structure
FX rates used for ledger entries must be sourced from an auditable feed; using internally computed or approximated rates without a rate source record creates a reconciliation gap
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp