多操作交易
一笔交易,里面做好几件事:在一个发射平台买入、在另一个卖出,发一枚币并买入它,买入后把代币转到别处,领取创建者费用并销毁。列表里的所有操作要么一起上链,要么全部不上。
POST https://sol.shrine.trade/api/local-actions,在 x-api-key 请求头里带上你套餐的密钥。
{
"publicKey": "<fee payer, and the wallet for actions without their own>",
"actions": [
{ "action": "buy", "mint": "<mint>", "amount": 0.05, "slippage": 15 },
{ "action": "transfer", "to": "<other wallet>", "mint": "<mint>", "amount": "50%" },
{ "action": "burn", "mint": "<mint>", "amount": "100%" }
],
"priorityFee": 0.0005,
"jitoTip": 0
}
响应是一笔未签名交易,外加必须为它签名的密钥列表:
{
"tx": "<base64 unsigned transaction>",
"blockhash": "…",
"signers": ["<fee payer>", "<other signing wallets or mint keypairs, in order>"],
"feeLamports": 125000,
"sizeBytes": 1088,
"actions": [
{ "action": "buy", "wallet": "…", "mint": "…", "amount": 0.05, "feeLamports": 125000 },
{ "action": "transfer", "wallet": "…", "mint": "…", "amount": 12345.6, "feeLamports": 0 },
{ "action": "burn", "wallet": "…", "mint": "…", "amount": 12345.6, "feeLamports": 0 }
]
}
用 signers 中的每一个密钥签名,然后通过 POST /api/send 的中继发送,和单笔交易完全一样:中继通过我们自己的 Solana 端点广播并等待确认,所以机器人不需要 RPC。完整脚本在复制这段下面。
操作
每个操作都接受一个可选的 publicKey。不带时以顶层钱包执行;带上时该钱包也要签名,并出现在 signers 中。
action | 字段 | 说明 |
|---|---|---|
buy | mint、amount(SOL,或该币的计价资产)、slippage、pool、poolAddress | 交易端点能路由的任何发射平台。 |
sell | mint、amount(代币数量或 "100%")、slippage、pool、poolAddress | |
create | name、symbol,然后 uri 或 imageUrl 二选一(+ description、twitter、telegram、website),可选 mint、mintRef、initialBuy、slippage、creatorFeeAddress、quoteMint 和 V2 标志 | pump.fun 发币,见创建代币。不带 uri 时元数据由我们替你固定上传;不带 mint 时你会得到一个以 pump 结尾、由我们替它签名的地址。 |
transfer | to、amount、mint(转 SOL 时省略) | 需要时会创建接收方的代币账户。免费。 |
burn | mint、amount | 全部销毁会关闭账户并退回租金。免费。 |
claimCreatorFees | 同领取创建者费用。免费。 | |
wrap | amount(SOL) | 把 SOL 存入钱包的 WSOL 账户。免费。 |
unwrap | 关闭 WSOL 账户,每一个 lamport 都退回。免费。 |
卖出、转账或销毁的 amount 可以是代币数量,也可以是钱包持仓的百分比。"100%"、"50%" 和 "all" 都能识别。
一步完成发币并买入
在交易中创建的币在你写请求时还没有地址,所以给创建操作一个 mintRef,之后用 "$name" 引用它。自己生成 mint 密钥对并把它的公钥作为 mint 传入;它会和钱包一起为交易签名。或者省略 mint:币会得到一个以 pump 结尾的地址,交易返回时已经由它签好名,响应中的 mintSecretKeys 列出每个由我们提供的 mint 及其密钥。在捆绑包里同样如此。
{
"publicKey": "<dev wallet>",
"actions": [
{ "action": "create", "mintRef": "coin", "mint": "<mint keypair public key>", "name": "My Coin", "symbol": "COIN", "uri": "https://…/metadata.json", "initialBuy": 0.5 },
{ "action": "buy", "mint": "$coin", "amount": 0.2, "slippage": 30 }
]
}
对同一笔交易中新生币的买入,报价来自曲线的发射常量,并按之前已投入的 SOL 向前推算,所以请给它们宽松的 slippage。
能装下多少
Solana 把一笔交易限制在 1232 字节。借助共享的查找表,大约是同一发射平台上四笔兑换,跨发射平台则更少,或者一次发币加开发者买入再加一笔买入。当一组操作装不下时,响应是一个注明大小的 400;把它拆到一个捆绑包里,mintRef 在那里仍然可以从一笔交易解析到下一笔。
复制这段
- JavaScript
- Python
import { Keypair, VersionedTransaction } from "@solana/web3.js";
import bs58 from "bs58";
const wallet = Keypair.fromSecretKey(bs58.decode("<your wallet private key, base58>"));
const res = await fetch("https://sol.shrine.trade/api/local-actions", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
publicKey: wallet.publicKey.toBase58(),
actions: [
{ action: "buy", mint: "<mint>", amount: 0.01, slippage: 15 },
{ action: "transfer", to: "<friend>", mint: "<mint>", amount: "50%" },
],
}),
});
const { tx, signers } = await res.json();
const txObj = VersionedTransaction.deserialize(Buffer.from(tx, "base64"));
txObj.sign([wallet]); // `signers` 中列出的每一个密钥
// 通过中继发送;它会等待确认。
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, `https://solscan.io/tx/${sent.signature}`);
import base64, os, requests
from solders.keypair import Keypair
from solders.transaction import VersionedTransaction
wallet = Keypair.from_base58_string("<your wallet private key, base58>")
r = requests.post("https://sol.shrine.trade/api/local-actions", json={
"publicKey": str(wallet.pubkey()),
"actions": [
{"action": "buy", "mint": "<mint>", "amount": 0.01, "slippage": 15},
{"action": "transfer", "to": "<friend>", "mint": "<mint>", "amount": "50%"},
],
}).json()
raw = VersionedTransaction.from_bytes(base64.b64decode(r["tx"]))
signed = VersionedTransaction(raw.message, [wallet]) # r["signers"] 中的每一个密钥
sent = requests.post("https://sol.shrine.trade/api/send",
json={"signedTx": base64.b64encode(bytes(signed)).decode()}).json()
print(sent["status"], sent["signature"])
说明
- 原子性。 任何一条指令失败都会回滚整笔交易:永远不会出现部分上链。
- 优先费是整笔交易的一个数值。计算预算按里面的操作来定。
- 费用。 没有:多操作交易随 Lite 和 Developer 提供,这两个套餐交易费率为 0%。
- 未签名,与每个交易端点一样:API 构建,你的钱包签名;我们不签名也不发送任何东西。
LimitsLite 3 req/sDeveloper 10 req/sSee plans →