以下是一个solana+jupiter 的多线程 多代理ip 套利程序, 使用v0交易,其中需要获取...
생성일: 2025년 6월 21일
생성일: 2025년 6월 21일
以下是一个solana+jupiter 的多线程 多代理ip 套利程序,
使用v0交易,其中需要获取ALT地址,
为了 提升运行速度,采用:预先采集 所有 正反交易对比报价的ALT地址(alt-cache.json),
然后 作为全局缓存,当需要使用ALT地址时,先从全局缓存 中 查询,不存在 则实时查询,
当前问题:
无法从全局缓存 中查询到 实际存在的ALT地址,
请分别检查:
ALT地址 采集程序(12.js)和ALT地址 应用程序(24.js),
确定问题,
直接输出修改后代码,并标记替换现有代码位置
以下是代码:
12.js:
/*
下面给出一份 可直接 node b.js
运行 的完整脚本,已完成以下改动:
alt-step.json
;alt-step.json
已存在,则跳过采集,直接批量拉取 ALT 账户;process.send()
flush 后再退出;依赖:
npm i node-fetch@2 https-proxy-agent @solana/web3.js bs58
额外本地文件:
•constants.js
导出TOKENS1000
(1000 个 mint 地址数组)
•config.js
导出WALLET_PRIVATE_KEY
(base58 私钥)
/
/****************************************************************
② 拉取 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();
textfor (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}
);
}
}
textconst 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());
textjson.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;
*/
}
/*
📌 运行顺序
node b.js
→ ① 采集 ALT pubkey(多进程 + 代理均分)→ 写入 alt-step.json
→ ② 批量拉取 ALT 账户 → alt-cache.json
alt-step.json
,直接跳到步骤②,省去再次采集的时间。如需重新采集,只需手动删除 alt-step.json
再执行即可。
*/
24.js:
/*****************************************************************
node index.js
即可运行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;
/******************************************************************
/**
调用 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);
//
/ =============================================================
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
textconst 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');
}
/******************************************************************
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
textconst 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
);
}
/ ============================================================
// 构造 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'); // 如需改代理自行修改
/ =========================================================================
// 放在 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;
}
/**
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);
textconst 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
textconst 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 交易>'
};
}
/* -----------------------------------------------------------
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');
}
/**
let tries = 0;
while (tries < maxRetries) {
// 轮换 Jito 节点
const url = jitoUrlIter.next().value;
tries++;
texttry { 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;
}
/* -------- 模拟交易 -------- /
/ ------------------------------------------------------------------
if (!sim) return
即可跳过本轮// 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')) {
textdumpMessageDetail(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))];
textconst 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');
}
/* ============================================================
• staticKeys + ΣALT.addresses < 256 且
• 所有 accountKeyIndex < 256
// 没有可用 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));
textif (!isMessageTooBig(msg)) { return sorted; // ← OK,返回当前 ALT 集合 }
/*
if (sorted.length === 0) {
return []; // 全删光依旧超 → 干脆不用 ALT
}
*/
if (sorted.length === 0) return []; // ← 交由调用方判空
text// ③ 删除当前“最大的”一张 ALT,继续循环 sorted.shift();
}
}
/* ==============================================================
// 过滤非法对象并按地址数降序排
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);
textif (!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_SOLLAMPORTS_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));
textif(!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 计算完之后) ====
/**
[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(avg1.2, 200_000)
const microLamports =Math.min(avgPriorFee1.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
);
textif(!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
下面只给出 必须替换/新增 的代码片段,每段都用
// ===== PATCH-BEGIN =====
/ // ===== PATCH-END =====
标注。
将对应位置整段替换即可,其它行保持原样。
data
➜ raw
)js// ===== PATCH-BEGIN (12.js, batchFetchALT 末尾部分) ===== /* 只保留 key 与原始 base64,字段名统一为 raw */ return filteredOut.map(({ key, raw }) => ({ key, raw })); // ===== PATCH-END =====
initializeAltCache()
—— 重载函数js// ===== PATCH-BEGIN (24.js, 替换整个 initializeAltCache 函数) ===== function initializeAltCache() { try { if (fs.existsSync(CACHE_FILE)) { const json = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8')); /* 兼容旧版 data 字段 → 统一映射到 raw */ globalAltCache = json.map(i => ({ key : String(i.key).trim(), raw : i.raw || i.data, // 向后兼容 })); console.log(`成功加载 ALT 缓存,包含 ${globalAltCache.length} 个 ALT`); } else { console.warn('ALT 缓存文件不存在,初始化为空缓存'); globalAltCache = []; } } catch (e) { console.error(`加载 ALT 缓存失败:${e.message}`); globalAltCache = []; } } // ===== PATCH-END =====
loadAltAccountsWithCache()
—— 开头两行js// ===== PATCH-BEGIN (24.js, loadAltAccountsWithCache 开头) ===== async function loadAltAccountsWithCache(keys) { try { const toStr = k => (typeof k === 'string' ? k.trim() : k.toBase58()); /* 用 raw 作 value,避免再找不到 */ const cacheMap = new Map(globalAltCache.map(i => [i.key, i.raw])); const uniqKeys = [...new Set(keys.map(toStr))]; // ===== PATCH-END =====
loadAltAccountsWithCache()
—— 抓到新 ALT 后写回js// ===== PATCH-BEGIN (24.js, 同一函数中新 ALT 写回处) ===== /* 写回全局缓存(字段仍用 raw) */ globalAltCache.push({ key: key.toBase58(), raw }); // ===== PATCH-END =====
loadAltAccountsWithCache()
—— 刷盘js// ===== PATCH-BEGIN (24.js, 同一函数内刷盘处) ===== fs.writeFileSync( CACHE_FILE, JSON.stringify(globalAltCache, null, 2) ); // ===== PATCH-END =====
alt-cache.json
里现在只有 key
与 raw
,避免命名不一致导致查不到。data
字段仍可自动识别,不会丢失已有缓存。cacheMap
直接按 raw
建立映射,再次查询时能够正确命中,不会反复 “新增 ALT”。替换完成后,重新运行 node 12.js
(或直接删除旧 alt-cache.json
重新抓取一次)→ 再跑 node 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 complete。 trim 时不要改顺序:先记录原索引,再按长度裁剪,最后 按原 lookupKeys 顺序 还原。
loadAltAccountsWithCache() 仍会 RPC 代码注释写“仅用缓存”,但函数里还是 missKeys → getAltAccounts(),一旦跑网络就失去了“冷启动零 RPC” 的意义。 如果确实想绝对只用缓存,把 missKeys 分支删掉/改为直接返回空;或者再加一个开关 ALLOW_FETCH_ON_MISS。
globalAltCache.push({ key, data }) 并发落盘 多个逻辑线程同时 push + writeFileSync,存在竞争(最后写入者可能覆盖)。 用 fs.writeFileSync 的 原子 rename 做落盘,或把写入放到单线程定时批量 flush。
整体判断:大部分分析是对的,但有几处细节需要补充或修正。下面按条目逐一核对。
位置 | 你的判断 | 反馈 |
---|---|---|
jIx({...}) 只传基础 3 字段,导致 ALT 少采 | 基本正确。<br/>在 Jupiter v6 里,要想一定拿到 addressLookupTableAddresses ,至少要显式传 maxAccounts ;dynamicComputeUnitLimit /prioritizationFeeLamports 会影响 CU 估算,不强制要求。<br/>因此采集端应改成和运行端 同一套 build body(含 maxAccounts: 64 ),这样能保证采到运行期真正用到的表。 | |
filterValidAltAccounts → 写盘字段冲突 | 部分正确。<br/>只要把 原始 base64(我在补丁里统一叫 raw )存下来即可;运行端可随时 deserialize(raw) 反求 state,所以 不一定要把 state 落盘。保存 state 当然也可以,但文件会大很多。 | |
采集顺序随机 | 影响有限。真正决定顺序的是运行端 lookupKeys → compileToV0Message ;只要 24 .js 在裁剪后能保持 lookupKeys 原序(见下一节第二条),采集顺序无关紧要。 |
位置 | 你的判断 | 反馈 |
---|---|---|
if (staticCnt > 38 && altStates.length === 0) return; 过早退出 | 确有问题。这句应该放到 strictTrimAlt() 之后,或直接删掉;否则还没来得及裁剪就误判为“无 ALT”。 | |
strictTrimAlt() 把 ALT 重排 | 确有问题。重排后 addressTableLookups[i] ≠ alts[i] ,模拟会直接 Program failed to complete 。<br/>修复思路:先记住原索引,内部按长度筛掉超限地址后 再按原索引排序 输出,或改成“不排序只 slice”。 | |
loadAltAccountsWithCache() 仍会 RPC | 设计取舍。若想“完全离线”可加 ALLOW_FETCH_ON_MISS=false 切掉 miss 分支;默认策略是:缓存命中 ➜ 直接用;miss ➜ RPC 拉 + 追加到缓存,保证首轮也能跑通。 | |
并发 writeFileSync 竞争 | 理论上会有。如果同时有多线程落盘,最后写入者可能覆盖。常见做法:<br/>* 把写盘放到主线程定时批量 flush;<br/>* 或 fs.writeFileSync(tmp) ➜ fs.renameSync(tmp, CACHE_FILE) ,保证原子替换。 |
最关键的两处:
jIx
加上 maxAccounts
(及其它一致参数)——让 ALT 真正采集全;strictTrimAlt()
裁剪时保持 lookupKeys 的原顺序 ——避免 “Program failed to complete”。其余(保存 state
、并发落盘、是否允许 miss 拉取)可按实际需求取舍。