Вот здесь про ивент-сорсинг можно поговорить. Где каждое действие программы не трогает юзера там, его баланс или заказы, а создает обьект, наполняемый изменившимися данными и сохраняет их в таблицу истории. А потом когда надо сделать вторую операцию - берем все события, загружаем назад в объект "проигрываем" - и получаем реальную сумму на счете и все остальное.
Но для платежей кроме лога действий обычно нужен еще номер транзации в платежке, название действия, статус самой транзакции, которая обновляется по мере того как приходит ответ "оттуда", можно конечно всё в лог действий писать, а потом разгребсти что и откуда из этой мусорки, а можно и традиционно - таблица "payment_transactions" и там поле "status: wait/processing/done/fail" и кусочки кода которые сдвигают этот статус.
Что до верхнего слоя апи - то первые пару методов такие - списать бабло, зачислить бабло, подарить бабло от имени админа, забрать бабло от имени админа.
Валюты точно потребуются. А значит вводите понятие "базовая валюта", именно в ней будут ваши цены. Можете условно приравнять её к 1 доллару, но не используйте сам доллар/евро/рубль в качестве валюты, сделайте новую. Лучшая аналогия (в том числе юридическая) - какие-нибудь танки. Там могли бы платить баксами, но платят игровым золотом, а золото покупают за баксы.