главная

Руководства

Пополнения и выводы

USDC в Solana на счёт Seeryx и обратно из кода: пополнения, адреса для пополнения, мгновенный и отложенный вывод и их стоимость.

Обзор

Ваши средства — это USDC в Solana на вашем собственном счёте в программе Seeryx. Пополнения и выводы — это транзакции вашего кошелька, которые сервер готовит с Seeryx в качестве плательщика комиссии: кошелёк подписывает, Seeryx добавляет свою подпись и отправляет транзакцию, поэтому SOL на кошельке не нужен. Каждая операция — это три вызова:

  1. Запросите транзакцию: POST /api/relay или POST /api/withdraw-now возвращает { "transaction": "<base64>" }.
  2. Подпишите её кошельком (только подпись, без отправки) и передайте в POST /api/relay/submit; в ответе будет её подпись.
  3. Дождитесь подтверждения в Solana, затем вызовите POST /api/funds/refresh: ваши средства обновятся в течение нескольких секунд.

sendPrepared в chain.ts (send_prepared в chain.py) выполняет шаги 2 и 3.

Пополнение с кошелька

  • POST /api/relay с { "action": "deposit", "amount": 10 }, затем подпишите и отправьте.
  • Комиссия за пополнение (1 USDC) оплачивается в той же транзакции, остальное зачисляется.
  • Первое пополнение открывает ваш счёт: после комиссии на нём должно остаться не меньше 1 USDC. До этого запрос торговой сессии возвращает 409 «Deposit first».

Адрес для пополнения

POST /api/deposit/address с { "network": "solana", "token": "USDC" } выдаёт ваш собственный адрес. USDC, отправленные на него с биржи или любого кошелька, зачисляются на баланс автоматически (auto: true) за вычетом комиссии за пополнение. GET /api/deposit/options возвращает список других сетей и токенов (USDT и USDC в Ethereum, BNB Chain, Base, Polygon, Arbitrum и других), каждый со своим минимумом; они поступают через мост. GET /api/funds/wallet показывает средства в пути (incoming).

Мгновенный вывод

  • POST /api/withdraw-now с { "amount": 25 } (и to для другого кошелька Solana), затем подпишите и отправьте.
  • Комиссия за вывод (1 USDC, accountFee в ответе) удерживается из суммы; за её счёт также открывается USDC-счёт получателя, если его нет.
  • С network и token USDC уходят дальше через мост в другую сеть; POST /api/withdraw/quote заранее сообщает, сколько поступит.
  • 409, пока одна из ваших сделок ещё проходит расчёт: повторите через несколько секунд.

Отложенный вывод

Бесплатно и с подписью только вашего кошелька: POST /api/relay с { "action": "request_withdraw", "amount": 25 }, подождите withdrawDelay секунд из GET /api/funds (60), затем execute_withdraw выплачивает сумму на ваш кошелёк (или на to — кошелёк, у которого уже есть USDC-счёт). cancel_withdraw отменяет запрос.

Код

funds.ts
// funds.ts: deposit USDC from the wallet and withdraw it again; the exchange pays every fee. npx tsx funds.ts
import { api, loadWallet, signIn } from './seeryx';
import { sendPrepared, type Funds } from './chain';
import { logValue } from './api-url.mjs';

const wallet = await loadWallet();
await signIn(wallet);
const funds = await api<Funds>('/funds');
if (funds.mode !== 'chain') throw new Error('This server holds no USDC on Solana');

// USDC in the wallet, not deposited yet; `account` is null until the first deposit opens it
console.log({ wallet: await api('/funds/wallet') });

// deposit 10 USDC (the first deposit is at least 1): the server prepares the transaction, the wallet signs it
const deposit = await api<{ transaction: string }>('/relay', {
  method: 'POST', body: { action: 'deposit', amount: 10 },
});
console.log('deposit', logValue(await sendPrepared(funds, wallet, deposit.transaction)));
await api('/funds/refresh', { method: 'POST' }); // read the program now; cash follows within seconds
await new Promise((r) => setTimeout(r, 5000));
console.log({ balance: await api('/balance') });

// withdraw 4 USDC at once to this wallet (or `to`: another Solana wallet), co-signed by the exchange
const withdrawal = await api<{ transaction: string; accountFee: number }>('/withdraw-now', {
  method: 'POST', body: { amount: 4 },
});
const sent = await sendPrepared(funds, wallet, withdrawal.transaction);
console.log('withdrawal', logValue(sent), 'withdrawal fee', Number(withdrawal.accountFee));
await api('/funds/refresh', { method: 'POST' });

Все комиссии в одном месте: Комиссии.

