Loading...
Loading...
Compare original and translation side by side
undefinedundefinedundefinedundefinedimport { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// Make RPC calls
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// 发起RPC调用
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();https://{ENDPOINT_NAME}.solana-mainnet.quiknode.pro/{TOKEN}/https://{ENDPOINT_NAME}.solana-mainnet.quiknode.pro/{TOKEN}/| Network | URL Pattern |
|---|---|
| Mainnet | |
| Devnet | |
| WebSocket | |
| 网络 | URL格式 |
|---|---|
| 主网 | |
| 测试网 | |
| WebSocket | |
import {
createSolanaRpc,
createSolanaRpcSubscriptions,
address,
lamports,
} from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// Account balance
const balance = await rpc.getBalance(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk")).send();
// Account info
const accountInfo = await rpc.getAccountInfo(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"), {
encoding: "base64",
}).send();
// Recent blockhash
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// Token accounts
const tokenAccounts = await rpc.getTokenAccountsByOwner(
address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"),
{ programId: address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") },
{ encoding: "jsonParsed" },
).send();import {
createSolanaRpc,
createSolanaRpcSubscriptions,
address,
lamports,
} from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// 账户余额
const balance = await rpc.getBalance(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk")).send();
// 账户信息
const accountInfo = await rpc.getAccountInfo(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"), {
encoding: "base64",
}).send();
// 最新区块哈希
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// 代币账户
const tokenAccounts = await rpc.getTokenAccountsByOwner(
address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"),
{ programId: address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") },
{ encoding: "jsonParsed" },
).send();import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(process.env.QUICKNODE_RPC_URL!);
const balance = await connection.getBalance(new PublicKey("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"));import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(process.env.QUICKNODE_RPC_URL!);
const balance = await connection.getBalance(new PublicKey("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"));| Plan | Requests/sec | Credits/month |
|---|---|---|
| Free Trial | 15 | 10M |
| Build | 50 | 80M |
| Accelerate | 125 | 450M |
| Scale | 250 | 950M |
| Business | 500 | 2B |
| 套餐 | 请求数/秒 | 月度额度 |
|---|---|---|
| 免费试用 | 15 | 1000万 |
| Build | 50 | 8000万 |
| Accelerate | 125 | 4.5亿 |
| Scale | 250 | 9.5亿 |
| Business | 500 | 20亿 |
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetsByOwner",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
limit: 10,
options: { showFungible: true, showCollectionMetadata: true },
},
}),
});
const { result } = await response.json();
// result.total — total assets
// result.items — array of asset metadata
// result.cursor — for paginationconst response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetsByOwner",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
limit: 10,
options: { showFungible: true, showCollectionMetadata: true },
},
}),
});
const { result } = await response.json();
// result.total — 资产总数
// result.items — 资产元数据数组
// result.cursor — 用于分页const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "searchAssets",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
tokenType: "fungible",
limit: 50,
},
}),
});const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "searchAssets",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
tokenType: "fungible",
limit: 50,
},
}),
});const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetProof",
params: { id: "compressed_nft_id" },
}),
});const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetProof",
params: { id: "compressed_nft_id" },
}),
});| Method | Description |
|---|---|
| Get metadata for a single asset |
| Get metadata for multiple assets |
| Get Merkle proof for a compressed asset |
| Get Merkle proofs for multiple assets |
| List assets by authority |
| List assets by creator |
| List assets by group (e.g., collection) |
| List assets by wallet owner |
| Transaction signatures for compressed assets |
| Token accounts by mint or owner |
| Edition details of a master NFT |
| Search assets with flexible filters |
| 方法 | 描述 |
|---|---|
| 获取单个资产的元数据 |
| 获取多个资产的元数据 |
| 获取压缩资产的默克尔证明 |
| 获取多个压缩资产的默克尔证明 |
| 按权限方列出资产 |
| 按创建者列出资产 |
| 按组(如合集)列出资产 |
| 按钱包所有者列出资产 |
| 压缩资产的交易签名 |
| 按铸币地址或所有者列出代币账户 |
| 主NFT的版本详情 |
| 使用灵活过滤器搜索资产 |
import Client, { CommitmentLevel } from "@triton-one/yellowstone-grpc";
// Derive gRPC URL from HTTP endpoint:
// HTTP: https://example.solana-mainnet.quiknode.pro/TOKEN/
// gRPC: https://example.solana-mainnet.quiknode.pro:10000
const client = new Client(
"https://example.solana-mainnet.quiknode.pro:10000",
"TOKEN",
{}
);
const stream = await client.subscribe();
stream.on("data", (data) => {
if (data.transaction) {
console.log("Transaction:", data.transaction);
}
if (data.account) {
console.log("Account update:", data.account);
}
});
// Subscribe to transactions for a specific program
stream.write({
transactions: {
txn_filter: {
vote: false,
failed: false,
accountInclude: ["PROGRAM_PUBKEY"],
accountExclude: [],
accountRequired: [],
},
},
accounts: {},
slots: {},
blocks: {},
blocksMeta: {},
transactionsStatus: {},
entry: {},
accountsDataSlice: [],
commitment: CommitmentLevel.CONFIRMED,
});import Client, { CommitmentLevel } from "@triton-one/yellowstone-grpc";
// 从HTTP端点推导gRPC地址:
// HTTP: https://example.solana-mainnet.quiknode.pro/TOKEN/
// gRPC: https://example.solana-mainnet.quiknode.pro:10000
const client = new Client(
"https://example.solana-mainnet.quiknode.pro:10000",
"TOKEN",
{}
);
const stream = await client.subscribe();
stream.on("data", (data) => {
if (data.transaction) {
console.log("交易:", data.transaction);
}
if (data.account) {
console.log("账户更新:", data.account);
}
});
// 订阅特定程序的交易
stream.write({
transactions: {
txn_filter: {
vote: false,
failed: false,
accountInclude: ["PROGRAM_PUBKEY"],
accountExclude: [],
accountRequired: [],
},
},
accounts: {},
slots: {},
blocks: {},
blocksMeta: {},
transactionsStatus: {},
entry: {},
accountsDataSlice: [],
commitment: CommitmentLevel.CONFIRMED,
});| Filter | Description |
|---|---|
| accounts | Account data changes by pubkey, owner, or data pattern |
| transactions | Transaction events with vote/failure/account filters |
| transactionsStatus | Lightweight transaction status updates |
| slots | Slot progression and status changes |
| blocks | Full block data with optional tx/account inclusion |
| blocksMeta | Block metadata without full contents |
| entry | PoH entry updates |
| 过滤器 | 描述 |
|---|---|
| accounts | 按公钥、所有者或数据模式过滤账户数据变更 |
| transactions | 包含投票/失败/账户过滤器的交易事件 |
| transactionsStatus | 轻量级交易状态更新 |
| slots | 区块槽进度与状态变更 |
| blocks | 完整区块数据,可选择是否包含交易/账户信息 |
| blocksMeta | 不含完整内容的区块元数据 |
| entry | PoH条目更新 |
// Get recommended priority fees
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: {
last_n_blocks: 100,
account: "YOUR_ACCOUNT_PUBKEY",
},
}),
});// 获取推荐的优先费用
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: {
last_n_blocks: 100,
account: "YOUR_ACCOUNT_PUBKEY",
},
}),
});import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
prependTransactionMessageInstructions,
appendTransactionMessageInstruction,
} from "@solana/kit";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
// 1. Get fee estimate
const feeResponse = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: { last_n_blocks: 100, account: payer.address },
}),
});
const feeData = await feeResponse.json();
const priorityFee = feeData.result.per_compute_unit.high;
// 2. Build transaction with compute budget
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions([
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: BigInt(priorityFee) }),
], tx),
(tx) => appendTransactionMessageInstruction(mainInstruction, tx),
);import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
prependTransactionMessageInstructions,
appendTransactionMessageInstruction,
} from "@solana/kit";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
// 1. 获取费用估算
const feeResponse = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: { last_n_blocks: 100, account: payer.address },
}),
});
const feeData = await feeResponse.json();
const priorityFee = feeData.result.per_compute_unit.high;
// 2. 构建包含计算预算的交易
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions([
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: BigInt(priorityFee) }),
], tx),
(tx) => appendTransactionMessageInstruction(mainInstruction, tx),
);import { createJupiterApiClient } from "@jup-ag/api";
const jupiterApi = createJupiterApiClient({
basePath: process.env.QUICKNODE_METIS_URL!,
});
// Get swap quote
const quote = await jupiterApi.quoteGet({
inputMint: "So11111111111111111111111111111111111111112", // SOL
outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
amount: 1_000_000_000, // 1 SOL
slippageBps: 50,
});
// Get swap transaction
const swapResult = await jupiterApi.swapPost({
swapRequest: {
quoteResponse: quote,
userPublicKey: "YourPubkey...",
},
});import { createJupiterApiClient } from "@jup-ag/api";
const jupiterApi = createJupiterApiClient({
basePath: process.env.QUICKNODE_METIS_URL!,
});
// 获取兑换报价
const quote = await jupiterApi.quoteGet({
inputMint: "So11111111111111111111111111111111111111112", // SOL
outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
amount: 1_000_000_000, // 1 SOL
slippageBps: 50,
});
// 获取兑换交易
const swapResult = await jupiterApi.swapPost({
swapRequest: {
quoteResponse: quote,
userPublicKey: "YourPubkey...",
},
});| Type | Data | Use Case |
|---|---|---|
| Block | Full block data | Block explorers, analytics |
| Transaction | Transaction details | Tx monitoring, indexing |
| Logs | Contract events | DeFi tracking, token transfers |
| Receipt | Transaction receipts | Status tracking |
| 类型 | 数据 | 使用场景 |
|---|---|---|
| Block | 完整区块数据 | 区块浏览器、数据分析 |
| Transaction | 交易详情 | 交易监控、索引 |
| Logs | 合约事件 | DeFi追踪、代币转账 |
| Receipt | 交易收据 | 状态追踪 |
function main(data) {
// Filter for transactions involving a specific program
const PROGRAM_ID = "YOUR_PROGRAM_ID";
const hasProgram = data.transaction?.message?.accountKeys?.some(
(key) => key === PROGRAM_ID
);
if (!hasProgram) return null;
return data;
}function main(data) {
// 过滤涉及特定程序的交易
const PROGRAM_ID = "YOUR_PROGRAM_ID";
const hasProgram = data.transaction?.message?.accountKeys?.some(
(key) => key === PROGRAM_ID
);
if (!hasProgram) return null;
return data;
}| Feature | Streams | Webhooks |
|---|---|---|
| Complexity | More configuration | Simple setup |
| Filtering | Custom JavaScript | Template-based |
| Destinations | Webhook, S3, Postgres, Azure, Snowflake | HTTP endpoint only |
| Processing | Full transformation | Limited |
| Use Case | Complex pipelines | Simple alerts |
| 特性 | Streams | Webhooks |
|---|---|---|
| 复杂度 | 配置较多 | 设置简单 |
| 过滤功能 | 自定义JavaScript | 基于模板 |
| 目标地址 | Webhook、S3、Postgres、Azure、Snowflake | 仅HTTP端点 |
| 处理能力 | 完整转换 | 有限 |
| 使用场景 | 复杂管道 | 简单告警 |
// Upload file to IPFS
const formData = new FormData();
formData.append("file", fileBuffer);
const response = await fetch("https://api.quicknode.com/ipfs/rest/v1/s3/put-object", {
method: "POST",
headers: { "x-api-key": process.env.QUICKNODE_API_KEY! },
body: formData,
});
const { pin } = await response.json();
// Access via: https://quicknode.quicknode-ipfs.com/ipfs/{pin.cid}// 上传文件至IPFS
const formData = new FormData();
formData.append("file", fileBuffer);
const response = await fetch("https://api.quicknode.com/ipfs/rest/v1/s3/put-object", {
method: "POST",
headers: { "x-api-key": process.env.QUICKNODE_API_KEY! },
body: formData,
});
const { pin } = await response.json();
// 访问地址: https://quicknode.quicknode-ipfs.com/ipfs/{pin.cid}qnLibqnLib// In a Streams filter function:
// List operations — manage address watchlists
await qnLib.qnAddListItem("my-watchlist", "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk");
const isWatched = await qnLib.qnContainsListItems("my-watchlist", [data.from]);
// Set operations — store key-value pairs
await qnLib.qnAddSet("token-prices", { key: "SOL", value: "150.25" });
const price = await qnLib.qnGetSet("token-prices", "SOL");// 在Streams过滤函数中:
// 列表操作 — 管理地址监控列表
await qnLib.qnAddListItem("my-watchlist", "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk");
const isWatched = await qnLib.qnContainsListItems("my-watchlist", [data.from]);
// 集合操作 — 存储键值对
await qnLib.qnAddSet("token-prices", { key: "SOL", value: "$150.25" });
const price = await qnLib.qnGetSet("token-prices", "SOL");qnLib.qnUpsertListqnLib.qnAddListItemqnLib.qnRemoveListItemqnLib.qnContainsListItemsqnLib.qnDeleteListqnLib.qnUpsertListqnLib.qnAddListItemqnLib.qnRemoveListItemqnLib.qnContainsListItemsqnLib.qnDeleteListqnLib.qnAddSetqnLib.qnGetSetqnLib.qnBulkSetsqnLib.qnDeleteSetqnLib.qnAddSetqnLib.qnGetSetqnLib.qnBulkSetsqnLib.qnDeleteSetnpm install @quicknode/sdkimport { Core } from "@quicknode/sdk";
const core = new Core({
endpointUrl: process.env.QUICKNODE_RPC_URL!,
});
// Token API
const balances = await core.client.qn_getWalletTokenBalance({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
});
// NFT API
const nfts = await core.client.qn_fetchNFTs({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
page: 1,
perPage: 10,
});npm install @quicknode/sdkimport { Core } from "@quicknode/sdk";
const core = new Core({
endpointUrl: process.env.QUICKNODE_RPC_URL!,
});
// 代币API
const balances = await core.client.qn_getWalletTokenBalance({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
});
// NFT API
const nfts = await core.client.qn_fetchNFTs({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
page: 1,
perPage: 10,
});x-api-keyhttps://api.quicknode.com/v0/const QN_API_KEY = process.env.QUICKNODE_API_KEY!;
// List all endpoints
const res = await fetch("https://api.quicknode.com/v0/endpoints", {
headers: { "x-api-key": QN_API_KEY },
});
const endpoints = await res.json();
// Get usage metrics
const usage = await fetch("https://api.quicknode.com/v0/usage/rpc", {
headers: { "x-api-key": QN_API_KEY },
});https://api.quicknode.com/v0/x-api-keyconst QN_API_KEY = process.env.QUICKNODE_API_KEY!;
// 列出所有端点
const res = await fetch("https://api.quicknode.com/v0/endpoints", {
headers: { "x-api-key": QN_API_KEY },
});
const endpoints = await res.json();
// 获取使用指标
const usage = await fetch("https://api.quicknode.com/v0/usage/rpc", {
headers: { "x-api-key": QN_API_KEY },
});| Resource | Methods | Endpoint |
|---|---|---|
| Chains | GET | |
| Endpoints | GET, POST, PATCH, DELETE | |
| Metrics | GET | |
| Rate Limits | GET, POST, PUT | |
| Usage | GET | |
| Billing | GET | |
| 资源 | 方法 | 端点 |
|---|---|---|
| 链 | GET | |
| 端点 | GET、POST、PATCH、DELETE | |
| 指标 | GET | |
| 速率限制 | GET、POST、PUT | |
| 使用情况 | GET | |
| 账单 | GET | |
import { wrapFetch } from "@x402/fetch";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
account,
chain: base,
transport: http(),
});
// Wrap fetch to auto-handle 402 payments
const x402Fetch = wrapFetch(fetch, walletClient);
// Use like normal fetch — payments handled automatically
const response = await x402Fetch("https://x402.quicknode.com/solana-mainnet", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
method: "getSlot",
params: [],
id: 1,
}),
});import { wrapFetch } from "@x402/fetch";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
account,
chain: base,
transport: http(),
});
// 包装fetch以自动处理402支付
const x402Fetch = wrapFetch(fetch, walletClient);
// 像普通fetch一样使用——支付将自动处理
const response = await x402Fetch("https://x402.quicknode.com/solana-mainnet", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
method: "getSlot",
params: [],
id: 1,
}),
});| Category | Networks |
|---|---|
| EVM | Ethereum, Polygon, Arbitrum, Optimism, Base, BSC, Avalanche, Fantom, zkSync, Scroll, Linea, HyperEVM |
| Non-EVM | Solana, Bitcoin, NEAR, Stacks, Cosmos, Sei, Aptos, Sui, TON, Hyperliquid |
| 分类 | 网络 |
|---|---|
| EVM | 以太坊、Polygon、Arbitrum、Optimism、Base、BSC、Avalanche、Fantom、zkSync、Scroll、Linea、HyperEVM |
| 非EVM | Solana、Bitcoin、NEAR、Stacks、Cosmos、Sei、Aptos、Sui、TON、Hyperliquid |
import { Core } from "@quicknode/sdk";
const chains = {
solana: new Core({ endpointUrl: process.env.QUICKNODE_SOL_RPC! }),
ethereum: new Core({ endpointUrl: process.env.QUICKNODE_ETH_RPC! }),
polygon: new Core({ endpointUrl: process.env.QUICKNODE_POLYGON_RPC! }),
};import { Core } from "@quicknode/sdk";
const chains = {
solana: new Core({ endpointUrl: process.env.QUICKNODE_SOL_RPC! }),
ethereum: new Core({ endpointUrl: process.env.QUICKNODE_ETH_RPC! }),
polygon: new Core({ endpointUrl: process.env.QUICKNODE_POLYGON_RPC! }),
};try {
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "getSlot", params: [] }),
});
if (!response.ok) {
if (response.status === 401) console.error("Invalid endpoint URL or token");
if (response.status === 429) console.error("Rate limited — upgrade plan or reduce requests");
if (response.status >= 500) console.error("Server error — retry with backoff");
}
} catch (error) {
console.error("Network error:", error);
}try {
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "getSlot", params: [] }),
});
if (!response.ok) {
if (response.status === 401) console.error("无效的端点URL或令牌");
if (response.status === 429) console.error("超出速率限制——升级套餐或减少请求");
if (response.status >= 500) console.error("服务器错误——退避后重试");
}
} catch (error) {
console.error("网络错误:", error);
}| Code | Meaning | Solution |
|---|---|---|
| 401 | Invalid authentication | Verify endpoint URL and token |
| 429 | Rate limited | Upgrade plan or add delays |
| 500+ | Server error | Retry with exponential backoff |
| 代码 | 含义 | 解决方案 |
|---|---|---|
| 401 | 身份验证无效 | 验证端点URL和令牌 |
| 429 | 超出速率限制 | 升级套餐或增加请求延迟 |
| 500+ | 服务器错误 | 指数退避后重试 |
confirmedfinalizedconfirmedfinalizedquicknode/
├── SKILL.md # This file
├── resources/
│ ├── rpc-reference.md # RPC methods and WebSocket patterns
│ ├── das-api-reference.md # DAS API methods and parameters
│ ├── yellowstone-grpc-reference.md # gRPC streaming reference
│ ├── streams-reference.md # Streams filter functions and destinations
│ ├── webhooks-reference.md # Webhook configuration
│ └── marketplace-addons.md # Token API, NFT API, Metis, Priority Fees
├── examples/
│ ├── basic-rpc/ # Basic RPC calls
│ ├── das-api/ # DAS API queries
│ ├── streaming/ # Yellowstone gRPC examples
│ └── streams-webhooks/ # Streams and webhook setup
├── templates/
│ └── quicknode-setup.ts # Starter template
└── docs/
└── troubleshooting.md # Common issues and solutionsquicknode/
├── SKILL.md # 本文档
├── resources/
│ ├── rpc-reference.md # RPC方法和WebSocket模式
│ ├── das-api-reference.md # DAS API方法和参数
│ ├── yellowstone-grpc-reference.md # gRPC流参考
│ ├── streams-reference.md # Streams过滤函数和目标地址
│ ├── webhooks-reference.md # Webhook配置
│ └── marketplace-addons.md # 代币API、NFT API、Metis、优先费用
├── examples/
│ ├── basic-rpc/ # 基础RPC调用
│ ├── das-api/ # DAS API查询
│ ├── streaming/ # Yellowstone gRPC示例
│ └── streams-webhooks/ # Streams和Webhook配置
├── templates/
│ └── quicknode-setup.ts # 入门模板
└── docs/
└── troubleshooting.md # 常见问题与解决方案