mcpField
C
carbium

carbium

github.com/sendaifunクラウド・DevOps13054 回インストール13 週間前に更新
リポジトリ

carbium について

Carbium は、Solana 開発者向けインフラの接続方法をまとめたスキルです。RPC、WebSocket、gRPC の全ブロックストリーミング、DEX 集約 Swap API を扱い、アカウント参照やリアルタイム購読、プログラムからのスワップを説明します。

主な機能

  1. 01Solana JSON-RPC の読み書きと購読
  2. 02WebSocket によるアカウント・トランザクション通知
  3. 03Yellowstone の全ブロックストリーミング
  4. 04DEX の見積もり集約とスワップ実行
  5. 05Jito バンドルとガスレススワップの選択肢

活用シーン

  1. 01アカウント残高の参照とトランザクション送信
  2. 02ウォレットやプログラムログのリアルタイム監視
  3. 03全ブロックとトランザクションのストリーム処理
  4. 04DEX 見積もりの比較とスワップ実行

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sendaifun/skills --skill carbium

インストール後、Claude Code で/carbiumを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

docs/
migration.md
trading-bots.md
troubleshooting.md
examples/gasless-swap/
README.md
examples/grpc-stream/
README.md
examples/pump-snipe/
README.md
examples/rpc-basic/
README.md
examples/swap-bundle/
README.md
examples/swap-quote/
README.md
examples/websocket-monitor/
README.md
resources/
endpoints-and-auth.md
grpc-reference.md
swap-api-reference.md
websocket-reference.md
templates/
carbium-setup.ts

詳細

Carbium — Solana フルスタックインフラストラクチャ

Carbium はベアメタルの Solana インフラストラクチャです。スイスの技術で設計され、クラウド事業者を介しません。トランザクションのライフサイクル全体をカバーする単一のプラットフォームです。

概要

製品エンドポイント用途
RPChttps://rpc.carbium.io読み取り、書き込み、サブスクリプションに対応する標準 JSON-RPC
標準 WebSocketwss://wss-rpc.carbium.ioSolana ネイティブの pubsub(アカウント変更、スロット、ログ、署名)
gRPC / Streamwss://grpc.carbium.ioYellowstone のフルブロックストリーミング(レイテンシ約 22ms)
Swap APIhttps://api.carbium.ioCQ1 エンジンを活用した DEX アグリゲーションと実行
DEX アプリhttps://app.carbium.io一般ユーザー向けの取引インターフェース
ドキュメントhttps://docs.carbium.ioドキュメント一式

主な差別化要因:

  • CQ1 ルーティングエンジンとバイナリネイティブの状態管理による、1 ミリ秒未満の DEX 見積もり
  • 約 22ms のフルブロック gRPC — アトミックで完全なブロック(シュレッドの再構築は不要)
  • ガスレススワップ — ユーザーは SOL を保有せずに取引できます
  • MEV 保護 — Jito バンドリングが Swap API に組み込まれています
  • スイスのベアメタルサーバー — RPC レイテンシ 50ms 未満、稼働率 99.99%

このスキルを使う場面

やりたいこと使用するもの必要なキー
アカウントデータや残高を読み取るRPCRPC キー
トランザクションを送信するRPCRPC キー
ウォレットをリアルタイムで監視する標準 WebSocketRPC キー
ポーリングせずにトランザクションを確認する標準 WebSocketRPC キー
プログラムアカウントの変更を監視する標準 WebSocketRPC キー
ウォレットアプリを構築するRPC + Swap API両方
トークンスワップの見積もりを取得するSwap APIAPI キー
プログラムからスワップを実行するSwap APIAPI キー
Jito バンドリングでスワップを実行するSwap API(バンドルエンドポイント)API キー
すべての DEX プロバイダーの見積もりを比較するSwap API(quote/all)API キー
ユーザーが SOL を保有せずにスワップするSwap API(gasless フラグ)API キー
pump.fun トークンをスナイプする(卒業前)gRPC + ボンディングカーブへの直接 txRPC キー(Business 以上)
オンチェーンイベントにリアルタイムで反応するgRPC(ストリーミング)RPC キー(Business 以上)
プログラムのトランザクションをインデックス化するgRPC(ストリーミング)RPC キー(Business 以上)
アービトラージ/MEV ボットを構築するgRPC + Swap API両方

クイックスタート

1. API キーを取得する
製品サインアップ備考
RPC + gRPC + WebSocketrpc.carbium.io/signup1 つのキーで RPC、WebSocket、gRPC を利用できます
Swap APIapi.carbium.io/login別のキーが必要です。無料アカウントですぐに利用できます

プログラムによるキーの発行にはまだ対応していません。キーはダッシュボードから作成する必要があります。