Эндпоинты средств

Ваши USDC лежат на вашем собственном счёте в программе Seeryx на Solana. Каждую вашу транзакцию готовит сервер, а комиссию сети оплачивает Seeryx: кошелёк только подписывает.

GET/api/funds

Данные блокчейна, которые нужны клиенту

Публичный
Запрос
curl "https://seeryx.com/api/funds"
Ответ
{
  "mode": "chain", "cluster": "mainnet",
  "programId": "2uUbvYHqBH1HDVzABGPcqrjHodoBVcNkq6Nrv6MABaiv", "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "withdrawDelay": 60, "maxSessionTtl": 86400, "instantWithdraw": true, "withdrawFee": 1.0, "depositFee": 1.0,
  "onChainTrading": true, "fees": { "rateBps": 700, "rebateBps": 2000 },
  "relayed": true, "directDeposits": true, "finePrices": true, "budgetBuys": true, ...
}
  • programId: программа Seeryx (аккаунты рынков выводятся из неё); mint: USDC. onChainTrading: каждый ордер, разделение и объединение должны быть подписаны. relayed: Seeryx оплачивает комиссию сети за ваши транзакции.
  • finePrices: лимиты с шагом 0,1¢ ниже 1¢ и выше 99¢. budgetBuys: рыночные покупки подписываются по бюджету (PMO4). maxSessionTtl: максимальная длительность торговой сессии в секундах; withdrawDelay: ожидание отложенного вывода в секундах. depositFee и withdrawFee — в USDC.
GET/api/funds/wallet

USDC в вашем кошельке, ваши средства в программе, USDC в пути

Нужен входSolana
ПолеТипОписание
freshстрока запросанеобязательно1Пропустить 5-секундный кэш
Запрос
curl "https://seeryx.com/api/funds/wallet" \
  -H "X-Auth-Token: $TOKEN"
Ответ
{ "wallet": 200, "account": null, "sol": 0, "incoming": 0 }
  • wallet: USDC в кошельке, ещё не зачисленные на счёт. account: средства в программе или null, пока счёт не открыт первым пополнением. incoming: USDC, которые поступили на ваш адрес для пополнения и находятся в пути к вашему балансу.
СтатусКогда
502Не удалось прочитать данные Solana; ноль в этом случае не возвращается
POST/api/funds/refresh

После пополнения или вывода: прочитать программу сейчас

Нужен входSolana
Запрос
curl -X POST "https://seeryx.com/api/funds/refresh" \
  -H "X-Auth-Token: $TOKEN"
Ответ
{ "ok": true }
POST/api/relay

Подготовить вашу транзакцию для подписи кошельком

Нужен входSolana
ПолеТипОписание
actionтелообязательноstringdeposit, session, close_session, request_withdraw, cancel_withdraw или execute_withdraw
amountтелонеобязательноnumberdeposit, request_withdraw: сумма в USDC
keyтелонеобязательноstringsession: новый ключ сессии; close_session: ключ сессии, если подписывает он, а не кошелёк
expiresAtтелонеобязательноnumbersession: секунды Unix, не позднее чем через maxSessionTtl от текущего момента
limitтелонеобязательноnumbersession: общая сумма в USDC, которую можно потратить
maxTradeтелонеобязательноnumbersession: сумма в USDC, которую может потратить один ордер, не больше limit
toтелонеобязательноstringexecute_withdraw: другой кошелёк Solana, у которого есть USDC-счёт
Запрос
curl -X POST "https://seeryx.com/api/relay" \
  -H "X-Auth-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"action":"deposit","amount":10}'
Ответ
{ "transaction": "AQAB..." }
  • transaction — транзакция v0 в base64, в которой комиссию оплачивает Seeryx, а все слоты подписей пусты. Подпишите её кошельком (только подпись, без отправки), затем отправьте POST-запросом в /api/relay/submit.
  • С каждого пополнения в той же транзакции удерживается комиссия за пополнение (depositFee из GET /api/funds); остальное зачисляется. После первого пополнения за вычетом комиссии должно остаться не меньше 1 USDC: оно открывает ваш счёт.
  • close_session отменяет ваши ордера в стакане и сразу останавливает ключ сессии (его ордера получают trading_paused) — ещё до отправки транзакции.
СтатусКогда
400Отсутствующее или неверное поле, пополнение не больше комиссии
409«Deposit first» (счёта ещё нет), нет ожидающего вывода или он ещё не готов, у получателя нет USDC-счёта
POST/api/relay/submit

Отправить подготовленную транзакцию после подписи кошельком

