以下是一个solana+jupiter 的多线程 多代理ip 套利程序, 使用v0交易,其中需要获取...

作成日: 2025年6月21日

使用モデル O3 by Chat01

質問

以下是一个solana+jupiter 的多线程 多代理ip 套利程序,
使用v0交易,其中需要获取ALT地址,
为了 提升运行速度,采用:预先采集 所有 正反交易对比报价的ALT地址(alt-cache.json),

然后 作为全局缓存,当需要使用ALT地址时,先从全局缓存 中 查询,不存在 则实时查询,

当前问题:
无法从全局缓存 中查询到 实际存在的ALT地址,

请分别检查:
ALT地址 采集程序(12.js)和ALT地址 应用程序(24.js),
确定问题

以下是代码:
12.js:
/*
下面给出一份 可直接 node b.js 运行 的完整脚本,已完成以下改动:

  1. ALT pubkey 采集结束后先落盘 alt-step.json
  2. 若下次脚本启动时发现 alt-step.json 已存在,则跳过采集,直接批量拉取 ALT 账户;
  3. 修掉前一版提到的几个隐患:
    • 线程数 > 代理数 自动降级;
    process.send() flush 后再退出;
    • 金额注释与实值一致;
    • Jupiter / RPC 带简单重试;
    • 拉 ALT 时多代理 + 并发;

依赖:npm i node-fetch@2 https-proxy-agent @solana/web3.js bs58
额外本地文件:
constants.js 导出 TOKENS1000(1000 个 mint 地址数组)
config.js 导出 WALLET_PRIVATE_KEY(base58 私钥)

/
/
****************************************************************

  • b.js —— ① 采集 ALT pubkey ➜ alt-step.json
  •      ② 拉取 ALT 账户 ➜ alt-cache.json
    

****************************************************************/
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
global.fetch = require('node-fetch');
/
──────────── 公共依赖 ──────────── */
const fs = require('fs');
const { fork } = require('child_process');
//const fetch = require('node-fetch');
// ↓ 放在脚本最顶部即可
const _nf = require('node-fetch'); // v2 得到函数,v3 得到 { default: f }
const fetch = typeof _nf === 'function' ? _nf // v2
: _nf.default // v3
|| global.fetch; // Node ≥18 原生

global.fetch = fetch; // 其它地方若直接用 global.fetch 也安全

const bs58 = require('bs58');
const { HttpsProxyAgent } = require('https-proxy-agent');
const { Keypair } = require('@solana/web3.js');

/* ──────────── 项目常量 ──────────── */
const { TOKENS1000 } = require('./constants');
const { WALLET_PRIVATE_KEY } = require('./config');

/* === 工具函数 === */
const delay = ms => new Promise(r => setTimeout(r, ms));
const keypair = (() => {
const buf = bs58.decode(WALLET_PRIVATE_KEY);
return require('@solana/web3.js').Keypair.fromSecretKey(buf);
})();

function filterValidAltAccounts(alts) {
return alts.filter(item => {
// 过滤条件:key存在且为非空字符串
if (!item.key || typeof item.key !== 'string' || item.key.trim() === '') return false;
// data存在且为字符串
if (!item.raw || typeof item.raw !== 'string') return false;
// state存在且为对象
if (!item.state || typeof item.state !== 'object') return false;
// state中的addresses是数组
if (!Array.isArray(item.state.addresses)) return false;
return true;
});
}
function parseProxy(str) { // 'host:port->N' → N 条代理 URL
const [hp, n] = str.split('->');
const [h, p] = hp.split(':');
return Array.from({ length: Number(n) }, (, i) => http://${h}:${+p + i});
}
function splitAvg(arr, n) { // 平均切片
const sz = Math.ceil(arr.length / n);
return Array.from({ length: n }, (
, i) => arr.slice(i * sz, (i + 1) * sz));
}

/* =======================================================================
主进程
======================================================================= /
if (!process.send) {
/
---------- 配置 ---------- */
const THREADS_REQ = Number(process.env.THREADS) || 4;
const PROXY_STR = process.env.PROXY_POOL || '127.0.0.1:10000->100';

const STEP_FILE = 'alt-step.json'; // 只保存 ALT pubkey
const OUT_FILE = 'alt-cache.json'; // 保存最终 ALT 数据

/* ---------- 读取 / 切片代理 ---------- */
const PROXIES = parseProxy(PROXY_STR);
if (!PROXIES.length) {
console.error('⛔️ 没有可用代理,脚本终止');
process.exit(1);
}

const THREADS = Math.min(THREADS_REQ, PROXIES.length);
if (THREADS < THREADS_REQ)
console.warn(⚠️ THREADS(${THREADS_REQ}) > PROXIES(${PROXIES.length}),已降级为 ${THREADS});

// Round-Robin 把代理 URL 分给线程
const PROXY_CHUNKS = Array.from({ length: THREADS }, () => []);
PROXIES.forEach((url, i) => PROXY_CHUNKS[i % THREADS].push(url));

/* ────────────────────────────────────────────────────────────── */
(async () => {
// 如果已有 step 文件 ➜ 直接拉 ALT
if (fs.existsSync(STEP_FILE)) {
console.log(🔄 检测到 ${STEP_FILE} 已存在,跳过采集阶段);
const pubkeys = JSON.parse(fs.readFileSync(STEP_FILE, 'utf8'));
await runBatchFetch(pubkeys);
return;
}

text
/* ============ 阶段①:多进程采集 pubkey ============ */ const TOKEN_CHUNKS = splitAvg(TOKENS1000, THREADS); const altSet = new Set(); let finished = 0; console.log(`🚀 启动 ${THREADS} 个 worker 进行 ALT pubkey 采集…`); for (let i = 0; i < THREADS; i++) { const w = fork(__filename, [], { env: { ROLE : 'worker', IDX : String(i), TOKENS : JSON.stringify(TOKEN_CHUNKS[i]), PROXIES: JSON.stringify(PROXY_CHUNKS[i]), WALLET : WALLET_PRIVATE_KEY, }, }); w.on('message', list => Array.isArray(list) && list.forEach(k => altSet.add(k))); w.on('exit', (code) => { if (code !== 0) console.warn(`⚠️ worker ${i} exit code ${code}`); if (++finished === THREADS) doneCollect(); }); } /* 收集结束 */ function doneCollect() { console.log(`✅ ALT pubkey 收集完毕:${altSet.size} 条`); fs.writeFileSync(STEP_FILE, JSON.stringify([...altSet])); console.log(`📃 已写入 ${STEP_FILE}`); runBatchFetch([...altSet]); } /* ============ 阶段②:批量拉取 ALT 账户 ============ */ async function runBatchFetch(pubkeys) { console.log(`🚚 开始批量抓取 ALT 账户(${pubkeys.length})…`); const data = await batchFetchALT(pubkeys, PROXIES); fs.writeFileSync(OUT_FILE, JSON.stringify(data)); console.log(`🎉 全部完成!结果写入 ${OUT_FILE}`); }

})();

return; // 主进程到此结束
}

/* =======================================================================
子进程逻辑 —— 采集 ALT pubkey
======================================================================= */
if (process.env.ROLE === 'worker') {
const IDX = +process.env.IDX;
const TOKENS = JSON.parse(process.env.TOKENS);
const PROXIES = JSON.parse(process.env.PROXIES);
const WALLET_PRIVATE = process.env.WALLET;

/* ---------- 轮转代理的 safeFetch + 重试 ---------- /
let pIdx = 0;
const rotateAgent = () => new HttpsProxyAgent(PROXIES[pIdx++ % PROXIES.length]);
/

const rotateAgent = () =>
new HttpsProxyAgent({
...new URL(PROXIES[pIdx++ % PROXIES.length]),
rejectUnauthorized: false // 仅这条代理连接忽略证书
});
*/

const safeFetch = async (url, opt = {}, retry = 3) => {
try {
const res = await fetch(url, { ...opt, agent: rotateAgent() });
if (!res.ok) throw new Error(${res.status} ${res.statusText});
return res.json();
} catch (e) {
if (retry) {
await delay(500);
return safeFetch(url, opt, retry - 1);
}
throw e;
}
};

/* ---------- Jupiter Helpers ---------- */
const JUP = 'https://quote-api.jup.ag/v6';
const jQuote = qs => safeFetch(${JUP}/quote?${qs});
const jIx = body=> safeFetch(${JUP}/swap-instructions, {
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify(body)
});

/* ---------- Keypair ---------- */
//const keypair = Keypair.fromSecretKey(bs58.decode(WALLET_PRIVATE));

/* ---------- 开始采集 ---------- */
(async () => {
const altLocal = new Set();

text
for (const token of TOKENS) { console.warn(`${token}`); try { /* const amt = 5 * 1_000_000_000; // 5 SOL const qsBaseIn = `inputMint=So11111111111111111111111111111111111111112` + `&outputMint=${token}&amount=${amt}` + `&onlyDirectRoutes=false&slippageBps=400`; const qIn = await jQuote(qsBaseIn);

if (!qIn.outAmount) {
console.warn([W${IDX}] skip ${token}: 无 outAmount);
continue;
}
*/
let qIn;
//为低流动性代币调整 amount
const amounts = [5_000_000_000, 1_000_000_000, 100_000_000]; // 5, 1, 0.1 SOL
for (const amt of amounts) {
try {
const qsBaseIn = inputMint=So11111111111111111111111111111111111111112 +
&outputMint=${token}&amount=${amt} +
&onlyDirectRoutes=false&slippageBps=400;
qIn = await jQuote(qsBaseIn);
if (qIn.outAmount) break;
} catch (e) {
console.warn([W${IDX}] ${token} 金额 ${amt/1_000_000_000} SOL 失败: ${e.message});
}
}

text
const qsBaseOut = `inputMint=${token}` + `&outputMint=So11111111111111111111111111111111111111112` + `&amount=${qIn.outAmount}&onlyDirectRoutes=false&slippageBps=400`; const qOut = await jQuote(qsBaseOut); if (!qOut.outAmount) continue; const [ixIn, ixOut] = await Promise.all([ jIx({ quoteResponse:qIn ,userPublicKey:keypair.publicKey.toBase58() }), jIx({ quoteResponse:qOut,userPublicKey:keypair.publicKey.toBase58() }), ]); const collect = obj => Array.isArray(obj?.addressLookupTableAddresses) && obj.addressLookupTableAddresses.forEach(k => altLocal.add(k)); collect(ixIn); collect(ixOut); } catch (e) { console.warn(`[W${IDX}] skip ${token.slice(0,5)}… : ${e.message}`); } } /* → 发回主进程并退出(等待 flush) */ process.send([...altLocal], () => { process.disconnect(); process.exit(0); });

})();
}

/* =======================================================================
公共函数:批量 getMultipleAccounts 取 ALT 数据
======================================================================= */
async function batchFetchALT(pubkeys, proxyList) {
if (!pubkeys.length) return [];
const MAIN = 'https://api.mainnet-beta.solana.com';

/* 分块并发参数 */
const CHUNK = 99; // RPC 限制 100
const CONCURRENCY = 4;
let proxyIdx = 0;
const nextAgent = () => new HttpsProxyAgent(proxyList[proxyIdx++ % proxyList.length]);

const out = [];
const tasks = [];

const fetchSlice = async (slice, agent) => {
const body = {
jsonrpc:'2.0',
id:Date.now(),
method:'getMultipleAccounts',
params:[slice, { encoding:'base64', commitment:'confirmed' }],
};
for (let retry = 3; retry >= 0; retry--) {
try {
const json = await fetch(MAIN, {
method :'POST',
agent ,
//agent : nextAgent(), // 每次请求都换新代理
headers:{ 'Content-Type':'application/json' },
//headers : { 'Content-Type':'application/json',
//'Connection' : 'close' }, // 明确关短链接,省得 proxy 卡死
body :JSON.stringify(body),
}).then(r => r.json());

text
json.result.value.forEach((info, idx) => { if (info?.data) out.push({ key: slice[idx], data: info.data[0] }); }); console.log(` ↳ ${out.length}/${pubkeys.length} 已拉取`); return; } catch (e) { if (!retry) throw e; await delay(500); } }

};

for (let i = 0; i < pubkeys.length; i += CHUNK) {
tasks.push(pubkeys.slice(i, i + CHUNK));
}

/* 控制并发 */
let cursor = 0;
await Promise.all(
Array.from({ length: CONCURRENCY }).map(async () => {
while (cursor < tasks.length) {
const slice = tasks[cursor++];
await fetchSlice(slice, nextAgent());
}
})
);

//return out;
// 在返回前过滤
const filteredOut = filterValidAltAccounts(out.map(item => {
try {
const buf = Buffer.from(item.data, 'base64');
const state = require('@solana/web3.js').AddressLookupTableAccount.deserialize(buf);
return { key: item.key, raw: item.data, state };
} catch (e) {
console.warn(无效 ALT ${item.key}: ${e.message});
return null;
}
}).filter(Boolean));
return filteredOut.map(({ key, raw }) => ({ key, data: raw }));
/*
const filteredOut = out.filter(item => {
if (!item.key || typeof item.key !== 'string' || !item.key.trim()) return false;
if (!item.data || typeof item.data !== 'string') return false;
if (!item.state || typeof item.state !== 'object') return false;
if (!Array.isArray(item.state.addresses)) return false;
return true;
});
return filteredOut;
/
// 过滤无效字段
/

const validOut = filterValidAltAccounts(out);
return validOut;
*/

}

/*
📌 运行顺序

  1. 首次运行
    node b.js → ① 采集 ALT pubkey(多进程 + 代理均分)→ 写入 alt-step.json → ② 批量拉取 ALT 账户 → alt-cache.json
  2. 随后再次运行
    检测到已存在 alt-step.json,直接跳到步骤②,省去再次采集的时间。

如需重新采集,只需手动删除 alt-step.json 再执行即可。
*/

24.js:
/*****************************************************************

  • index.js —— 覆盖后 node index.js 即可运行
    *****************************************************************/
    const { v4: uuidv4 } = require('uuid'); // 文件顶部,npm i uuid
    //const fetch = require('node-fetch');
    // ↓ 放在脚本最顶部即可
    const _nf = require('node-fetch'); // v2 得到函数,v3 得到 { default: f }
    const fetch = typeof _nf === 'function' ? _nf // v2
    : _nf.default // v3
    || global.fetch; // Node ≥18 原生

global.fetch = fetch; // 其它地方若直接用 global.fetch 也安全

const {
PublicKey, SystemProgram, TransactionMessage, ComputeBudgetProgram,
VersionedTransaction, AddressLookupTableAccount, LAMPORTS_PER_SOL,
Connection,
} = require('@solana/web3.js');
const bs58 = require('bs58');
const { HttpsProxyAgent } = require('https-proxy-agent');
const { TOKENS1000 } = require('./constants');
const ProxyPool = require('./proxyPool');
const { WALLET_PRIVATE_KEY } = require('./config');
const { deserializeInstruction } = require('./transactionUtils');
const fs = require('fs');

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
const keypair = (() => {
const buf = bs58.decode(WALLET_PRIVATE_KEY);
return require('@solana/web3.js').Keypair.fromSecretKey(buf);
})();

/* ---------------- 线程 & 代理池准备 ---------------- */
const THREADS = Number(process.env.THREADS) || 4;
const PROXY_STR = process.env.PROXY_POOL || '127.0.0.1:10000->10';
//const PROXY_STR = '127.0.0.1:10000->180';
const BASE_AMOUNT_SOL = 0.05;
const SLIPPAGE_BPS = 30;//第一次報價slippage 0.3%
const SLIPPAGE_BPS0 = 2000;//第二次報價slippage 20%

//500,000 lamports = 0.0005 SOL=0.075 usdt=0.5 rmb

const MIN_NET_PROFIT =18000;// 200000; //最小净利润阈值 0.2rmb

const maxAccounts=64;//32 最大 64
/*
1200_000->SLIPPAGE_BPS:100;lamports
600_000->SLIPPAGE_BPS:50;lamports
*/
const MIN_PROFIT_FIXED =15_000;//
const COMPUTE_UNIT_FALLBACK = 400_000;//优先费
const CU_UPPER_LIMIT = 1_400_000;