2. 環境変数を設定する
export CARBIUM_RPC_KEY="your-rpc-key"
export CARBIUM_API_KEY="your-swap-api-key"
3. セキュリティルール(必須)
  • キーをフロントエンドやクライアント側のコードに埋め込まないでください
  • キーをバージョン管理にコミットしないでください
  • 環境変数 CARBIUM_RPC_KEY、CARBIUM_API_KEY を使用してください
  • キーが漏えいした場合は、直ちにローテーションしてください
  • キーはサーバー側だけで管理してください

料金プラン

プラン価格月間クレジット最大 RPSgRPCWebSocket
Free$0500K10なしあり
Developer$32/mo10M50なしあり
Business$320/mo100M200ありあり
Professional$640/mo200M500ありあり

gRPC ストリーミングを利用するには、Business 以上のプランが必要です。


RPC

標準の Solana JSON-RPC です。@solana/web3.js、solana-py、solana Rust クレートなど、あらゆる Solana SDK を利用できます。

エンドポイント:

https://rpc.carbium.io/?apiKey=YOUR_RPC_KEY
TypeScript
import { Connection, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";

const connection = new Connection(
  `https://rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`,
  "confirmed"
);

// Read balance
const pubkey = new PublicKey("YOUR_WALLET_ADDRESS");
const balance = await connection.getBalance(pubkey);
console.log(`Balance: ${balance / LAMPORTS_PER_SOL} SOL`);

// Send transaction
const sig = await connection.sendRawTransaction(transaction.serialize(), {
  skipPreflight: false,
  maxRetries: 3,
});
await connection.confirmTransaction(sig, "confirmed");
Python
from solana.rpc.api import Client
from solders.pubkey import Pubkey
import os

rpc = Client(f"https://rpc.carbium.io/?apiKey={os.environ['CARBIUM_RPC_KEY']}")
pubkey = Pubkey.from_string("YOUR_WALLET_ADDRESS")
resp = rpc.get_balance(pubkey)
print(f"Balance: {resp.value / 1e9} SOL")
Rust
use solana_client::rpc_client::RpcClient;
use solana_sdk::pubkey::Pubkey;
use std::str::FromStr;

let url = format!(
    "https://rpc.carbium.io/?apiKey={}",
    std::env::var("CARBIUM_RPC_KEY").unwrap()
);
let client = RpcClient::new(url);
let pubkey = Pubkey::from_str("YOUR_WALLET_ADDRESS").unwrap();
let balance = client.get_balance(&pubkey).unwrap();
println!("Balance: {} lamports", balance);
コミットメントレベル
レベル速度保証用途
processed約 400msロールバックされる可能性があります価格フィード、重要度の低い UX
confirmed約 2s超多数の投票済みデフォルト — 最適なバランス
finalized約 32s完全に確定済み取り消せない確認、高額な操作

標準 WebSocket(Solana Pubsub)

ネイティブの Solana WebSocket pubsub です。Solana WebSocket 用に構築された SDK なら、変更なしで利用できます。

エンドポイント:

wss://wss-rpc.carbium.io/?apiKey=YOUR_RPC_KEY

認証:クエリパラメーターに RPC キーを指定します。本機能はすべてのティアで利用できます(本番環境では Developer 以上を推奨します)。

WSS と gRPC — どちらを使うべきか
標準 WSSgRPC / Yellowstone
プロトコルWebSocket 経由の JSON-RPCWebSocket(または HTTP/2)経由のバイナリー protobuf
取得できるものアカウントの変更、スロットの更新、ログ、署名完全なアトミックブロック、すべてのトランザクション
SDK のサポートあらゆる Solana SDK(@solana/web3.js、solana-py)Yellowstone クライアント、または JSON フィルターを使う生の WS
レイテンシサブスクリプション確認応答は 100 ms 未満完全なブロックの配信は約 22 ms
必要なティアDeveloper 以上Business 以上
最適な用途ウォレット、dApps、特定のアカウントのモニタリングMEV ボット、インデクサー、完全なブロックの処理

目安: 特定のアカウントや署名を監視する場合は WSS、すべてのトランザクションを処理する場合や完全なブロックデータが必要な場合は gRPC を使用します。

サブスクリプションメソッド
メソッドストリームされる内容主な用途
slotSubscribe新しいスロット番号ブロッククロック、稼働確認
rootSubscribeファイナライズされたスロットファイナリティの追跡
accountSubscribeアカウントデータの変更ウォレット残高の更新、PDA 状態の変更
programSubscribeプログラムが所有するすべてのアカウントDEX プールの状態、ステーキングの更新
signatureSubscribeトランザクションの確認ステータス送信したトランザクションのリアルタイム確認
logsSubscribeフィルターに一致するトランザクションログプログラムイベントのモニタリング
blockSubscribe完全なブロックデータブロックエクスプローラー、インデクサー
slotsUpdatesSubscribeスロットのライフサイクルに関する詳細イベント高度なタイミング計測、バリデーターのモニタリング
voteSubscribe投票トランザクションバリデーターのモニタリング
TypeScript — ウォレットを監視する
import WebSocket from "ws";

const ws = new WebSocket(
  `wss://wss-rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`
);

ws.on("open", () => {
  ws.send(JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "accountSubscribe",
    params: [
      "YOUR_WALLET_ADDRESS",
      { encoding: "base64", commitment: "confirmed" },
    ],
  }));
});

