Перейти к содержанию

Admin Withdrawal Management Endpoints

Аудитория: разработчики, разработчики админских панелей Последнее обновление: 2025-11-17 Краткое содержание: Детальная документация Admin Withdrawal Management endpoints — список выводов, одобрение/отклонение/исполнение ожидающих запросов, управление жизненным циклом выводов. Полное руководство по интеграции для admin withdrawal операций.


Обзор Endpoints

Метод Endpoint Описание Auth Required Permission
GET /api/admin/withdrawals Список всех выводов ✅ Admin withdrawals:read
GET /api/admin/withdrawals/pending Ожидающие выводы ✅ Admin withdrawals:read
GET /api/admin/withdrawals/:id Детали вывода ✅ Admin withdrawals:read
PUT /api/admin/withdrawals/:id/approve Одобрить вывод ✅ Admin withdrawals:approve
PUT /api/admin/withdrawals/:id/execute Исполнить вывод ✅ Admin withdrawals:approve
PUT /api/admin/withdrawals/:id/reject Отклонить вывод ✅ Admin withdrawals:approve

💸 GET /api/admin/withdrawals

Получить постраничный список всех выводов платформы с фильтрацией и сортировкой.

Запрос

GET /api/admin/withdrawals?page=1&limit=50&status=pending&userId=user_123abc&minAmount=1000
Authorization: Bearer <admin_jwt_token>

Заголовки:

Заголовок Значение Обязательно Описание
Authorization Bearer <admin_token> ✅ Да Admin JWT токен

Query параметры:

Параметр Тип Обязательно Описание По умолчанию
page number ❌ Нет Номер страницы (начинается с 1) 1
limit number ❌ Нет Элементов на странице (макс: 100) 50
status string ❌ Нет Фильтр по статусу: pending, approved, processing, completed, failed, rejected, cancelled Все
userId string ❌ Нет Фильтр по user ID Все
minAmount string ❌ Нет Фильтр минимальной суммы вывода -
sortBy string ❌ Нет Поле сортировки: createdAt, amount, completedAt createdAt
orderBy string ❌ Нет Порядок сортировки: asc, desc desc
createdAfter string ❌ Нет Фильтр выводов после даты (ISO 8601) -

Ответ

Успех (200 OK):

{
  "success": true,
  "data": [
    {
      "id": "wdr_abc123",
      "userId": "user_123abc",
      "userEmail": "john@example.com",
      "walletAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
      "amount": "1000.00",
      "currency": "USDC",
      "destinationAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
      "source": "available",
      "status": "completed",
      "gasFee": "0.005 ETH",
      "txHash": "0xabcd1234...",
      "createdAt": "2025-10-02T10:00:00Z",
      "approvedAt": "2025-10-02T10:05:00Z",
      "approvedBy": "admin_456def",
      "executedAt": "2025-10-02T10:10:00Z",
      "completedAt": "2025-10-02T10:15:00Z",
      "note": null
    },
    {
      "id": "wdr_def456",
      "userId": "user_456def",
      "userEmail": "jane@example.com",
      "walletAddress": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
      "amount": "500.00",
      "currency": "USDC",
      "destinationAddress": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
      "source": "available",
      "status": "pending",
      "gasFee": "0.005 ETH",
      "txHash": null,
      "createdAt": "2025-10-03T11:00:00Z",
      "approvedAt": null,
      "approvedBy": null,
      "executedAt": null,
      "completedAt": null,
      "note": "User requested withdrawal to personal wallet"
    }
  ],
  "summary": {
    "totalWithdrawals": 450,
    "totalWithdrawnValue": "2500000.00",
    "pendingWithdrawals": 12,
    "pendingValue": "8500.00",
    "completedToday": 45,
    "completedTodayValue": "125000.00",
    "averageWithdrawal": "5555.56",
    "averageProcessingTime": "15 minutes"
  },
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 450,
    "totalPages": 9,
    "hasNext": true,
    "hasPrevious": false
  },
  "timestamp": "2025-10-03T12:34:56Z"
}