/******************************************************************

  • 2. 固定代理 127.0.0.1:1082 专用 fetch
    ****************************************************************/
    const LOCAL_AGENT = new HttpsProxyAgent('http://127.0.0.1:1082');
    const CACHE_FILE = 'alt-cache.json';
    /
  • 只做最简单的重试 1 次(本地代理一般稳定)
    */
    async function safeFetchLocal(url, opt = {}) {
    return fetch(url, { ...opt, agent: LOCAL_AGENT });
    }

/**

  • 调用 JSON-RPC,自动轮转 RPC 节点、自动走全局代理

  • @param {string} method RPC 方法名

  • @param {array} params 传参数组

  • @returns {Promise<any>} rpc.result
    */
    async function callRpc(method, params = [], useLocalProxy = false) {
    const url = nextRpc(); // 轮转 RPC 端点
    const fetchFn = useLocalProxy ? safeFetchLocal : safeFetchGlobal;

    const res = await fetchFn(url, {
    method : 'POST',
    headers: { 'Content-Type': 'application/json' },
    body : JSON.stringify({
    jsonrpc:'2.0',
    id :1,
    method,
    params
    })
    });

    const json = await res.json();
    if (json.error) throw new Error(json.error.message);
    return json.result;
    }

function splitAvg(arr,n){const s=Math.ceil(arr.length/n);return Array.from({length:n},(,i)=>arr.slice(i*s,(i+1)*s));}
function parseProxy(str){const[hps,sz]=str.split('->');const[h,sp]=hps.split(':');return Array.from({length:Number(sz)},(
,i)=>http://${h}:${Number(sp)+i});}
const PROXY_CHUNKS = splitAvg(parseProxy(PROXY_STR), THREADS);
const TOKEN_CHUNKS = splitAvg(TOKENS1000, THREADS);

const SOLANA_RPC=['https://solana-mainnet.g.alchemy.com/v2/alqGV-y3cz0uau9dDpvohJmlf8k893tT',
'https://solana-mainnet.g.alchemy.com/v2/alcht_r9gUZZ9NEe7YO06VQ265LJqxsACIWl',
'https://solana-mainnet.g.alchemy.com/v2/aosSEDNOSBO0fsNcTISNYfj9irU59Gzz',
'https://solana-mainnet.g.alchemy.com/v2/asCWW_nE_5MottOGIJtjOIfVCm_dU6Bd',
'https://solana-mainnet.g.alchemy.com/v2/ac1w6ejg24NFG2VZmDWieAO_hW0aPw2m',
'https://solana-mainnet.core.chainstack.com/c1f70bbc35644bd95ae98c944984230a',
'https://solana-mainnet.g.alchemy.com/v2/zAXPbOHQv5uZBUD1NG_nLbzip0WKZ5bM',
'https://solana-mainnet.g.alchemy.com/v2/sgFGPAyqiBwvqiEkXHiiSFYkVaNbFOro',
'https://solana-mainnet.g.alchemy.com/v2/ZB4MhPz7qnwwAK8kF6bXBVw_qHomL6YU',
'https://solana-mainnet.g.alchemy.com/v2/BO3XZ1SKw5U2agTBN-5CW',
'https://solana-mainnet.g.alchemy.com/v2/cym50KbOd8JsNJSk2mMLlsCbJIkExt6w',
'https://solana-mainnet.core.chainstack.com/90b1a03e7d63d7dafdefe698039b7056',
'https://solana-mainnet.core.chainstack.com/8d701a8cf39221fedef455984ecd8b4f',
'https://solana-mainnet.core.chainstack.com/704d0c5ae2421c3ecac091544acb5089'
];

const ALL_PROXIES = PROXY_CHUNKS.flat();      // <-- 关键 ①

//全局 ProxyPool / safeFetch —— 仅初始化一次
const GLOBAL_PROXY_POOL = new ProxyPool(ALL_PROXIES); // ALL_PROXIES 已在前文展开
const safeFetchGlobal = buildSafeFetch(GLOBAL_PROXY_POOL);

// 全局只做一次
let avgPriorFee = 5_000;
setInterval(async ()=>{
try{
const {microLamports} = await getAveragePriorityFee(); // RPC 拿 avg
avgPriorFee = Math.ceil(microLamports * 1.1); // +10% 安全系数
}catch{ /* 持续用旧值 / }
}, 5_000);
//
/
=============================================================

    1. 先把“全部代理”拍平成一个数组
  • =========================================================== */

let latestBlockhashData = null;
setInterval(async () => {
try {
latestBlockhashData = await getLatestBlockhash1();
}
catch (e) {
console.warn('更新区块哈希失败,继续使用旧值', e);
} }, 500); // 500毫秒更新一次

// 假设 SOLANA_RPC = ['url1', 'url2', 'url3']
let rpcIdx = 0; // 全局下标

function nextRpc() {
const url = SOLANA_RPC[rpcIdx];
rpcIdx = (rpcIdx + 1) % SOLANA_RPC.length; // 末尾→0,形成循环
return url;
}
/* -------- getLatestBlockhash(按指定实现) -------- */
async function getLatestBlockhash1aa(){
var proxies=['http://127.0.0.1:1082'];//PROXY_CHUNKS[0];
//var proxies=PROXY_CHUNKS[1];
const proxyPool = new ProxyPool(proxies);
//const proxyPool = new ProxyPool(ALL_PROXIES);
const safeFetch = buildSafeFetch(proxyPool);

text
//const MAIN_RPC = 'https://api.mainnet-beta.solana.com'; //const MAIN_RPC=SOLANA_RPC[Math.floor(Math.random()*SOLANA_RPC.length)]; const MAIN_RPC = nextRpc();// 每调用一次就往后走一个 const res = await safeFetch(MAIN_RPC,{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({jsonrpc:'2.0',id:1,method:'getLatestBlockhash', params:[{commitment:'confirmed'}]}), }); //start /* const responseText = await res.text();

console.log('响应内容:', responseText);
try {
const data = JSON.parse(responseText);
// 继续处理
} catch (e) {
console.error('解析JSON失败,内容:', responseText);
}
*/
//end

text
const data = await res.json(); //console.log('>>> getLatestBlockhash1:', JSON.stringify(data, null, 2)); if(data.error) throw new Error(data.error.message); if(data.result) return { blockhash:data.result.value.blockhash, lastValidBlockHeight:data.result.value.lastValidBlockHeight, }; throw new Error('No blockhash data in response');

}
/******************************************************************

  • 4. getLatestBlockhash1 / getBlockHeight —— 固定代理版本
    *****************************************************************/
    async function getLatestBlockhash1() {
    const data = await callRpc(
    'getLatestBlockhash',
    [ { commitment:'confirmed' } ],
    /
    useLocalProxy = */ true
    );

return {
blockhash : data.value.blockhash,
lastValidBlockHeight : data.value.lastValidBlockHeight,
};
}

async function ensureFreshBlockhash() {
// 当前块高
//const cur = await connection.getBlockHeight('finalized');
const cur = await getBlockHeight();
// 剩余 slot 小于 10,就重新拉
if (!latestBlockhashData ||
latestBlockhashData.lastValidBlockHeight - cur < 10) {
latestBlockhashData = await getLatestBlockhash1();
}
return latestBlockhashData;
}
async function getBlockHeightaa(){
var proxies=['http://127.0.0.1:1082'];//PROXY_CHUNKS[0];
//var proxies=PROXY_CHUNKS[1];
const proxyPool = new ProxyPool(proxies);
//const proxyPool = new ProxyPool(ALL_PROXIES);
const safeFetch = buildSafeFetch(proxyPool);

text
//const MAIN_RPC = 'https://api.mainnet-beta.solana.com'; //const MAIN_RPC=SOLANA_RPC[Math.floor(Math.random()*SOLANA_RPC.length)]; const MAIN_RPC = nextRpc();// 每调用一次就往后走一个 const res = await safeFetch(MAIN_RPC,{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({jsonrpc:'2.0',id:1,method:'getBlockHeight', params:[{commitment:'finalized'}]}), }); //start /* const responseText = await res.text();

console.log('响应内容:', responseText);
try {
const data = JSON.parse(responseText);
// 继续处理
} catch (e) {
console.error('解析JSON失败,内容:', responseText);
}
*/
//end

text
const data = await res.json(); //console.log('>>> getLatestBlockhash1:', JSON.stringify(data, null, 2)); if(data.error) throw new Error(data.error.message); if(data.result) return data.result; throw new Error('No blockhash data in response');

}
async function getBlockHeight() {
return await callRpc(
'getBlockHeight',
[ { commitment:'finalized' } ],
/* useLocalProxy = / true
);
}
/
============================================================

  • getAveragePriorityFee —— 纯 JSON-RPC 实现
  • ========================================================== */
    async function getAveragePriorityFee() {
    const rpcUrl = 'https://api.mainnet-beta.solana.com';

// 构造 JSON-RPC 请求体
const body = {
jsonrpc: '2.0',
id : 1,
method : 'getRecentPrioritizationFees',
params : [] // 官方文档:该方法无参数
};

// 通过线程私有 safeFetch 发送
const res = await safeFetch(rpcUrl, {
method : 'POST',
headers: { 'Content-Type': 'application/json' },
body : JSON.stringify(body),
});

const json = await res.json();

if (json.error) {
console.warn('[priorityFee] RPC 返回错误,使用默认 5000μ');
return { microLamports: 5_000 };
}

const fees = json.result || [];
if (!Array.isArray(fees) || fees.length === 0) {
console.warn('[priorityFee] 空结果,使用默认 5000μ');
return { microLamports: 5_000 };
}

// 取最近 150 个槽做平均
const recent = fees.slice(-150);
const avg = Math.ceil(
recent.reduce((sum, f) => sum + (f.prioritizationFee || 0), 0) /
recent.length
);

// 最低兜底 5000μ
const microLamports = Math.max(avg, 5_000);
return { microLamports };
}

// 定义全局 ALT 缓存变量
let globalAltCache = [];

// 在程序启动时加载 ALT 缓存
function initializeAltCache() {
try {
if (fs.existsSync(CACHE_FILE)) {
globalAltCache = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));
console.log(成功加载 ALT 缓存,包含 ${globalAltCache.length} 个 ALT);
} else {
console.warn('ALT 缓存文件不存在,初始化为空缓存');
globalAltCache = [];
}
} catch (e) {
console.error(加载 ALT 缓存失败:${e.message});
globalAltCache = [];
}
}

/* ---------------- safeFetch 工厂 ---------------- */
function buildSafeFetch(pool){
return async function safeFetch(url,opt={},retry=pool.list.length){
let i=0;
while(i<retry){
const agent=pool.getAgent();
try{
const res=await fetch(url,{...opt,agent});
if(res.status>=500) throw new Error(HTTP ${res.status});
return res;
}catch(e){
//console.log(❌ 代理 ${pool.list[pool.idx]} 失败: ${e.message});
pool.next();i++;}}
//throw new Error(全部代理均失败: ${url});
throw new Error(``);

}
}
// (1) 在文件开头 (或至少在 createWorker / doWork 之前) 添加一个调试签名函数
function signWithDebug(tx, signers, contextInfo = {}) {
console.log('>>> [signWithDebug] 即将签名 transaction');
if (contextInfo) {
console.log('>>> [signWithDebug] 额外上下文:', JSON.stringify(contextInfo, null, 2));
}

// 可以先检查 transaction.message 里的 addressTableLookups / staticAccountKeys / instructions
try {
// 在这里可手动调试 transaction.serialize() 以打印每一步
// console.log('>>> [signWithDebug] serialize check: ', tx.serialize().toString('base64'));

tx.sign(signers);
console.log('>>> [signWithDebug] 签名成功');
} catch (error) {
console.error('!!! [signWithDebug] 签名报错:', error.message);
console.error('>>> error stack:', error.stack); // 打印堆栈

// 尝试查看 transaction 的关键信息
try {
console.error(
'>>> debug: transaction.message (JSON)',
JSON.stringify(tx.message, null, 2)
);
} catch (e2) {
console.error('>>> transaction.message JSON.stringify 再次异常:', e2.message);
}

// 也可以遍历一下 addressTableLookups
try {
const lookups = tx.message.addressTableLookups || [];
console.log('>>> addressTableLookups 条数:', lookups.length);
lookups.forEach((l, idx) => {
console.log(--- lookup[${idx}]:, l);
});
} catch (e3) {
console.error('>>> dump lookups 异常:', e3.message);
}

// 最后抛出原始错误,不要吞掉
throw error;
}
}

/* =================================================================
createWorker —— 每并发线程
================================================================= */
function createWorker(threadId, proxies, tokens){
const proxyPool = new ProxyPool(proxies);
const safeFetch = buildSafeFetch(proxyPool);

const MAIN_RPC = 'https://api.mainnet-beta.solana.com';
/* -------- Jito bundle工具(全部走 safeFetch) -------- /
const JITO_EP=[ 'https://mainnet.block-engine.jito.wtf/api/v1/bundles',
'https://amsterdam.mainnet.block-engine.jito.wtf/api/v1/bundles',
'https://frankfurt.mainnet.block-engine.jito.wtf/api/v1/bundles',
'https://ny.mainnet.block-engine.jito.wtf/api/v1/bundles',
'https://tokyo.mainnet.block-engine.jito.wtf/api/v1/bundles'];
const agentJito=new HttpsProxyAgent('http://127.0.0.1:1082'); // 如需改代理自行修改
/
=========================================================================

  • checkBundleStatus —— 轮转节点,直到拿到终止态
  • • 终止态:Landed / Dropped / Expired / Rejected
  • • 初始态 / 中间态:Invalid / Submitted / Processed …
  • ======================================================================= /
    /
    ================================================================
  • util:返回一个“轮转取节点”的生成器
  • ============================================================== /
    function
    roundRobin(arr) {
    let i = 0;
    while (true) {
    yield arr[i % arr.length];
    i += 1;
    }
    }

// 放在 createWorker 里,保持线程私有
const jitoUrlIter = roundRobin(JITO_EP);

/* -------- getLatestBlockhash(按指定实现) -------- */
async function getLatestBlockhash(){
const res = await safeFetch(MAIN_RPC,{
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify({jsonrpc:'2.0',id:1,method:'getLatestBlockhash',
params:[{commitment:'confirmed'}]}),
});
const data = await res.json();
if(data.error) throw new Error(data.error.message);
if(data.result) return {
blockhash:data.result.value.blockhash,
lastValidBlockHeight:data.result.value.lastValidBlockHeight,
};
throw new Error('No blockhash data in response');
}

/* -------- getAccountInfo1 & ALT 解析 -------- */
// 简单的数组 chunk 函数
function chunkArray(arr, size) {
const ret = [];
for (let i = 0; i < arr.length; i += size) {
ret.push(arr.slice(i, i + size));
}
return ret;
}

/**

  • 批量拉取 ALT table,并把原始 b64 一并返回
  • @param {string[]} keys - base58 字符串数组
  • @returns {Promise<{key: PublicKey, state: AddressLookupTableAccount, raw: string}[]>}
    */
    async function getAltAccounts(keys) {
    const uniqueKeys = Array.from(new Set(keys));
    const batches = chunkArray(uniqueKeys, 100);
    const altResults = [];

for (const batch of batches) {
const body = {
jsonrpc: '2.0',
id : 1,
method : 'getMultipleAccounts',
params : [
batch,
{ encoding: 'base64', commitment: 'confirmed' }
]
};
const res = await safeFetch(MAIN_RPC, {
method : 'POST',
headers: { 'Content-Type': 'application/json' },
body : JSON.stringify(body),
});
const json = await res.json();
if (json.error) throw new Error(json.error.message);

text
const accounts = json.result.value || []; for (let i = 0; i < batch.length; i++) { const info = accounts[i]; if (!info?.data) continue; // 取出 Base64 字符串 const b64 = Array.isArray(info.data) ? info.data[0] : info.data; const buf = Buffer.from(b64, 'base64'); try { // 反序列化出 wrapper const state = AddressLookupTableAccount.deserialize(buf); altResults.push({ key : new PublicKey(batch[i]), state, raw : b64, // <- 把原始 b64 带出来 }); } catch (e) { console.warn(`[getAltAccounts] 解析 ALT 失败: ${batch[i]}`, e.message); } }

}

return altResults;
}
/* -------- Jupiter 助手 -------- */
const JUP='https://quote-api.jup.ag/v6';
const jQuote=qs=>safeFetch(${JUP}/quote?${qs}).then(r=>r.json());
const jIx=body=>safeFetch(${JUP}/swap-instructions,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)}).then(r=>r.json());

/* -------- VersionedTx 构造工具 -------- /
function createVersionedTransaction(
instructions,
payer,
addressLookupTableAccounts,
recentBlockhash,
computeUnits,
microLamports = 0, // 新增参数
tipAmount
) {
const computeBudgetIx = ComputeBudgetProgram.setComputeUnitLimit({
units: computeUnits,
});
/
---------- CU Price(90 % 逻辑兜底) ---------- /
/

const microLamports = priorityFeeLamports !== null
? priorityFeeLamports
: Math.max(5_000, Math.floor(expectedProfit * 0.9));
*/

const priorityFeeIx = ComputeBudgetProgram.setComputeUnitPrice({
microLamports: microLamports,
});

//const tipAccountPubkey = new PublicKey("96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5");
//使用多个tip账户以提高成功率
// Jito官方tip账户池
const tipAccounts = [
"96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5",
"HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe",
"Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY",
"ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49",
"DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh",
"ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt",
"DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL",
"3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT"
];

// 随机选择一个tip账户
const tipAccountPubkey = new PublicKey(
tipAccounts[Math.floor(Math.random() * tipAccounts.length)]
);

// 动态计算tip:利润的1-5%,但至少1000 lamports
//let tipAmount = Math.max(1000, Math.floor(expectedProfit * 0.02)); // 2%的利润作为tip

// 设置一个合理的上限,避免tip过高
//tipAmount = Math.min(tipAmount, 50000); // 最多0.05 SOL

text
const tipInstruction = SystemProgram.transfer({ fromPubkey: keypair.publicKey, toPubkey: tipAccountPubkey, lamports:tipAmount// 10000, });

const finalInstructions = [computeBudgetIx, priorityFeeIx, ...instructions, tipInstruction];

const messageV0 = new TransactionMessage({
payerKey: payer,
recentBlockhash: recentBlockhash,
instructions: finalInstructions,
}).compileToV0Message(addressLookupTableAccounts.filter(Boolean));

return new VersionedTransaction(messageV0);
}

async function jitoCall(method,params){
const url=JITO_EP[Math.floor(Math.random()*JITO_EP.length)];
const res=await safeFetch(url,{
method:'POST',agent:agentJito,
headers:{'Content-Type':'application/json'},
body:JSON.stringify({jsonrpc:'2.0',id:1,method,params})});
const json=await res.json(); if(json.error) throw new Error(json.error.message);
return json.result;
}
//const createJitoBundle = (tx)=>bs58.encode(tx.serialize());
//const sendJitoBundle = (bundle)=>jitoCall('sendBundle',[bundle]);
//const checkBundleStatus= (id)=>jitoCall('getInflightBundleStatuses',[[id]]);

/* -------- Priority Fee 取平均 -------- */

/* ---------- Jito bundle 工具 ---------- */
async function createJitoBundle(versionedTx) {
//const bundle = bs58.encode(transaction.serialize());
//return bundle;
// 单笔交易就返回长度为 1 的数组;多笔时 push 即可
return [ bs58.encode(versionedTx.serialize()) ];
/*如果以后要一次发多笔,只需
const bundle = [
bs58.encode(tx1.serialize()),
bs58.encode(tx2.serialize()),
...
];

  */

}
function buildBundle(base58Tx) {
return {
encodedTransactions: [base58Tx],
bundleName : uuidv4(), // 方便排查
// tipTx : '<可选补充 tip 交易>'
};
}
/* -----------------------------------------------------------

  • sendJitoBundle —— 内建限流退避
  • • 默认最多 retry 5 次
  • • 收到 429 时:指数退避 (500ms * 2^n) + 随机 0-500ms
  • • 其他 HTTP≥400 直接抛错
  • --------------------------------------------------------- */
    async function sendJitoBundle(transactions, region = 'tokyo',maxRetry = 5) {
    // 1. 先序列化,再用 bs58 做 BASE-58 编码
    //const base58Tx = bs58.encode(transactions.serialize());
    //const base58Tx = bs58.encode(transactions.serialize());
    //const bundle = buildBundle(base58Tx);
    const base64Tx = Buffer.from(transactions.serialize()).toString('base64');
    //const bundle = buildBundle(base64Tx);// buildBundle 内只做包裹

for (let attempt = 0; attempt < maxRetry; attempt++) {
const url= jitoUrlIter.next().value;// 轮转节点
const agentJito = new HttpsProxyAgent(http://127.0.0.1:1082);
const resp = await safeFetch(url, {
method : 'POST',
agent : agentJito,
headers: { 'Content-Type': 'application/json' },
body : JSON.stringify({
jsonrpc: '2.0',
id : 1,
method : 'sendBundle',
params: [[base64Tx]]// 双层数组
}),
});

text
/* -------- 2xx 正常返回 -------- */ if (resp.ok) { const json = await resp.json(); return json.result; // bundleId } /* -------- 429 -> 退避重试 -------- */ if (resp.status === 429) { /* const base = 500 * 2 ** attempt; const jitter = Math.floor(Math.random() * 500); const wait = base + jitter; console.warn(`⚠️ 429 TooManyRequests,${wait}ms 后重试 (${attempt + 1}/${maxRetry})`); await new Promise(r => setTimeout(r, wait)); */ console.warn(`⚠️ 429 TooManyRequests @ ${url},切换节点后重试 (${attempt+1}/${maxRetry})`); // 不休眠,直接继续循环(已换节点) continue; } /* -------- 其它 4xx/5xx:打印具体错误并抛 -------- */ const errText = await resp.text(); // 读取返回体,看具体错误 throw new Error(`HTTP ${resp.status} → ${errText}`);

}
throw new Error('sendJitoBundle retry exhausted');
}
/**

  • 轮询查询 bundle 状态
  • 返回格式示例:
  • { bundle_id, status: 'Processed'|'Dropped'|'Invalid', landed_slot }
    /
    /
    *
  • 轮询查询 bundle 状态:
  • • Landed / Failed → 立即返回状态
  • • 其他状态 → 等待 500ms 后继续查询
  • @param {string} bundleId
  • @param {number} maxRetries 最多尝试次数
  • @returns {Promise<string>} 最终状态(Landed 或 Failed)
    */
    async function checkBundleStatus(bundleId, maxRetries = 60) {
    const requestBody = {
    jsonrpc: "2.0",
    id: 1,
    method: "getInflightBundleStatuses",
    params: [[bundleId]],
    };

let tries = 0;
while (tries < maxRetries) {
// 轮换 Jito 节点
const url = jitoUrlIter.next().value;
tries++;

text
try { const resp = await safeFetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), }); // 解析 RPC 返回 const json = await resp.json(); const info = json.result?.value?.[0]; if (info && info.status) { const st = info.status; console.log(`[轮询#${tries}] bundle ${bundleId} 状态 = ${st}`); // 如果命中终态,就直接返回 if (st === "Landed" || st === "Failed") { return info; } } } catch (e) { console.warn(`[轮询#${tries}] 查询失败: ${e.message}`); // 可视情况 decide:这里也算一次尝试,或直接继续不计数 } // 500ms 后再次尝试 await new Promise(r => setTimeout(r, 500));

}

throw new Error(达到最大重试次数 ${maxRetries},仍未得到 Landed/Failed);
}
async function getIxSafeaa(quote,lookupKeys,slippageBps) {
try {
return await jIx(buildIxBody(quote, lookupKeys));
} catch (e) {
if (e.message?.includes('6001')) { // SlippageExceeded
console.warn('↪ 降级到 3% 滑点重试');
return await jIx({
...buildIxBody(quote, lookupKeys),
slippageBps: slippageBps * 2 // 3%
});
}
throw e;
}
}
async function getIxSafe12(quote, lookupKeys, slippageBps) {
try {
return await jIx(
buildIxBody(quote, prioMicroLamports, slippageBps, lookupKeys)
);
} catch (e) {
if (e.message?.includes('6001')) {
// 降级滑点重试
return await jIx({
...buildIxBody(quote, prioMicroLamports, slippageBps * 2, lookupKeys),
});
}
throw e;
}
}
// ==== 新版:把 prioMicroLamports 也作为参数传进来 ====
async function getIxSafe33 (
quote,
lookupKeys,
slippageBps,
prioMicroLamports // <—— 新增
) {
try {
// 第一次调用,按原始 slippage 生成指令
return await jIx(
buildIxBody(quote, prioMicroLamports, slippageBps, lookupKeys)
);
} catch (e) {
// Jupiter 自定义错误 6001 = SlippageExceeded
if (e.message?.includes('6001')) {
console.warn('↪ SlippageExceeded,自动 x2 重新请求');
return await jIx(
buildIxBody(quote, prioMicroLamports, slippageBps * 2, lookupKeys)
);
}
throw e; // 其它错误照旧抛
}
}
async function getIxSafe(quote, lookupKeys, slippageBps, prioMicroLamports) {
const body = buildIxBody(quote, prioMicroLamports, slippageBps, lookupKeys);
const response = await jIx(body);
if (response.error) {
if (response.error.code === '6001') { // SlippageExceeded
console.warn('↪ SlippageExceeded,自动 x2 重新请求');
return await getIxSafe(quote, lookupKeys, slippageBps * 2, prioMicroLamports);
} else {
throw new Error(Jupiter API error: ${response.error.message});
}
}
return response;
}

// ① 把滑点、ALT、maxAccounts 全塞进去
// -------------------------------------------------------------
// quote : Jupiter /quote 的原响应
// lookupKeys : 需要引用的 ALT pubkey[](≤32)
// slippageBps : 这条 quote 希望容忍的滑点
// -------------------------------------------------------------
/* ---------- 1. 先把 buildIxBody 写好(不需要 lookupKeys) ---------- */
// 修改签名,多加一个第四参:lookupKeys,默认空数组
function buildIxBody(
quote,
prioMicroLamports,
slippageBps,
lookupKeys = []
) {
return {
quoteResponse : quote,
userPublicKey : keypair.publicKey.toBase58(),
wrapAndUnwrapSol : true,
dynamicComputeUnitLimit : true,
prioritizationFeeLamports: prioMicroLamports,
slippageBps : slippageBps,
maxAccounts : maxAccounts,
// 新增:让 Jupiter 直接在指令里引用 ALT
addressLookupTableAddresses: lookupKeys,
};
}
function trimAltaa(alt) {
if (!alt || !alt.addresses) return null; // <── 先兜底
if (alt.addresses.length < 256) return alt; // OK

// 生成一个“浅拷贝 + slice(0,255)”的新实例
return new AddressLookupTableAccount({
key : alt.key,
state : { ...alt.state, addresses: alt.addresses.slice(0, 255) }
});
}
function trimAltaaa(alt) {
if (!alt || !alt.state || !Array.isArray(alt.addresses)) return null;
if (alt.addresses.length < 256) return alt;
return new AddressLookupTableAccount({
key : alt.key,
state: { ...alt.state, addresses: alt.addresses.slice(0, 255) }
});
}
function trimAlt(alt) {
if (!alt || !alt.state || !Array.isArray(alt.addresses)) return null;
if (alt.addresses.length < 256) return alt;
return new AddressLookupTableAccount({
key : alt.key,
state: { ...alt.state, addresses: alt.addresses.slice(0, 255) }
});
}
function isMessageTooBig(message) {
// ① static keys 本身
if (message.staticAccountKeys.length >= 256) return true;

// ② 每条指令里的最大索引
return message.compiledInstructions.some(ix =>
ix.accountKeyIndexes.some(i => i >= 256)
);
}
/* ---------- helper:按 255 上限裁剪 ALT ---------- */
function trimAltSet(staticCnt, altStates) {
const out = [];
let total = staticCnt;

for (const tbl of altStates) {
const sz = tbl.addresses.length;
if (total + sz >= 256) break; // 再加就爆
out.push(tbl);
total += sz;
}
return out;
}

/* -------- 模拟交易 -------- /
/
------------------------------------------------------------------

  • simulateTransaction()
  • • 任何 RangeError/overruns 视为 “尺寸超限” 直接返回 null
  • • 调用方只要 if (!sim) return 即可跳过本轮
  • -----------------------------------------------------------------*/
    async function simulateTransaction(instr, payer, alts) {
    //const latest=await getLatestBlockhash();
    // 1. 用假 blockhash 编译一次,只为组装 message
    const msgV0 = new TransactionMessage({
    payerKey : payer,
    //recentBlockhash:latestBlockhashData.blockhash,// '11111111111111111111111111111111', // dummy
    recentBlockhash:'11111111111111111111111111111111', // dummy
    instructions : instr,
    }).compileToV0Message(alts.filter(Boolean));

// 2. 粗测 static+ALT 总量,>255 直接跳过
if (isMessageTooBig(msgV0)) return null;

// 3. serialize 可能仍触发 RangeError → 捕获并返回 null
let tx64;
try {
tx64 = Buffer
.from(new VersionedTransaction(msgV0).serialize())
.toString('base64');
} catch (e) {
if (e instanceof RangeError &&
e.message.includes('overruns Uint8Array')) {

text
dumpMessageDetail(msgV0, alts);// ← 新增 console.warn('[simulate] serialize 超限,跳过本轮'); return null; // 让 caller 直接 continue } throw e; // 其它错误照旧抛出

}

// 4. 真正 RPC simulate
const res = await safeFetch(MAIN_RPC, {
method : 'POST',
headers: { 'Content-Type':'application/json' },
body : JSON.stringify({
jsonrpc: '2.0',
id : 1,
method : 'simulateTransaction',
params : [
tx64,
{ encoding:'base64', sigVerify:false, replaceRecentBlockhash:true }
]
})
}).then(r => r.json());

return res;
}
/* ===========================================================

  • dumpMessageDetail —— 把静态 key、ALT、指令索引全部打印

  • ========================================================= */
    function dumpMessageDetail(msgV0, altStates = []) {
    try {
    const staticKeys = msgV0.staticAccountKeys.map(k => k.toBase58());

    // 汇总每张 ALT 的地址个数
    const altSummary = altStates.map((alt, idx) => ({
    idx,
    key : (alt.key || alt.addresses?.[0]).toBase58?.() ?? 'n/a',
    addrCnt : alt.addresses.length
    }));

    // 找出所有指令里最大的 accountKeyIndex
    const maxIdxEachIx = msgV0.compiledInstructions.map(ix =>
    Math.max(...ix.accountKeyIndexes)
    );

    console.warn('====== [Message Detail] ======');
    console.warn('• staticAccountKeys.len =', staticKeys.length);
    console.warn('• ALT 数量 =', altStates.length);
    console.warn(' ', JSON.stringify(altSummary, null, 2));
    console.warn('• 各指令最大索引 =', maxIdxEachIx);
    console.warn('==============================');
    } catch (dumpErr) {
    console.error('[dumpMessageDetail] 解析失败:', dumpErr.message);
    }
    }

// 修改后的 loadAltAccountsWithCache 函数,仅从全局缓存中获取 ALT
// ------------------ ALT 读取 / 写回缓存 ------------------
async function loadAltAccountsWithCache(keys) {
try {
/* -------- 1. 准备 -------- */
const toStr = k => (typeof k === 'string' ? k : k.toBase58());
const cacheMap = new Map(globalAltCache.map(i => [i.key, i.data]));
const uniqKeys = [...new Set(keys.map(toStr))];

text
const hitTables = []; // 命中缓存的 ALT const missKeys = []; // 缺失的 key(需 RPC) /* -------- 2. 命中缓存 -------- */ for (const k of uniqKeys) { const raw = cacheMap.get(k); if (!raw) { // 文件里没有 missKeys.push(k); continue; } try { const tbl = AddressLookupTableAccount.deserialize( Buffer.from(raw, 'base64')); // deserialize 不带 key,手动补一下,便于后续打印 tbl.key = new PublicKey(k); hitTables.push(tbl); } catch { // 反序列化失败 → 视作 miss missKeys.push(k); } } /* -------- 3. RPC 拉取缺失 ALT -------- */ let newTables = []; if (missKeys.length) { const fetched = await getAltAccounts(missKeys); // [{ key, state, raw }] for (const { key, state, raw } of fetched) { // state 本身就是 AddressLookupTableAccount state.key = key; // 同样补 key newTables.push(state); // 落盘缓存 if (raw) { globalAltCache.push({ key: key.toBase58(), data: raw }); } } // 刷盘 try { fs.writeFileSync(CACHE_FILE, JSON.stringify(globalAltCache, null, 2)); console.log(`更新 ALT 缓存,新增 ${newTables.length} 个 ALT`); } catch (e) { console.error(`更新 ALT 缓存失败:${e.message}`); } } /* -------- 4. 合并返回 -------- */ return [...hitTables, ...newTables];

} catch (e) {
console.error(加载 ALT 失败:${e.message});
return [];
}
}
async function getFeeForMessageRPC(msgV0) {
const res = await safeFetch(MAIN_RPC, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getFeeForMessage',
params: [Buffer.from(msgV0.serialize()).toString('base64')],
}),
});

const data = await res.json();

//fs.writeFileSync("11.txt", JSON.stringify(data, null, 2));

if (data.error) {
throw new Error(data.error.message);
}
if (data.result && typeof data.result.value === 'number') {
//return data.result.value; // 费率(lamports)
const val = data?.result?.value;
if (typeof val === 'number') return val;
console.warn('[getFeeForMessageRPC] 返回了非数字 fee,使用兜底 5000');
return 5_000;

}
throw new Error('No fee data in response');
}

/* ============================================================

  • ===== [SIZE_FIX_START] 更严格的 ALT 尺寸控制 =====
  • 原理:
    1. 先将 ALT 按 addresses.length 从大到小排序;
    1. 带入 compileToV0Message 做一次“真实”尺寸检测;
    1. 若仍超限,循环删除“最大的那张 ALT”重试,直到:
  •   • staticKeys + ΣALT.addresses < 256 且
    
  •   • 所有 accountKeyIndex < 256
    
    1. 如果删光 ALT 仍超限,则返回空数组,转为“无 ALT”版本。
  • ========================================================== */
    function strictTrimAlt99(instr, payer, originAlts,DUMMY_BH) {
    // <── 新增:空值直接返回 []
    if (!originAlts || !Array.isArray(originAlts) || originAlts.length === 0) {
    return []; // 让调用方按 “无 ALT” 继续
    }
    // ① 先确保 alt 都是有效对象
    originAlts = (originAlts || []).filter(a => a && a.addresses);

// 没有可用 ALT 直接返回 []
if (originAlts.length === 0) return [];
// ① 拷贝一份并按地址数降序排,越大的越先被剔除
const sorted = [...originAlts].sort(
//(a, b) => (b.addresses.length - a.addresses.length)
(a, b) => (b.addresses.length - a.addresses.length)
);

// ② 循环迭代,直到满足 isMessageTooBig === false
while (true) {
const msg = new TransactionMessage({
payerKey : payer,
recentBlockhash: DUMMY_BH, // dummy,尺寸检测即可
instructions : instr,
}).compileToV0Message(sorted.filter(Boolean));

text
if (!isMessageTooBig(msg)) { return sorted; // ← OK,返回当前 ALT 集合 }

/*
if (sorted.length === 0) {
return []; // 全删光依旧超 → 干脆不用 ALT
}
*/
if (sorted.length === 0) return []; // ← 交由调用方判空

text
// ③ 删除当前“最大的”一张 ALT,继续循环 sorted.shift();

}
}
/* ==============================================================

  • strictTrimAlt —— 地址粒度裁剪,保证至少留 1 张 ALT
  • ============================================================== */
    function strictTrimAlt(instr, payer, originAlts, DUMMY_BH) {
    if (!Array.isArray(originAlts) || originAlts.length === 0) return [];

// 过滤非法对象并按地址数降序排
let sorted = originAlts
.filter(t => Array.isArray(t.addresses) && t.addresses.length)
.sort((a, b) => b.addresses.length - a.addresses.length);

while (true) {
// ① 尝试编译
const msg = new TransactionMessage({
payerKey : payer,
recentBlockhash: DUMMY_BH,
instructions : instr,
}).compileToV0Message(sorted);

text
if (!isMessageTooBig(msg)) return sorted; // 已满足尺寸 /* ---- 未通过尺寸检查 ---- */ if (sorted.length > 1) { // 还有不止 1 张 → 整张删 sorted.shift(); continue; } /* 只剩最后 1 张 ALT —— 做地址粒度裁剪 */ const last = sorted[0]; const spare = 255 - msg.staticAccountKeys.length; // 还能容纳的地址数 const target = Math.max(0, spare - 1); // 留一点余地 if (target <= 0) return []; // 无论如何都会超 // slice 并重新编译验证 last.state.addresses = last.addresses.slice(0, target); last.addresses = last.state.addresses; // 保证 getter 一致

}
}
// ===== [SIZE_FIX_END] =====
// Jupiter 的 swap*Instruction 里 已经带了一条 setComputeUnitLimit
// 先把它们剔掉
function stripCbIx(instructions=[]){
return instructions.filter(ix =>
!ix.programId.equals(ComputeBudgetProgram.programId));
}
function safeDeserialize(ixB64){
if (!ixB64) return null; // ① 彻底过滤 undefined / ''
try {
return deserializeInstruction(ixB64); // ② 正常反序列化
} catch(e){
console.warn('[deserialize] 跳过异常指令:', e.message);
return null; // ③ 任何解析异常也返回 null
}
}
function filterValidInstructions(ixs) {
return ixs.filter(ix => ix != null);
}

/* ---------------- 线程主逻辑 ---------------- */
async function doWork(){
try{
const token=tokens[Math.floor(Math.random()tokens.length)];
//const token='EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
const amt=BASE_AMOUNT_SOL
LAMPORTS_PER_SOL;
//增加滑点容忍度: 从 slippageBps=50 (0.5%) 增加到 slippageBps=100 (1%)
//alt賬戶:256 上限
const qIn =await jQuote(inputMint=So11111111111111111111111111111111111111112&outputMint=${token}&amount=${amt}&onlyDirectRoutes=false&maxAccounts=${maxAccounts}&slippageBps=${SLIPPAGE_BPS});
//console.log([T${threadId}] token ${token} profit ${profit});
//console.log([T${threadId}] qIn:, JSON.stringify(qIn));

text
if(!qIn?.outAmount) return; const qOut=await jQuote(`inputMint=${token}&outputMint=So11111111111111111111111111111111111111112&amount=${qIn.outAmount}&onlyDirectRoutes=false&maxAccounts=${maxAccounts}&slippageBps=${SLIPPAGE_BPS0}`); if(!qOut?.outAmount) return; const profit=qOut.outAmount-amt; //console.log(`[T${threadId}] token ${token} profit ${profit}`); // ==== PATCH-BEGIN (放在 profit 计算完之后) ====

/**

  • 动态滑点(bps) 0.5% ≤ slip ≤ 50%
  • 当利润越大 → 允许滑点越大;保证最小 50bps,最大 5 000bps
    /
    /

    const dynSlipInBps = Math.min(
    5_000,
    Math.max( 50, Math.ceil(0.8 * profit / qIn .outAmount * 10_000) )
    );
    const dynSlipOutBps = Math.min(
    5_000,
    Math.max( 50, Math.ceil(0.8 * profit / qOut.outAmount * 10_000) )
    );
    */
    //800 bps (=0.8 %)
    //0.8% 封顶;而且把第二跳最小值调到 100bps,不容易 6001
    const dynSlipInBps = Math.min(800, Math.max(SLIPPAGE_BPS, profit * 1e4 / qIn.outAmount ));
    const dynSlipOutBps = Math.min(1500, Math.max(SLIPPAGE_BPS0, profit * 1e4 / qOut.outAmount ));
    //console.log([T${threadId}] token ${token} profit ${profit} dynSlipInBps ${dynSlipInBps} dynSlipOutBps ${dynSlipOutBps});

// ==== PATCH-END ====
//为正-不亏本
const solProfit = profit / LAMPORTS_PER_SOL;
const usdtProfit = solProfit150;
if (qOut.outAmount>=amt) {
const now = new Date().toLocaleString();
fs.appendFileSync('不亏本.txt',[T${threadId}] [${now}] 使用 token: ${token} 利润: ${profit} lamports (${solProfit} SOL) ${usdtProfit} usdt \n);
}
if(profit<MIN_PROFIT_FIXED) return;//提高利润门槛: 从 15,000 增加到 20,000+ lamports
/
计算优先费:利润的 90%(向下取整) */
// ① 计算 90 %,单位 μ-lamports;5_000 兜底
const prioMicroLamports = Math.max(5_000, Math.floor(profit * 0.9));
let swapIn, swapOut;
let lookupKeys;
//let altAcc;
let altStates;
let instr;
let altWrappers;

try
{

/*
[swapIn,swapOut]=await Promise.all([
jIx({quoteResponse:qIn,userPublicKey:keypair.publicKey.toBase58(),wrapAndUnwrapSol:true,dynamicComputeUnitLimit:true,prioritizationFeeLamports:prioMicroLamports}),
jIx({quoteResponse:qOut,userPublicKey:keypair.publicKey.toBase58(),wrapAndUnwrapSol:true,dynamicComputeUnitLimit:true,prioritizationFeeLamports:prioMicroLamports}),
]);
/
/

[swapIn, swapOut] = await Promise.all([
jIx(buildIxBody(qIn,lookupKeys,lookupKeys)),
jIx(buildIxBody(qOut,lookupKeys, lookupKeys)),
]);
/
/
---------------- 请求 swap-instructions ---------------- /
/
---------- 2. 先请求 swap-instructions ---------- /
// 注释掉原来的 jIx 调用
/

[swapIn, swapOut] = await Promise.all([
jIx(buildIxBody(qIn,prioMicroLamports, SLIPPAGE_BPS )), // 0.5 %
jIx(buildIxBody(qOut,prioMicroLamports, SLIPPAGE_BPS0)), // 1.5 %
]);
/
//第一步:不带任何 lookupKeys,获取 “推荐的” ALT keys
const [firstIn, firstOut] = await Promise.all([ getIxSafe(qIn, [], dynSlipInBps ,prioMicroLamports), getIxSafe(qOut, [], dynSlipOutBps,prioMicroLamports), ]);
if (!firstIn || !firstOut) return; // 防御
// 拿到所有推荐的 ALT 公钥
lookupKeys = [ ...firstIn.addressLookupTableAddresses, ...firstOut.addressLookupTableAddresses, ];
// —— 加载并裁剪 ALT accounts,得到 altStates
altWrappers = await loadAltAccountsWithCache(lookupKeys);
//altStates = (altWrappers || []) // ← 避免 null
//.filter(w => w.addresses && w.addresses.length < 256) // ✅ 直接用 wrapper
//.map(trimAlt) // 先把 256+ 的表裁成 255
//.slice(0, 32); // 最多 32 张
/

.map(w => (w.addresses ? w // 已经是 ALT
: w.state ? new AddressLookupTableAccount({ // wrapper → ALT
key : w.key,
state: w.state,
})
: null) // 其它格式直接抛
)
.map(trimAlt) // 可能返回 null
.filter(Boolean) // 把 null/undefined 统统去掉
.slice(0, 32);
*/
altStates = (altWrappers || [])
.map(trimAlt) // 直接裁剪
.filter(Boolean)
.slice(0, 32);

/*
let altStates = altWrappers .map(w => { w.state.key = w.key;
return w.state; }).filter(s => s.addresses.length < 256) .slice(0, 32); // (这里还可以再走 strictTrimAlt/trimAltSet 的逻辑)
*/

// —— 第二步:带上 lookupKeys,拿到真正要用的指令
[swapIn, swapOut] = await Promise.all([ getIxSafe(qIn, lookupKeys, dynSlipInBps ,prioMicroLamports), getIxSafe(qOut, lookupKeys, dynSlipOutBps,prioMicroLamports), ]);

console.log([T${threadId}] swapIn:, JSON.stringify(swapIn));
console.log([T${threadId}] swapOut:, JSON.stringify(swapOut));
//
// 只取核心 swapInstruction,去掉 setup/cleanup(你也可以按需保留)
//const instr = [ deserializeInstruction(swapIn.swapInstruction), deserializeInstruction(swapOut.swapInstruction), ];

// 新:带滑点重试的安全接口
/*
[swapIn, swapOut] = await Promise.all([
getIxSafe(qIn, lookupKeys, SLIPPAGE_BPS),
getIxSafe(qOut, lookupKeys, SLIPPAGE_BPS0),
]);
/
/

instr=[...swapIn.setupInstructions.map(deserializeInstruction),
deserializeInstruction(swapIn.swapInstruction),
deserializeInstruction(swapOut.swapInstruction),
deserializeInstruction(swapOut.cleanupInstruction)];
/
/

const inIxs = stripCbIx([
...(swapIn.setupInstructions || []).map(safeDeserialize),
safeDeserialize(swapIn.swapInstruction),
]).filter(Boolean); // ④ 过滤 null

const outIxs = stripCbIx([
safeDeserialize(swapOut.swapInstruction),
safeDeserialize(swapOut.cleanupInstruction), // 允许 undefined
]).filter(Boolean);
*/
const rawInIxs = [
...(swapIn.setupInstructions || []).map(safeDeserialize),
safeDeserialize(swapIn.swapInstruction),
];
const validInIxs = filterValidInstructions(rawInIxs);
const inIxs = stripCbIx(validInIxs);
const rawOutIxs = [
safeDeserialize(swapOut.swapInstruction),
safeDeserialize(swapOut.cleanupInstruction),
];
const validOutIxs = filterValidInstructions(rawOutIxs);
const outIxs = stripCbIx(validOutIxs);

instr = [...inIxs, ...outIxs]; // 绝不包含 undefined
if (!Array.isArray(instr) || instr.length === 0) return;

} catch (error) {
console.error('!!! [instr] 报错:', error.message);
console.error('>>> error stackaa:', error.stack); // 打印堆栈
}
/* ---------- 3. 收集 ALT pubkey,再去加载 ---------- /
const DUMMY_BH ='11111111111111111111111111111111'; // 32 个字符
const tmpMsg = new TransactionMessage({
payerKey: keypair.publicKey,
recentBlockhash: latestBlockhashData.blockhash,
instructions: instr,
}).compileToV0Message([]); // 先不用 ALT
const staticCnt = tmpMsg.staticAccountKeys.length;
if (staticCnt > 38 && altStates.length === 0) {
console.warn([T${threadId}] static=${staticCnt} 无 ALT,必超 1232B → skip);
return;
}
//altStates = trimAltSet(staticCnt, altStates);
/
---------- 使用严格裁剪替换旧逻辑 ---------- */
//兜底:如果 strictTrimAlt 返回 null(全部裁到不能用)就转成 []:
altStates = strictTrimAlt(instr, keypair.publicKey, altStates,latestBlockhashData.blockhash)|| [];

/* ---------- 全局 255 兜底裁剪 ---------- */
//altStates = trimAltSet(staticCntRough, altStates);

/* 若仍 >255(极端情况),干脆清空,走无 ALT 版本 */
const totalAddr = staticCnt +
altStates.reduce((n,t)=>n+t.addresses.length,0);
if (totalAddr >= 256) altStates = [];

/* 若数量不一致,打印一下方便对照 */
if (altStates.length !== altWrappers.length && altStates.length > 0) {
console.warn([ALT] ${altWrappers.length} => ${altStates.length} 有效 ALT);
}

console.log([T${threadId}] token ${token} profit ${profit} step1);

// ---------- DEBUG: 把 altStates dump 到 a.txt ----------
// ② dump 前再检查一次
try {
if (altStates.length) {
const dump = altStates.map((s, i) => ({
idx : i,
//key : s.key.toBase58(),
key: (s.key ?? new PublicKey(lookupKeys[i])).toBase58(),
addresses : s.addresses.length,
}));
/*
fs.writeFileSync(
${token}.txt,
[${new Date().toLocaleString()}] altStates(${altStates.length})\n +
JSON.stringify(dump, null, 2) + '\n\n',
{ flag: 'a' }
);
/
} else {
/

fs.writeFileSync(
${token}.txt,
[${new Date().toLocaleString()}] altStates(0)\n\n,
{ flag: 'a' }
);
*/

}
} catch (e) {
console.warn('❗ dump altStates 失败:', e.message);
}

//盈虧控制 start
// 1) 估算 CU
//let computeUnits =COMPUTE_UNIT_FALLBACK;//优先费 200_000; // fallback(约 200K CU)
//try {
const sim= await simulateTransaction(instr, keypair.publicKey, altStates);
if (!sim || !sim.result) {
// ① simulate 为空的分支
console.error(
[T${threadId}] token ${token} profit ${profit} [simulate] 空 result,完整响应 =,
JSON.stringify(sim, null, 2)
);

return; // 或者 throw,自行決定
}
// ② simulate 正常的分支
console.log(
[T${threadId}] token ${token} profit ${profit} [simulate] result =\n,
JSON.stringify(sim.result, null, 2)
);

/*
if (sim.value.err) {
throw new Error(交易模拟失败: ${JSON.stringify(sim.value.err)});
}
/
if (sim.result.value?.err) {
throw new Error(交易模擬失敗: ${JSON.stringify(sim.result.value.err)});
}
// ---------- 估算 CU ----------
// 单笔交易里
// 1) simulate 拿 unitsConsumed
const consumed = sim.result.value.unitsConsumed || 200_000;
const computeUnits = Math.ceil(consumed * 1.1);
// 2) 签名费精确
//const msgV0 = new TransactionMessage({ /
same as createVersionedTransaction 里 */ })
//.compileToV0Message(altStates);

const msgV0 = new TransactionMessage({
payerKey : keypair.publicKey,
recentBlockhash: latestBlockhashData.blockhash, // 或 latestBlockhash.blockhash
instructions : instr,
}).compileToV0Message(altStates.filter(Boolean));

const sigFee =5_000;//await getFeeForMessageRPC(msgV0);// await connection.getFeeForMessage(msgV0);//5_000
console.log([T${threadId}] profit=${profit} sigFee=${sigFee} );
// 3) 优先费
const priorityFeeCost = Math.ceil(computeUnits * avgPriorFee / 1_000_000);
// 4) tip 固定或比例
const tipLamports = Math.min(10_000, Math.max(1_000, Math.floor(priorityFeeCost * 0.1)));
// 5) 总成本=优先费+小費+签名费
const totalCost = sigFee + priorityFeeCost + tipLamports;

// ---------- microLamports (μ-lamports / CU) ----------
//let microLamports = Math.floor(profit * 0.9 * 1_000_000 / computeUnits);
//microLamports = Math.max(5_000, Math.min(microLamports, 100_000));
// 2) 优先费单价直接用 avgPriorFee
//const microLamports = avgPriorFee;
//从固定 avgPriorFee 切到“挂钩利润”的动态 μ-lamports
/*
要确保 sigFee、computeUnits、profit 已经提前算好并在当前作用域可用。
此处用 1e6 把 lamports → μ-lamports。
/
const expectedProfit = profit - sigFee;
/

const microLamports = Math.max(
5_000,
Math.min(
Math.floor(expectedProfit1e6/ computeUnits),
200_000
)
);
/
/

优先费 μ-lamports 建议直接用 avgPriorFee × 1.2
不再跟利润耦合,避免把单价抬到 20 万:
/
//const microLamports = Math.round(avgPriorFee * 1.2);
//Priority Fee 上限 200 000μ 已够高,再乘 1.2 可能会炸,建议 Math.min(avg
1.2, 200_000)
const microLamports =Math.min(avgPriorFee
1.2, 200_000)

// ③ 成本檢查
const ta=profit - totalCost;
console.log([T${threadId}] token ${token} profit ${profit} dynSlipInBps ${dynSlipInBps} dynSlipOutBps ${dynSlipOutBps} totalCost ${totalCost} 净利润: ${ta});

if (totalCost >= profit) {
console.log([T${threadId}] 跳過:profit=${profit} cost=${totalCost} 扣费后无利润);
return;
}
// 4) 盈亏判断
if (profit - totalCost < MIN_NET_PROFIT) return;
//盈虧控制 end

//} catch (e) {
//console.warn('[simulate] 获取 unitsConsumed 失败,使用默认值 200000');
//}
console.log([T${threadId}] token ${token} profit ${profit} cost=${totalCost} computeUnits ${computeUnits} step2);
try{
//const latestBlockhash = await CONNECTION.getLatestBlockhash('finalized');
//const latestBlockhash=await getLatestBlockhash();
/*
const latestBlockhash = latestBlockhashData;
if (!latestBlockhash) {
// 还没有获取到值,可以等待或者立即调用获取
// 这里可等待首次初始化完成
latestBlockhash=await getLatestBlockhash();
}
*/
console.log([T${threadId}] token ${token} profit ${profit} latestBlockhash ${latestBlockhashData.blockhash} step2);

// 6) 创建最终交易
//const { blockhash } = await ensureFreshBlockhash();
const transaction= createVersionedTransaction(
instr,
keypair.publicKey,
altStates,
latestBlockhashData.blockhash,
computeUnits,
microLamports, // 继续传给 expectedProfit,用于后面打赏
tipLamports
);
//console.log([T${threadId}] transaction ${JSON.stringify(transaction)} step2);
console.log([T${threadId}] profit ${profit} step210);
//transaction.sign([keypair]);
//signWithDebug(transaction, [keypair])
// 将这里替换:
// transaction.sign([keypair]);
signWithDebug(transaction, [keypair], {
token,
profit,
computeUnits,
priorityFee: microLamports,
//altAccCount: altAcc?.length,
altAccCount: altStates.length // ← 修正
});

console.log([T${threadId}] profit ${profit} step211);
//const jitoBundle= await createJitoBundle(transaction);
//const jitoBundle = createJitoBundle(transaction, latestBlockhash.lastValidBlockHeight);
//console.log([T${threadId}] profit ${profit} step22);
//console.log([T${threadId}] jitoBundle ${JSON.stringify(jitoBundle)} step3);
const bundleId= await sendJitoBundle(transaction);
console.log([T${threadId}] bundleId [T${bundleId}] token ${token} profit ${profit} step4);
const bundleStatus = await checkBundleStatus(bundleId);
if (bundleStatus.status === 'Landed') {
console.log('✅ 成功落块', bundleStatus.landed_slot);
const now3 = new Date().toLocaleString();
fs.appendFileSync('落块.txt',[T${threadId}] [${now3}] 使用 token: ${token} 利润: ${profit} lamports (${solProfit} SOL) landed_slot ${bundleStatus.landed_slot} ${usdtProfit} usdt \n);

} else {
console.warn('❌ 未成功:', JSON.stringify(bundleStatus));
}
console.log('bundle: ', JSON.stringify(bundleStatus));
const now = new Date().toLocaleString();//toISOString();
fs.appendFileSync('交易.txt',[T${threadId}] [${now}] 使用 token: ${token} 利润: ${profit} lamports (${solProfit} SOL) bundle status ${JSON.stringify(bundleStatus)} bundleId ${bundleId}\n);

text
if(!bundleStatus || bundleStatus.status!=='Landed'){ throw new Error('Soory'); } console.log('========== SWAP DONE! =========='); }catch(err){ console.error('Error sending transaction:',err.message); } }catch(e){

console.error([T${threadId}] error,e.message);
console.error([T${threadId}] error stack:, e.stack); // 打印堆栈

}
}

return{doWork};
}

/* ---------------- 调度器 ---------------- */
async function main(){
console.log(启动 ${THREADS} 条逻辑线程…);
//让所有逻辑在拿到第一次 blockhash 之前不要跑
while (!latestBlockhashData || !latestBlockhashData.blockhash) {
await new Promise(r => setTimeout(r, 100));
}
// 在多线程启动前初始化 ALT 缓存
initializeAltCache();

const workers=Array.from({length:THREADS},(_,i)=>createWorker(i,PROXY_CHUNKS[i],TOKEN_CHUNKS[i]));
const setImmediatePromise = () => new Promise(res => setImmediate(res));
while(true){
await Promise.all(workers.map(w=>w.doWork()));
//await new Promise(r=>setTimeout(r,100));
await setImmediatePromise();

}
}
main().catch(console.error);

运行日志:
PS F:\v2rayN\sol_jk> node 24.js
启动 30 条逻辑线程…
(node:21124) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
(Use node --trace-warnings ... to show where the warning was created)
成功加载 ALT 缓存,包含 1944 个 ALT
更新 ALT 缓存,新增 1 个 ALT
[T0] swapIn: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"ApUfAgA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"A8DBAQAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="},{"programId":"11111111111111111111111111111111","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"AgAAAIDw+gIAAAAA"},{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"EQ=="},{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"6KjY5s7NeNYVVLTHJKmgbk4qXkSmAytpnrsNacQTyWM1","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"6KjY5s7NeNYVVLTHJKmgbk4qXkSmAytpnrsNacQTyWM1","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"3KKc9ddshVruCwYtU9CvgvZkEkpk49vN2bbK5eqhUPhF","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"6N6na8YJSEHkaMmA4TxvGNgP9dajDfZimBgvZxqX7M4R","isSigner":false,"isWritable":true},{"pubkey":"6wRJ3JMy1ivRp8zgxZUTBg85R8jd2jv81Q2rmuaCGcqn","isSigner":false,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"6KjY5s7NeNYVVLTHJKmgbk4qXkSmAytpnrsNacQTyWM1","isSigner":false,"isWritable":true},{"pubkey":"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"2r3aHU6TsganXCwqkWSmuEb6NbLTe8H6wbtPBakygBuH","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"6StjyQyxNCsiVCD8yL72E6nCwBieHUPAMnqWEzcvoeE7","isSigner":false,"isWritable":true},{"pubkey":"QHpAtA8bvrKdwD93s1Fn1QYEKVWkUZmF2onp6nHrKJV","isSigner":false,"isWritable":true},{"pubkey":"C1eCBHh3vMSvsYQwkaseW2U76QP3RKdFxW1WoHm3GWYa","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false}],"data":"5RfLl3rjrSoBAAAAJmQAAYDw+gIAAAAAnWEYAAAAAAAeAAA="},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["8BQJEdTT219LkWBhMdLHgKBixPqKU6CkCuomttYTPUGM"],"prioritizationFeeLamports":16021,"computeUnitLimit":139157,"prioritizationType":{"computeBudget":{"microLamports":115136,"estimatedMicroLamports":null}},"simulationSlot":348341416,"dynamicSlippageReport":null,"simulationError":null,"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[188,103,75,102,132,39,210,48,28,147,129,118,165,8,31,251,205,64,131,168,69,126,111,78,225,154,74,19,44,166,223,127],"lastValidBlockHeight":326545455,"fetchedAt":{"secs_since_epoch":1750546941,"nanos_since_epoch":442740277}}}
[T0] swapOut: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AsBcFQA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"A7QsAAAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"6KjY5s7NeNYVVLTHJKmgbk4qXkSmAytpnrsNacQTyWM1","isSigner":false,"isWritable":true},{"pubkey":"G1onzqcx4eLnKMfcNzmMK1SybnXfyKLaL8Qvoqt5YM6p","isSigner":false,"isWritable":true},{"pubkey":"8ctcHN52LY21FEipCjr1MVWtoZa1irJQTPyAaTj72h7S","isSigner":false,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"DbTk2SNKWxu9TJbPzmK9HcQCAmraBCFb5VMo8Svwh34z","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"2LNvcmeTwEtWhtbFiNWcQ5SAVa23np1syTrgjYeayE83","isSigner":false,"isWritable":true},{"pubkey":"9n5JZGhE31tWh2guMgke5Xhx178oMUexCjkA56E9RL15","isSigner":false,"isWritable":true},{"pubkey":"G1onzqcx4eLnKMfcNzmMK1SybnXfyKLaL8Qvoqt5YM6p","isSigner":false,"isWritable":true},{"pubkey":"7u7cD7NxcZEuzRCBaYo8uVpotRdqZwez47vvuwzCov43","isSigner":false,"isWritable":true},{"pubkey":"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4","isSigner":false,"isWritable":false},{"pubkey":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","isSigner":false,"isWritable":false},{"pubkey":"AauSbyE34GsfndXiYuURRcFFMZFLxuwqCKwriwicvonP","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"GRJ7NncfjGfmXYhXMmTvjMLewDpBZnDZpZiscwmmtUjp","isSigner":false,"isWritable":true},{"pubkey":"6bBfgUFXn6V9dhPXBf618394ArLJQ22oZRXQiT31NG2k","isSigner":false,"isWritable":true},{"pubkey":"3cBTuu4zwgURC3VDFUqsvsnQeDLgJLCxnw4wZCKYWBiz","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ","isSigner":false,"isWritable":false},{"pubkey":"BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV","isSigner":false,"isWritable":false},{"pubkey":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","isSigner":false,"isWritable":false},{"pubkey":"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","isSigner":false,"isWritable":false},{"pubkey":"7u7cD7NxcZEuzRCBaYo8uVpotRdqZwez47vvuwzCov43","isSigner":false,"isWritable":true},{"pubkey":"6pXVFSACE5BND2C3ibGRWMG1fNtV7hfynWrfNKtCXhN3","isSigner":false,"isWritable":true},{"pubkey":"AioJRQXvcDLRhHMd6DAkTbbMpgVx63qSGQYmRBS2vHYA","isSigner":false,"isWritable":true},{"pubkey":"95QUtvDkuoDZrNJiuh9MdahkpRNtSVhZRe83oepd8AM7","isSigner":false,"isWritable":true},{"pubkey":"4CQUrzq6qaVtMVtWEL2CvaZjqBUxnMJtBgM6M3hHHDsJ","isSigner":false,"isWritable":true},{"pubkey":"DzqXLUHzZTc3mhwDwuoawQAm2boiNcCFrNyc1XJTiZ51","isSigner":false,"isWritable":true},{"pubkey":"8BSWYgAczR36C7ukr32v7uTepoRhYJYxAVnpBtYniZTm","isSigner":false,"isWritable":false},{"pubkey":"stab1io8dHvK26KoHmTwwHyYmHRbUWbyEJx6CdrGabC","isSigner":false,"isWritable":false},{"pubkey":"7imnGYfCovXjMWKdbQvETFVMe72MQDX4S5zW4GFxMJME","isSigner":false,"isWritable":false},{"pubkey":"vo1tWgqZMjG61Z2T9qUaMYKqZ75CYzMuaZ2LZP1n7HV","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","isSigner":false,"isWritable":false},{"pubkey":"2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c","isSigner":false,"isWritable":false},{"pubkey":"CMfBovCEj8zQgZDSc8iQYYP9r8JMFsnTKED1W55d9ghy","isSigner":false,"isWritable":false},{"pubkey":"HyGVf4UhoQ4ux9ueZgTCf6aJwCcvWqeWf258ZtbeRteV","isSigner":false,"isWritable":true},{"pubkey":"BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV","isSigner":false,"isWritable":false},{"pubkey":"6pXVFSACE5BND2C3ibGRWMG1fNtV7hfynWrfNKtCXhN3","isSigner":false,"isWritable":true},{"pubkey":"8ctcHN52LY21FEipCjr1MVWtoZa1irJQTPyAaTj72h7S","isSigner":false,"isWritable":true},{"pubkey":"4BoHhThRWuokMQz5kER3SJoEGKPHkS68dCsGgJdfYJJo","isSigner":false,"isWritable":true},{"pubkey":"DHHd8MrNU6YBrfJw47dyzNuuWkr4YkWrjkt5MWVUZvUN","isSigner":false,"isWritable":true},{"pubkey":"FYidwukt6P8dmwKUbxNUihDbLhBmvenGeDkV8s1yxKq9","isSigner":false,"isWritable":true},{"pubkey":"7VRs5J28yYXTjjq8NSKbXoamcbe5qHGVMGbEyLQMLB31","isSigner":false,"isWritable":true},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"8RVPH46opPd3qLy1n1djntzGMZxnqEzbYs9uoeixdnwk","isSigner":false,"isWritable":false},{"pubkey":"8RVPH46opPd3qLy1n1djntzGMZxnqEzbYs9uoeixdnwk","isSigner":false,"isWritable":false},{"pubkey":"3ZDBff7jeQaksmGvmkRix36rU159EBDjYiPThvV8QVZM","isSigner":false,"isWritable":false}],"data":"wSCbM0HWnIECAwAAACZkAAFPZAECGWQCA51hGAAAAAAACzb7AgAAAADQBwA="},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["YN2ENU4kvLuXypiaEQXCXM6wJX3pe92noEEYs42nFAa","FucMYjkfiJo4G9fbhQuc4cwpXnyhQRLRNwJzBmxRHryr","6LpcMQrSj6hJc176rU1sdHdAzja4a9xaDgjRuGxfP3oH"],"prioritizationFeeLamports":16021,"computeUnitLimit":1400000,"prioritizationType":{"computeBudget":{"microLamports":11444,"estimatedMicroLamports":null}},"simulationSlot":348341416,"dynamicSlippageReport":null,"simulationError":{"errorCode":"TRANSACTION_ERROR","error":"Error processing Instruction 2: Program failed to complete"},"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[128,14,228,219,176,229,2,240,25,40,14,40,228,120,51,110,115,109,49,15,194,143,209,104,31,32,14,18,175,222,81,109],"lastValidBlockHeight":326545459,"fetchedAt":{"secs_since_epoch":1750546942,"nanos_since_epoch":922697499}}}
[T0] static=52 无 ALT,必超 1232B → skip
更新 ALT 缓存,新增 2 个 ALT
[T0] swapIn: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AlQWBwA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"A205AgAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="},{"programId":"11111111111111111111111111111111","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"AgAAAIDw+gIAAAAA"},{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"EQ=="},{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"HRwDAi1Lwcxszh54NMmGd6HUZgKYnhgymXYxG559UKjZ","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"6U91aKa8pmMxkJwBCfPTmUEfZi6dHe7DcFq2ALvB2tbB","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"7x4VcEX8aLd3kFsNWULTp1qFgVtDwyWSxpTGQkoMM6XX","isSigner":false,"isWritable":true},{"pubkey":"89YMNsMDmHeMhT3BiDTcryRuxWSn24B31Gf5H9N2Z8Zu","isSigner":false,"isWritable":true},{"pubkey":"HRwDAi1Lwcxszh54NMmGd6HUZgKYnhgymXYxG559UKjZ","isSigner":false,"isWritable":true},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"6U91aKa8pmMxkJwBCfPTmUEfZi6dHe7DcFq2ALvB2tbB","isSigner":false,"isWritable":false},{"pubkey":"AhhoxZDmsg2snm85vPjqzYzEYESoKfb4KmTj4HrBBNwY","isSigner":false,"isWritable":true},{"pubkey":"7x4VcEX8aLd3kFsNWULTp1qFgVtDwyWSxpTGQkoMM6XX","isSigner":false,"isWritable":true},{"pubkey":"B6YvSdbUpH3NH7oWp9LM7rXCh4agtJQmwvyKpiYqqz5s","isSigner":false,"isWritable":true},{"pubkey":"4mdQgodP1CZsx6fZEQWesU7BtPpGdYn69gCCGYAEYqUj","isSigner":false,"isWritable":true},{"pubkey":"2szbZL7evrm2tmuGoqajBnvbwBUfqjmiHVmVJ8YdzrVQ","isSigner":false,"isWritable":true},{"pubkey":"3sRPh44hN6f27zmY7NdCBhvd2yS7RqMBwjSRB8zmHhgL","isSigner":false,"isWritable":true},{"pubkey":"9cHZQCNRpp9j96fFiD8mqKYDdTtAfrU56o7A7rcu6Pa1","isSigner":false,"isWritable":true},{"pubkey":"H8eCDikRXCoMapSibhbunVMRNx9in8FXGr1VwAVwW8cU","isSigner":false,"isWritable":true},{"pubkey":"79ZAyzQaZxJCSjbQh2x3KwxpVXkSSKULXJaKCnpHCgzF","isSigner":false,"isWritable":false},{"pubkey":"obriQD1zbpyLz95G5n7nJe6a4DPjpFwa5XYPoNm113y","isSigner":false,"isWritable":false},{"pubkey":"BWBHrYqfcjAh5dSiRwzPnY4656cApXVXmkeDmAfwBKQG","isSigner":false,"isWritable":true},{"pubkey":"GZsNmWKbqhMYtdSkkvMdEyQF9k5mLmP7tTKYWZjcHVPE","isSigner":false,"isWritable":false},{"pubkey":"6YawcNeZ74tRyCv4UfGydYMr7eho7vbUR6ScVffxKAb3","isSigner":false,"isWritable":false},{"pubkey":"C3tPQ8TRcHybnPpR8KMASUVD3PukQRRHEsLwxorJMhgm","isSigner":false,"isWritable":true},{"pubkey":"AAamGhyPfpQJWfZHTq944NM1cFvoVLDrQxt7HGjeRQUS","isSigner":false,"isWritable":true},{"pubkey":"59v2cSbCsnyaWymLnsq6TWzE6cEN5KJYNTBNrcP4smRH","isSigner":false,"isWritable":true},{"pubkey":"4mdQgodP1CZsx6fZEQWesU7BtPpGdYn69gCCGYAEYqUj","isSigner":false,"isWritable":true},{"pubkey":"J4HJYz4p7TRP96WVFky3vh7XryxoFehHjoRySUTeSeXw","isSigner":false,"isWritable":true},{"pubkey":"J4HJYz4p7TRP96WVFky3vh7XryxoFehHjoRySUTeSeXw","isSigner":false,"isWritable":false},{"pubkey":"J4HJYz4p7TRP96WVFky3vh7XryxoFehHjoRySUTeSeXw","isSigner":false,"isWritable":false},{"pubkey":"6U91aKa8pmMxkJwBCfPTmUEfZi6dHe7DcFq2ALvB2tbB","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe","isSigner":false,"isWritable":false},{"pubkey":"6U91aKa8pmMxkJwBCfPTmUEfZi6dHe7DcFq2ALvB2tbB","isSigner":false,"isWritable":false},{"pubkey":"FeLULW5RCKDT2NuThu4vrAQ8BjH5YbU2Y7GbiZXYohm8","isSigner":false,"isWritable":true},{"pubkey":"8tpF5NrzaWYU1RjbtjuToMWMRebgqGfiMRYRf46ih9Rc","isSigner":false,"isWritable":true},{"pubkey":"81zFSjrz9tDu9ixkKToGDGhiX7Q18T8jG6DiwZVXrt3u","isSigner":false,"isWritable":true},{"pubkey":"89YMNsMDmHeMhT3BiDTcryRuxWSn24B31Gf5H9N2Z8Zu","isSigner":false,"isWritable":true},{"pubkey":"59v2cSbCsnyaWymLnsq6TWzE6cEN5KJYNTBNrcP4smRH","isSigner":false,"isWritable":true},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"Sysvar1nstructions1111111111111111111111111","isSigner":false,"isWritable":false}],"data":"wSCbM0HWnIEDAwAAABEBZAABOgBkAQI9AWQCA4Dw+gIAAAAAOy12AAAAAAAeAAA="},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["B6soH8io3E2SJFb91CNE9XmRcnQZs4VNet6GqDtdzXFE","3FMu6psLv6S7LjbpFaD4o3ot8B7YG6hZwZAK2nG6xkYw","2YZvo6LkePK8V2G2ZaS8UxBYX2Ph6udCu5iuaYAqVM38"],"prioritizationFeeLamports":67706,"computeUnitLimit":464468,"prioritizationType":{"computeBudget":{"microLamports":145773,"estimatedMicroLamports":null}},"simulationSlot":348341445,"dynamicSlippageReport":null,"simulationError":null,"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[126,130,188,180,163,178,129,104,195,85,200,93,103,2,147,187,40,192,194,239,35,4,45,171,111,209,230,197,222,4,107,111],"lastValidBlockHeight":326545487,"fetchedAt":{"secs_since_epoch":1750546954,"nanos_since_epoch":503063352}}}
[T0] swapOut: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AsBcFQA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"A+q8AAAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"4xDsmeTWPNjgSVSS1VTfzFq3iHZhp77ffPkAmkZkdu71","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"HRwDAi1Lwcxszh54NMmGd6HUZgKYnhgymXYxG559UKjZ","isSigner":false,"isWritable":true},{"pubkey":"FFuS34FLAwVutrdYKvEvqSzY4DC8Yh43DxfF3GXXKbxS","isSigner":false,"isWritable":true},{"pubkey":"6zAcFYmxkaH25qWZW5ek4dk4SyQNpSza3ydSoUxjTudD","isSigner":false,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK","isSigner":false,"isWritable":false},{"pubkey":"4xDsmeTWPNjgSVSS1VTfzFq3iHZhp77ffPkAmkZkdu71","isSigner":false,"isWritable":false},{"pubkey":"3XCQJQryqpDvvZBfGxR7CLAw5dpGJ9aa7kt1jRLdyxuZ","isSigner":false,"isWritable":false},{"pubkey":"3MjwoqZHAAbCQLBSn6DtmgL6rpazvgYaxBYGHaxiQYTx","isSigner":false,"isWritable":true},{"pubkey":"FFuS34FLAwVutrdYKvEvqSzY4DC8Yh43DxfF3GXXKbxS","isSigner":false,"isWritable":true},{"pubkey":"m3BrPbv2TFmZZTPpyB9NgsCXqGNujpXvzvGqj8ksars","isSigner":false,"isWritable":true},{"pubkey":"8XX9c93q71chQPvcLuEzA1yJDjMpdChei2526gRgxewL","isSigner":false,"isWritable":true},{"pubkey":"3W8cv7HUrdgmRodY5WeFHDGXvbUGBJobBT1c6NVDe6M3","isSigner":false,"isWritable":true},{"pubkey":"A7dy25MU1UiqE54v3eQ2qQT2WLMXiZpP1F2ALNc5F6Ub","isSigner":false,"isWritable":true},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"8CXXLPciGAevhr3JLDHkMEy78Qi8cVmjzQd4H5wHtcE9","isSigner":false,"isWritable":true},{"pubkey":"8xSmGEnUsnRxd7ZmmWWngueHA7fXM5LMhSMggn8dFTSV","isSigner":false,"isWritable":true},{"pubkey":"HDDEaEkzX1zNtAESGXiYcFtRW9TEFo75zUiH79PM38Xn","isSigner":false,"isWritable":true},{"pubkey":"AjyCAXwXXoSoFvGLRD9y1xuwYUor8X9Vkwm1jzThpxXt","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"b7r3mYT9MHkv18zmfX12XJtgrTuhcKEr4kueNFH8NRV","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"2fb9ibwEhmsh4hFPXcFM4bgXdHUyhTbhJrtFCegQWFUt","isSigner":false,"isWritable":true},{"pubkey":"H9LV6PBGjHxdGa5KZnZFTTjcVZT6HCzbLpzyxWjbYbRh","isSigner":false,"isWritable":true},{"pubkey":"m3BrPbv2TFmZZTPpyB9NgsCXqGNujpXvzvGqj8ksars","isSigner":false,"isWritable":true},{"pubkey":"FPqvUeimA7FXTM9Qg7RttXF2Pzm8XHTpaqbaGNa3cZK","isSigner":false,"isWritable":true},{"pubkey":"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn","isSigner":false,"isWritable":false},{"pubkey":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","isSigner":false,"isWritable":false},{"pubkey":"HQNzuYSpD9wxMzp1ipa99PS6Gm1aJZpUiXCEUcBcxS4w","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"4xDsmeTWPNjgSVSS1VTfzFq3iHZhp77ffPkAmkZkdu71","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"CNrNRB22ribkv2j9W7xzycWB7oDsaPDH4PFK4JaTpf4i","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB","isSigner":false,"isWritable":false},{"pubkey":"9K1R4DVYZjSH3JiegPfpWndp7RNjFzbtReQPHERoZar8","isSigner":false,"isWritable":true},{"pubkey":"FPqvUeimA7FXTM9Qg7RttXF2Pzm8XHTpaqbaGNa3cZK","isSigner":false,"isWritable":true},{"pubkey":"6zAcFYmxkaH25qWZW5ek4dk4SyQNpSza3ydSoUxjTudD","isSigner":false,"isWritable":true},{"pubkey":"2xqqwsYDPG8stqyksxgeCdNMWKwdvpJw88gGpaiy4m8p","isSigner":false,"isWritable":true},{"pubkey":"BpgPqeH6KURvZdxBkpBrS3QkeRFxGqjvUFCk2awp3Aan","isSigner":false,"isWritable":true},{"pubkey":"H8eHe3Fy4mpLZFMdGX77U1S9TSLBi8rtgEEq6SmZa9ed","isSigner":false,"isWritable":true},{"pubkey":"9a6SidbgkdvotSj2bx3ttLBVTemBq5ktBLrKbD6avV2t","isSigner":false,"isWritable":true},{"pubkey":"EcF9SszTQ6wRfvRufYaGde6QVnyTbZRE7ckBV7WkoX7r","isSigner":false,"isWritable":true},{"pubkey":"7yFNysv3wKwx4QEE3ToVaNTY3qisk7V72hVzkLLYDJHX","isSigner":false,"isWritable":true},{"pubkey":"G3aQM1ZoMo8sKerCFGGmPmuU6hm4so15EwP7UcUsNWEo","isSigner":false,"isWritable":true},{"pubkey":"46WZ1wdHjc4K5jGYCdjT5Z24zSKDJhtAfGbf8SLRcKWd","isSigner":false,"isWritable":true},{"pubkey":"6o4DDCDPvq43fn1rZWpKUw1GJtN5YwQYK5RqbGpvu9PM","isSigner":false,"isWritable":true},{"pubkey":"4xDsmeTWPNjgSVSS1VTfzFq3iHZhp77ffPkAmkZkdu71","isSigner":false,"isWritable":false},{"pubkey":"24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"Jito4APyf642JPZPx3hGc6WWJ8zPKtRbRs4P815Awbb","isSigner":false,"isWritable":false}],"data":"wSCbM0HWnIEEAwAAABpkAAEmZAECE2QCAzstdgAAAAAAXxb8AgAAAADQBwA="},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["7acHDSp8FKjVNG9BU5fS5LgeyJi7tVoFNNp2dCySwsh","145yimgn5A64y43Wca4wG1bUizrvuFPySCsH94GD7naL","6HgQqiVsKcxhk61i2VcPFhBVQq6gapidNR7TW6BrNUKw"],"prioritizationFeeLamports":67706,"computeUnitLimit":1400000,"prioritizationType":{"computeBudget":{"microLamports":48362,"estimatedMicroLamports":null}},"simulationSlot":348341445,"dynamicSlippageReport":null,"simulationError":{"errorCode":"TRANSACTION_ERROR","error":"Error processing Instruction 2: Program failed to complete"},"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[42,139,143,81,17,69,171,52,63,157,184,251,43,117,57,98,51,87,221,173,225,115,211,245,46,114,183,85,31,205,115,229],"lastValidBlockHeight":326545483,"fetchedAt":{"secs_since_epoch":1750546952,"nanos_since_epoch":939221759}}}
[T0] static=72 无 ALT,必超 1232B → skip
[T0] swapIn: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AupuBgA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"A/AvAQAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="},{"programId":"11111111111111111111111111111111","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"AgAAAIDw+gIAAAAA"},{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"EQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"H1qQ6Hent1C5wa4Hc3GK2V1sgg4grvDBbmKd5H8dsTmo","isSigner":false,"isWritable":true},{"pubkey":"D4EwnPB4tYV93Jo1uMQXiaPtjGa3ii97pYfaWY2XktAA","isSigner":false,"isWritable":true},{"pubkey":"8tzCDHSfE2HVq5kYwJXeMkZUpLsGbNsDPSjrpsmwmqiG","isSigner":false,"isWritable":true},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"obriQD1zbpyLz95G5n7nJe6a4DPjpFwa5XYPoNm113y","isSigner":false,"isWritable":false},{"pubkey":"Fn68NZzCCgZKtYmnAYbkL6w5NNx3TgjW91dGkLA3hsDK","isSigner":false,"isWritable":true},{"pubkey":"GZsNmWKbqhMYtdSkkvMdEyQF9k5mLmP7tTKYWZjcHVPE","isSigner":false,"isWritable":false},{"pubkey":"6YawcNeZ74tRyCv4UfGydYMr7eho7vbUR6ScVffxKAb3","isSigner":false,"isWritable":false},{"pubkey":"86KSdCfcqnJo9TCLFi3zxsJAJzvx9QU7oEPd6Fn5ZPom","isSigner":false,"isWritable":true},{"pubkey":"8ofECjHnVGLU4ywyPdK6mFddEqAuXsnrrov8m2zeFhvj","isSigner":false,"isWritable":true},{"pubkey":"H1qQ6Hent1C5wa4Hc3GK2V1sgg4grvDBbmKd5H8dsTmo","isSigner":false,"isWritable":true},{"pubkey":"JSvtokJbtGsYhneKomFBjnJh4djEQLdHV2kAeS43bBZ","isSigner":false,"isWritable":true},{"pubkey":"FpCMFDFGYotvufJ7HrFHsWEiiQCGbkLCtwHiDnh7o28Q","isSigner":false,"isWritable":true},{"pubkey":"J4HJYz4p7TRP96WVFky3vh7XryxoFehHjoRySUTeSeXw","isSigner":false,"isWritable":false},{"pubkey":"Sysvar1nstructions1111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe","isSigner":false,"isWritable":false},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"BAP9tycZkEFJMzvHsgXohXFwiqpuWECHBoknyJGVPwzj","isSigner":false,"isWritable":true},{"pubkey":"2uAJghPTqVxYys4U1TVqp3dSo7GrdjHE37BMtbGWEWwV","isSigner":false,"isWritable":true},{"pubkey":"8DiVqrb4AvHQSU2RFEvA8SJByYFWfVW46SwWKXue5qwd","isSigner":false,"isWritable":true},{"pubkey":"AjwhgcMpFXbqAuq6bafQjQU4pZ1URwXncv8CG8p7TQ1V","isSigner":false,"isWritable":true},{"pubkey":"JSvtokJbtGsYhneKomFBjnJh4djEQLdHV2kAeS43bBZ","isSigner":false,"isWritable":true},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"Sysvar1nstructions1111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"AishPhdJXUHpo3zg2gt5AVfdUg3MPmf8DV8FButvbRJ6","isSigner":false,"isWritable":true},{"pubkey":"AjwhgcMpFXbqAuq6bafQjQU4pZ1URwXncv8CG8p7TQ1V","isSigner":false,"isWritable":true},{"pubkey":"Evwk2J2ohwuEuXrREKMJC4JvTDpjUSLN9mEW4iBP4Wtw","isSigner":false,"isWritable":true},{"pubkey":"D4EwnPB4tYV93Jo1uMQXiaPtjGa3ii97pYfaWY2XktAA","isSigner":false,"isWritable":true},{"pubkey":"4GXFbfupsJJ8aMcE6LNJtZmp9uWYVCn8hx9gcGY5HiJd","isSigner":false,"isWritable":true},{"pubkey":"8reevTu43TktmkXHYYRnMCK8s9p3SZSDg8TfCKfgh48v","isSigner":false,"isWritable":true},{"pubkey":"7tL6s8Xy93P4wnCdtnQAToDHE3QaSdmVekmW8X2XYK87","isSigner":false,"isWritable":true},{"pubkey":"3HYo87FwnXWiB56kT4JiWPKtzC2LMNa59wzYYnSxS5xi","isSigner":false,"isWritable":true},{"pubkey":"GNsYmjn3vaCBbrbNXYXcqJn7K4M5hSFn5HFj8c5sVskN","isSigner":false,"isWritable":false}],"data":"wSCbM0HWnIEBAwAAADoBZAABPQFkAQIRAWQCA4Dw+gIAAAAA2X2TAAAAAAAeAAA="},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["HPLCVFcCMgt6mp5uZLo9u8WnqAe2Yan7Sf285fRmitYP","Der1gRv2cnKCgerhmUmdG1tgTYPHpDJ5DJXFf8D5QLss","9AsimPML6N36BAe8keQRAHpLuKgCKv9QJV9912TXZhBD"],"prioritizationFeeLamports":32804,"computeUnitLimit":421610,"prioritizationType":{"computeBudget":{"microLamports":77808,"estimatedMicroLamports":null}},"simulationSlot":348341898,"dynamicSlippageReport":null,"simulationError":null,"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[19,58,16,134,44,12,3,0,80,119,88,198,231,250,149,193,30,226,175,164,44,85,197,181,158,224,113,150,32,231,73,150],"lastValidBlockHeight":326545941,"fetchedAt":{"secs_since_epoch":1750547137,"nanos_since_epoch":975323226}}}
[T0] swapOut: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AsBcFQA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"A4hbAAAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"8tzCDHSfE2HVq5kYwJXeMkZUpLsGbNsDPSjrpsmwmqiG","isSigner":false,"isWritable":true},{"pubkey":"3N3UYzTV6V7QamECYk6CArRAr7g3yD2qLJoeGSVUaBiN","isSigner":false,"isWritable":true},{"pubkey":"A8kEy5wWgdW4FG593fQJ5QPVbqx1wkfXw9c4L9bPo2CN","isSigner":false,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"D39QbGSiymeKR1eegDk5ztADUKWL5aFAz6BSpGEptBFc","isSigner":false,"isWritable":true},{"pubkey":"3hXcMGW7dgts37qbuzSKwHQJDiHN3p9uuRAZiDz9fdji","isSigner":false,"isWritable":true},{"pubkey":"j2iUczEMsisek8p9EUvsKAGGEnQmvZnrHWaHxBBtdFi","isSigner":false,"isWritable":true},{"pubkey":"3N3UYzTV6V7QamECYk6CArRAr7g3yD2qLJoeGSVUaBiN","isSigner":false,"isWritable":true},{"pubkey":"EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X","isSigner":false,"isWritable":true},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"Sysvar1nstructions1111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"BAP9tycZkEFJMzvHsgXohXFwiqpuWECHBoknyJGVPwzj","isSigner":false,"isWritable":true},{"pubkey":"2uAJghPTqVxYys4U1TVqp3dSo7GrdjHE37BMtbGWEWwV","isSigner":false,"isWritable":true},{"pubkey":"8DiVqrb4AvHQSU2RFEvA8SJByYFWfVW46SwWKXue5qwd","isSigner":false,"isWritable":true},{"pubkey":"9uTKT96PWUC1f9XcXYNFTUJi9NsGcFTDiPeXDgvZ3Gqw","isSigner":false,"isWritable":true},{"pubkey":"EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X","isSigner":false,"isWritable":true},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"Sysvar1nstructions1111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"EqH9g8yz1HWfbuME97NSRShzYRh8emMsdGmmnfm84Q9C","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"2mSRQFZLQQEMknVJPVd3w3Xu9oqmbwUdehELgSrnySAP","isSigner":false,"isWritable":true},{"pubkey":"C1qRTUMySCGDcBcqmHjGDxvwNGk6VRKBuYYgi5pH5uqB","isSigner":false,"isWritable":true},{"pubkey":"9uTKT96PWUC1f9XcXYNFTUJi9NsGcFTDiPeXDgvZ3Gqw","isSigner":false,"isWritable":true},{"pubkey":"A8kEy5wWgdW4FG593fQJ5QPVbqx1wkfXw9c4L9bPo2CN","isSigner":false,"isWritable":true},{"pubkey":"7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"ARhDv1xVS6A7ZMmj1rVGTthroyUrdKCuqNehUiFFZujX","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"2C6wrW1zmUkNq4pp6UQoNbJD721KDvkrRFg7LfXVL1G9","isSigner":false,"isWritable":true},{"pubkey":"3gp7TppQDsKTkNGssjiwKxnV5o6kRXd1umCsSMPF6XUB","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false}],"data":"wSCbM0HWnIEGAwAAAD0AZAABPQFkAQImZAID2X2TAAAAAADjfvsCAAAAANAHAA=="},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["2bhfDvW3qgapjWWy9FCbpHhXpXwzMcSy1GX2uRJWQP5j","ExeSfSvBRWwC7J1hKFTHoWoyKXGJzU4nMXdwmX3b81xV","Der1gRv2cnKCgerhmUmdG1tgTYPHpDJ5DJXFf8D5QLss"],"prioritizationFeeLamports":32804,"computeUnitLimit":1400000,"prioritizationType":{"computeBudget":{"microLamports":23432,"estimatedMicroLamports":null}},"simulationSlot":348341898,"dynamicSlippageReport":null,"simulationError":{"errorCode":"TRANSACTION_ERROR","error":"Error processing Instruction 2: custom program error: 0x1"},"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[19,58,16,134,44,12,3,0,80,119,88,198,231,250,149,193,30,226,175,164,44,85,197,181,158,224,113,150,32,231,73,150],"lastValidBlockHeight":326545941,"fetchedAt":{"secs_since_epoch":1750547137,"nanos_since_epoch":975323226}}}
[T0] static=53 无 ALT,必超 1232B → skip
更新 ALT 缓存,新增 2 个 ALT
!!! [instr] 报错: Jupiter API error: undefined