ws.on("message", (raw) => {
  const msg = JSON.parse(raw.toString());
  if (msg.result !== undefined) {
    console.log(`Subscribed, id: ${msg.result}`);
    return;
  }
  if (msg.method === "accountNotification") {
    const { lamports } = msg.params.result.value;
    console.log(`Balance changed: ${lamports / 1e9} SOL`);
  }
});
TypeScript — WSS 経由でトランザクションを確認する
ws.send(JSON.stringify({
  jsonrpc: "2.0",
  id: 1,
  method: "signatureSubscribe",
  params: ["YOUR_TX_SIGNATURE", { commitment: "confirmed" }],
}));

// signatureSubscribe auto-unsubscribes after first notification
TypeScript — プログラムログをストリームする
ws.send(JSON.stringify({
  jsonrpc: "2.0",
  id: 1,
  method: "logsSubscribe",
  params: [
    { mentions: ["PROGRAM_ID"] },
    { commitment: "confirmed" },
  ],
}));
@solana/web3.js の使用(推奨)

Connection クラスはサブスクリプションをネイティブに処理します。

import { Connection, PublicKey } from "@solana/web3.js";

const connection = new Connection(
  `https://rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`,
  {
    commitment: "confirmed",
    wsEndpoint: `wss://wss-rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`,
  }
);

// Account subscription
connection.onAccountChange(
  new PublicKey("YOUR_WALLET"),
  (info, ctx) => console.log(`Balance: ${info.lamports / 1e9} SOL at slot ${ctx.slot}`),
  "confirmed"
);

// Slot subscription
connection.onSlotChange((slotInfo) => {
  console.log(`Slot: ${slotInfo.slot}`);
});

// Log subscription
connection.onLogs(
  new PublicKey("PROGRAM_ID"),
  (logs, ctx) => {
    console.log(`Tx: ${logs.signature}`);
    logs.logs.forEach(log => console.log(" ", log));
  },
  "confirmed"
);
Python — アカウントを監視する
import asyncio, json, os
import websockets

WALLET = "YOUR_WALLET_ADDRESS"

async def watch_account():
    uri = f"wss://wss-rpc.carbium.io/?apiKey={os.environ['CARBIUM_RPC_KEY']}"
    async with websockets.connect(uri) as ws:
        await ws.send(json.dumps({
            "jsonrpc": "2.0", "id": 1,
            "method": "accountSubscribe",
            "params": [WALLET, {"encoding": "base64", "commitment": "confirmed"}],
        }))
        ack = json.loads(await ws.recv())
        print(f"Subscribed: {ack['result']}")
        async for raw in ws:
            msg = json.loads(raw)
            if msg.get("method") == "accountNotification":
                val = msg["params"]["result"]["value"]
                print(f"Balance: {val['lamports'] / 1e9} SOL")

asyncio.run(watch_account())
サブスクリプションを解除する

各サブスクリプションメソッドには対応する解除メソッドがあります。確認応答で返されるサブスクリプション ID を使用します。

{"jsonrpc": "2.0", "id": 2, "method": "accountUnsubscribe", "params": [SUBSCRIPTION_ID]}
登録解除
slotSubscribeslotUnsubscribe
accountSubscribeaccountUnsubscribe
programSubscribeprogramUnsubscribe
signatureSubscribesignatureUnsubscribe(最初の通知後に自動解除)
logsSubscribelogsUnsubscribe
blockSubscribeblockUnsubscribe
rootSubscriberootUnsubscribe

通知の完全な形式と高度なパターンについては、resources/websocket-reference.md を参照してください。


gRPC / 完全なブロックのストリーミング

Yellowstone 互換のリアルタイム完全ブロックストリームです。レイテンシは約 22 ms。アトミックな完全ブロックが配信されるため、シュレッドの再構築は不要です。

エンドポイントと認証
方法形式用途
WebSocket クエリパラメーターwss://grpc.carbium.io/?apiKey=YOUR_RPC_KEYTS/Python に推奨
HTTP/2 ヘッダーx-token: YOUR_RPC_KEYRust の yellowstone-grpc-client 用

Business ティア以上が必要です。

利用可能なメソッド
メソッド説明
transactionSubscribeフィルターを使ってリアルタイムトランザクションを購読する
transactionUnsubscribeトランザクションストリームの購読を解除する
TypeScript — プログラムのトランザクションを購読する
import WebSocket from "ws";

const PROGRAM_ID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P";

const ws = new WebSocket(
  `wss://grpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`
);

