Exchange Integration Service
Назначение
Exchange Integration — сервис-адаптер (прокси) между внешними клиентами (прежде всего UnivexID, Gateway, Admin Gateway) и внутренним Exchange Admin gRPC биржевого движка. Помимо проксирования, сервис самостоятельно управляет биржевыми аккаунтами: регистрация и логин выполняются с хэшированием паролей.
Общее количество RPC: 60.
Архитектура
Сервис построен по многоуровневой архитектуре:
┌─────────────────────────────────────────────┐
│ RPC Layer │
│ (gRPC-сервер, обработка входящих запросов) │
└────────────────────┬────────────────────────┘
│
┌────────────────────▼────────────────────────┐
│ Domain Layer │
│ (бизнес-логика: регистрация, логин, │
│ хэширование паролей, оркестрация вызовов) │
└──────────┬─────────────────────┬────────────┘
│ │
┌──────────▼──────────┐ ┌────────▼────────────┐
│ Storage Layer │ │ Clients Layer │
│ (PostgreSQL, │ │ (Exchange Admin │
│ 2 таблицы) │ │ gRPC клиент) │
└─────────────────────┘ └─────────────────────┘
| Слой |
Ответственность |
| RPC |
Принимает входящие gRPC-запросы, сериализация/десериализация |
| Domain |
Бизнес-логика: хэширование паролей, оркестрация Storage и Clients |
| Storage |
CRUD операции с таблицами PostgreSQL |
| Clients |
HTTP/gRPC-клиент для обращения к Exchange Admin gRPC |
База данных
Миграции (2)
| Миграция |
Таблица |
Описание |
| 1 |
exchange_accounts |
Биржевые аккаунты с хэшированными паролями |
| 2 |
tokens_for_exchange_account |
Токены, привязанные к биржевым аккаунтам |
Схема таблиц
erDiagram
exchange_accounts {
UUID account_id PK "Первичный ключ"
TEXT password "Хэшированный пароль (SHA-256)"
TIMESTAMP created_at "Дата создания аккаунта"
}
tokens_for_exchange_account {
UUID id PK "Первичный ключ"
UUID account_id FK "Ссылка на exchange_accounts"
TEXT token "Токен доступа"
TIMESTAMP expires_at "Срок действия токена"
TIMESTAMP created_at "Дата создания"
}
exchange_accounts ||--o{ tokens_for_exchange_account : "имеет"
Пароли хранятся в виде SHA-256 хэша. Сервис использует общий пакет pkg/sha256 для хэширования.
gRPC-контракт
Прото-файл: proto/exchange_integration.proto
Полный список RPC (60)
service ExchangeIntegration {
// Аутентификация (2)
rpc Register(RegisterRequest) returns (RegisterResponse);
rpc Login(LoginRequest) returns (LoginResponse);
// API-ключи (3)
rpc ListApiKeys(ListApiKeysRequest) returns (ListApiKeysResponse);
rpc DeleteApiKey(DeleteApiKeyRequest) returns (DeleteApiKeyResponse);
rpc CreateApiKey(CreateApiKeyRequest) returns (CreateApiKeyResponse);
// Аккаунты (8)
rpc GetBalances(GetBalancesRequest) returns (GetBalancesResponse);
rpc GetAccountDetails(GetAccountDetailsRequest) returns (GetAccountDetailsResponse);
rpc SetTier(SetTierRequest) returns (SetTierResponse);
rpc CreateTier(CreateTierRequest) returns (CreateTierResponse);
rpc ListOrders(ListOrdersRequest) returns (ListOrdersResponse);
rpc ChangeAccountStatus(ChangeAccountStatusRequest) returns (ChangeAccountStatusResponse);
rpc SetAccountVIP(SetAccountVIPRequest) returns (SetAccountVIPResponse);
rpc ListTransactions(ListTransactionsRequest) returns (ListTransactionsResponse);
// Горячие кошельки (3)
rpc ListHotWallets(ListHotWalletsRequest) returns (ListHotWalletsResponse);
rpc TransferAssets(TransferAssetsRequest) returns (TransferAssetsResponse);
rpc GetTransferAssetStatus(GetTransferAssetStatusRequest) returns (GetTransferAssetStatusResponse);
// Транзитные кошельки (6)
rpc ListTransitWallets(ListTransitWalletsRequest) returns (ListTransitWalletsResponse);
rpc GetTransitWallet(GetTransitWalletRequest) returns (GetTransitWalletResponse);
rpc CreateTransitWallet(CreateTransitWalletRequest) returns (CreateTransitWalletResponse);
rpc BypassAML(BypassAMLRequest) returns (BypassAMLResponse);
rpc ListWalletTopups(ListWalletTopupsRequest) returns (ListWalletTopupsResponse);
rpc ListWalletWithdrawals(ListWalletWithdrawalsRequest) returns (ListWalletWithdrawalsResponse);
// Информация (4)
rpc ListNetworks(ListNetworksRequest) returns (ListNetworksResponse);
rpc ListNetworksInfo(ListNetworksInfoRequest) returns (ListNetworksInfoResponse);
rpc ListTiers(ListTiersRequest) returns (ListTiersResponse);
rpc GetTier(GetTierRequest) returns (GetTierResponse);
// Блокчейн (10)
rpc GetDepositAddress(GetDepositAddressRequest) returns (GetDepositAddressResponse);
rpc WithdrawToBlockchain(WithdrawToBlockchainRequest) returns (WithdrawToBlockchainResponse);
rpc GetWithdrawRequestStatus(GetWithdrawRequestStatusRequest) returns (GetWithdrawRequestStatusResponse);
rpc ListTopUps(ListTopUpsRequest) returns (ListTopUpsResponse);
rpc ListAllTopUps(ListAllTopUpsRequest) returns (ListAllTopUpsResponse);
rpc ListWithdrawals(ListWithdrawalsRequest) returns (ListWithdrawalsResponse);
rpc GetWithdrawAvailabilityStatus(GetWithdrawAvailabilityStatusRequest) returns (GetWithdrawAvailabilityStatusResponse);
rpc SetWithdrawAvailabilityStatus(SetWithdrawAvailabilityStatusRequest) returns (SetWithdrawAvailabilityStatusResponse);
rpc ListBlockchainTransactions(ListBlockchainTransactionsRequest) returns (ListBlockchainTransactionsResponse);
rpc GetTransactionHashes(GetTransactionHashesRequest) returns (GetTransactionHashesResponse);
// Операции (6)
rpc ManualTopup(ManualTopupRequest) returns (ManualTopupResponse);
rpc ManualWithdraw(ManualWithdrawRequest) returns (ManualWithdrawResponse);
rpc Transfer(TransferRequest) returns (TransferResponse);
rpc ManualTopupBalanceAccount(ManualTopupBalanceAccountRequest) returns (ManualTopupBalanceAccountResponse);
rpc ManualWithdrawBalanceAccount(ManualWithdrawBalanceAccountRequest) returns (ManualWithdrawBalanceAccountResponse);
rpc TransferBalanceAccount(TransferBalanceAccountRequest) returns (TransferBalanceAccountResponse);
// Активы (6)
rpc ListAssets(ListAssetsRequest) returns (ListAssetsResponse);
rpc GetAssetStatus(GetAssetStatusRequest) returns (GetAssetStatusResponse);
rpc SetAssetTradingEnabled(SetAssetTradingEnabledRequest) returns (SetAssetTradingEnabledResponse);
rpc SetNetworkAssetAliasEnabledTopup(SetNetworkAssetAliasEnabledTopupRequest) returns (SetNetworkAssetAliasEnabledTopupResponse);
rpc SetNetworkAssetAliasEnabledWithdraw(SetNetworkAssetAliasEnabledWithdrawRequest) returns (SetNetworkAssetAliasEnabledWithdrawResponse);
rpc SetNetworkAssetAliasWithdrawCommission(SetNetworkAssetAliasWithdrawCommissionRequest) returns (SetNetworkAssetAliasWithdrawCommissionResponse);
// Тикеры (2)
rpc ListTickers(ListTickersRequest) returns (ListTickersResponse);
rpc SetTickerTradingEnabled(SetTickerTradingEnabledRequest) returns (SetTickerTradingEnabledResponse);
// Категории риска (4)
rpc GetCategories(GetCategoriesRequest) returns (GetCategoriesResponse);
rpc SetCategoryThresholds(SetCategoryThresholdsRequest) returns (SetCategoryThresholdsResponse);
rpc RenameRiskCategory(RenameRiskCategoryRequest) returns (RenameRiskCategoryResponse);
rpc ListBlacklistedAddresses(ListBlacklistedAddressesRequest) returns (ListBlacklistedAddressesResponse);
// AML / Refund (6)
rpc AmlDecisionClean(AmlDecisionCleanRequest) returns (AmlDecisionCleanResponse);
rpc AmlDecisionRefund(AmlDecisionRefundRequest) returns (AmlDecisionRefundResponse);
rpc SetRefundAddress(SetRefundAddressRequest) returns (SetRefundAddressResponse);
rpc ListTopupStatusHistory(ListTopupStatusHistoryRequest) returns (ListTopupStatusHistoryResponse);
rpc DeleteRiskCategories(DeleteRiskCategoriesRequest) returns (DeleteRiskCategoriesResponse);
rpc GetTopupDetails(GetTopupDetailsRequest) returns (GetTopupDetailsResponse);
// Конфигурация (1)
rpc ValidateConfig(ValidateConfigRequest) returns (ValidateConfigResponse);
}
Группы RPC
Аутентификация (2)
| RPC |
Описание |
Register |
Регистрирует новый биржевой аккаунт. Создаёт запись в exchange_accounts, хэширует пароль (SHA-256). |
Login |
Аутентифицирует аккаунт по UUID и паролю. Сверяет SHA-256 хэш. |
API-ключи (3)
| RPC |
Описание |
ListApiKeys |
Возвращает список API-ключей аккаунта. |
CreateApiKey |
Создаёт новый API-ключ для аккаунта. |
DeleteApiKey |
Удаляет API-ключ по идентификатору. |
Управление аккаунтами (8)
| RPC |
Описание |
GetBalances |
Возвращает балансы аккаунта по всем активам. |
GetAccountDetails |
Возвращает детальную информацию об аккаунте. |
SetTier |
Устанавливает торговый уровень (tier) аккаунта. |
CreateTier |
Создаёт новый торговый уровень (tier). |
ListOrders |
Возвращает список ордеров аккаунта с фильтрацией. |
ChangeAccountStatus |
Изменяет статус аккаунта (активен, заблокирован и т.д.). |
SetAccountVIP |
Устанавливает/снимает VIP-статус аккаунта. |
ListTransactions |
Возвращает список транзакций аккаунта. |
Горячие кошельки (3)
| RPC |
Описание |
ListHotWallets |
Возвращает список горячих кошельков. |
TransferAssets |
Инициирует перевод активов между кошельками. |
GetTransferAssetStatus |
Возвращает статус перевода активов. |
Транзитные кошельки (6)
| RPC |
Описание |
ListTransitWallets |
Возвращает список транзитных кошельков. |
GetTransitWallet |
Возвращает данные конкретного транзитного кошелька. |
CreateTransitWallet |
Создаёт новый транзитный кошелёк. |
BypassAML |
Помечает пополнение транзитного кошелька как прошедшее AML без проверки. |
ListWalletTopups |
Возвращает историю пополнений транзитного кошелька. |
ListWalletWithdrawals |
Возвращает историю выводов с транзитного кошелька. |
Информация (4)
| RPC |
Описание |
ListNetworks |
Возвращает список поддерживаемых блокчейн-сетей. |
ListNetworksInfo |
Возвращает расширенную информацию о сетях (комиссии, минимальные суммы). |
ListTiers |
Возвращает список доступных торговых уровней. |
GetTier |
Возвращает данные конкретного торгового уровня. |
Блокчейн-операции (10)
| RPC |
Описание |
GetDepositAddress |
Возвращает адрес для пополнения по сети и аккаунту. |
WithdrawToBlockchain |
Инициирует вывод средств в блокчейн. |
GetWithdrawRequestStatus |
Возвращает статус запроса на вывод. |
ListTopUps |
Возвращает список пополнений аккаунта. |
ListAllTopUps |
Возвращает список всех пополнений (для администраторов). |
ListWithdrawals |
Возвращает список выводов. |
GetWithdrawAvailabilityStatus |
Проверяет, доступен ли вывод для актива/сети. |
SetWithdrawAvailabilityStatus |
Включает/выключает возможность вывода для актива/сети. |
ListBlockchainTransactions |
Возвращает список блокчейн-транзакций. |
GetTransactionHashes |
Возвращает хэши транзакций по идентификатору вывода. |
Ручные операции (6)
| RPC |
Описание |
ManualTopup |
Ручное пополнение торгового баланса. |
ManualWithdraw |
Ручной вывод с торгового баланса. |
Transfer |
Перевод между торговыми аккаунтами. |
ManualTopupBalanceAccount |
Ручное пополнение балансового аккаунта. |
ManualWithdrawBalanceAccount |
Ручной вывод с балансового аккаунта. |
TransferBalanceAccount |
Перевод между балансовыми аккаунтами. |
Активы (6)
| RPC |
Описание |
ListAssets |
Возвращает список всех активов. |
GetAssetStatus |
Возвращает статус актива (торговля, пополнение, вывод). |
SetAssetTradingEnabled |
Включает/выключает торговлю активом. |
SetNetworkAssetAliasEnabledTopup |
Включает/выключает пополнение для актива/сети. |
SetNetworkAssetAliasEnabledWithdraw |
Включает/выключает вывод для актива/сети. |
SetNetworkAssetAliasWithdrawCommission |
Устанавливает комиссию на вывод для актива/сети. |
Тикеры (2)
| RPC |
Описание |
ListTickers |
Возвращает список всех торговых пар (тикеров). |
SetTickerTradingEnabled |
Включает/выключает торговлю по паре. |
Категории риска (4)
| RPC |
Описание |
GetCategories |
Возвращает список категорий риска с порогами. |
SetCategoryThresholds |
Устанавливает пороговые значения для категории риска. |
RenameRiskCategory |
Переименовывает категорию риска. |
ListBlacklistedAddresses |
Возвращает список адресов из чёрного списка. |
AML / Refund (6)
| RPC |
Описание |
AmlDecisionClean |
Помечает пополнение как чистое (AML пройден). |
AmlDecisionRefund |
Инициирует возврат средств по пополнению (AML не пройден). |
SetRefundAddress |
Устанавливает адрес возврата для аккаунта. |
ListTopupStatusHistory |
Возвращает историю смены статусов пополнения. |
DeleteRiskCategories |
Удаляет категории риска. |
GetTopupDetails |
Возвращает детали пополнения включая AML-информацию. |
Конфигурация (1)
| RPC |
Описание |
ValidateConfig |
Валидирует конфигурацию биржевого движка. |
Типы и перечисления
Network — блокчейн-сеть
enum Network {
NETWORK_UNSPECIFIED = 0;
ETHEREUM = 1;
TRON = 2;
BITCOIN = 3;
}
TxStatus — статус транзакции
enum TxStatus {
TX_STATUS_UNSPECIFIED = 0;
TX_STATUS_PENDING = 1;
TX_STATUS_COMPLETED = 2;
TX_STATUS_FAILED = 3;
}
AccountStatus — статус аккаунта
enum AccountStatus {
ACCOUNT_STATUS_UNSPECIFIED = 0;
ACCOUNT_STATUS_ACTIVE = 1;
ACCOUNT_STATUS_SUSPENDED = 2;
ACCOUNT_STATUS_BLOCKED = 3;
}
OrderType — тип ордера
enum OrderType {
ORDER_TYPE_UNSPECIFIED = 0;
ORDER_TYPE_LIMIT = 1;
ORDER_TYPE_MARKET = 2;
}
OrderStatus — статус ордера
enum OrderStatus {
ORDER_STATUS_UNSPECIFIED = 0;
ORDER_STATUS_OPEN = 1;
ORDER_STATUS_FILLED = 2;
ORDER_STATUS_CANCELLED = 3;
ORDER_STATUS_PARTIAL = 4;
}
OrderDir — направление ордера
enum OrderDir {
ORDER_DIR_UNSPECIFIED = 0;
ORDER_DIR_BUY = 1;
ORDER_DIR_SELL = 2;
}
BalanceAccountType — тип балансового аккаунта
enum BalanceAccountType {
BALANCE_ACCOUNT_TYPE_UNSPECIFIED = 0;
BALANCE_ACCOUNT_TYPE_TRADING = 1;
BALANCE_ACCOUNT_TYPE_BALANCE = 2;
}
Коды ошибок
| Операция |
Код ошибки |
Описание |
Register |
ALREADY_EXISTS |
Аккаунт с таким ID уже зарегистрирован |
Register |
INTERNAL |
Ошибка при создании аккаунта в движке |
Login |
NOT_FOUND |
Аккаунт не найден |
Login |
UNAUTHENTICATED |
Неверный пароль |
GetBalances |
NOT_FOUND |
Аккаунт не найден |
CreateApiKey |
PERMISSION_DENIED |
Недостаточно прав |
DeleteApiKey |
NOT_FOUND |
Ключ не найден |
WithdrawToBlockchain |
FAILED_PRECONDITION |
Недостаточно средств |
GetWithdrawRequestStatus |
NOT_FOUND |
Запрос не найден |
GetDepositAddress |
INVALID_ARGUMENT |
Неверная сеть или аккаунт |
ChangeAccountStatus |
NOT_FOUND |
Аккаунт не найден |
SetTier |
INVALID_ARGUMENT |
Неверный tier |
TransferAssets |
FAILED_PRECONDITION |
Недостаточно средств на кошельке |
AmlDecisionRefund |
FAILED_PRECONDITION |
Адрес возврата не установлен |
| Любой RPC |
UNAVAILABLE |
Exchange Admin gRPC недоступен |
Конфигурация
| Параметр |
Описание |
EXCHANGE_ADMIN_GRPC_ADDR |
Адрес Exchange Admin gRPC сервера |
DATABASE_URL |
DSN для подключения к PostgreSQL |
GRPC_PORT |
Порт gRPC-сервера (по умолчанию 50051) |