error stackaa: Error: Jupiter API error: undefined
at getIxSafe (F:\v2rayN\sol_jk\24.js:787:13)
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
at async Promise.all (index 0)
at async Object.doWork (F:\v2rayN\sol_jk\24.js:1270:21)
at async Promise.all (index 2)
at async main (F:\v2rayN\sol_jk\24.js:1578:5)
[T2] error instructions is not iterable
[T2] error stack: TypeError: instructions is not iterable
at CompiledKeys.compile (F:\v2rayN\sol_jk\node_modules@solana\web3.js\lib\index.cjs.js:636:22)
at MessageV0.compile (F:\v2rayN\sol_jk\node_modules@solana\web3.js\lib\index.cjs.js:1003:39)
at TransactionMessage.compileToV0Message (F:\v2rayN\sol_jk\node_modules@solana\web3.js\lib\index.cjs.js:2052:22)
at Object.doWork (F:\v2rayN\sol_jk\24.js:1328:4)
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
at async Promise.all (index 2)
at async main (F:\v2rayN\sol_jk\24.js:1578:5)
更新 ALT 缓存,新增 2 个 ALT
[T0] swapIn: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AhClBAA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"A/u3AAAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="},{"programId":"11111111111111111111111111111111","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"AgAAAIDw+gIAAAAA"},{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true}],"data":"EQ=="},{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"UhhF2DntnSDjFL2mefymsWMBWSFpy8AhkrZGAydvkMQ","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"KMNo3nJsBXfcpJTVhZcXLW7RmTwTt4GVFE7suUBo9sS","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"A8kEy5wWgdW4FG593fQJ5QPVbqx1wkfXw9c4L9bPo2CN","isSigner":false,"isWritable":true},{"pubkey":"G6mAGte5pkMWFWcM9yjsEQ5i9tSdpZ51TP3JLTwZKd1M","isSigner":false,"isWritable":true},{"pubkey":"UhhF2DntnSDjFL2mefymsWMBWSFpy8AhkrZGAydvkMQ","isSigner":false,"isWritable":true},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"KMNo3nJsBXfcpJTVhZcXLW7RmTwTt4GVFE7suUBo9sS","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"G7ixPyiyNeggVf1VanSetFMNbVuVCPtimJmd9axfQqng","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"4FZVZAsNsupSWUVP5J9jjJxcBAP75BG84V3isu6dR1Co","isSigner":false,"isWritable":true},{"pubkey":"dDFZCzuEFoJuMP9MabhufcFJu5JAhKzYpViAzsmViDz","isSigner":false,"isWritable":true},{"pubkey":"A8kEy5wWgdW4FG593fQJ5QPVbqx1wkfXw9c4L9bPo2CN","isSigner":false,"isWritable":true},{"pubkey":"JChqfU7KQ2Tw5FKJAom57HsuU5u5Vo53arzSHAQ5nHKt","isSigner":false,"isWritable":true},{"pubkey":"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"CdvDtE4qvGjc1d85VCNUnXtL3w4cDNZn7cDmPdpSuyJu","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"Gfg3Udxpw53wHWqnyThouNHgGCK46BJxJp3tnB1kuxHi","isSigner":false,"isWritable":true},{"pubkey":"YF4HWeaV2v48nn7p12yyXs4gf5mkRyv5YUoiz3M3j2m","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"DbTk2SNKWxu9TJbPzmK9HcQCAmraBCFb5VMo8Svwh34z","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"2LNvcmeTwEtWhtbFiNWcQ5SAVa23np1syTrgjYeayE83","isSigner":false,"isWritable":true},{"pubkey":"9n5JZGhE31tWh2guMgke5Xhx178oMUexCjkA56E9RL15","isSigner":false,"isWritable":true},{"pubkey":"JChqfU7KQ2Tw5FKJAom57HsuU5u5Vo53arzSHAQ5nHKt","isSigner":false,"isWritable":true},{"pubkey":"EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X","isSigner":false,"isWritable":true},{"pubkey":"27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4","isSigner":false,"isWritable":false},{"pubkey":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","isSigner":false,"isWritable":false},{"pubkey":"AauSbyE34GsfndXiYuURRcFFMZFLxuwqCKwriwicvonP","isSigner":false,"isWritable":true},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","isSigner":false,"isWritable":false},{"pubkey":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","isSigner":false,"isWritable":false},{"pubkey":"GRJ7NncfjGfmXYhXMmTvjMLewDpBZnDZpZiscwmmtUjp","isSigner":false,"isWritable":true},{"pubkey":"6bBfgUFXn6V9dhPXBf618394ArLJQ22oZRXQiT31NG2k","isSigner":false,"isWritable":true},{"pubkey":"3cBTuu4zwgURC3VDFUqsvsnQeDLgJLCxnw4wZCKYWBiz","isSigner":false,"isWritable":true},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8","isSigner":false,"isWritable":false},{"pubkey":"3ndjN1nJVUKGrJBc1hhVpER6kWTZKHdyDrPyCJyX3CXK","isSigner":false,"isWritable":true},{"pubkey":"G6mAGte5pkMWFWcM9yjsEQ5i9tSdpZ51TP3JLTwZKd1M","isSigner":false,"isWritable":true},{"pubkey":"5mpXMyJsw7BQsEZxVXreNRZQytWvbSfpTQC37xofT1wR","isSigner":false,"isWritable":true},{"pubkey":"EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X","isSigner":false,"isWritable":true},{"pubkey":"5m3MXzAwb9xj6RHFtXRkBh9DJ6kWMpcTK3dmY1ucgXZ","isSigner":false,"isWritable":true},{"pubkey":"6nwR688Pvbgku3XNHdEfxCh9Gn7JKDxQF7RiQwndMUpC","isSigner":false,"isWritable":true},{"pubkey":"8Gixgb8J6DN1Lg2Df34wMZVfGUpa773j7RSmDp35CzMc","isSigner":false,"isWritable":true},{"pubkey":"HUUuXZXQTHeoPstjhD3njM9kVMaZ2saj2x6e6chhiRtA","isSigner":false,"isWritable":true},{"pubkey":"7h9s2c7gZNECbi2jAA3fCNRw693pMhBNMkBdM61Wa4ox","isSigner":false,"isWritable":false}],"data":"wSCbM0HWnIEGAwAAACZkAAEmZAECEQBkAgOA8PoCAAAAAPOetwYAAAAAHgAA"},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["7nUBGKXsRSW2u8v2fjbp7jdA7Fqz5qeoayDvJEFPJedY","FucMYjkfiJo4G9fbhQuc4cwpXnyhQRLRNwJzBmxRHryr","5tV8nXXuYSJhunnZQpLFTTw9W4H2KEftqwnCHywvLGPv"],"prioritizationFeeLamports":14336,"computeUnitLimit":304400,"prioritizationType":{"computeBudget":{"microLamports":47099,"estimatedMicroLamports":null}},"simulationSlot":348342369,"dynamicSlippageReport":null,"simulationError":null,"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[97,121,114,56,238,189,228,25,242,240,61,217,80,130,204,90,228,227,7,119,39,174,210,115,82,131,49,81,121,152,85,98],"lastValidBlockHeight":326546410,"fetchedAt":{"secs_since_epoch":1750547325,"nanos_since_epoch":11641136}}}
[T0] swapOut: {"tokenLedgerInstruction":null,"computeBudgetInstructions":[{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AsBcFQA="},{"programId":"ComputeBudget111111111111111111111111111111","accounts":[],"data":"AwAoAAAAAAAA"}],"setupInstructions":[{"programId":"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","accounts":[{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"11111111111111111111111111111111","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false}],"data":"AQ=="}],"swapInstruction":{"programId":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","accounts":[{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false},{"pubkey":"UhhF2DntnSDjFL2mefymsWMBWSFpy8AhkrZGAydvkMQ","isSigner":false,"isWritable":true},{"pubkey":"CPrVhYPSfsXp4KHwnS5rt61wbytPRcQJPDWwtJgiFdyb","isSigner":false,"isWritable":true},{"pubkey":"H1qQ6Hent1C5wa4Hc3GK2V1sgg4grvDBbmKd5H8dsTmo","isSigner":false,"isWritable":true},{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"KMNo3nJsBXfcpJTVhZcXLW7RmTwTt4GVFE7suUBo9sS","isSigner":false,"isWritable":false},{"pubkey":"So11111111111111111111111111111111111111112","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf","isSigner":false,"isWritable":false},{"pubkey":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","isSigner":false,"isWritable":false},{"pubkey":"whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","isSigner":false,"isWritable":false},{"pubkey":"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr","isSigner":false,"isWritable":false},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"JDELdNKDVFQqAodu79QcgnYbZJA8H3HXKxLQ7MzxByZb","isSigner":false,"isWritable":true},{"pubkey":"KMNo3nJsBXfcpJTVhZcXLW7RmTwTt4GVFE7suUBo9sS","isSigner":false,"isWritable":false},{"pubkey":"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo","isSigner":false,"isWritable":false},{"pubkey":"CPrVhYPSfsXp4KHwnS5rt61wbytPRcQJPDWwtJgiFdyb","isSigner":false,"isWritable":true},{"pubkey":"4eiooLpMmBe9vQmXbFzWkv8XNio3bwMxawvUx7ePgFGN","isSigner":false,"isWritable":true},{"pubkey":"82CcK8sx67ztZQwWnWWobt51idQrgJtmEJ7Tv9xxgwqB","isSigner":false,"isWritable":true},{"pubkey":"47hjvJeQcRNzcA1RXBjPx36CU5ZKRc6s96YjbLh4SRyR","isSigner":false,"isWritable":true},{"pubkey":"2Xys8BZFddWM45pVmBstSqh26L7xMAf2uTWdk4ddcSA8","isSigner":false,"isWritable":true},{"pubkey":"GmGZyy9EiE6GFAemBLvbC2fN3LXrw1M6NoKdKULYJA2L","isSigner":false,"isWritable":true},{"pubkey":"FAMYMdWATQ9Dm7QD5w9crEQrxBBa1roNxdxYE3PzN2DK","isSigner":false,"isWritable":true},{"pubkey":"DTV4oCYaKrNiKp6CWpEAHDfrnAsZptcozx3iA7choQVH","isSigner":false,"isWritable":true},{"pubkey":"swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ","isSigner":false,"isWritable":false},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo","isSigner":false,"isWritable":false},{"pubkey":"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","isSigner":false,"isWritable":false},{"pubkey":"82CcK8sx67ztZQwWnWWobt51idQrgJtmEJ7Tv9xxgwqB","isSigner":false,"isWritable":true},{"pubkey":"F3Hej7eXZMWTr141APvCiNM7ZUn22cD9b1p8EcfFH8vn","isSigner":false,"isWritable":true},{"pubkey":"EszmvzMNgMPDysbAJBvqPC4DtUcU76KvBVfC11r8sSv7","isSigner":false,"isWritable":true},{"pubkey":"95QUtvDkuoDZrNJiuh9MdahkpRNtSVhZRe83oepd8AM7","isSigner":false,"isWritable":true},{"pubkey":"4CQUrzq6qaVtMVtWEL2CvaZjqBUxnMJtBgM6M3hHHDsJ","isSigner":false,"isWritable":true},{"pubkey":"DzqXLUHzZTc3mhwDwuoawQAm2boiNcCFrNyc1XJTiZ51","isSigner":false,"isWritable":true},{"pubkey":"8BSWYgAczR36C7ukr32v7uTepoRhYJYxAVnpBtYniZTm","isSigner":false,"isWritable":false},{"pubkey":"stab1io8dHvK26KoHmTwwHyYmHRbUWbyEJx6CdrGabC","isSigner":false,"isWritable":false},{"pubkey":"7imnGYfCovXjMWKdbQvETFVMe72MQDX4S5zW4GFxMJME","isSigner":false,"isWritable":false},{"pubkey":"vo1tWgqZMjG61Z2T9qUaMYKqZ75CYzMuaZ2LZP1n7HV","isSigner":false,"isWritable":false},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","isSigner":false,"isWritable":false},{"pubkey":"2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c","isSigner":false,"isWritable":false},{"pubkey":"CMfBovCEj8zQgZDSc8iQYYP9r8JMFsnTKED1W55d9ghy","isSigner":false,"isWritable":false},{"pubkey":"HyGVf4UhoQ4ux9ueZgTCf6aJwCcvWqeWf258ZtbeRteV","isSigner":false,"isWritable":true},{"pubkey":"2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h","isSigner":false,"isWritable":false},{"pubkey":"F3Hej7eXZMWTr141APvCiNM7ZUn22cD9b1p8EcfFH8vn","isSigner":false,"isWritable":true},{"pubkey":"H1qQ6Hent1C5wa4Hc3GK2V1sgg4grvDBbmKd5H8dsTmo","isSigner":false,"isWritable":true},{"pubkey":"4BoHhThRWuokMQz5kER3SJoEGKPHkS68dCsGgJdfYJJo","isSigner":false,"isWritable":true},{"pubkey":"DHHd8MrNU6YBrfJw47dyzNuuWkr4YkWrjkt5MWVUZvUN","isSigner":false,"isWritable":true},{"pubkey":"FYidwukt6P8dmwKUbxNUihDbLhBmvenGeDkV8s1yxKq9","isSigner":false,"isWritable":true},{"pubkey":"7VRs5J28yYXTjjq8NSKbXoamcbe5qHGVMGbEyLQMLB31","isSigner":false,"isWritable":true},{"pubkey":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","isSigner":false,"isWritable":false},{"pubkey":"8RVPH46opPd3qLy1n1djntzGMZxnqEzbYs9uoeixdnwk","isSigner":false,"isWritable":false},{"pubkey":"8RVPH46opPd3qLy1n1djntzGMZxnqEzbYs9uoeixdnwk","isSigner":false,"isWritable":false},{"pubkey":"3ZDBff7jeQaksmGvmkRix36rU159EBDjYiPThvV8QVZM","isSigner":false,"isWritable":false}],"data":"wSCbM0HWnIEBAwAAAC8BAGQAAU9kAQIZZAID8563BgAAAAC7LvsCAAAAANAHAA=="},"cleanupInstruction":{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","accounts":[{"pubkey":"9DWuUUSehDFFAb27ARJHFB2Avm2ChnMxwo149nWK2zjq","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":false,"isWritable":true},{"pubkey":"HvAi5aRSJCWj9nmh46bDyBJhVTvHEo726HYDyVxoPDAA","isSigner":true,"isWritable":false}],"data":"CQ=="},"otherInstructions":[],"addressLookupTableAddresses":["AauGw76bkTMKmXx3R1gS6s3WHy2gBGkpXjdKimvejeBW","YN2ENU4kvLuXypiaEQXCXM6wJX3pe92noEEYs42nFAa","6LpcMQrSj6hJc176rU1sdHdAzja4a9xaDgjRuGxfP3oH"],"prioritizationFeeLamports":14336,"computeUnitLimit":1400000,"prioritizationType":{"computeBudget":{"microLamports":10240,"estimatedMicroLamports":null}},"simulationSlot":348342369,"dynamicSlippageReport":null,"simulationError":{"errorCode":"TRANSACTION_ERROR","error":"Error processing Instruction 2: Program failed to complete"},"addressesByLookupTableAddress":null,"blockhashWithMetadata":{"blockhash":[107,131,73,143,122,111,172,141,250,21,81,191,137,216,208,216,29,243,215,88,111,71,175,64,63,45,12,229,164,165,232,37],"lastValidBlockHeight":326546412,"fetchedAt":{"secs_since_epoch":1750547325,"nanos_since_epoch":893721370}}}
[T0] static=74 无 ALT,必超 1232B → skip