Поля ответа:

Поле Тип Описание
data[].source string Источник вывода: available, investment
data[].gasFee string Оценочная комиссия blockchain gas
data[].txHash string On-chain transaction hash (null если не исполнен)
summary.totalWithdrawnValue string Общая выведенная сумма за всё время
summary.pendingValue string Общая сумма ожидающих выводов
summary.averageProcessingTime string Среднее время завершения вывода

Ошибки:

Код статуса Код ошибки Описание
401 TOKEN_EXPIRED Admin JWT токен истёк
403 PERMISSION_DENIED Недостаточно разрешений (требуется withdrawals:read)
400 INVALID_PAGINATION Невалидные page или limit

Пример cURL

ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."

# Получить все ожидающие выводы
curl -X GET "https://app.saga.surf/api/admin/withdrawals?status=pending" \
  -H "Authorization: Bearer $ADMIN_TOKEN"

# Крупные выводы (> $5K)
curl -X GET "https://app.saga.surf/api/admin/withdrawals?minAmount=5000&sortBy=amount&orderBy=desc" \
  -H "Authorization: Bearer $ADMIN_TOKEN"

# Выводы конкретного пользователя
curl -X GET "https://app.saga.surf/api/admin/withdrawals?userId=user_123abc" \
  -H "Authorization: Bearer $ADMIN_TOKEN"

Пример TypeScript

const fetchAllWithdrawals = async (filters = {}) => {
  const params = new URLSearchParams({
    page: '1',
    limit: '50',
    ...filters
  });

  const response = await fetch(`/api/admin/withdrawals?${params}`, {
    headers: {
      'Authorization': `Bearer ${adminToken}`
    }
  });

  const { data: withdrawals, summary, pagination } = await response.json();

  console.log('Platform Withdrawal Summary:');
  console.log('  Total Withdrawals:', summary.totalWithdrawals);
  console.log('  Total Value: $', summary.totalWithdrawnValue);
  console.log('  Pending:', summary.pendingWithdrawals, '($' + summary.pendingValue + ')');
  console.log('  Avg Processing:', summary.averageProcessingTime);

  withdrawals.forEach(wdr => {
    console.log(`\n${wdr.userEmail}`);
    console.log(`  Amount: $${wdr.amount} (${wdr.status})`);
    console.log(`  Destination: ${wdr.destinationAddress}`);
    console.log(`  Gas Fee: ${wdr.gasFee}`);
    if (wdr.txHash) console.log(`  TX: ${wdr.txHash}`);
  });

  return { withdrawals, summary, pagination };
};

⏳ GET /api/admin/withdrawals/pending

Получить список выводов ожидающих одобрения админа.

Запрос

GET /api/admin/withdrawals/pending?sortBy=createdAt&orderBy=asc
Authorization: Bearer <admin_jwt_token>

Query параметры:

Параметр Тип Обязательно Описание По умолчанию
sortBy string ❌ Нет Поле сортировки: createdAt, amount createdAt
orderBy string ❌ Нет Порядок сортировки: asc, desc asc

Ответ

Успех (200 OK):