ws.on("open", () => {
  ws.send(JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "transactionSubscribe",
    params: [
      {
        vote: false,
        failed: false,
        accountInclude: [PROGRAM_ID],
        accountExclude: [],
        accountRequired: [],
      },
      {
        commitment: "confirmed",
        encoding: "base64",
        transactionDetails: "full",
        showRewards: false,
        maxSupportedTransactionVersion: 0,
      },
    ],
  }));
});

ws.on("message", (raw) => {
  const msg = JSON.parse(raw.toString());
  if (msg.result !== undefined) {
    console.log(`Subscribed, ID: ${msg.result}`);
    return;
  }
  if (msg.method === "transactionNotification") {
    const { signature, slot } = msg.params.result;
    console.log(`tx ${signature} in slot ${slot}`);
  }
});

// Always reconnect on close — see Production Patterns
ws.on("close", (code) => {
  console.warn(`Disconnected (${code}), reconnecting...`);
});
フィルターフィールド
フィールド型説明
votebool投票トランザクションを含める
failedbool失敗したトランザクションを含める
accountIncludestring[]これらのアカウントのいずれかに関与するトランザクションを含める
accountExcludestring[]これらのアカウントに関与するトランザクションを除外する
accountRequiredstring[]これらすべてのアカウントに関与するトランザクションのみを含める

accountInclude または accountRequired の少なくとも一方に値を指定する必要があります。

サブスクリプションのオプション
フィールド型値
commitmentstringprocessed / confirmed / finalized
encodingstringbase64 / base58 / jsonParsed
transactionDetailsstringfull / signatures / none
showRewardsbool報酬情報を含める
maxSupportedTransactionVersionnumberレガシーと v0 の場合は 0
Python
import asyncio, json, os
import websockets

PROGRAM_ID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"

async def subscribe():
    uri = f"wss://grpc.carbium.io/?apiKey={os.environ['CARBIUM_RPC_KEY']}"
    async with websockets.connect(uri) as ws:
        await ws.send(json.dumps({
            "jsonrpc": "2.0", "id": 1,
            "method": "transactionSubscribe",
            "params": [
                {
                    "vote": False, "failed": False,
                    "accountInclude": [PROGRAM_ID],
                    "accountExclude": [], "accountRequired": [],
                },
                {
                    "commitment": "confirmed", "encoding": "base64",
                    "transactionDetails": "full", "showRewards": False,
                    "maxSupportedTransactionVersion": 0,
                },
            ],
        }))
        async for message in ws:
            data = json.loads(message)
            if "result" in data:
                print(f"Subscribed: {data['result']}")
            elif data.get("method") == "transactionNotification":
                print(f"tx: {data['params']['result']['signature'][:20]}...")

asyncio.run(subscribe())
Rust(HTTP/2 gRPC)
use yellowstone_grpc_client::GeyserGrpcClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = GeyserGrpcClient::connect(
        "https://grpc.carbium.io",
        "YOUR_RPC_KEY",  // passed as x-token header automatically
        None,
    )?;
    let (_subscribe_tx, mut stream) = client.subscribe().await?;
    // Define subscription filters and consume stream
    Ok(())
}
フルブロックとシャード
指標値コンテキスト
Solana スロットの時間約400msブロックが生成される時間枠
競合他社の「シャード」約9msクライアント側での再構成が必要な断片化データ
Carbium フルブロック約22msアトミックで完全な、すぐに使えるデータ

13ms の差は、400ms のスロット内ではごくわずかです。フルブロックにより、アトミックな整合性、ロジック不要の取り込み、効率的な解析を実現できます。

購読解除
{"jsonrpc": "2.0", "id": 2, "method": "transactionUnsubscribe", "params": [SUBSCRIPTION_ID]}

レスポンス形式を含む完全な gRPC リファレンスについては、resources/grpc-reference.md を参照してください。


スワップ API

CQ1 エンジンを活用した、集約型 DEX の見積もりと実行機能です。ミリ秒未満の見積もり、約10ms のチェーンからクエリ可能になるまでのレイテンシ、バイナリネイティブな状態を実現します。

ベース URL: https://api.carbium.io 認証: すべてのリクエストに X-API-KEY: YOUR_API_KEY ヘッダーを指定 キーの取得: api.carbium.io/login(無料アカウント)

API バージョン
バージョンインターフェース状態
v2 (Q1)GET /api/v2/quote現行 — 新しい統合ではこちらを使用してください
v1(レガシー)GET /api/v1/quote、/api/v1/swap、/api/v1/quote/all、/api/v1/swap/bundleレガシー — 引き続き利用可能

重要: v2 と v1 ではパラメーター名が異なります。混在させないでください。v2 (Q1) では src_mint/dst_mint/amount_in/slippage_bps を使用します。v1 では fromMint/toMint/amount/slippage を使用します。

v2 / Q1 — 見積もり + 実行可能なトランザクション(推奨)