思考

Clarifying data structures

It looks like the function "loadAltAccountsWithCache" is returning two types of objects: hitTables and newTables. The former are AddressLookupTableAccount objects, while the latter are state objects that are pushed into the newTables.

Actually, altWrappers seems to represent ALT objects, not wrappers with key and raw properties. The mistake could be in treating altWrappers as wrappers instead of proper ALT objects.

So, it's important to focus on the correct data structure when manipulating those results.

Analyzing altStates and addresses

The trimAlt function checks if alt has a valid state and an addresses array, but the issue is it's using a getter for addresses, not accessing it directly. The real problem seems to be with the way staticCount is calculated and passed around. When altStates is overwritten or reset, such as in strictTrimAlt(...), it doesn't handle the case where it's empty, leading to errors like "static=53 无 ALT,必超 1232B → skip."

It’s important to ensure that when resetting values, we properly handle situations with zero altStates or missing addresses.

Investigating altStates and trimming logic

The issue seems related to altStates being empty after the trimming process. loadAltAccountsWithCache returns altTables (not wrappers), which doesn’t seem to include the expected state and addresses properties in some cases. This would cause altStates to become empty. Also, the trimming function trimAlt isn’t handling the addresses property correctly due to incorrect references.

It looks like the filtering logic might inadvertently remove items that lack a state, meaning missing addresses could be a key issue for altStates being empty after trimming.

