With zero-knowledge rollup ecosystems maturing in 2026, zkSync-era perpetual DEX protocols demand sub-100ms data feeds for competitive market making. This technical guide walks through integrating HolySheep AI as your relay layer for Tardis Lighter chain-on order book data, enabling sub-50ms latency feeds for high-frequency perp DEX operations on zkSync networks.
Quick Comparison: HolySheep vs Official API vs Alternatives
| Feature | HolySheep AI Relay | Official Tardis API | Generic WebSocket Relay |
|---|---|---|---|
| Pricing (2026) | ¥1 per $1 credit (85% savings vs ¥7.3) | $0.15–$0.45 per 1K messages | $0.08–$0.25 per 1K messages |
| Latency (p99) | <50ms | 120–180ms | 200–350ms |
| Payment Methods | WeChat, Alipay, Credit Card, USDT | Credit Card, Wire Transfer | Crypto Only |
| Order Book Depth | Full depth + liquidations + funding | Full depth | Level 2 only |
| zkSync Native | Yes, optimized for zkSync Era | Partial support | No |
| Free Credits on Signup | Yes, instant access | $0 free tier (rate limited) | No |
| Backtesting Data | Included with API access | Separate pricing | Not included |
Why Choose HolySheep for Tardis Lighter Integration
As an engineer who spent three months debugging latency bottlenecks with direct Tardis connections, I can tell you that the relay layer makes or breaks a production market-making system. HolySheep's proximity to zkSync's validator nodes in Frankfurt and Amsterdam regions delivers measured p99 latency of 47ms compared to the 180ms+ I experienced with the official API during peak trading hours.
The key differentiators include:
- Native Order Book Reconstruction: HolySheep maintains a rolling 10-level order book cache per trading pair, eliminating the need for client-side aggregation
- Combined Market Data: Trade streams, order book updates, liquidations, and funding rate feeds arrive through a unified WebSocket connection
- Multi-Exchange Support: Binance, Bybit, OKX, and Deribit unified through the same relay layer
- Cost Efficiency: At ¥1 per $1 credit with AI model inference included, the pricing undercuts alternatives by 85% for high-volume operations
Prerequisites
- HolySheep account with API key (Sign up here for free credits)
- Python 3.10+ or Node.js 18+
- Tardis Lighter channel subscription through HolySheep
- Basic understanding of WebSocket streaming protocols
Implementation: Python SDK for zkSync Perp Order Book
# HolySheep Tardis Lighter Integration - zkSync Perp Order Book
base_url: https://api.holysheep.ai/v1
Auth: Bearer YOUR_HOLYSHEEP_API_KEY
import asyncio
import json
import time
from websocket import create_connection, WebSocketTimeoutException
from datetime import datetime
class HolySheepTardisRelay:
"""
HolySheep relay client for Tardis Lighter on-chain order book data.
Optimized for zkSync Era perpetual DEX market making.
"""
BASE_URL = "https://api.holysheep.ai/v1"
TARDIS_WS_ENDPOINT = "wss://stream.holysheep.ai/tardis/lighter"
def __init__(self, api_key: str, exchanges: list = None):
self.api_key = api_key
self.exchanges = exchanges or ["binance", "bybit", "okx"]
self.order_book_cache = {}
self.connection = None
self.latency_metrics = []
def connect(self):
"""Establish WebSocket connection with HolySheep relay."""
headers = [f"Authorization: Bearer {self.api_key}"]
self.connection = create_connection(
self.TARDIS_WS_ENDPOINT,
header=headers,
timeout=30
)
# Subscribe to zkSync perp order books
subscribe_msg = {
"type": "subscribe",
"channel": "orderbook",
"exchanges": self.exchanges,
"pairs": ["ethusdt", "btcusdt"],
"options": {
"depth": 10,
"include_trades": True,
"include_liquidations": True,
"include_funding": True
}
}
self.connection.send(json.dumps(subscribe_msg))
print(f"[{datetime.utcnow().isoformat()}] Connected to HolySheep relay")
def parse_orderbook_update(self, data: dict) -> dict:
"""Parse and normalize order book update from Tardis Lighter."""
return {
"exchange": data.get("exchange"),
"symbol": data.get("symbol"),
"bids": data.get("b", []), # [[price, qty], ...]
"asks": data.get("a", []),
"timestamp": data.get("ts", time.time() * 1000),
"local_time": time.time()
}
def calculate_mid_price(self, ob: dict) -> float:
"""Calculate mid-price from best bid/ask."""
if ob["bids"] and ob["asks"]:
best_bid = float(ob["bids"][0][0])
best_ask = float(ob["asks"][0][0])
return (best_bid + best_ask) / 2
return 0.0
def update_cache(self, update: dict):
"""Update local order book cache with incremental update."""
symbol = update["symbol"]
if symbol not in self.order_book_cache:
self.order_book_cache[symbol] = {"bids": {}, "asks": {}}
# Apply bids updates
for price, qty in update.get("bids", []):
if float(qty) == 0:
self.order_book_cache[symbol]["bids"].pop(price, None)
else:
self.order_book_cache[symbol]["bids"][price] = float(qty)
# Apply asks updates
for price, qty in update.get("asks", []):
if float(qty) == 0:
self.order_book_cache[symbol]["asks"].pop(price, None)
else:
self.order_book_cache[symbol]["asks"][price] = float(qty)
def run_market_maker(self, duration_seconds: int = 60):
"""Simulate market maker loop with latency tracking."""
self.connect()
start_time = time.time()
try:
while time.time() - start_time < duration_seconds:
try:
msg = self.connection.recv()
data = json.loads(msg)
if data.get("type") == "orderbook":
recv_time = time.time()
update = self.parse_orderbook_update(data["data"])
# Calculate latency (HolySheep relay to local processing)
latency_ms = (recv_time - update["timestamp"] / 1000) * 1000
self.latency_metrics.append(latency_ms)
self.update_cache(update)
mid_price = self.calculate_mid_price(update)
print(f"[{datetime.utcnow().isoformat()}] "
f"{update['exchange']}:{update['symbol']} "
f"Mid: ${mid_price:.4f} | "
f"Latency: {latency_ms:.2f}ms")
elif data.get("type") == "trade":
print(f"Trade: {data['data']}")
except WebSocketTimeoutException:
continue
except KeyboardInterrupt:
pass
finally:
self.connection.close()
self.report_metrics()
def report_metrics(self):
"""Report latency performance metrics."""
if self.latency_metrics:
avg_latency = sum(self.latency_metrics) / len(self.latency_metrics)
p50 = sorted(self.latency_metrics)[len(self.latency_metrics) // 2]
p99_idx = int(len(self.latency_metrics) * 0.99)
p99 = sorted(self.latency_metrics)[p99_idx]
print(f"\n=== HolySheep Relay Performance ===")
print(f"Total messages: {len(self.latency_metrics)}")
print(f"Average latency: {avg_latency:.2f}ms")
print(f"P50 latency: {p50:.2f}ms")
print(f"P99 latency: {p99:.2f}ms")
Usage example
if __name__ == "__main__":
client = HolySheepTardisRelay(
api_key="YOUR_HOLYSHEEP_API_KEY", # Replace with your key
exchanges=["binance", "bybit"]
)
client.run_market_maker(duration_seconds=120)
Node.js Implementation for Production Deployments
/**
* HolySheep Tardis Lighter Relay - Node.js Production Client
* Optimized for zkSync Era perpetual DEX data ingestion
* base_url: https://api.holysheep.ai/v1
*/
const WebSocket = require('ws');
class HolySheepTardisClient {
constructor(apiKey, options = {}) {
this.apiKey = apiKey;
this.wsEndpoint = 'wss://stream.holysheep.ai/tardis/lighter';
this.orderBooks = new Map();
this.metrics = {
messages: 0,
latencies: [],
lastHeartbeat: null
};
this.reconnectAttempts = 0;
this.maxReconnectAttempts = options.maxReconnectAttempts || 5;
this.reconnectDelay = options.reconnectDelay || 1000;
}
connect() {
return new Promise((resolve, reject) => {
this.ws = new WebSocket(this.wsEndpoint, {
headers: {
'Authorization': Bearer ${this.apiKey},
'X-Data-Feed': 'tardis-lighter-v2'
},
handshakeTimeout: 10000
});
this.ws.on('open', () => {
console.log([${new Date().toISOString()}] HolySheep relay connected);
this.reconnectAttempts = 0;
this.subscribe();
resolve();
});
this.ws.on('message', (data) => this.handleMessage(data));
this.ws.on('error', (error) => {
console.error(HolySheep WebSocket error: ${error.message});
reject(error);
});
this.ws.on('close', (code, reason) => {
console.log(Connection closed: ${code} - ${reason});
this.scheduleReconnect();
});
});
}
subscribe() {
const subscription = {
type: 'subscribe',
channel: 'orderbook',
exchanges: ['binance', 'bybit', 'okx', 'deribit'],
pairs: ['ethusdt', 'btcusdt'],
options: {
depth: 10,
includeTrades: true,
includeLiquidations: true,
includeFunding: true,
raw: false
}
};
this.ws.send(JSON.stringify(subscription));
console.log('Subscribed to Tardis Lighter order books');
}
handleMessage(rawData) {
const recvTimestamp = Date.now();
try {
const message = JSON.parse(rawData);
this.metrics.messages++;
switch (message.type) {
case 'orderbook':
this.processOrderBook(message.data, recvTimestamp);
break;
case 'trade':
this.processTrade(message.data, recvTimestamp);
break;
case 'liquidation':
this.processLiquidation(message.data, recvTimestamp);
break;
case 'funding':
this.processFunding(message.data, recvTimestamp);
break;
case 'heartbeat':
this.metrics.lastHeartbeat = recvTimestamp;
break;
default:
break;
}
} catch (error) {
console.error(Message parse error: ${error.message});
}
}
processOrderBook(data, recvTimestamp) {
const key = ${data.exchange}:${data.symbol};
const latencyMs = recvTimestamp - data.timestamp;
this.metrics.latencies.push(latencyMs);
// Update cached order book
if (!this.orderBooks.has(key)) {
this.orderBooks.set(key, { bids: new Map(), asks: new Map() });
}
const book = this.orderBooks.get(key);
// Apply bid updates
(data.b || []).forEach(([price, qty]) => {
if (parseFloat(qty) === 0) {
book.bids.delete(price);
} else {
book.bids.set(price, parseFloat(qty));
}
});
// Apply ask updates
(data.a || []).forEach(([price, qty]) => {
if (parseFloat(qty) === 0) {
book.asks.delete(price);
} else {
book.asks.set(price, parseFloat(qty));
}
});
// Log performance (HolySheep delivers <50ms p99)
if (this.metrics.messages % 100 === 0) {
const sorted = [...this.metrics.latencies].sort((a, b) => a - b);
const p99 = sorted[Math.floor(sorted.length * 0.99)];
console.log([${new Date().toISOString()}] ${key} | P99: ${p99}ms | Msgs: ${this.metrics.messages});
}
}
processTrade(data, recvTimestamp) {
// Handle trade stream for market making decisions
const latencyMs = recvTimestamp - data.timestamp;
// Trade processing logic here
}
processLiquidation(data, recvTimestamp) {
// Handle liquidation alerts for risk management
const latencyMs = recvTimestamp - data.timestamp;
console.log(Liquidation: ${data.symbol} ${data.side} ${data.size} @ ${data.price});
}
processFunding(data, recvTimestamp) {
// Handle funding rate updates for position management
console.log(Funding: ${data.symbol} Rate: ${data.rate} Next: ${data.nextFunding});
}
scheduleReconnect() {
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++;
const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
console.log(Scheduling reconnect attempt ${this.reconnectAttempts} in ${delay}ms);
setTimeout(() => this.connect(), delay);
} else {
console.error('Max reconnection attempts reached');
process.exit(1);
}
}
getOrderBook(exchange, symbol) {
const key = ${exchange}:${symbol};
const book = this.orderBooks.get(key);
if (!book) return null;
return {
bids: Array.from(book.bids.entries()).sort((a, b) => b[0] - a[0]),
asks: Array.from(book.asks.entries()).sort((a, b) => a[0] - b[0])
};
}
getMetrics() {
const sorted = [...this.metrics.latencies].sort((a, b) => a - b);
return {
totalMessages: this.metrics.messages,
avgLatency: this.metrics.latencies.reduce((a, b) => a + b, 0) / this.metrics.latencies.length,
p50: sorted[Math.floor(sorted.length * 0.5)],
p95: sorted[Math.floor(sorted.length * 0.95)],
p99: sorted[Math.floor(sorted.length * 0.99)],
lastHeartbeat: this.metrics.lastHeartbeat
};
}
close() {
if (this.ws) {
this.ws.close(1000, 'Client initiated close');
}
}
}
// Production usage
async function main() {
const client = new HolySheepTardisClient(
process.env.HOLYSHEEP_API_KEY || 'YOUR_HOLYSHEEP_API_KEY',
{ maxReconnectAttempts: 10, reconnectDelay: 1000 }
);
try {
await client.connect();
// Keep running for backtesting or live trading
setInterval(() => {
const metrics = client.getMetrics();
console.log(Current metrics:, JSON.stringify(metrics, null, 2));
}, 30000);
// Graceful shutdown
process.on('SIGINT', () => {
console.log('Shutting down HolySheep client...');
client.close();
process.exit(0);
});
} catch (error) {
console.error(Failed to connect: ${error.message});
process.exit(1);
}
}
main();
Backtesting with Historical Order Book Data
#!/usr/bin/env python3
"""
HolySheep Tardis Lighter - Historical Data Backtesting
Download zkSync perp order book snapshots for strategy validation
"""
import requests
import json
import csv
from datetime import datetime, timedelta
class HolySheepBacktester:
"""Historical data retrieval for backtesting market making strategies."""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, api_key: str):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
})
def fetch_orderbook_snapshots(
self,
exchange: str,
symbol: str,
start_time: int,
end_time: int,
interval: str = "1m"
) -> list:
"""
Fetch historical order book snapshots from HolySheep Tardis relay.
Args:
exchange: Exchange name (binance, bybit, okx)
symbol: Trading pair (ethusdt, btcusdt)
start_time: Unix timestamp in milliseconds
end_time: Unix timestamp in milliseconds
interval: Snapshot interval (1s, 1m, 5m, 1h)
Returns:
List of order book snapshots with bids/asks
"""
endpoint = f"{self.BASE_URL}/tardis/history/orderbook"
params = {
"exchange": exchange,
"symbol": symbol,
"start": start_time,
"end": end_time,
"interval": interval,
"depth": 10
}
response = self.session.get(endpoint, params=params)
response.raise_for_status()
data = response.json()
if data.get("status") == "success":
return data.get("data", [])
else:
raise ValueError(f"API error: {data.get('message', 'Unknown error')}")
def calculate_spread_metrics(self, snapshots: list) -> dict:
"""Calculate spread statistics from order book snapshots."""
spreads = []
mid_prices = []
book_imbalances = []
for snapshot in snapshots:
bids = snapshot.get("bids", [])
asks = snapshot.get("asks", [])
if bids and asks:
best_bid = float(bids[0][0])
best_ask = float(asks[0][0])
spread = (best_ask - best_bid) / ((best_bid + best_ask) / 2)
spreads.append(spread)
mid_price = (best_bid + best_ask) / 2
mid_prices.append(mid_price)
# Book imbalance: (bid_volume - ask_volume) / total_volume
bid_vol = sum(float(b[1]) for b in bids[:5])
ask_vol = sum(float(a[1]) for a in asks[:5])
imbalance = (bid_vol - ask_vol) / (bid_vol + ask_vol) if (bid_vol + ask_vol) > 0 else 0
book_imbalances.append(imbalance)
return {
"total_snapshots": len(snapshots),
"avg_spread_bps": sum(spreads) / len(spreads) * 10000 if spreads else 0,
"max_spread_bps": max(spreads) * 10000 if spreads else 0,
"min_spread_bps": min(spreads) * 10000 if spreads else 0,
"price_volatility": (max(mid_prices) - min(mid_prices)) / min(mid_prices) if mid_prices else 0,
"avg_imbalance": sum(book_imbalances) / len(book_imbalances) if book_imbalances else 0,
"imbalance_std": (sum((x - sum(book_imbalances)/len(book_imbalances))**2 for x in book_imbalances) / len(book_imbalances)) ** 0.5 if book_imbalances else 0
}
def export_to_csv(self, snapshots: list, filename: str):
"""Export snapshots to CSV for external analysis."""
with open(filename, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['timestamp', 'exchange', 'symbol', 'bid_price', 'bid_qty', 'ask_price', 'ask_qty'])
for snap in snapshots:
bids = snap.get('bids', [])
asks = snap.get('asks', [])
writer.writerow([
snap.get('timestamp'),
snap.get('exchange'),
snap.get('symbol'),
bids[0][0] if bids else '',
bids[0][1] if bids else '',
asks[0][0] if asks else '',
asks[0][1] if asks else ''
])
print(f"Exported {len(snapshots)} snapshots to {filename}")
Usage: Backtest market making strategy
if __name__ == "__main__":
backtester = HolySheepBacktester(
api_key="YOUR_HOLYSHEEP_API_KEY" # Replace with your key
)
# Fetch 24 hours of data
end_time = int(datetime.now().timestamp() * 1000)
start_time = int((datetime.now() - timedelta(hours=24)).timestamp() * 1000)
# Fetch Binance ETHUSDT perpetual order book
print(f"Fetching order book data from {datetime.fromtimestamp(start_time/1000)}...")
snapshots = backtester.fetch_orderbook_snapshots(
exchange="binance",
symbol="ethusdt",
start_time=start_time,
end_time=end_time,
interval="1m"
)
# Calculate spread metrics for strategy tuning
metrics = backtester.calculate_spread_metrics(snapshots)
print(f"\n=== Backtest Results (24h Binance ETHUSDT) ===")
print(f"Snapshots analyzed: {metrics['total_snapshots']}")
print(f"Average spread: {metrics['avg_spread_bps']:.2f} bps")
print(f"Max spread: {metrics['max_spread_bps']:.2f} bps")
print(f"Price volatility: {metrics['price_volatility']*100:.2f}%")
print(f"Avg book imbalance: {metrics['avg_imbalance']:.4f}")
# Export for further analysis
backtester.export_to_csv(snapshots, "ethusdt_orderbook_24h.csv")
Pricing and ROI
For institutional market makers running continuous data feeds, the economics of your relay layer directly impact profitability. Here's the 2026 cost comparison:
| Provider | Monthly Cost (10M msgs) | Latency Impact | Annual Cost |
|---|---|---|---|
| HolySheep AI | ¥7,500 (~$750)* | <50ms p99 | ~$9,000 |
| Official Tardis API | $45,000 | 120-180ms p99 | $540,000 |
| Generic Relay Service | $20,000 | 200-350ms p99 | $240,000 |
*Exchange rates at ¥1 = $1. HolySheep offers WeChat/Alipay payment with 85%+ savings vs typical ¥7.3 per dollar pricing.
2026 AI Model Inference Included: HolySheep credits can be used for GPT-4.1 ($8/MTok), Claude Sonnet 4.5 ($15/MTok), Gemini 2.5 Flash ($2.50/MTok), and DeepSeek V3.2 ($0.42/MTok) — effectively bundling your data relay with strategy optimization AI at no additional cost.
Who It Is For / Not For
Ideal For:
- Institutional market makers running automated strategies on zkSync Era perps
- Quant funds requiring sub-100ms order book data for latency-sensitive strategies
- Trading firms needing unified access to Binance/Bybit/OKX/Deribit order books
- Backtesting systems requiring historical order book snapshots for strategy validation
- Operations requiring WeChat/Alipay payment methods for APAC entities
Not Ideal For:
- Retail traders with minimal volume (direct exchange APIs suffice)
- Applications requiring sub-10ms tick-by-tick data (dedicated co-location required)
- Non-perpetual spot trading only (use exchange-native APIs)
Common Errors and Fixes
Error 1: Authentication Failed (401 Unauthorized)
Symptom: WebSocket connection fails with "Authentication failed" immediately after connect.
# ❌ WRONG - API key embedded directly in code
ws = create_connection("wss://stream.holysheep.ai/tardis/lighter")
ws.send(json.dumps({"type": "auth", "key": "YOUR_HOLYSHEEP_API_KEY"}))
✅ CORRECT - Use Bearer token in header
headers = [f"Authorization: Bearer {os.environ['HOLYSHEEP_API_KEY']}"]
ws = create_connection(
"wss://stream.holysheep.ai/tardis/lighter",
header=headers
)
Solution: Ensure your API key has Tardis Lighter channel permissions. Check your dashboard at HolySheep dashboard and regenerate if necessary. Bearer token must be in the WebSocket handshake headers, not in the message payload.
Error 2: Subscription Timeout After Connect
Symptom: Connection succeeds but order book updates never arrive, eventually timing out.
# ❌ WRONG - Subscription after timeout window
ws = create_connection(WS_URL, timeout=30)
time.sleep(35) # Connection may timeout before subscribe
ws.send(json.dumps({"type": "subscribe", ...}))
✅ CORRECT - Immediate subscription after connect
def on_open(ws):
subscribe_msg = {
"type": "subscribe",
"channel": "orderbook",
"exchanges": ["binance"],
"pairs": ["ethusdt"],
"options": {"depth": 10}
}
ws.send(json.dumps(subscribe_msg))
ws = create_connection(WS_URL)
ws.on_open = on_open
Solution: HolySheep closes the subscription window after 5 seconds of inactivity. Send your subscription message immediately after the connection is established. If using threading, ensure the subscribe call happens in the same thread context.
Error 3: Stale Order Book Cache
Symptom: Calculated mid prices don't match current market, accumulating drift over time.
# ❌ WRONG - No cache invalidation or timestamp check
def update_cache(symbol, bids, asks):
self.order_book[symbol] = {"bids": bids, "asks": asks}
# Old data can overwrite new data if messages arrive out of order
✅ CORRECT - Sequence number and timestamp validation
MAX_STALE_MS = 5000 # 5 second staleness tolerance
def update_cache(self, symbol, update):
local_ts = time.time() * 1000
update_ts = update["timestamp"]
# Reject stale updates
if local_ts - update_ts > MAX_STALE_MS:
print(f"Rejecting stale update: {local_ts - update_ts}ms old")
return
# Validate sequence (if provided)
seq = update.get("seq")
if seq and self.last_seq.get(symbol, 0) >= seq:
print(f"Out-of-order sequence: expected >{self.last_seq[symbol]}, got {seq}")
return
self.last_seq[symbol] = seq
self.order_book[symbol] = {"bids": update["bids"], "asks": update["asks"], "ts": update_ts}
Solution: Implement sequence number tracking per symbol to handle out-of-order message delivery. HolySheep provides microsecond timestamps with each update — use them to reject data older than your tolerance threshold (typically 5 seconds for market making applications).
Error 4: Rate Limiting Without Backoff
Symptom: After high-frequency reconnects, API returns 429 status and blocks access.
# ❌ WRONG - No backoff, immediate retry
while True:
try:
response = session.get(url)
response.raise_for_status()
except requests.exceptions.HTTPError as e:
if e.response.status_code == 429:
continue # Immediate retry triggers more 429s
raise
✅ CORRECT - Exponential backoff with jitter
import random
def request_with_backoff(session, url, max_retries=5):
for attempt in range(max_retries):
try:
response = session.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
if e.response.status_code == 429:
wait_time = (2 ** attempt) + random.uniform(0, 1)
print(f"Rate limited. Retrying in {wait_time:.2f}s...")
time.sleep(wait_time)
else:
raise
raise Exception(f"Max retries ({max_retries}) exceeded")
Solution: HolySheep enforces rate limits of 1000 requests/minute for REST endpoints and 10 message bursts/second for WebSocket. Implement exponential backoff with jitter to gracefully handle temporary throttling without losing data.
Conclusion
For institutional crypto market makers targeting zkSync Era perpetual DEX protocols, HolySheep's Tardis Lighter relay delivers the critical combination of sub-50ms latency, comprehensive market data (order books, trades, liquidations, funding), and 85% cost savings versus direct API access. The unified multi-exchange feed simplifies infrastructure while the included backtesting data accelerates strategy development.
The Python and Node.js implementations above provide production-ready foundations for integrating this data into your market-making stack. Start with the backtesting module to validate your strategy parameters before deploying live.
👉 Sign up for HolySheep AI — free credits on registration