user_account を含めると、Q1 エンジンは1回の呼び出しで見積もりと実行可能なトランザクションの両方を返します。別途スワップエンドポイントを呼び出す必要はありません。

GET /api/v2/quote
パラメーター必須説明
src_mintはい入力トークンのミントアドレス
dst_mintはい出力トークンのミントアドレス
amount_inはい最小単位(lamports)での入力額
slippage_bpsはいベーシスポイント単位のスリッページ許容値
user_accountいいえウォレットアドレス — 含めると、レスポンスに実行可能な txn フィールドが含まれます

見積もりのみ(トランザクションなし):

const quote = await fetch(
  "https://api.carbium.io/api/v2/quote" +
  "?src_mint=So11111111111111111111111111111111111111112" +
  "&dst_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" +
  "&amount_in=1000000000" +
  "&slippage_bps=100",
  { headers: { "X-API-KEY": process.env.CARBIUM_API_KEY! } }
).then(r => r.json());
// Returns: { srcAmountIn, destAmountOut, destAmountOutMin, priceImpactPct, routePlan }

見積もり + 実行可能なトランザクション(user_account を含める):

const quote = await fetch(
  "https://api.carbium.io/api/v2/quote" +
  "?src_mint=So11111111111111111111111111111111111111112" +
  "&dst_mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" +
  "&amount_in=1000000000" +
  "&slippage_bps=100" +
  "&user_account=YOUR_WALLET_ADDRESS",
  { headers: { "X-API-KEY": process.env.CARBIUM_API_KEY! } }
).then(r => r.json());
// Returns: { srcAmountIn, destAmountOut, destAmountOutMin, priceImpactPct, routePlan, txn }
// txn is base64-encoded, ready for deserialization and signing
import httpx, os

resp = httpx.get(
    "https://api.carbium.io/api/v2/quote",
    params={
        "src_mint": "So11111111111111111111111111111111111111112",
        "dst_mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "amount_in": 1_000_000_000,
        "slippage_bps": 100,
        "user_account": "YOUR_WALLET_ADDRESS",  # include for executable txn
    },
    headers={"X-API-KEY": os.environ["CARBIUM_API_KEY"]},
)
print(resp.json())
v1 レガシーエンドポイント

これらのエンドポイントは引き続き利用できますが、古いパラメータ形式を使用します。v1 のパラメーターを v2 の URL と混在させないでください。

エンドポイントメソッドパラメーター説明
/api/v1/quoteGETfromMint、toMint、amount、slippage、providerプロバイダー固有の見積もり
/api/v1/quote/allGETfromMint、toMint、amount、slippageすべてのプロバイダーの見積もりを比較
/api/v1/swapGETowner、fromMint、toMint、amount、slippage、provider + オプションのフラグシリアライズ済みスワップトランザクションを取得
/api/v1/swap/bundleGETsignedTransactionJito バンドル経由で送信(MEV 保護)
/api/v1/fee/customGETpayer、receiver、lamportsカスタム手数料送金トランザクションを生成

v1 の /swap は、追加の実行フラグとして gasless、mevSafe、priorityMicroLamports、feeLamports、feeReceiver、pool をサポートします。

スワップ実行の全フロー(TypeScript)— v2/Q1
import { Connection, VersionedTransaction, Keypair } from "@solana/web3.js";

const connection = new Connection(
  `https://rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`,
  "confirmed"
);