Investigating altStates population issue

The altStates length becoming zero may stem from issues with how altWrappers and altStates are populated and trimmed. Specifically, trimAlt may return null if alt.addresses is not handled properly, possibly due to the getter function returning an array. It seems like the root issue could be a mismatch with how addresses are stored or loaded from the cache, such as key type inconsistencies (PublicKey vs string). Additionally, concurrency issues with cache updates across threads may introduce complications. Further debugging would be needed to ensure proper population and trimming of altStates.

Explaining mismatch in alt addresses collection

It seems the issue arises from differences in how Alt addresses are collected in 12.js and processed in 24.js. In 12.js, the jIx request doesn't utilize optional fields like dynamicComputeUnitLimit, which are used in later scripts. This leads to missing alt addresses due to potentially different Jupiter routes, especially with slippage differences. 24.js expects these additional parameters, so the cache isn't aligned with what 12.js collects. To fix this, 12.js should use the same parameters as 24.js to consistently capture alt addresses.

Thought for 1m 44s

回答

下面把两段代码分别“拆机”——找出为什么 alt-cache.json 里明明已经有条目,却在 24.js 里始终命中不到
核心问题:

  • 采集端 (12.js) 拿到的 ALT 列表和运行端 (24.js) 真正用到的列表不是同一批
  • 运行端还有两处早退/排序逻辑,让即便命中了 ALT 也被“扔”掉。