Нужен входSolana
ПолеТипОписание
transactionтелообязательноstringbase64: транзакция из /relay или /withdraw-now с подписью вашего кошелька
Запрос
curl -X POST "https://seeryx.com/api/relay/submit" \
  -H "X-Auth-Token: $TOKEN"
Ответ
{ "signature": "5VERv8NM..." }
  • Seeryx добавляет свою подпись, проверяет все подписи и отправляет транзакцию в Solana; signature — её id. Дождитесь подтверждения через любой Solana RPC (getSignatureStatuses).
СтатусКогда
400Это не транзакция, подготовленная для вашего аккаунта за последние 5 минут, или она уже отправлена
409Её blockhash истёк до того, как она попала в Solana: подготовьте её заново
POST/api/withdraw-now

Мгновенный вывод для подписи кошельком

Нужен входSolana
ПолеТипОписание
amountтелообязательноnumberUSDC, списываемые с вашего счёта, включая комиссию за вывод
toтелонеобязательноstringДругой кошелёк Solana или адрес в сети network
networkтелонеобязательноstringВместе с token: доставка в другую сеть (сеть из /deposit/options с withdraw true)
tokenтелонеобязательноstringUSDC или USDT
cancelPendingтелонеобязательноbooleanЗаменить ожидающий отложенный вывод
Запрос
curl -X POST "https://seeryx.com/api/withdraw-now" \
  -H "X-Auth-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"amount":25}'
Ответ
{ "transaction": "AQAB...", "accountFee": 1 }
  • Подпишите транзакцию кошельком и отправьте через /api/relay/submit. accountFee — комиссия за вывод, удерживаемая из суммы. С network и token ответ также содержит bridge { receive, fee, seconds }.
СтатусКогда
400Сумма не больше комиссии или больше ваших свободных средств
409Одна из ваших сделок ещё проходит расчёт: повторите через несколько секунд или используйте отложенный вывод
POST/api/withdraw/quote

Сколько доставит вывод в другую сеть

Нужен входSolana
ПолеТипОписание
amountтелообязательноnumberUSDC, списываемые с вашего счёта
networkтелообязательноstringСеть из /deposit/options
tokenтелообязательноstringUSDC или USDT
toтелонеобязательноstringНеобязательный адрес получателя
Запрос
curl -X POST "https://seeryx.com/api/withdraw/quote" \
  -H "X-Auth-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"amount":20,"network":"base","token":"USDC"}'
Ответ
{ "receive": 18.89, "fee": 0.11, "networkFee": 0.11, "bridgeFee": 1, "seconds": 1 }
  • bridgeFee — комиссия за вывод; networkFee — оценка стоимости моста в другой сети.
GET/api/deposit/options

Сети и токены, из которых можно пополнить счёт

ПубличныйSolana
Запрос
curl "https://seeryx.com/api/deposit/options"
Ответ
{ "routes": [{ "network": "solana", "token": "USDC", "min": 1, "available": true, "reason": null, "direct": true, "auto": true, "withdraw": true },
  { "network": "bsc", "token": "USDT", "min": 3, "available": true, "reason": null, "direct": false, "auto": true, "withdraw": true }, ...] }
  • direct: USDC в Solana, без моста. auto: то, что поступает на ваш адрес для пополнения, зачисляется на баланс автоматически. withdraw: туда можно вывести средства.
POST/api/deposit/address

Ваш собственный адрес для пополнения токеном в выбранной сети

Нужен входSolana
ПолеТипОписание
networkтелообязательноstringСеть из /deposit/options
tokenтелообязательноstringUSDT или USDC
Запрос
curl -X POST "https://seeryx.com/api/deposit/address" \
  -H "X-Auth-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"network":"solana","token":"USDC"}'
Ответ
{ "network": "solana", "token": "USDC", "address": "7xKXtg2C...", "min": 1, "direct": true, "auto": true }
  • Для вашего кошелька и маршрута адрес всегда один и тот же. Отправляйте не меньше min.
СтатусКогда
409Маршрут недоступен
502Мост недоступен
POST/api/deposit/recover

Найти пополнение, отправленное другим токеном или в другой сети

Нужен входSolana
Запрос
curl -X POST "https://seeryx.com/api/deposit/recover" \
  -H "X-Auth-Token: $TOKEN"
Ответ
{ "found": [{ "address": "0x09a3...", "network": "ethereum", "token": "USDC", "amount": "25000000" }] }
  • Для USDC, отправленных на адрес, указанный для USDT, или на адрес в другой сети, чем та, для которой он создан: мост ищет ещё раз и пересылает найденное. amount — в минимальных единицах токена.
СтатусКогда
429Больше 2 вызовов в минуту