accueil

Guides

Dépôts et retraits

Déposer et retirer des USDC sur Solana d’un compte Seeryx par le code : dépôts, adresses de dépôt, retraits immédiats et différés, et leur coût.

Vue d’ensemble

Vos liquidités sont des USDC sur Solana, sur votre propre compte dans le programme Seeryx. Les dépôts et les retraits sont des transactions de votre portefeuille que le serveur prépare avec Seeryx comme payeur des frais : le portefeuille signe, Seeryx ajoute sa signature et envoie la transaction ; le portefeuille n’a donc pas besoin de SOL. Chaque opération se fait en trois appels :

  1. Demandez la transaction : POST /api/relay ou POST /api/withdraw-now répond { "transaction": "<base64>" }.
  2. Signez-la avec le portefeuille (signer uniquement, sans envoyer) et transmettez-la à POST /api/relay/submit ; la réponse est sa signature.
  3. Attendez que Solana la confirme, puis appelez POST /api/funds/refresh : vos liquidités sont mises à jour en quelques secondes.

sendPrepared dans chain.ts (send_prepared dans chain.py) effectue les étapes 2 et 3.

Dépôt depuis le portefeuille

  • POST /api/relay avec { "action": "deposit", "amount": 10 }, puis signez et transmettez.
  • Les frais de dépôt (1 USDC) sont payés dans la même transaction et le reste est crédité.
  • Votre premier dépôt ouvre votre compte : il doit laisser au moins 1 USDC après les frais. D’ici là, une session de trading répond 409 "Deposit first".

Adresse de dépôt

POST /api/deposit/address avec { "network": "solana", "token": "USDC" } vous donne une adresse qui vous est propre. Les USDC qui y sont envoyés depuis une plateforme d’échange ou n’importe quel portefeuille sont ajoutés automatiquement à votre solde (auto: true), déduction faite des frais de dépôt. GET /api/deposit/options liste les autres réseaux et jetons (USDT et USDC sur Ethereum, BNB Chain, Base, Polygon, Arbitrum et d’autres), chacun avec son minimum ; ceux-ci arrivent par un pont. GET /api/funds/wallet indique ce qui est incoming.

Retrait immédiat

  • POST /api/withdraw-now avec { "amount": 25 } (et to pour un autre portefeuille Solana), puis signez et transmettez.
  • Les frais de retrait (1 USDC, accountFee dans la réponse) sont prélevés sur le montant ; ils ouvrent aussi un compte USDC pour une destination qui n’en a pas.
  • Avec network et token, les USDC poursuivent leur route par un pont vers un autre réseau ; POST /api/withdraw/quote indique d’abord ce qui arrivera.
  • 409 tant que l’une de vos opérations est encore en cours de règlement : réessayez quelques secondes plus tard.

Retrait différé

Gratuit, et signé par votre seul portefeuille : POST /api/relay avec { "action": "request_withdraw", "amount": 25 }, attendez le nombre de secondes indiqué par withdrawDelay de GET /api/funds (60), puis execute_withdraw verse le montant sur votre portefeuille (ou sur to, un portefeuille qui a déjà un compte USDC). cancel_withdraw annule la demande.

Code

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' });

Tous les frais au même endroit : Frais.

Endpoints des fonds

Vos USDC se trouvent sur votre propre compte dans le programme Seeryx sur Solana. Chacune de vos transactions est préparée par le serveur, Seeryx payant les frais de réseau : votre portefeuille se contente de signer.

GET/api/funds

Les informations de la blockchain dont un client a besoin