一、12.js(采集脚本)的问题

位置问题 & 影响修复办法
jIx({ quoteResponse:qIn ,userPublicKey:… })调用体只传了最基础的 3 个字段。在 Jupiter v6 里,只有请求体里带了 dynamicComputeUnitLimit / maxAccounts / prioritizationFeeLamports … 等扩展参数时,返回里才可能出现 addressLookupTableAddresses<br/>因此你采出来的大量 route 根本不会含 ALT,结果 alt-cache.json 里缺了运行期真正需要的那批表。采集时使用和 24.js 完全一致 的 build body:<br/>jsconst bodyBase = { quoteResponse, userPublicKey: kp, wrapAndUnwrapSol: true, dynamicComputeUnitLimit: true, maxAccounts: 64, prioritizationFeeLamports: 5_000};<br/>分别对正、反两条 quote 调用 jIx(bodyBase) 再 collect ALT。
filterValidAltAccounts(…) → map(({key, raw})=>…)过滤时用的是 item.raw,落盘时却写成了 data 字段;虽然 24.js 读的是 data但 state 丢失了,后面无法做地址数裁剪,只能再次 RPC。直接把 state 一并保存:<br/>jsfiltered.map(({key, raw, state})=>({key, data:raw, state}))
线程拼装 key → ALT 时顺序随机采集端是 token 粒度 round-robin,运行端却按 Jupiter 报价顺序 提交 ALT,导致顺序不一致。不影响采集,但 24.js 在 trim 时要保序,见下面第三条。

