Guías
Depósitos y retiros
Mueve USDC en Solana a y desde una cuenta de Seeryx con código: depósitos, direcciones de depósito, retiros inmediatos y diferidos y lo que cuesta cada uno.
Descripción general
Tu efectivo son USDC en Solana, en tu propia cuenta del programa de Seeryx. Los depósitos y los retiros son transacciones de tu billetera que el servidor prepara con Seeryx como pagador de la comisión: la billetera firma, Seeryx añade su firma y la envía, así que la billetera no necesita SOL. Cada flujo consta de tres llamadas:
- Pide la transacción:
POST /api/relayoPOST /api/withdraw-nowresponde{ "transaction": "<base64>" }. - Fírmala con la billetera (solo firmar, no enviar) y envíala con
POST /api/relay/submit; la respuesta es su firma. - Espera a que Solana la confirme y, después, llama a
POST /api/funds/refresh: tu efectivo se actualiza en segundos.
sendPrepared en chain.ts (send_prepared en chain.py) hace los pasos 2 y 3.
Depositar desde la billetera
POST /api/relaycon{ "action": "deposit", "amount": 10 }; después, firma y envía.- La comisión de depósito (1 USDC) se paga en la misma transacción y el resto se abona.
- Tu primer depósito abre tu cuenta: debe dejar al menos 1 USDC después de la comisión. Hasta entonces, abrir una sesión de trading responde 409 "Deposit first".
Dirección de depósito
POST /api/deposit/address con { "network": "solana", "token": "USDC" } te da una dirección propia. Los USDC enviados allí desde un exchange o desde cualquier billetera se añaden a tu saldo automáticamente (auto: true), menos la comisión de depósito. GET /api/deposit/options lista las demás redes y tokens (USDT y USDC en Ethereum, BNB Chain, Base, Polygon, Arbitrum y más), cada uno con su mínimo; esos llegan a través de un puente. GET /api/funds/wallet muestra lo que está en camino (incoming).
Retirar al instante
POST /api/withdraw-nowcon{ "amount": 25 }(ytopara otra billetera de Solana); después, firma y envía.- La comisión de retiro (1 USDC,
accountFeeen la respuesta) se descuenta del importe; también abre una cuenta de USDC para un destino que no la tenga. - Con
networkytoken, los USDC siguen a través de un puente hacia otra red;POST /api/withdraw/quoteindica antes lo que llega. - 409 mientras una de tus operaciones se sigue liquidando: inténtalo de nuevo unos segundos después.
Retiro diferido
Gratis y firmado solo por tu billetera: POST /api/relay con { "action": "request_withdraw", "amount": 25 }, espera los withdrawDelay segundos de GET /api/funds (60) y, después, execute_withdraw paga el importe a tu billetera (o a to, una billetera que ya tenga una cuenta de USDC). cancel_withdraw anula la solicitud.
Código
// 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' });Todas las comisiones en un solo lugar: Comisiones.
Endpoints de fondos
Tus USDC están en tu propia cuenta del programa de Seeryx en Solana. El servidor prepara cada transacción tuya con Seeryx pagando la comisión de red: tu billetera solo firma.
/api/fundsLos datos de la cadena de bloques que necesita un cliente
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: el programa de Seeryx (las cuentas de mercado se derivan de él); mint: USDC. onChainTrading: cada orden, división y combinación debe estar firmada. relayed: Seeryx paga la comisión de red de tus transacciones.
- finePrices: límites en décimas de centavo por debajo de 1¢ y por encima de 99¢. budgetBuys: las compras de mercado se firman por presupuesto (PMO4). maxSessionTtl: la sesión de trading más larga, en segundos; withdrawDelay: la espera de un retiro diferido, en segundos. depositFee y withdrawFee, en USDC.
/api/funds/walletUSDC en tu billetera, tu efectivo en el programa, USDC en camino
| Campo | Tipo | Descripción |
|---|---|---|
fresh | 1 | Omitir la caché de 5 segundos |
curl "https://seeryx.com/api/funds/wallet" \
-H "X-Auth-Token: $TOKEN"{ "wallet": 200, "account": null, "sol": 0, "incoming": 0 }- wallet: USDC en la billetera aún no depositados. account: efectivo en el programa, null hasta que el primer depósito abre la cuenta. incoming: USDC que llegaron a tu dirección de depósito y están en camino a tu saldo.
| Estado | Cuándo |
|---|---|
| 502 | No se pudo leer Solana; nunca se devuelve un cero |
/api/funds/refreshTras un depósito o un retiro: leer el programa ahora
curl -X POST "https://seeryx.com/api/funds/refresh" \
-H "X-Auth-Token: $TOKEN"{ "ok": true }/api/relayPreparar una transacción tuya para que la firme la billetera
| Campo | Tipo | Descripción |
|---|---|---|
action | string | deposit, session, close_session, request_withdraw, cancel_withdraw o execute_withdraw |
amount | number | deposit, request_withdraw: USDC |
key | string | session: la nueva clave de sesión; close_session: la clave de sesión, cuando firma ella en lugar de la billetera |
expiresAt | number | session: segundos Unix, como máximo maxSessionTtl a partir de ahora |
limit | number | session: los USDC que puede gastar en total |
maxTrade | number | session: los USDC que puede gastar una orden, como máximo limit |
to | string | execute_withdraw: otra billetera de Solana que tenga una cuenta de 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 es una transacción v0 en base64 con Seeryx como pagador de la comisión y todos los espacios de firma vacíos. Fírmala con la billetera (solo firmar, sin enviarla) y, después, envíala con POST a /api/relay/submit.
- Cada depósito paga la comisión de depósito (depositFee de GET /api/funds) en la misma transacción; el resto se abona. Un primer depósito debe dejar al menos 1 USDC después de la comisión: abre tu cuenta.
- close_session cancela tus órdenes en el libro y detiene la clave de sesión al instante (sus órdenes reciben trading_paused), incluso antes de que se envíe la transacción.
| Estado | Cuándo |
|---|---|
| 400 | Un campo ausente o no válido, un depósito que no supera la comisión |
| 409 | "Deposit first" (aún no hay cuenta), ningún retiro en espera o todavía no disponible, ninguna cuenta de USDC en el destino |
/api/relay/submitEnviar una transacción preparada después de que tu billetera la firme
| Campo | Tipo | Descripción |
|---|---|---|
transaction | string | base64: la transacción de /relay o /withdraw-now con la firma de tu billetera |
curl -X POST "https://seeryx.com/api/relay/submit" \
-H "X-Auth-Token: $TOKEN"{ "signature": "5VERv8NM..." }- Seeryx añade su propia firma, comprueba todas las firmas y envía la transacción a Solana; signature es su id. Espera la confirmación con cualquier RPC de Solana (getSignatureStatuses).
| Estado | Cuándo |
|---|---|
| 400 | No es una transacción preparada para tu cuenta en los últimos 5 minutos, o ya se envió |
| 409 | Su blockhash venció antes de que llegara a Solana: prepárala de nuevo |
/api/withdraw-nowUn retiro inmediato, para que lo firme la billetera
| Campo | Tipo | Descripción |
|---|---|---|
amount | number | Los USDC que salen de tu cuenta, comisión de retiro incluida |
to | string | Otra billetera de Solana, o una dirección en network |
network | string | Con token: entregar en otra red (una red de /deposit/options con withdraw true) |
token | string | USDC o USDT |
cancelPending | boolean | Reemplazar un retiro diferido en espera |
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 }- Firma la transacción con la billetera y envíala a través de /api/relay/submit. accountFee es la comisión de retiro, que se descuenta del importe. Con network y token, la respuesta incluye también bridge { receive, fee, seconds }.
| Estado | Cuándo |
|---|---|
| 400 | El importe no supera la comisión o es mayor que tu efectivo libre |
| 409 | Una de tus operaciones se sigue liquidando: inténtalo de nuevo en unos segundos o usa un retiro diferido |
/api/withdraw/quoteLo que entrega un retiro a otra red
| Campo | Tipo | Descripción |
|---|---|---|
amount | number | Los USDC que salen de tu cuenta |
network | string | Una red de /deposit/options |
token | string | USDC o USDT |
to | string | Dirección de destino opcional |
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 es la comisión de retiro; networkFee, el coste estimado del puente de la otra red.
/api/deposit/optionsRedes y tokens desde los que puede llegar un depósito
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 en Solana, sin puente. auto: lo que llega a tu dirección de depósito se añade a tu saldo automáticamente. withdraw: un retiro puede entregar allí.
/api/deposit/addressTu propia dirección de depósito para un token en una red
| Campo | Tipo | Descripción |
|---|---|---|
network | string | Una red de /deposit/options |
token | string | USDT o 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 }- Siempre la misma dirección para tu billetera y esa ruta. Envía al menos min.
| Estado | Cuándo |
|---|---|
| 409 | La ruta no está disponible |
| 502 | No se puede contactar con el puente |
/api/deposit/recoverEncontrar un depósito enviado con otro token o en otra red
curl -X POST "https://seeryx.com/api/deposit/recover" \
-H "X-Auth-Token: $TOKEN"{ "found": [{ "address": "0x09a3...", "network": "ethereum", "token": "USDC", "amount": "25000000" }] }- Para USDC enviados a la dirección mostrada para USDT, o a una dirección en una red distinta de aquella para la que se creó: el puente vuelve a buscar y reenvía lo que encuentra. amount está en las unidades mínimas del token.
| Estado | Cuándo |
|---|---|
| 429 | Más de 2 llamadas por minuto |