{
  "success": true,
  "data": [
    {
      "id": "wdr_pending_001",
      "userId": "user_789ghi",
      "userEmail": "alice@example.com",
      "walletAddress": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
      "amount": "3000.00",
      "currency": "USDC",
      "destinationAddress": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
      "source": "available",
      "gasFee": "0.005 ETH",
      "createdAt": "2025-10-03T09:00:00Z",
      "limits": {
        "dailyLimit": "10000.00",
        "usedToday": "3000.00",
        "remainingToday": "7000.00"
      },
      "userBalance": {
        "available": "5000.00",
        "invested": "2000.00"
      },
      "complianceChecks": {
        "kycStatus": "not_required",
        "amlChecks": "passed",
        "sanctionsList": "clear",
        "riskLevel": "low"
      }
    },
    {
      "id": "wdr_pending_002",
      "userId": "user_101jkl",
      "userEmail": "bob@example.com",
      "walletAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
      "amount": "1500.00",
      "currency": "USDC",
      "destinationAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
      "source": "available",
      "gasFee": "0.005 ETH",
      "createdAt": "2025-10-03T10:30:00Z",
      "limits": {
        "dailyLimit": "10000.00",
        "usedToday": "1500.00",
        "remainingToday": "8500.00"
      },
      "userBalance": {
        "available": "3000.00",
        "invested": "1000.00"
      },
      "complianceChecks": {
        "kycStatus": "not_required",
        "amlChecks": "passed",
        "sanctionsList": "clear",
        "riskLevel": "low"
      }
    }
  ],
  "summary": {
    "totalPending": 12,
    "totalPendingValue": "8500.00",
    "oldestPending": "2025-10-02T14:00:00Z",
    "averageWaitTime": "3.5 hours"
  },
  "timestamp": "2025-10-03T12:34:56Z"
}

Поля ответа:

Поле Тип Описание
data[].limits object Дневные лимиты вывода пользователя
data[].userBalance object Текущий баланс пользователя breakdown
data[].complianceChecks object Статус KYC/AML соответствия
summary.totalPending number Общее количество ожидающих выводов
summary.totalPendingValue string Общая ожидающая сумма

Ошибки:

Код статуса Код ошибки Описание
403 PERMISSION_DENIED Недостаточно разрешений

Пример cURL

ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X GET https://app.saga.surf/api/admin/withdrawals/pending \
  -H "Authorization: Bearer $ADMIN_TOKEN"

Пример TypeScript

const fetchPendingWithdrawals = async () => {
  const response = await fetch('/api/admin/withdrawals/pending', {
    headers: {
      'Authorization': `Bearer ${adminToken}`
    }
  });

  const { data: pending, summary } = await response.json();

  console.log('🔔 Pending Withdrawal Approvals:');
  console.log(`  Total: ${summary.totalPending}`);
  console.log(`  Value: $${summary.totalPendingValue}`);
  console.log(`  Avg Wait: ${summary.averageWaitTime}`);

  pending.forEach(wdr => {
    console.log(`\n📋 ${wdr.id}`);
    console.log(`  User: ${wdr.userEmail}`);
    console.log(`  Amount: $${wdr.amount}`);
    console.log(`  Balance: $${wdr.userBalance.available} available`);
    console.log(`  Daily Limit: $${wdr.limits.remainingToday} remaining`);
    console.log(`  Compliance: ${wdr.complianceChecks.amlChecks}`);
  });

  return { pending, summary };
};

GET /api/admin/withdrawals/:id

Получить детальную информацию о конкретном выводе.

Запрос

GET /api/admin/withdrawals/wdr_abc123
Authorization: Bearer <admin_jwt_token>

Path параметры:

Параметр Тип Обязательно Описание
id string ✅ Да ID вывода (например, wdr_abc123)

Ответ

Успех (200 OK):

