本地交易 API
通过 API 交易 Solana 迷因币的非托管方式。你的钱包留在你自己的电脑上——我们永远看不到你的私钥。 签好名的交易由你通过我们的中继提交,或者走你自己的 RPC。
一套 API,四条网络:同样的请求、流和密钥在 Solana、BNB Chain、Robinhood Chain 和 Arc 上都能用;机器人只需改一下基础 URL 就能在链间切换。Solana 侧运行在法兰克福、阿姆斯特丹和纽约;用侧边栏底部的区域选择器选你的区域,见区域。最快的路线是交易用 Lightspeed、数据用 Ultra Fast Shred Stream(超快分片流)。
围绕交易端点:Ultra Fast Shred Stream 在区块执行前就送达每一笔 pump.fun 交易,24 小时回放意味着断线不会丢失任何数据,而同一套 API 运行在三个区域。
一个端点就能交易任何发射平台的币,无论它此刻在哪里交易:
不需要 API 密钥,没有账户。API 构建交易,你的机器签名,中继发送。我们唯一看到的只有你的公钥。Free 套餐上一笔交易付 0.25%;把你套餐的密钥作为 x-api-key 发送,就是 0%,限额也更高。
你需要什么
- 一个 Solana 钱包。 它的 base58 私钥。(Phantom:设置 → 显示秘密恢复短语 → 显示私钥。)
- 一些 SOL。 钱包里的 SOL 够付交易金额,再加少量网络费。
- 一种提交方式。 默认情况下,你把签好名的交易回传到
/api/send,我们通过自己的端点广播,所以不需要 RPC。如果你更愿意用自己的 Solana RPC(Helius、Triton、QuickNode 或公共节点),就用它发送。 - Node.js 或 Python。 如果想原样运行下面的代码片段,需要装好。
示例
- JavaScript
- Python
import { Connection, Keypair, VersionedTransaction } from "@solana/web3.js";
import bs58 from "bs58";
const wallet = Keypair.fromSecretKey(bs58.decode("<your wallet private key, base58>"));
// 1. 请 shrine.trade 构建一笔未签名交易。
const res = await fetch("https://sol.shrine.trade/api/local-trade", {
method: "POST",
headers: { "content-type": "application/json", "accept": "application/json" },
// 有套餐时,在 headers 里加上 "x-api-key": "sk_…":0% 费率,更高限额
body: JSON.stringify({
action: "buy", // "buy" 或 "sell"
publicKey: wallet.publicKey.toBase58(),
mint: "<token mint>", // base58 代币 mint
amount: 0.01, // 买入时为 SOL;卖出时为代币数量或 "100%"
slippage: 10, // 百分比
priorityFee: 0.0001, // SOL
}),
});
const { tx } = await res.json();
// 2. 本地签名——你的私钥永远不离开这个脚本。
const txObj = VersionedTransaction.deserialize(Buffer.from(tx, "base64"));
txObj.sign([wallet]);
// 3. 通过 shrine.trade 中继发送——不需要 RPC。等待确认。
const sent = await (await fetch("https://sol.shrine.trade/api/send", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ signedTx: Buffer.from(txObj.serialize()).toString("base64") }),
})).json();
console.log(sent.status, sent.explorer); // "landed" https://solscan.io/tx/…
// 或者,用你自己的 RPC:
// const conn = new Connection("https://your-rpc");
// const sig = await conn.sendRawTransaction(txObj.serialize());
import base64, requests, base58
from solana.rpc.api import Client
from solders.keypair import Keypair
from solders.transaction import VersionedTransaction
wallet = Keypair.from_bytes(base58.b58decode(WALLET_SECRET))
# 1. 请 shrine.trade 构建一笔未签名交易。
res = requests.post(
"https://sol.shrine.trade/api/local-trade",
headers={"accept": "application/json"},
json={
"action": "buy", # "buy" 或 "sell"
"publicKey": str(wallet.pubkey()),
"mint": "<token mint>", # base58 代币 mint
"amount": 0.01, # 买入时为 SOL;卖出时为代币数量或 "100%"
"slippage": 10, # 百分比
"priorityFee": 0.0001, # SOL
},
)
tx_b64 = res.json()["tx"]
# 2. 本地签名——你的私钥永远不离开这个脚本。
raw = VersionedTransaction.from_bytes(base64.b64decode(tx_b64))
signed = VersionedTransaction(raw.message, [wallet])
# 3. 通过 shrine.trade 中继发送——不需要 RPC。等待确认。
sent = requests.post("https://sol.shrine.trade/api/send",
json={"signedTx": base64.b64encode(bytes(signed)).decode()}).json()
print(sent["status"], sent["explorer"]) # landed https://solscan.io/tx/…
# 或者,用你自己的 RPC:
# sig = Client("https://your-rpc").send_raw_transaction(bytes(signed)).value
print(f"https://solscan.io/tx/{sig}")
工作原理
- 你发起请求,向 shrine.trade 要一笔交易。我们构建一笔未签名交易。
- 你签名,在自己的机器上用自己的钱包给交易签名。
- 你提交签好名的交易:发到
/api/send由我们广播,或者通过你自己的 RPC 发送。
发送
POST https://sol.shrine.trade/api/send 接收一笔签好名的交易,并通过我们的 Solana 端点广播,因此脚本完全不需要 RPC。它只转发由本 API 构建的交易:每次构建都会被记住 15 分钟,签名后的交易必须与其中一笔完全一致。任何在别处组装、或构建后被修改的交易都会以 not_ours 拒绝。是否使用它由你决定;签好名的交易随时可以改走你自己的 RPC。
| 字段 | ||
|---|---|---|
signedTx | base64 | 签好名的交易:web3.js 中为 Buffer.from(tx.serialize()).toString("base64"),solders 中为 base64.b64encode(bytes(signed))。 |
wait | 布尔值,可选 | 默认 true:等待确认。false 则在节点接受后立即返回签名。 |
{ "signature": "5Kd…", "status": "landed", "slot": 372114820, "explorer": "https://solscan.io/tx/5Kd…" }
status 为 landed(已确认)、failed(已执行但链上出错;error 携带程序错误)或 pending(未等待,或 60 秒内未确认)。被节点在预检中拒绝的交易——SOL 不足、超出滑点、blockhash 过期——会以 400 返回,并附上节点给出的原因。
请求字段
| 字段 | 类型 | 说明 |
|---|---|---|
action | "buy" / "sell" | |
publicKey | string | 你的钱包。它负责签名并支付费用。 |
mint | string | 代币 mint。 |
amount | number 或 string | 买入时投入的数量:SOL,或者对于以其他资产计价的 pump.fun 币,则为该币的计价资产(USDC 等)。卖出时为代币数量,或钱包持仓的比例:"100%" 全部卖出,"50%" 卖一半。 |
slippage | number | 百分比。默认 5。 |
priorityFee | number | SOL。默认约 0.0002。 |
pool | string | 通过哪个发射平台路由,见下文。省略则按 mint 自动路由。 |
poolAddress | string | 对 raydium_cpmm、raydium_amm_v4 和 meteora_damm_v2,当该 mint 没有缓存的池时必填;对 meteora_dbc 可选。 |
jitoTip | number | SOL。追加一笔到 Jito 小费账户的转账,这样签好名的交易可以直接发给区块引擎。 |
发射平台
数据流覆盖的每个发射平台和 AMM 都能通过同一个调用交易。不填 pool,mint 会被查找并自动路由到其当前活跃的池,并跟随迁移。只有在要强制指定发射平台时才设置它。
pool | 发射平台 |
|---|---|
pumpfun(或 pump) | pump.fun 联合曲线 |
pumpswap | PumpSwap,pump.fun 币毕业后在此交易 |
bonk、stonkfun | Raydium LaunchLab:letsbonk.fun、StonkFun 及其他所有 LaunchLab 平台 |
meteora_dbc(或 bags、moonshot) | Meteora 动态联合曲线:Bags、Moonshot 及 Meteora 发射平台的其余部分 |
raydium_cpmm | Raydium CPMM,LaunchLab 币毕业后在此交易 |
raydium_amm_v4 | Raydium AMM v4 |
meteora_damm_v2 | Meteora DAMM v2,DBC 币毕业后在此交易 |
以其他资产计价的币
币不一定以 SOL 计价。pump.fun 币可以用 USDC 或其他代币计价,LaunchLab 上的 StonkFun 币可以用代币化股票、Pre-IPO 股票或货币计价。交易端点从币的曲线或池里读取计价资产并照此处理,无论是哪个发射平台:此时买入的 amount 是要花掉多少计价资产,钱包必须已经持有这个数量外加手续费;卖出以计价资产付款;交易费也以计价资产收取。响应用 quoteMint 和 feeMint 说明是哪种资产;feeLamports 以费用资产的最小单位计。带转账费的 Token-2022 计价 mint(xStocks)也能处理;SOL 只用来付网络费。无需任何设置,token-info 会提前显示币的 quote。
多个操作放进一笔原子交易,包括发币后由其他钱包买入,走 local-actions。转账、销毁、包装 SOL 和余额读取见钱包工具。
meteora_dbc 支持以 SOL 计价的池。DBC 上的滑点按现价计算,所以在陡峭曲线上大额买入时要留出余量。
手续费在 Free 套餐上为交易 SOL 侧的 0.25%,在 Lite 和 Developer 上为 0%,包含在交易里。见套餐与限额。
试一试
无需 API 密钥——这个端点无需密钥。粘贴你的钱包私钥和一个代币 mint,按下 Sign & send。API 只会收到你的公钥并返回一笔未签名交易;你的浏览器签名后把签好名的字节发到 /api/send,或者发到你填写的自有 RPC。私钥永远不离开这个标签页。这是主网上的真实交易,请从小额开始。
出了问题怎么办
你会收到形如 { "error": "..." } 的响应,带一条简短说明。常见原因:钱包地址错误、代币 mint 错误,或 SOL 不足。来自 /api/send 的 400 会引用节点的预检原因(滑点、余额、blockhash 过期),not_ours 表示该交易不是本 API 构建的,或者构建后被改动过。