二、24.js(运行脚本)的问题

位置问题 & 影响修复办法
if (staticCnt > 38 && altStates.length === 0) return;这句 早于 strictTrimAlt();当 loadAltAccountsWithCache() 还没把大表裁剪完返回时就直接退出,日志里就出现了 “static=52 无 ALT” 的假阳性。把这句 挪到 altStates = strictTrimAlt(…) 之后,或干脆删掉;留给 trim 机会。
strictTrimAlt()sorted = [...originAlts].sort(…)为了压尺寸把 ALT 重排 了。可是在 Solana V0 消息里,addressTableLookups[i] 必须和 compileToV0Message(alts[i]) 一一对应,顺序乱了就会模拟报 Program failed to completetrim 时不要改顺序:先记录原索引,再按长度裁剪,最后 按原 lookupKeys 顺序 还原。
loadAltAccountsWithCache() 仍会 RPC代码注释写“仅用缓存”,但函数里还是 missKeys → getAltAccounts(),一旦跑网络就失去了“冷启动零 RPC” 的意义。如果确实想绝对只用缓存,把 missKeys 分支删掉/改为直接返回空;或者再加一个开关 ALLOW_FETCH_ON_MISS
globalAltCache.push({ key, data }) 并发落盘多个逻辑线程同时 push + writeFileSync,存在竞争(最后写入者可能覆盖)。fs.writeFileSync原子 rename 做落盘,或把写入放到单线程定时批量 flush。

改动后应看到的效果

  1. 重新跑一次 12.js,alt-cache.json 将包含运行端真正需要的 ~3000 条左右的 ALT 表。
  2. 启动 24.js 时 不再出现 static=xx 无 ALT,必超 1232B 的日志;simulateTransaction 也不再因为 Program failed to complete 报错。
  3. 日志只在首次遇到新表时出现 命中缓存,后面完全走本地缓存,不再打印 “更新 ALT 缓存,新增 … ALT”。

这样就实现了 “先查全局缓存,命中即用,绝不二次 RPC”,同时保证交易指令里的 ALT 顺序与 Jupiter 返回一致,签名、落块都能通过。

このQ&Aを共有