// 1. Get quote with executable transaction (single call)
const url = new URL("https://api.carbium.io/api/v2/quote");
url.searchParams.set("src_mint", "So11111111111111111111111111111111111111112");
url.searchParams.set("dst_mint", "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
url.searchParams.set("amount_in", "100000000");
url.searchParams.set("slippage_bps", "100");
url.searchParams.set("user_account", "YOUR_WALLET_ADDRESS");

const quote = await fetch(url, {
  headers: { "X-API-KEY": process.env.CARBIUM_API_KEY! },
}).then(r => r.json());

if (!quote.txn) throw new Error("No executable transaction — check user_account param");

// 2. Deserialize and sign
const tx = VersionedTransaction.deserialize(Buffer.from(quote.txn, "base64"));
// tx.sign([yourKeypair]);

// 3. Submit via RPC
const sig = await connection.sendRawTransaction(tx.serialize(), { maxRetries: 3 });

// 4. Confirm
await connection.confirmTransaction(sig, "confirmed");
console.log("Swap confirmed:", sig);
サポートされている DEX プロバイダー
プロバイダーID
Raydiumraydium
Raydium CPMMraydium-cpmm
Orcaorca
Meteorameteora
Meteora DLMMmeteora-dlmm
Pump.funpump-fun
Moonshotmoonshot
Stabblestabble
PrintDEXprintdex
GooseFXgoosefx
スリッページの推奨値
ペアの種類推奨 BPS割合
ステーブルコインのスワップ5-100.05-0.1%
主要ペア(SOL/USDC)10-500.1-0.5%
価格変動の大きいトークン50-1000.5-1%
アービトラージ100.1%(低め)

OpenAPI パラメーターの完全な仕様については、resources/swap-api-reference.md を参照してください。


ガスレススワップ

ガスレススワップを使用すると、ユーザーは手数料を支払うための SOL を保有せずに、オンチェーン取引を実行できます。

仕組み
  1. ユーザーがスワップを開始します
  2. Carbium が内部の手数料プールから SOL 手数料を立て替えます
  3. 取引は通常どおりオンチェーンで確定します
  4. スワップ出力に微調整を加え、手数料プールの残高を調整します
制約

ガスレススワップでは、出力トークンが SOL である必要があります。現在、v1 スワップエンドポイントで利用できます。

使用する場面
  • SOL を持たずにトークンを受け取った初回ユーザー
  • 手間の少ないオンボーディングを実現する組み込みウォレット
  • ガス代の入金がコンバージョンを妨げる、スワップ優先の UX
組み込み方法

v1 スワップリクエストに gasless=true を追加します。

const res = await fetch(
  "https://api.carbium.io/api/v1/swap" +
  "?owner=WALLET&fromMint=USDC_MINT&toMint=SOL_MINT" +
  "&amount=1000000&slippage=100&provider=raydium&gasless=true",
  { headers: { "X-API-KEY": process.env.CARBIUM_API_KEY! } }
);

Pump.fun の卒業前トークンのスナイピング

Carbium Swap API では、卒業前の pump.fun トークンをルーティングできません(ルート数 0 を返します)。gRPC でローンチを検出 → ボンディングカーブの生トランザクションを構築 → RPC 経由で送信してください。

Business tier の RPC キー(gRPC アクセス)が必要です。

主な定数
const PUMP_PROGRAM       = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P";
const PUMP_GLOBAL        = "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf";
const PUMP_FEE_RECIPIENT = "CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM";
const PUMP_EVENT_AUTH    = "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1";
const GRADUATION_SOL     = 85_000_000_000n; // 85 SOL in lamports
const TOTAL_SUPPLY       = 1_000_000_000_000_000n; // 1 quadrillion (6 decimals)

const DISCRIMINATORS = {
  create: [0xe4, 0x45, 0xa5, 0x2e, 0x51, 0xcb, 0x9a, 0x1d],
  buy:    [0x66, 0x06, 0x3d, 0x12, 0x01, 0xda, 0xeb, 0xea],
  sell:   [0x33, 0xe6, 0x85, 0xa4, 0x01, 0x7f, 0x83, 0xad],
};
ステップ 1 — gRPC 経由でローンチをサブスクライブする
import WebSocket from "ws";

const ws = new WebSocket(
  `wss://grpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`
);

ws.on("open", () => {
  ws.send(JSON.stringify({
    jsonrpc: "2.0", id: 1,
    method: "transactionSubscribe",
    params: [
      { vote: false, failed: false, accountInclude: [PUMP_PROGRAM] },
      { commitment: "confirmed", encoding: "jsonParsed",
        transactionDetails: "full", showRewards: false,
        maxSupportedTransactionVersion: 0 },
    ],
  }));
});

setInterval(() => ws.ping(), 30_000); // keepalive

ws.on("message", (raw) => {
  const msg = JSON.parse(raw.toString());
  if (msg.method !== "transactionNotification") return;
  const { signature, transaction } = msg.params.result;
  const logs = transaction.meta.logMessages || [];
  for (const log of logs) {
    if (log.includes("Instruction: Create")) {
      const mint = transaction.meta.postTokenBalances[0]?.mint;
      if (mint) handleNewToken(mint, signature);
    }
  }
});
ステップ 2 — ボンディングカーブ PDA を導出する
import { PublicKey } from "@solana/web3.js";

function deriveBondingCurve(mint: string): PublicKey {
  const [address] = PublicKey.findProgramAddressSync(
    [Buffer.from("bonding-curve"), new PublicKey(mint).toBuffer()],
    new PublicKey(PUMP_PROGRAM)
  );
  return address;
}
ステップ 3 — ボンディングカーブの状態を取得して解析する
// Bonding curve layout (81 bytes):
// [0-7]   discriminator
// [8-15]  virtualTokenReserves (u64 LE)
// [16-23] virtualSolReserves   (u64 LE)
// [24-31] realTokenReserves    (u64 LE)
// [32-39] realSolReserves      (u64 LE)
// [40-47] tokenTotalSupply     (u64 LE)
// [72]    complete             (bool)

async function fetchBondingCurve(address: PublicKey) {
  const res = await fetch(`https://rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      jsonrpc: "2.0", id: 1,
      method: "getAccountInfo",
      params: [address.toBase58(), { encoding: "base64" }],
    }),
  });
  const { result } = await res.json();
  const data = Buffer.from(result.value.data[0], "base64");
  return {
    virtualTokenReserves: data.readBigUInt64LE(8),
    virtualSolReserves:   data.readBigUInt64LE(16),
    realTokenReserves:    data.readBigUInt64LE(24),
    realSolReserves:      data.readBigUInt64LE(32),
    complete:             data.readUInt8(72) === 1,
  };
}
ステップ 4 — 見積もる(定積 AMM)
function quoteBuy(curve: any, solLamports: number): bigint {
  const num = curve.virtualTokenReserves * BigInt(solLamports);
  const den = curve.virtualSolReserves + BigInt(solLamports);
  return num / den;
}

function quoteSell(curve: any, tokens: bigint): bigint {
  const num = curve.virtualSolReserves * tokens;
  const den = curve.virtualTokenReserves + tokens;
  return num / den;
}
ステップ 5 — 買い注文のトランザクションを構築して送信する

買い注文の命令アカウント(順序は重要、合計 13 個):

#アカウントアクセス
0PUMP_GLOBAL読み取り
1PUMP_FEE_RECIPIENT書き込み
2mint読み取り
3bondingCurve書き込み
4bondingCurve ATA書き込み
5user ATA書き込み
6user/payer書き込み、署名者
7SystemProgram-
8TokenProgram-
9AssociatedTokenProgram-
10Rent sysvar-
11PUMP_EVENT_AUTH読み取り
12PUMP_PROGRAM読み取り

約 200ms 節約するには、skipPreflight: true を指定して送信します。

const sig = await connection.sendRawTransaction(signedTx.serialize(), {
  skipPreflight: true,
  preflightCommitment: "confirmed",
  maxRetries: 3,
});
スナイピングフローの概要
gRPC "Create" event → extract mint
  → deriveBondingCurve(mint)
  → [optional] fetchBondingCurve() for price check
  → build buy instruction with desired SOL
  → sendTransaction(skipPreflight: true)
  → monitor bonding curve state for exit
  → sell when target % reached or graduation imminent (85 SOL)
Pump.fun のエラー処理
エラー原因解決方法
Blockhash expiredTx の処理に時間がかかりすぎましたより新しい blockhash を使用します。レイテンシを減らします
Insufficient fundsSOL が不足しています残高には金額と手数料(約 0.005 SOL)をカバーできる額が必要です
Account not foundトークンが作成された直後です少し待ってから再試行します(50-100ms)
Slippage exceeded価格が変動しましたmaxSolCost を増やすか、取引サイズを小さくします

スナイピングの完全な例については、examples/pump-snipe/example.ts を参照してください。


移行

他の RPC プロバイダー(Helius、QuickNode、Triton、Alchemy)からの移行

URL を差し替えるだけです。すべて標準の JSON-RPC を使用します。

// Before
const connection = new Connection("https://mainnet.helius-rpc.com/?api-key=...");

// After
const connection = new Connection(
  `https://rpc.carbium.io/?apiKey=${process.env.CARBIUM_RPC_KEY}`
);
Jupiter Swap API からの移行

パラメーターの対応関係(v2/Q1):

JupiterCarbium v2/Q1(/api/v2/quote)
inputMintsrc_mint
outputMintdst_mint
amountamount_in
slippageBpsslippage_bps

主な違い:Carbium Q1 では、user_account を含めると、実行可能なトランザクションが見積もりのレスポンスに返されます。別途スワップを呼び出す必要はありません。

Triton gRPC からの移行

同じ Yellowstone プロトコルです。エンドポイントのみ更新してください。

wss://grpc.carbium.io/?apiKey=YOUR_RPC_KEY

詳しい移行ガイドについては、docs/migration.md を参照してください。


本番環境でのパターン

指数バックオフによる再試行
const delay = (ms: number) => new Promise(r => setTimeout(r, ms));

async function withRetry<T>(fn: () => Promise<T>, retries = 3, baseMs = 300): Promise<T> {
  for (let i = 0; i < retries; i++) {
    try { return await fn(); }
    catch (e) {
      if (i === retries - 1) throw e;
      await delay(baseMs * 2 ** i + Math.random() * 100);
    }
  }
  throw new Error("unreachable");
}

sendTransaction をむやみに再試行してはいけません。まず getSignatureStatus を確認して、トランザクションがすでに確定していないことを確かめてください。

WebSocket / gRPC の再接続
async function connectWithReconnect(connectFn: () => Promise<void>) {
  let backoff = 1000;
  while (true) {
    try {
      await connectFn();
      backoff = 1000; // reset on success
    } catch {
      await delay(backoff);
      backoff = Math.min(backoff * 2, 30_000); // cap at 30s
    }
  }
}

意図しない切断を防ぐため、30 秒ごとに ping を送信してください。

タイムアウトの推奨値
操作タイムアウト
RPC 読み取り呼び出し5-10s
スワップの見積もり3-5s
トランザクションの確認30-60s(ポーリングあり)
障害対応
障害対応
Quote: no route foundスリッページを広げるか、別のプロバイダーで再試行します
Simulation failed送信しないでください。エラーを調査し、ログに記録して、アラートを出します
sendTransaction failed再試行する前に getSignatureStatus を確認します
Transaction not confirmedタイムアウトを設定してポーリングし、ブロックハッシュの有効期限を確認します
Stream disconnected指数バックオフで再接続します
HTTP 429 rate limit直ちにバックオフし、アーキテクチャ上の問題を示すシグナルとして扱います

エラーリファレンス

HTTP ステータスコード
コード意味対応
401API キーが無効、または指定されていませんキーと認証形式を確認します
403プランによる制限(例:無料プランでの gRPC)rpc.carbium.io でアップグレードします
429レート制限を超過しましたバックオフして再試行し、アーキテクチャを見直します
400ルートが見つからない、またはパラメーターが不正ですミントアドレス、スリッページ、必須パラメーターを確認します
500サーバーエラー1 秒後に再試行します
503一時的に利用できません指数バックオフで再試行します
WebSocket エラーコード
コードメッセージ原因
-32700解析エラーJSON の形式が不正、または必須パラメーターがありません
-32601メソッドが見つかりませんメソッド名の誤記、またはサポートされていないメソッドです
-32602パラメーターが無効ですパラメーターの型が誤っているか、フィールドがありません
-32603内部エラーサーバー側のエラーです。再試行してください

一般的なトークンミント

トークンミントアドレス
SOL(ラップ済み)So11111111111111111111111111111111111111112
USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB

ベストプラクティス

セキュリティ
  • API キーはサーバー側だけに保持し、フロントエンドのバンドルやモバイルクライアントには決して含めないでください
  • 環境変数(CARBIUM_RPC_KEY、CARBIUM_API_KEY)を使用します
  • キーが漏えいした場合は、直ちにローテーションします
  • 可能であれば、RPC ダッシュボードでエンドポイントをドメイン/IP によって制限します
レート制限
  • HTTP 429 は単なる再試行の合図ではなく、アーキテクチャ上の問題を示すシグナルです
  • 開発環境/ステージング環境/本番環境のキーを分けます
  • 再試行の処理経路を意思決定ロジックから分離します
  • getSignatureStatus を確認する前に sendTransaction を再試行しないでください
トランザクションの送信
  • Quote の検証後に限り skipPreflight: true を使用します。約 200ms 短縮できます
  • Address Lookup Table(ALT)をサポートするには VersionedTransaction(V0)を使用します
  • 確認には WebSocket よりも HTTP ポーリングを優先します(より信頼性が高いため)
  • ブロックハッシュは新しい状態に保ってください。約 60 秒で期限切れになります
コミットメントレベル
  • ほとんどの操作では confirmed をデフォルトにします
  • processed は価格フィードや重要度の低い読み取りに限って使用します
  • 取り消せない確認や高額な操作には finalized を使用します

スキルの構成

skills/carbium/
├── SKILL.md                              # This file
├── resources/
│   ├── endpoints-and-auth.md             # All endpoints, auth patterns, pricing
│   ├── swap-api-reference.md             # Full Swap API parameter specs
│   ├── grpc-reference.md                 # gRPC filter fields, response shapes
│   └── websocket-reference.md            # All WSS subscription methods and shapes
├── examples/
│   ├── rpc-basic/README.md               # Balance check + send transaction
│   ├── swap-quote/README.md              # Quote → swap → sign → submit
│   ├── swap-bundle/README.md             # MEV-protected Jito bundle
│   ├── grpc-stream/README.md             # Program transaction subscription
│   ├── websocket-monitor/README.md       # Account + slot monitoring via WSS
│   ├── pump-snipe/README.md              # Full pump.fun sniping flow
│   └── gasless-swap/README.md            # Gasless swap execution
├── templates/
│   └── carbium-setup.ts                  # Connection setup + retry helper
└── docs/
    ├── troubleshooting.md                # Error codes, 429 handling
    ├── migration.md                      # From Helius, QuickNode, Jupiter
    └── trading-bots.md                   # Bot architecture patterns

参考資料

リソースURL
エコシステムの概要docs.carbium.io/docs/the-carbium-ecosystem
RPC クイックスタートdocs.carbium.io/docs/quick-start-rpc
Swap API クイックスタートdocs.carbium.io/docs/quick-start-dex-api
gRPC/ストリーミングdocs.carbium.io/docs/solana-grpc
CQ1 エンジンdocs.carbium.io/docs/cq1-engine-overview
RPC 料金docs.carbium.io/docs/carbium-rpc-pricing
API レシピdocs.carbium.io/recipes
よくある質問docs.carbium.io/docs/faq
AI コンテキスト全文carbium.io/llms-ctx.txt
RPC 登録rpc.carbium.io/signup
Swap API 登録api.carbium.io/login
Discorddiscord.gg/jW7BUkQS5U
Twitter/Xx.com/carbium

コメント