跳到主要内容

多操作交易

一笔交易,里面装几件事:在一个发射台买、在另一个发射台卖,发币并买入,买入后把代币转走,领取创作者费用并销毁。列表里的操作要么全部落地,要么全部不落地。

POST https://sol.shrine.trade/api/local-actions

{
"publicKey": "<付费方,也是没有单独指定钱包的操作所用的钱包>",
"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 未签名交易>",
"blockhash": "…",
"signers": ["<付费方>", "<其他签名钱包或 mint 密钥对,按顺序>"],
"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 里的每个密钥签名,然后通过你自己的 RPC 发送,和单笔交易完全一样。

操作

每个操作都可带可选的 publicKey。不带时以顶层钱包执行;带了则该钱包也要签名,并出现在 signers 里。

action字段说明
buymintamount(SOL,或该币的计价资产)、slippagepoolpoolAddress交易接口能路由的任何发射台。0.25% 手续费。
sellmintamount(代币数量或 "100%")、slippagepoolpoolAddress0.25% 手续费。
createmintmintRefnamesymboluriinitialBuyslippagecreatorFeeAddressquoteMint 及 V2 选项一次 pump.fun 发射,见创建代币。mint 密钥对要签名。
transfertoamountmint(SOL 则省略)需要时会创建收款方的代币账户。免费。
burnmintamount全部销毁会同时关闭账户并退回租金。免费。
claimCreatorFees领取创作者费用。免费。
wrapamount(SOL)把 SOL 放进钱包的 WSOL 账户。免费。
unwrap关闭 WSOL 账户,每一 lamport 都退回。免费。

卖出、转账或销毁的 amount 可以是代币数量,也可以是钱包持仓的比例。"100%""50%""all" 都能识别。

一笔交易里发币并买入

同一笔交易里创建的币在你写请求时还没有地址,所以给 create 起一个 mintRef,后面用 "$名字" 引用它。mint 密钥对由你自己生成,把它的公钥作为 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 字节。用 API 编译时依赖的查找表,大约是同一发射台四次交换,跨发射台更少,或者一次发射加开发者买入再加一次买入。装不下时会返回 400 并说明大小;把它拆到捆绑交易里,mintRef 在后面的交易里照样可用。

直接复制

import { Connection, Keypair, VersionedTransaction } from "@solana/web3.js";
import bs58 from "bs58";

const wallet = Keypair.fromSecretKey(bs58.decode(process.env.SECRET));
const conn = new Connection(process.env.RPC_URL, "confirmed");

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` 里列出的每个密钥
console.log(await conn.sendRawTransaction(txObj.serialize()));

说明

  • 原子。 任何一个指令失败都会回滚整笔交易:永远不会有部分落地。
  • 优先费是整笔交易的一个数字。计算预算按里面的操作估算。
  • 手续费。 每次买入和卖出 0.25%,在同一笔交易里以 SOL 收取,每个钱包合并为一次转账。其他操作免费。
  • 无需密钥、不签名,和每个交易接口一样。没有密钥、没有账号;我们不签名也不发送任何东西。