A newly generated machine has zero balance. Before it can register an identity (which requires bonding 1 PEAQ), it needs native tokens for . Gas Station solves this bootstrap problem: the enrolls in 2FA once, then funds each machine wallet with a single call.
Open any TOTP-compatible authenticator (Google Authenticator, Authy, 1Password). Scan the QR code or manually enter the otpauthUri. The QR image expires after approximately 2 minutes.
3
Confirm 2FA activation
Submit the current TOTP code from the authenticator app to activate 2FA for this owner address.
await client.confirmFaucet2FA( ownerAddress, "https://depinstation.peaq.network", "123456" // TOTP code from authenticator);
After 2FA is active, fund any machine wallet with fundFromGasStation. The response is a discriminated union: either success (transfer landed) or skipped (wallet already funded).
JS (camelCase). The SDK retains the idempotency key on the response so callers can persist it for retry recovery:
Field
Type
Description
status
"success"
Transfer completed
requestId
string
Idempotency key (echoed from request, or SDK-generated UUID)
txHash
0x-prefixed hex
Transaction hash of the funding transfer
fundedAmount
string (decimal wei)
Amount transferred
Python (snake_case). The SDK does not echo request_id on the response. If you need it for retry recovery, pass it in explicitly and hold the value yourself:
Gas Station enforces three independent throttles to prevent abuse, plus a per-chain minimum balance threshold that decides whether a funding request transfers anything at all:
Limit
Scope
Surfaces as
Description
Rate limit
Per owner
RATE_LIMITED
Too many funding requests in too short a window. Back off and retry.
Daily funding cap
Per owner
CAP_EXCEEDED_OWNER
Total funded amount per owner per day.
Daily funding cap
Per wallet
CAP_EXCEEDED_WALLET
Total funded amount per target wallet per day.
Minimum gas balance
Per chain
skipped response
When the target wallet already holds at least this much, the faucet returns skipped with currentBalance/current_balance and minGasBalance/min_gas_balance instead of transferring.
Exact cap values, rate-limit windows, and the minimum gas balance are configured server-side and are subject to change. Branch on the error codes (or the skipped status) rather than hard-coding numbers.