{
  "success": true,
  "data": {
    "id": "wdr_abc123",
    "userId": "user_123abc",
    "user": {
      "id": "user_123abc",
      "email": "john@example.com",
      "walletAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
      "verificationStatus": "verified",
      "accountCreated": "2025-09-01T10:00:00Z"
    },
    "withdrawal": {
      "amount": "1000.00",
      "currency": "USDC",
      "destinationAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
      "source": "available",
      "gasFee": "0.005 ETH",
      "netAmount": "999.95",
      "note": "Withdrawal to personal wallet"
    },
    "limits": {
      "dailyLimit": "10000.00",
      "usedToday": "1000.00",
      "remainingToday": "9000.00",
      "lifetimeWithdrawn": "5000.00"
    },
    "status": "completed",
    "lifecycle": {
      "createdAt": "2025-10-02T10:00:00Z",
      "approvedAt": "2025-10-02T10:05:00Z",
      "approvedBy": "admin_456def",
      "executedAt": "2025-10-02T10:10:00Z",
      "completedAt": "2025-10-02T10:15:00Z",
      "processingTime": "15 minutes"
    },
    "blockchain": {
      "txHash": "0xabcd1234...",
      "blockNumber": 12345678,
      "confirmations": 25,
      "gasUsed": "21000",
      "effectiveGasPrice": "0.000000025 ETH",
      "networkFee": "0.000525 ETH"
    },
    "complianceInfo": {
      "kycStatus": "not_required",
      "amlChecks": "passed",
      "sanctionsList": "clear",
      "riskLevel": "low",
      "lastChecked": "2025-10-02T10:00:00Z"
    },
    "auditTrail": [
      {
        "action": "created",
        "timestamp": "2025-10-02T10:00:00Z",
        "actor": "user_123abc",
        "details": "Withdrawal request created"
      },
      {
        "action": "approved",
        "timestamp": "2025-10-02T10:05:00Z",
        "actor": "admin_456def",
        "details": "Withdrawal approved by admin"
      },
      {
        "action": "executed",
        "timestamp": "2025-10-02T10:10:00Z",
        "actor": "system",
        "details": "Blockchain transaction submitted"
      },
      {
        "action": "completed",
        "timestamp": "2025-10-02T10:15:00Z",
        "actor": "system",
        "details": "Transaction confirmed on blockchain"
      }
    ]
  },
  "timestamp": "2025-10-03T12:34:56Z"
}

Поля ответа:

Поле Тип Описание
data.limits object Лимиты вывода пользователя и использование
data.blockchain object Детали on-chain транзакции
data.complianceInfo object Детали проверки соответствия
data.auditTrail array Полный audit trail жизненного цикла

Ошибки:

Код статуса Код ошибки Описание
403 PERMISSION_DENIED Недостаточно разрешений
404 WITHDRAWAL_NOT_FOUND ID вывода не существует

Пример cURL

ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X GET https://app.saga.surf/api/admin/withdrawals/wdr_abc123 \
  -H "Authorization: Bearer $ADMIN_TOKEN"

PUT /api/admin/withdrawals/:id/approve

Одобрить ожидающий вывод (не исполняет - требует отдельного исполнения).

Запрос

PUT /api/admin/withdrawals/wdr_pending_001/approve
Authorization: Bearer <admin_jwt_token>
Content-Type: application/json

{
  "note": "User balance verified, compliance checks passed",
  "notifyUser": true
}

Схема тела запроса:

Поле Тип Обязательно Описание
note string ❌ Нет Заметка об одобрении админа (внутренняя)
notifyUser boolean ❌ Нет Отправить email уведомление (по умолчанию: true)

Ответ

Успех (200 OK):

{
  "success": true,
  "data": {
    "withdrawalId": "wdr_pending_001",
    "status": "approved",
    "approvedAt": "2025-10-03T12:34:56Z",
    "approvedBy": "admin_456def",
    "amount": "3000.00",
    "destinationAddress": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
    "estimatedGasFee": "0.005 ETH",
    "expectedExecutionTime": "Within 5 minutes",
    "user": {
      "email": "alice@example.com",
      "notified": true
    }
  },
  "timestamp": "2025-10-03T12:34:56Z"
}

Поля ответа:

Поле Тип Описание
data.estimatedGasFee string Оценочная комиссия blockchain gas
data.expectedExecutionTime string Ожидаемое время исполнения
data.user.notified boolean Статус отправки email уведомления

Ошибки:

Код статуса Код ошибки Описание
400 INVALID_STATUS Вывод не в статусе pending
403 PERMISSION_DENIED Недостаточно разрешений (требуется withdrawals:approve)
404 WITHDRAWAL_NOT_FOUND ID вывода не существует
422 INSUFFICIENT_BALANCE Недостаточный баланс пользователя
422 DAILY_LIMIT_EXCEEDED Превышен дневной лимит вывода

Пример cURL

ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X PUT https://app.saga.surf/api/admin/withdrawals/wdr_pending_001/approve \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "note": "User balance verified, compliance checks passed",
    "notifyUser": true
  }'

