runicRPC Logo
runicRPCv0.1
Documentation

Migration Guide

Migrate from @solana/web3.js Connection to runicRPC.

Quick Migration

runicRPC is designed as a drop-in replacement:

Before

import { Connection } from '@solana/web3.js';

const connection = new Connection('https://api.mainnet-beta.solana.com');

const slot = await connection.getSlot();
const balance = await connection.getBalance(publicKey);

After

import { RunicRPC } from '@runic-rpc/sdk';

const rpc = RunicRPC.create({ useFallback: true });

const slot = await rpc.request('getSlot');
const balance = await rpc.request('getBalance', [publicKey.toString()]);

Key Differences

Method Calls

Connection uses methods:

await connection.getSlot();
await connection.getBalance(publicKey);
await connection.getAccountInfo(publicKey);

runicRPC uses request():

await rpc.request('getSlot');
await rpc.request('getBalance', [publicKey.toString()]);
await rpc.request('getAccountInfo', [publicKey.toString()]);

PublicKey Conversion

Connection accepts PublicKey objects. runicRPC requires strings:

import { PublicKey } from '@solana/web3.js';

const publicKey = new PublicKey('...');

// Connection
await connection.getBalance(publicKey);

// RunicRPC
await rpc.request('getBalance', [publicKey.toString()]);

Common Patterns

Getting Balance

// Before
const balance = await connection.getBalance(publicKey);

// After
const balance = await rpc.request('getBalance', [publicKey.toString()]);

Getting Account Info

// Before
const accountInfo = await connection.getAccountInfo(publicKey);

// After
const accountInfo = await rpc.request('getAccountInfo', [
  publicKey.toString(),
  { encoding: 'base64' }
]);

Sending Transactions

import { Transaction } from '@solana/web3.js';

const transaction = new Transaction().add(/* instructions */);

// Before
const signature = await connection.sendTransaction(transaction, [signer]);

// After
const signature = await rpc.request('sendTransaction', [
  transaction.serialize().toString('base64')
]);

Confirming Transactions

// Before
await connection.confirmTransaction(signature);

// After
await rpc.request('getSignatureStatuses', [[signature]]);

WebSocket Subscriptions

Account Subscribe

// Before
const subscriptionId = connection.onAccountChange(
  publicKey,
  (accountInfo) => {
    console.log('Account changed:', accountInfo);
  }
);

// After
const subscriptionId = await rpc.subscribe(
  'accountSubscribe',
  [publicKey.toString(), { encoding: 'base64' }],
  (accountInfo) => {
    console.log('Account changed:', accountInfo);
  }
);

Cleanup

// Before
connection.removeAccountChangeListener(subscriptionId);

// After
await rpc.unsubscribe(subscriptionId);

Benefits of Migration

1. Automatic Failover

const rpc = RunicRPC.create({
  providers: {
    helius: { apiKey: 'key1' },
    alchemy: { apiKey: 'key2' }
  }
});

// Automatically fails over if one provider is down

2. Circuit Breaker

Prevents cascading failures:

rpc.on('circuit:open', (event) => {
  console.log(`Circuit opened for ${event.endpoint}`);
});

3. Intelligent Routing

Routes to fastest endpoint:

const rpc = RunicRPC.create({
  strategy: 'latency-based'
});

4. Request Caching

Automatic caching with TTL:

const rpc = RunicRPC.create({
  cache: {
    enabled: true,
    ttl: 1000
  }
});

5. Observability

Comprehensive events and metrics:

const stats = rpc.getStats();
console.log('Cache hit rate:', stats.cacheHitRate);
console.log('Total requests:', stats.totalRequests);

Gradual Migration

You can use both Connection and runicRPC during migration:

import { Connection } from '@solana/web3.js';
import { RunicRPC } from '@runic-rpc/sdk';

const connection = new Connection('https://api.mainnet-beta.solana.com');
const rpc = RunicRPC.create({ useFallback: true });

// Use RunicRPC for high-volume reads
const slot = await rpc.request('getSlot');

// Keep using Connection for complex operations
const transaction = await connection.sendTransaction(...);

Need Help?