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
- return {
354
- chainId,
355
- provider: new ethers.JsonRpcProvider(rpcUrl, { chainId, name: chain })
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 = new JsonRpcProvider(rpcUrl);
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 = new ethers.JsonRpcProvider(config.rpcUrl, {
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
- return {
408
- chainId,
409
- provider: new ethers.JsonRpcProvider(rpcUrl, { chainId, name: chain })
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
- const provider = new ethers.JsonRpcProvider(rpcUrl, {
493
- chainId,
494
- name: chain.toUpperCase()
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
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
264
- chainId,
265
- name: chain.toUpperCase()
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 }) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "four-flap-meme-sdk",
3
- "version": "1.3.25",
3
+ "version": "1.3.26",
4
4
  "description": "SDK for Flap bonding curve and four.meme TokenManager",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",