four-flap-meme-sdk 1.3.25 → 1.3.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -348,12 +348,22 @@ export async function batchSellWithBundleMerkle(params) {
|
|
|
348
348
|
signedTransactions: signedTxs
|
|
349
349
|
};
|
|
350
350
|
}
|
|
351
|
+
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
352
|
+
const providerCache = new Map();
|
|
353
|
+
const PROVIDER_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
|
|
351
354
|
function createChainContext(chain, rpcUrl) {
|
|
352
355
|
const chainId = CHAIN_ID_MAP[chain];
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
356
|
+
const cacheKey = `${chain}-${rpcUrl}`;
|
|
357
|
+
const now = Date.now();
|
|
358
|
+
// ✅ 检查缓存
|
|
359
|
+
const cached = providerCache.get(cacheKey);
|
|
360
|
+
if (cached && cached.expireAt > now) {
|
|
361
|
+
return { chainId, provider: cached.provider };
|
|
362
|
+
}
|
|
363
|
+
// ✅ 创建新 Provider 并缓存
|
|
364
|
+
const provider = new ethers.JsonRpcProvider(rpcUrl, { chainId, name: chain });
|
|
365
|
+
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
366
|
+
return { chainId, provider };
|
|
357
367
|
}
|
|
358
368
|
async function resolveGasPrice(provider, config) {
|
|
359
369
|
// ✅ 优化:如果前端传入了 gasPrice,直接使用(跳过 RPC 调用)
|
|
@@ -130,13 +130,28 @@ async function buildV3MultiHopTransactions(proxies, wallets, lpAddresses, exactT
|
|
|
130
130
|
}));
|
|
131
131
|
}
|
|
132
132
|
// ==================== 主要导出函数 ====================
|
|
133
|
+
/**
|
|
134
|
+
* ✅ 获取缓存的 Provider(通用方法)
|
|
135
|
+
*/
|
|
136
|
+
function getCachedProvider(chain, rpcUrl, chainId) {
|
|
137
|
+
const cacheKey = `${chain}-${rpcUrl}`;
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
const cached = providerCache.get(cacheKey);
|
|
140
|
+
if (cached && cached.expireAt > now) {
|
|
141
|
+
return cached.provider;
|
|
142
|
+
}
|
|
143
|
+
const resolvedChainId = chainId ?? (CHAIN_ID_MAP[chain] || 56);
|
|
144
|
+
const provider = new JsonRpcProvider(rpcUrl, { chainId: resolvedChainId, name: chain });
|
|
145
|
+
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
146
|
+
return provider;
|
|
147
|
+
}
|
|
133
148
|
/**
|
|
134
149
|
* 授权代币给 PancakeSwapProxy
|
|
135
150
|
*/
|
|
136
151
|
export async function approvePancakeProxy(params) {
|
|
137
152
|
const { chain, privateKey, tokenAddress, amount, rpcUrl } = params;
|
|
138
153
|
const pancakeProxyAddress = ADDRESSES.BSC.PancakeProxy;
|
|
139
|
-
const provider =
|
|
154
|
+
const provider = getCachedProvider(chain, rpcUrl); // ✅ 使用缓存
|
|
140
155
|
const wallet = new Wallet(privateKey, provider);
|
|
141
156
|
const token = new Contract(tokenAddress, ERC20_ABI, wallet);
|
|
142
157
|
// 查询 decimals
|
|
@@ -165,10 +180,7 @@ export async function approvePancakeProxyBatch(params) {
|
|
|
165
180
|
}
|
|
166
181
|
const pancakeProxyAddress = ADDRESSES.BSC.PancakeProxy;
|
|
167
182
|
const chainId = CHAIN_ID_MAP[chain];
|
|
168
|
-
const provider =
|
|
169
|
-
chainId,
|
|
170
|
-
name: chain.toUpperCase()
|
|
171
|
-
});
|
|
183
|
+
const provider = getCachedProvider(chain, config.rpcUrl, chainId); // ✅ 使用缓存
|
|
172
184
|
const gasPrice = await getOptimizedGasPrice(provider, getGasPriceConfig(config));
|
|
173
185
|
// 查询 decimals
|
|
174
186
|
const decimals = await getTokenDecimals(tokenAddress, provider);
|
|
@@ -402,12 +414,22 @@ export async function pancakeProxyBatchSellMerkle(params) {
|
|
|
402
414
|
signedTransactions: signedTxs
|
|
403
415
|
};
|
|
404
416
|
}
|
|
417
|
+
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
418
|
+
const providerCache = new Map();
|
|
419
|
+
const PROVIDER_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
|
|
405
420
|
function createChainContext(chain, rpcUrl) {
|
|
406
421
|
const chainId = CHAIN_ID_MAP[chain];
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
422
|
+
const cacheKey = `${chain}-${rpcUrl}`;
|
|
423
|
+
const now = Date.now();
|
|
424
|
+
// ✅ 检查缓存
|
|
425
|
+
const cached = providerCache.get(cacheKey);
|
|
426
|
+
if (cached && cached.expireAt > now) {
|
|
427
|
+
return { chainId, provider: cached.provider };
|
|
428
|
+
}
|
|
429
|
+
// ✅ 创建新 Provider 并缓存
|
|
430
|
+
const provider = new JsonRpcProvider(rpcUrl, { chainId, name: chain });
|
|
431
|
+
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
432
|
+
return { chainId, provider };
|
|
411
433
|
}
|
|
412
434
|
function createWallets(privateKeys, provider) {
|
|
413
435
|
return privateKeys.map(key => new Wallet(key, provider));
|
|
@@ -485,13 +485,27 @@ async function buildProfitTransaction({ seller, profitAmount, profitNonce, gasPr
|
|
|
485
485
|
function countTruthy(values) {
|
|
486
486
|
return values.filter(Boolean).length;
|
|
487
487
|
}
|
|
488
|
+
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
489
|
+
const providerCache = new Map();
|
|
490
|
+
const PROVIDER_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
|
|
488
491
|
function createChainContext(chain, rpcUrl) {
|
|
489
492
|
const chainId = getChainId(chain);
|
|
490
493
|
const nativeToken = getNativeTokenName(chain);
|
|
491
494
|
const portalAddress = FLAP_PORTAL_ADDRESSES[chain.toUpperCase()];
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
495
|
+
// ✅ Provider 缓存
|
|
496
|
+
const cacheKey = `${chain}-${rpcUrl}`;
|
|
497
|
+
const now = Date.now();
|
|
498
|
+
const cached = providerCache.get(cacheKey);
|
|
499
|
+
let provider;
|
|
500
|
+
if (cached && cached.expireAt > now) {
|
|
501
|
+
provider = cached.provider;
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
provider = new ethers.JsonRpcProvider(rpcUrl, {
|
|
505
|
+
chainId,
|
|
506
|
+
name: chain.toUpperCase()
|
|
507
|
+
});
|
|
508
|
+
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
509
|
+
}
|
|
496
510
|
return { chainId, nativeToken, portalAddress, provider };
|
|
497
511
|
}
|
|
@@ -256,14 +256,28 @@ export async function flapBundleSwapMerkle(params) {
|
|
|
256
256
|
};
|
|
257
257
|
}
|
|
258
258
|
// ==================== 工具函数 ====================
|
|
259
|
+
// ✅ Provider 缓存(复用连接,减少初始化开销)
|
|
260
|
+
const providerCache = new Map();
|
|
261
|
+
const PROVIDER_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
|
|
259
262
|
function createChainContext(chain, config) {
|
|
260
263
|
const chainId = config.chainId ?? getChainId(chain);
|
|
261
264
|
const nativeToken = getNativeTokenName(chain);
|
|
262
265
|
const portalAddress = FLAP_PORTAL_ADDRESSES[chain.toUpperCase()];
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
266
|
+
// ✅ Provider 缓存
|
|
267
|
+
const cacheKey = `${chain}-${config.rpcUrl}`;
|
|
268
|
+
const now = Date.now();
|
|
269
|
+
const cached = providerCache.get(cacheKey);
|
|
270
|
+
let provider;
|
|
271
|
+
if (cached && cached.expireAt > now) {
|
|
272
|
+
provider = cached.provider;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
provider = new ethers.JsonRpcProvider(config.rpcUrl, {
|
|
276
|
+
chainId,
|
|
277
|
+
name: chain.toUpperCase()
|
|
278
|
+
});
|
|
279
|
+
providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
|
|
280
|
+
}
|
|
267
281
|
return { chainId, nativeToken, portalAddress, provider };
|
|
268
282
|
}
|
|
269
283
|
async function buildApprovalTransaction({ tokenAddress, seller, provider, decimals, portalAddress, chainId, config }) {
|