Пример TypeScript

const approveWithdrawal = async (withdrawalId: string, note?: string) => {
  const response = await fetch(`/api/admin/withdrawals/${withdrawalId}/approve`, {
    method: 'PUT',
    headers: {
      'Authorization': `Bearer ${adminToken}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      note,
      notifyUser: true
    })
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.error.message);
  }

  const { data } = await response.json();

  console.log('✅ Withdrawal Approved:');
  console.log(`  Withdrawal ID: ${data.withdrawalId}`);
  console.log(`  Status: ${data.status}`);
  console.log(`  Amount: $${data.amount}`);
  console.log(`  Destination: ${data.destinationAddress}`);
  console.log(`  Approved By: ${data.approvedBy}`);
  console.log(`  Gas Fee: ${data.estimatedGasFee}`);
  console.log(`  Expected Execution: ${data.expectedExecutionTime}`);
  console.log(`\n📧 User notified: ${data.user.notified}`);

  return data;
};

// Usage
await approveWithdrawal('wdr_pending_001', 'Balance verified');

PUT /api/admin/withdrawals/:id/execute

Исполнить одобренный вывод на blockchain.

Запрос

PUT /api/admin/withdrawals/wdr_pending_001/execute
Authorization: Bearer <admin_jwt_token>
Content-Type: application/json

{
  "gasLimit": 100000,
  "priorityFee": "normal"
}

Схема тела запроса:

Поле Тип Обязательно Описание
gasLimit number ❌ Нет Пользовательский gas limit (по умолчанию: auto-estimate)
priorityFee string ❌ Нет Приоритет: low, normal, high (по умолчанию: normal)

Ответ

Успех (200 OK):

{
  "success": true,
  "data": {
    "withdrawalId": "wdr_pending_001",
    "status": "processing",
    "executedAt": "2025-10-03T12:34:56Z",
    "executedBy": "admin_456def",
    "blockchain": {
      "txHash": "0xabcd1234...",
      "from": "0xHotWalletAddress...",
      "to": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
      "amount": "3000.00",
      "gasLimit": 100000,
      "gasPrice": "0.000000025 ETH",
      "estimatedGasFee": "0.0025 ETH",
      "network": "mainnet",
      "explorerUrl": "https://etherscan.io/tx/0xabcd1234..."
    },
    "expectedCompletionAt": "2025-10-03T12:40:00Z",
    "user": {
      "email": "alice@example.com",
      "notified": true
    }
  },
  "timestamp": "2025-10-03T12:34:56Z"
}

Поля ответа:

Поле Тип Описание
data.blockchain.txHash string On-chain transaction hash
data.blockchain.explorerUrl string URL blockchain explorer
data.expectedCompletionAt string Ожидаемая временная метка завершения

Ошибки:

Код статуса Код ошибки Описание
400 INVALID_STATUS Вывод не в статусе approved
403 PERMISSION_DENIED Недостаточно разрешений (требуется withdrawals:approve)
404 WITHDRAWAL_NOT_FOUND ID вывода не существует
422 BLOCKCHAIN_ERROR Blockchain транзакция провалилась
422 GAS_ESTIMATION_FAILED Невозможно оценить gas
503 BLOCKCHAIN_UNAVAILABLE Blockchain нода недоступна

Пример cURL

ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X PUT https://app.saga.surf/api/admin/withdrawals/wdr_pending_001/execute \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "gasLimit": 100000,
    "priorityFee": "normal"
  }'

Пример TypeScript

const executeWithdrawal = async (
  withdrawalId: string,
  options?: { gasLimit?: number; priorityFee?: 'low' | 'normal' | 'high' }
) => {
  const response = await fetch(`/api/admin/withdrawals/${withdrawalId}/execute`, {
    method: 'PUT',
    headers: {
      'Authorization': `Bearer ${adminToken}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(options || {})
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.error.message);
  }

  const { data } = await response.json();

  console.log('🚀 Withdrawal Executed:');
  console.log(`  Withdrawal ID: ${data.withdrawalId}`);
  console.log(`  Status: ${data.status}`);
  console.log(`  TX Hash: ${data.blockchain.txHash}`);
  console.log(`  Explorer: ${data.blockchain.explorerUrl}`);
  console.log('\n⛽ Gas Details:');
  console.log(`  Limit: ${data.blockchain.gasLimit}`);
  console.log(`  Price: ${data.blockchain.gasPrice}`);
  console.log(`  Estimated Fee: ${data.blockchain.estimatedGasFee}`);
  console.log(`\n⏱️ Expected Completion: ${data.expectedCompletionAt}`);
  console.log(`📧 User notified: ${data.user.notified}`);

  return data;
};

// Usage
await executeWithdrawal('wdr_pending_001', { priorityFee: 'high' });

PUT /api/admin/withdrawals/:id/reject

Отклонить ожидающий вывод с указанием причины.

Запрос

PUT /api/admin/withdrawals/wdr_pending_002/reject
Authorization: Bearer <admin_jwt_token>
Content-Type: application/json

{
  "reason": "Suspicious activity detected, compliance review required",
  "notifyUser": true
}

Схема тела запроса:

Поле Тип Обязательно Описание
reason string ✅ Да Причина отклонения (видна пользователю)
notifyUser boolean ❌ Нет Отправить email уведомление (по умолчанию: true)

Ответ

Успех (200 OK):

{
  "success": true,
  "data": {
    "withdrawalId": "wdr_pending_002",
    "status": "rejected",
    "rejectedAt": "2025-10-03T12:34:56Z",
    "rejectedBy": "admin_456def",
    "reason": "Suspicious activity detected, compliance review required",
    "amount": "1500.00",
    "refundedToBalance": true,
    "user": {
      "email": "bob@example.com",
      "notified": true,
      "newBalance": {
        "available": "3000.00",
        "invested": "1000.00"
      }
    }
  },
  "timestamp": "2025-10-03T12:34:56Z"
}

Поля ответа:

Поле Тип Описание
data.refundedToBalance boolean Сумма возвращена на баланс пользователя
data.user.newBalance object Обновленный баланс пользователя после возврата
data.reason string Причина отклонения (видна пользователю)

Ошибки:

Код статуса Код ошибки Описание
400 INVALID_STATUS Вывод не в статусе pending/approved
400 REASON_REQUIRED Причина отклонения обязательна
403 PERMISSION_DENIED Недостаточно разрешений (требуется withdrawals:approve)
404 WITHDRAWAL_NOT_FOUND ID вывода не существует

Пример cURL

ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X PUT https://app.saga.surf/api/admin/withdrawals/wdr_pending_002/reject \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Suspicious activity detected, compliance review required",
    "notifyUser": true
  }'

Пример TypeScript

const rejectWithdrawal = async (withdrawalId: string, reason: string) => {
  const response = await fetch(`/api/admin/withdrawals/${withdrawalId}/reject`, {
    method: 'PUT',
    headers: {
      'Authorization': `Bearer ${adminToken}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      reason,
      notifyUser: true
    })
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.error.message);
  }

  const { data } = await response.json();

  console.log('❌ Withdrawal Rejected:');
  console.log(`  Withdrawal ID: ${data.withdrawalId}`);
  console.log(`  Rejected By: ${data.rejectedBy}`);
  console.log(`  Reason: ${data.reason}`);
  console.log('\n💰 Refund:');
  console.log(`  Amount: $${data.amount}`);
  console.log(`  Refunded to Balance: ${data.refundedToBalance}`);
  console.log(`  New Balance: $${data.user.newBalance.available}`);
  console.log(`\n📧 User notified: ${data.user.notified}`);

  return data;
};

// Usage
await rejectWithdrawal(
  'wdr_pending_002',
  'Suspicious activity detected, compliance review required'
);

Связанная документация

Другие Admin Endpoints:

User Endpoints:

Архитектура:




📋 Метаданные

Версия: 2.6.268

Обновлено: 2025-10-21

Статус: Published