Public
Requête
curl "https://seeryx.com/api/funds"
Réponse
{
  "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 : le programme Seeryx (les comptes des marchés en sont dérivés) ; mint : USDC. onChainTrading : chaque ordre, scission et fusion doit être signé. relayed : Seeryx paie les frais de réseau de vos transactions.
  • finePrices : limites en dixièmes de cent en dessous de 1¢ et au-dessus de 99¢. budgetBuys : les achats au marché sont signés par budget (PMO4). maxSessionTtl : la durée maximale d’une session de trading, en secondes ; withdrawDelay : l’attente d’un retrait différé, en secondes. depositFee et withdrawFee en USDC.
GET/api/funds/wallet

Les USDC de votre portefeuille, vos liquidités dans le programme, les USDC en cours d’arrivée

Connexion requiseSolana
ChampTypeDescription
freshrequêtefacultatif1Ignorer le cache de 5 secondes
Requête
curl "https://seeryx.com/api/funds/wallet" \
  -H "X-Auth-Token: $TOKEN"
Réponse
{ "wallet": 200, "account": null, "sol": 0, "incoming": 0 }
  • wallet : USDC du portefeuille pas encore déposés. account : liquidités dans le programme, null jusqu’à ce que le premier dépôt ouvre le compte. incoming : USDC arrivés à votre adresse de dépôt et en route vers votre solde.
StatutCas
502Solana n’a pas pu être lu ; la réponse n’est jamais un zéro
POST/api/funds/refresh

Après un dépôt ou un retrait : relire le programme immédiatement

Connexion requiseSolana
Requête
curl -X POST "https://seeryx.com/api/funds/refresh" \
  -H "X-Auth-Token: $TOKEN"
Réponse
{ "ok": true }
POST/api/relay

Préparer une de vos transactions pour que le portefeuille la signe

Connexion requiseSolana
ChampTypeDescription
actioncorpsobligatoirestringdeposit, session, close_session, request_withdraw, cancel_withdraw ou execute_withdraw
amountcorpsfacultatifnumberdeposit, request_withdraw : USDC
keycorpsfacultatifstringsession : la nouvelle clé de session ; close_session : la clé de session lorsqu’elle signe à la place du portefeuille
expiresAtcorpsfacultatifnumbersession : secondes Unix, au plus maxSessionTtl à partir de maintenant
limitcorpsfacultatifnumbersession : USDC qu’elle peut dépenser au total
maxTradecorpsfacultatifnumbersession : USDC qu’un ordre peut dépenser, au plus limit
tocorpsfacultatifstringexecute_withdraw : un autre portefeuille Solana qui a un compte USDC
Requête
curl -X POST "https://seeryx.com/api/relay" \
  -H "X-Auth-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"action":"deposit","amount":10}'
Réponse
{ "transaction": "AQAB..." }
  • transaction est une transaction v0 en base64 dont Seeryx est le payeur des frais et dont tous les emplacements de signature sont vides. Signez-la avec le portefeuille (signer uniquement, sans l’envoyer), puis envoyez-la par POST à /api/relay/submit.
  • Chaque dépôt paie les frais de dépôt (depositFee de GET /api/funds) dans la même transaction ; le reste est crédité. Un premier dépôt doit laisser au moins 1 USDC après les frais : il ouvre votre compte.
  • close_session annule vos ordres en attente et arrête aussitôt la clé de session (ses ordres reçoivent trading_paused), avant même l’envoi de la transaction.
StatutCas
400Un champ manquant ou invalide, un dépôt qui ne dépasse pas les frais
409"Deposit first" (pas encore de compte), aucun retrait en attente ou retrait pas encore prêt, pas de compte USDC à la destination
POST/api/relay/submit

Envoyer une transaction préparée après sa signature par votre portefeuille

Connexion requiseSolana
ChampTypeDescription
transactioncorpsobligatoirestringbase64 : la transaction de /relay ou de /withdraw-now avec la signature de votre portefeuille
Requête
curl -X POST "https://seeryx.com/api/relay/submit" \
  -H "X-Auth-Token: $TOKEN"
Réponse
{ "signature": "5VERv8NM..." }
  • Seeryx ajoute sa propre signature, vérifie toutes les signatures et envoie la transaction à Solana ; signature en est l’identifiant. Attendez la confirmation avec n’importe quel RPC Solana (getSignatureStatuses).
StatutCas
400Pas une transaction préparée pour votre compte au cours des 5 dernières minutes, ou déjà envoyée
409Son blockhash a expiré avant qu’elle n’atteigne Solana : préparez-la de nouveau
POST/api/withdraw-now

Un retrait immédiat, à signer par le portefeuille

Connexion requiseSolana
ChampTypeDescription
amountcorpsobligatoirenumberUSDC qui quittent votre compte, frais de retrait compris
tocorpsfacultatifstringUn autre portefeuille Solana, ou une adresse sur network
networkcorpsfacultatifstringAvec token : livrer sur un autre réseau (un réseau de /deposit/options avec withdraw true)
tokencorpsfacultatifstringUSDC ou USDT
cancelPendingcorpsfacultatifbooleanRemplacer un retrait différé en attente
Requête
curl -X POST "https://seeryx.com/api/withdraw-now" \
  -H "X-Auth-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"amount":25}'
Réponse
{ "transaction": "AQAB...", "accountFee": 1 }
  • Signez la transaction avec le portefeuille et envoyez-la via /api/relay/submit. accountFee correspond aux frais de retrait, prélevés sur le montant. Avec network et token, la réponse contient aussi bridge { receive, fee, seconds }.
StatutCas
400Le montant ne dépasse pas les frais, ou dépasse vos liquidités libres
409L’une de vos opérations est encore en cours de règlement : réessayez dans quelques secondes, ou utilisez un retrait différé
POST/api/withdraw/quote

Ce que livre un retrait vers un autre réseau

Connexion requiseSolana
ChampTypeDescription
amountcorpsobligatoirenumberUSDC qui quittent votre compte
networkcorpsobligatoirestringUn réseau de /deposit/options
tokencorpsobligatoirestringUSDC ou USDT
tocorpsfacultatifstringAdresse de destination facultative
Requête
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"}'
Réponse
{ "receive": 18.89, "fee": 0.11, "networkFee": 0.11, "bridgeFee": 1, "seconds": 1 }
  • bridgeFee correspond aux frais de retrait ; networkFee, au coût du pont de l’autre réseau, à titre estimatif.
GET/api/deposit/options

Réseaux et jetons depuis lesquels un dépôt peut arriver

PublicSolana
Requête
curl "https://seeryx.com/api/deposit/options"
Réponse
{ "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 sur Solana, sans pont. auto : ce qui arrive à votre adresse de dépôt est ajouté automatiquement à votre solde. withdraw : un retrait peut y être livré.
POST/api/deposit/address

Votre propre adresse de dépôt pour un jeton sur un réseau

Connexion requiseSolana
ChampTypeDescription
networkcorpsobligatoirestringUn réseau de /deposit/options
tokencorpsobligatoirestringUSDT ou USDC
Requête
curl -X POST "https://seeryx.com/api/deposit/address" \
  -H "X-Auth-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"network":"solana","token":"USDC"}'
Réponse
{ "network": "solana", "token": "USDC", "address": "7xKXtg2C...", "min": 1, "direct": true, "auto": true }
  • La même adresse à chaque fois pour votre portefeuille et votre itinéraire. Envoyez au moins min.
StatutCas
409L’itinéraire n’est pas disponible
502Le pont est injoignable
POST/api/deposit/recover

Retrouver un dépôt envoyé avec un autre jeton ou sur un autre réseau

Connexion requiseSolana
Requête
curl -X POST "https://seeryx.com/api/deposit/recover" \
  -H "X-Auth-Token: $TOKEN"
Réponse
{ "found": [{ "address": "0x09a3...", "network": "ethereum", "token": "USDC", "amount": "25000000" }] }
  • Pour des USDC envoyés à l’adresse affichée pour l’USDT, ou à une adresse sur un autre réseau que celui pour lequel elle a été créée : le pont cherche de nouveau et transfère ce qu’il trouve. amount est exprimé dans les plus petites unités du jeton.
StatutCas
429Plus de 2 appels par minute