four-flap-meme-sdk 1.5.27 → 1.5.29

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.
@@ -0,0 +1,295 @@
1
+ /**
2
+ * XLayer AA 外盘 (PotatoSwap/DEX) 捆绑换手实现
3
+ */
4
+ import { Wallet, ethers } from 'ethers';
5
+ import { AANonceMap, } from './types.js';
6
+ import { POTATOSWAP_V2_ROUTER, WOKB, } from './constants.js';
7
+ import { AAAccountManager, encodeExecute } from './aa-account.js';
8
+ import { encodeApproveCall, } from './portal-ops.js';
9
+ import { DexQuery, encodeSwapExactETHForTokensSupportingFee, encodeSwapExactTokensForETHSupportingFee, } from './dex.js';
10
+ import { BundleExecutor } from './bundle.js';
11
+ function getDexDeadline(minutes = 20) {
12
+ return Math.floor(Date.now() / 1000) + minutes * 60;
13
+ }
14
+ /**
15
+ * XLayer AA 外盘换手执行器
16
+ */
17
+ export class AADexSwapExecutor {
18
+ constructor(config = {}) {
19
+ this.config = config;
20
+ this.aaManager = new AAAccountManager(config);
21
+ this.dexQuery = new DexQuery({
22
+ rpcUrl: config.rpcUrl,
23
+ chainId: config.chainId,
24
+ });
25
+ this.bundleExecutor = new BundleExecutor(config);
26
+ }
27
+ /**
28
+ * 获取 Router 地址
29
+ */
30
+ getEffectiveRouter(params) {
31
+ if (params.routerAddress)
32
+ return params.routerAddress;
33
+ if (params.dexKey === 'DYORSWAP') {
34
+ return '0xfb001fbbace32f09cb6d3c449b935183de53ee96';
35
+ }
36
+ return POTATOSWAP_V2_ROUTER;
37
+ }
38
+ /**
39
+ * AA 外盘单钱包换手签名
40
+ */
41
+ async bundleSwapSign(params) {
42
+ const { dexKey, routerAddress: routerAddressIn, tokenAddress, sellerPrivateKey, buyerPrivateKey, sellAmount, sellPercent = 100, buyAmountOkb, slippageBps = 100, payerPrivateKey, beneficiary: beneficiaryIn, payerStartNonce, routeAddress, skipApprovalCheck = false, } = params;
43
+ const effectiveRouter = this.getEffectiveRouter({ dexKey, routerAddress: routerAddressIn });
44
+ const provider = this.aaManager.getProvider();
45
+ const sellerOwner = new Wallet(sellerPrivateKey, provider);
46
+ const buyerOwner = new Wallet(buyerPrivateKey, provider);
47
+ const payerWallet = new Wallet(payerPrivateKey || sellerPrivateKey, provider);
48
+ const beneficiary = beneficiaryIn || payerWallet.address;
49
+ const [sellerAi, buyerAi] = await this.aaManager.getMultipleAccountInfo([sellerOwner.address, buyerOwner.address]);
50
+ const sellerSender = sellerAi.sender;
51
+ const buyerSender = buyerAi.sender;
52
+ const nonceMap = new AANonceMap();
53
+ nonceMap.init(sellerSender, sellerAi.nonce);
54
+ nonceMap.init(buyerSender, buyerAi.nonce);
55
+ // initCode:确保“同一 sender”只在第一笔 op 携带
56
+ const initCodeBySenderLower = new Map();
57
+ const initIfNeeded = (sender, deployed, ownerAddress) => {
58
+ const k = sender.toLowerCase();
59
+ if (initCodeBySenderLower.has(k))
60
+ return;
61
+ initCodeBySenderLower.set(k, deployed ? '0x' : this.aaManager.generateInitCode(ownerAddress));
62
+ };
63
+ const consumeInitCode = (sender) => {
64
+ const k = sender.toLowerCase();
65
+ const cur = initCodeBySenderLower.get(k);
66
+ if (cur === undefined)
67
+ throw new Error(`initCode not initialized for sender: ${sender}`);
68
+ if (cur !== '0x')
69
+ initCodeBySenderLower.set(k, '0x');
70
+ return cur;
71
+ };
72
+ initIfNeeded(sellerSender, !!sellerAi?.deployed, sellerOwner.address);
73
+ initIfNeeded(buyerSender, !!buyerAi?.deployed, buyerOwner.address);
74
+ const decimals = await this.bundleExecutor['getErc20Decimals'](tokenAddress);
75
+ const sellerTokenBal = await this.aaManager.getErc20Balance(tokenAddress, sellerSender);
76
+ const sellAmountWei = sellAmount
77
+ ? ethers.parseUnits(String(sellAmount), decimals)
78
+ : (sellerTokenBal * BigInt(sellPercent)) / 100n;
79
+ if (sellAmountWei <= 0n)
80
+ throw new Error('卖出数量无效');
81
+ // 授权检查
82
+ let needApprove = false;
83
+ if (!skipApprovalCheck) {
84
+ const allowance = await this.aaManager.getErc20Allowance(tokenAddress, sellerSender, effectiveRouter);
85
+ needApprove = allowance < sellAmountWei;
86
+ }
87
+ // 报价
88
+ let finalBuyAmountWei;
89
+ if (buyAmountOkb) {
90
+ finalBuyAmountWei = ethers.parseEther(String(buyAmountOkb));
91
+ }
92
+ else {
93
+ const quoted = await this.dexQuery.quoteTokenToOkb(sellAmountWei, tokenAddress);
94
+ finalBuyAmountWei = (quoted * BigInt(10000 - slippageBps)) / 10000n;
95
+ }
96
+ const outOps = [];
97
+ if (needApprove) {
98
+ const { userOp } = await this.aaManager.buildUserOpWithFixedGas({
99
+ ownerWallet: sellerOwner,
100
+ sender: sellerSender,
101
+ nonce: nonceMap.next(sellerSender),
102
+ initCode: consumeInitCode(sellerSender),
103
+ callData: encodeExecute(tokenAddress, 0n, encodeApproveCall(effectiveRouter)),
104
+ deployed: sellerAi.deployed,
105
+ });
106
+ const signedApprove = await this.aaManager.signUserOp(userOp, sellerOwner);
107
+ outOps.push(signedApprove.userOp);
108
+ }
109
+ // Sell op
110
+ const sellSwapData = encodeSwapExactTokensForETHSupportingFee(sellAmountWei, 0n, [tokenAddress, WOKB], sellerSender, getDexDeadline());
111
+ const sellCallData = encodeExecute(effectiveRouter, 0n, sellSwapData);
112
+ const signedSell = await this.aaManager.buildUserOpWithState({
113
+ ownerWallet: sellerOwner,
114
+ sender: sellerSender,
115
+ nonce: nonceMap.next(sellerSender),
116
+ initCode: consumeInitCode(sellerSender),
117
+ callData: sellCallData,
118
+ signOnly: true,
119
+ });
120
+ outOps.push(signedSell.userOp);
121
+ // Buy op
122
+ const buySwapData = encodeSwapExactETHForTokensSupportingFee(0n, [WOKB, tokenAddress], buyerSender, getDexDeadline());
123
+ const buyCallData = encodeExecute(effectiveRouter, finalBuyAmountWei, buySwapData);
124
+ const signedBuy = await this.aaManager.buildUserOpWithState({
125
+ ownerWallet: buyerOwner,
126
+ sender: buyerSender,
127
+ nonce: nonceMap.next(buyerSender),
128
+ initCode: consumeInitCode(buyerSender),
129
+ callData: buyCallData,
130
+ signOnly: true,
131
+ });
132
+ outOps.push(signedBuy.userOp);
133
+ const signedHandleOps = await this.bundleExecutor['signHandleOpsTx']({
134
+ ops: outOps,
135
+ payerWallet,
136
+ beneficiary,
137
+ nonce: payerStartNonce,
138
+ });
139
+ const signedTransactions = [signedHandleOps];
140
+ if (routeAddress) {
141
+ const tx = ethers.Transaction.from(signedHandleOps);
142
+ const tailTx = await payerWallet.signTransaction({
143
+ to: routeAddress,
144
+ value: 0n,
145
+ nonce: Number(tx.nonce) + 1,
146
+ gasLimit: 21000n,
147
+ gasPrice: tx.gasPrice,
148
+ chainId: tx.chainId,
149
+ type: 0,
150
+ });
151
+ signedTransactions.push(tailTx);
152
+ }
153
+ return {
154
+ signedTransactions,
155
+ metadata: {
156
+ payer: payerWallet.address,
157
+ beneficiary,
158
+ sellerOwner: sellerOwner.address,
159
+ sellerSender,
160
+ buyerOwner: buyerOwner.address,
161
+ buyerSender,
162
+ sellAmountWei: sellAmountWei.toString(),
163
+ buyAmountWei: finalBuyAmountWei.toString(),
164
+ hasApprove: needApprove,
165
+ routeAddress,
166
+ },
167
+ };
168
+ }
169
+ /**
170
+ * AA 外盘批量换手签名
171
+ */
172
+ async bundleBatchSwapSign(params) {
173
+ const { dexKey, routerAddress: routerAddressIn, tokenAddress, sellerPrivateKey, buyerPrivateKeys, buyAmountsOkb, sellAmount, sellPercent = 100, payerPrivateKey, beneficiary: beneficiaryIn, payerStartNonce, routeAddress, skipApprovalCheck = false, } = params;
174
+ const effectiveRouter = this.getEffectiveRouter({ dexKey, routerAddress: routerAddressIn });
175
+ const provider = this.aaManager.getProvider();
176
+ const sellerOwner = new Wallet(sellerPrivateKey, provider);
177
+ const buyerOwners = buyerPrivateKeys.map(pk => new Wallet(pk, provider));
178
+ const payerWallet = new Wallet(payerPrivateKey || sellerPrivateKey, provider);
179
+ const beneficiary = beneficiaryIn || payerWallet.address;
180
+ const accountInfos = await this.aaManager.getMultipleAccountInfo([sellerOwner.address, ...buyerOwners.map(w => w.address)]);
181
+ const sellerAi = accountInfos[0];
182
+ const buyerAis = accountInfos.slice(1);
183
+ const nonceMap = new AANonceMap();
184
+ nonceMap.init(sellerAi.sender, sellerAi.nonce);
185
+ buyerAis.forEach(ai => nonceMap.init(ai.sender, ai.nonce));
186
+ // initCode:确保同一 sender 只在第一笔 op 携带
187
+ const initCodeBySenderLower = new Map();
188
+ const initIfNeeded = (sender, deployed, ownerAddress) => {
189
+ const k = sender.toLowerCase();
190
+ if (initCodeBySenderLower.has(k))
191
+ return;
192
+ initCodeBySenderLower.set(k, deployed ? '0x' : this.aaManager.generateInitCode(ownerAddress));
193
+ };
194
+ const consumeInitCode = (sender) => {
195
+ const k = sender.toLowerCase();
196
+ const cur = initCodeBySenderLower.get(k);
197
+ if (cur === undefined)
198
+ throw new Error(`initCode not initialized for sender: ${sender}`);
199
+ if (cur !== '0x')
200
+ initCodeBySenderLower.set(k, '0x');
201
+ return cur;
202
+ };
203
+ initIfNeeded(sellerAi.sender, sellerAi.deployed, sellerOwner.address);
204
+ for (let i = 0; i < buyerOwners.length; i++) {
205
+ initIfNeeded(buyerAis[i].sender, buyerAis[i].deployed, buyerOwners[i].address);
206
+ }
207
+ const decimals = await this.bundleExecutor['getErc20Decimals'](tokenAddress);
208
+ const sellerTokenBal = await this.aaManager.getErc20Balance(tokenAddress, sellerAi.sender);
209
+ const sellAmountWei = sellAmount
210
+ ? ethers.parseUnits(String(sellAmount), decimals)
211
+ : (sellerTokenBal * BigInt(sellPercent)) / 100n;
212
+ let needApprove = false;
213
+ if (!skipApprovalCheck) {
214
+ const allowance = await this.aaManager.getErc20Allowance(tokenAddress, sellerAi.sender, effectiveRouter);
215
+ needApprove = allowance < sellAmountWei;
216
+ }
217
+ const outOps = [];
218
+ if (needApprove) {
219
+ const { userOp } = await this.aaManager.buildUserOpWithFixedGas({
220
+ ownerWallet: sellerOwner,
221
+ sender: sellerAi.sender,
222
+ nonce: nonceMap.next(sellerAi.sender),
223
+ initCode: consumeInitCode(sellerAi.sender),
224
+ callData: encodeExecute(tokenAddress, 0n, encodeApproveCall(effectiveRouter)),
225
+ deployed: sellerAi.deployed,
226
+ });
227
+ const signedApprove = await this.aaManager.signUserOp(userOp, sellerOwner);
228
+ outOps.push(signedApprove.userOp);
229
+ }
230
+ // Sell op
231
+ const sellSwapData = encodeSwapExactTokensForETHSupportingFee(sellAmountWei, 0n, [tokenAddress, WOKB], sellerAi.sender, getDexDeadline());
232
+ const sellCallData = encodeExecute(effectiveRouter, 0n, sellSwapData);
233
+ const signedSell = await this.aaManager.buildUserOpWithState({
234
+ ownerWallet: sellerOwner,
235
+ sender: sellerAi.sender,
236
+ nonce: nonceMap.next(sellerAi.sender),
237
+ initCode: consumeInitCode(sellerAi.sender),
238
+ callData: sellCallData,
239
+ signOnly: true,
240
+ });
241
+ outOps.push(signedSell.userOp);
242
+ // Batch Buy ops
243
+ const buyAmountsWei = buyAmountsOkb.map(a => ethers.parseEther(a));
244
+ for (let i = 0; i < buyerOwners.length; i++) {
245
+ const ai = buyerAis[i];
246
+ const buyWei = buyAmountsWei[i];
247
+ const buySwapData = encodeSwapExactETHForTokensSupportingFee(0n, [WOKB, tokenAddress], ai.sender, getDexDeadline());
248
+ const buyCallData = encodeExecute(effectiveRouter, buyWei, buySwapData);
249
+ const signedBuy = await this.aaManager.buildUserOpWithState({
250
+ ownerWallet: buyerOwners[i],
251
+ sender: ai.sender,
252
+ nonce: nonceMap.next(ai.sender),
253
+ initCode: consumeInitCode(ai.sender),
254
+ callData: buyCallData,
255
+ signOnly: true,
256
+ });
257
+ outOps.push(signedBuy.userOp);
258
+ }
259
+ const signedHandleOps = await this.bundleExecutor['signHandleOpsTx']({
260
+ ops: outOps,
261
+ payerWallet,
262
+ beneficiary,
263
+ nonce: payerStartNonce,
264
+ });
265
+ const signedTransactions = [signedHandleOps];
266
+ if (routeAddress) {
267
+ const tx = ethers.Transaction.from(signedHandleOps);
268
+ const tailTx = await payerWallet.signTransaction({
269
+ to: routeAddress,
270
+ value: 0n,
271
+ nonce: Number(tx.nonce) + 1,
272
+ gasLimit: 21000n,
273
+ gasPrice: tx.gasPrice,
274
+ chainId: tx.chainId,
275
+ type: 0,
276
+ });
277
+ signedTransactions.push(tailTx);
278
+ }
279
+ return {
280
+ signedTransactions,
281
+ metadata: {
282
+ payer: payerWallet.address,
283
+ beneficiary,
284
+ sellerOwner: sellerOwner.address,
285
+ sellerSender: sellerAi.sender,
286
+ buyerOwners: buyerOwners.map(w => w.address),
287
+ buyerSenders: buyerAis.map(ai => ai.sender),
288
+ sellAmountWei: sellAmountWei.toString(),
289
+ buyAmountsWei: buyAmountsWei.map(w => w.toString()),
290
+ hasApprove: needApprove,
291
+ routeAddress,
292
+ },
293
+ };
294
+ }
295
+ }
@@ -58,20 +58,37 @@
58
58
  */
59
59
  export * from './constants.js';
60
60
  export * from './types.js';
61
+ import type { BundleSwapSignParams, BundleSwapSignResult, BundleBatchSwapSignParams, BundleBatchSwapSignResult } from './types.js';
61
62
  export { BundlerClient, createBundlerClient, type BundlerConfig, type BundlerReceipt, } from './bundler.js';
62
63
  export { AAAccountManager, createAAAccountManager, predictSender, createWallet, encodeExecute, encodeExecuteBatch, generateAAWallets, generateAAWalletsFromMnemonic, predictSendersFromPrivateKeys, type GeneratedAAWallet, type GenerateAAWalletsParams, type GenerateAAWalletsResult, } from './aa-account.js';
63
64
  export { encodeBuyCall, encodeSellCall, encodeApproveCall, encodeTransferCall, PortalQuery, createPortalQuery, applySlippage, formatOkb, parseOkb, formatTokenAmount, parseTokenAmount, type PortalQueryConfig, } from './portal-ops.js';
64
- export { BundleExecutor, createBundleExecutor, bundleBuy, bundleSell, bundleBuySell, bundleSwap, bundleSwapSign, bundleBatchSwap, bundleBatchSwapSign, } from './bundle.js';
65
+ export { BundleExecutor, createBundleExecutor, bundleBuy, bundleSell, bundleBuySell, } from './bundle.js';
66
+ export { AAPortalSwapExecutor, } from './portal-bundle-swap.js';
67
+ export { AADexSwapExecutor, } from './dex-bundle-swap.js';
68
+ /**
69
+ * XLayer AA 换手签名 (卖 -> 买)
70
+ */
71
+ export declare function bundleSwapSign(params: BundleSwapSignParams & {
72
+ skipApprovalCheck?: boolean;
73
+ }): Promise<BundleSwapSignResult>;
74
+ /**
75
+ * XLayer AA 批量换手签名 (一卖多买)
76
+ */
77
+ export declare function bundleBatchSwapSign(params: BundleBatchSwapSignParams & {
78
+ skipApprovalCheck?: boolean;
79
+ }): Promise<BundleBatchSwapSignResult>;
65
80
  export { VolumeExecutor, createVolumeExecutor, makeVolume, singleRoundVolume, } from './volume.js';
66
81
  export { DexQuery, DexExecutor, createDexQuery, createDexExecutor, quoteOkbToToken, quoteTokenToOkb, encodeSwapExactETHForTokens, encodeSwapExactTokensForETH, encodeSwapExactTokensForTokens, encodeSwapExactETHForTokensSupportingFee, encodeSwapExactTokensForETHSupportingFee, encodeSwapExactTokensForTokensSupportingFee, type DexConfig, } from './dex.js';
67
82
  export declare const xlayer: {
68
83
  bundleBuy: (params: import("./types.js").BundleBuyParams) => Promise<import("./types.js").BundleBuyResult>;
69
84
  bundleSell: (params: import("./types.js").BundleSellParams) => Promise<import("./types.js").BundleSellResult>;
70
85
  bundleBuySell: (params: import("./types.js").BundleBuySellParams) => Promise<import("./types.js").BundleBuySellResult>;
71
- bundleSwap: (params: import("./types.js").BundleSwapParams) => Promise<import("./types.js").BundleSwapResult>;
72
- bundleSwapSign: (params: import("./types.js").BundleSwapSignParams) => Promise<import("./types.js").BundleSwapSignResult>;
73
- bundleBatchSwap: (params: import("./types.js").BundleBatchSwapParams) => Promise<import("./types.js").BundleBatchSwapResult>;
74
- bundleBatchSwapSign: (params: import("./types.js").BundleBatchSwapSignParams) => Promise<import("./types.js").BundleBatchSwapSignResult>;
86
+ bundleSwapSign: (params: BundleSwapSignParams & {
87
+ skipApprovalCheck?: boolean;
88
+ }) => Promise<BundleSwapSignResult>;
89
+ bundleBatchSwapSign: (params: BundleBatchSwapSignParams & {
90
+ skipApprovalCheck?: boolean;
91
+ }) => Promise<BundleBatchSwapSignResult>;
75
92
  makeVolume: (params: import("./types.js").VolumeParams) => Promise<import("./types.js").VolumeResult>;
76
93
  quoteOkbToToken: (okbAmount: bigint, tokenAddress: string, config?: import("./dex.js").DexConfig | undefined) => Promise<bigint>;
77
94
  quoteTokenToOkb: (tokenAmount: bigint, tokenAddress: string, config?: import("./dex.js").DexConfig | undefined) => Promise<bigint>;
@@ -81,7 +81,36 @@ export { encodeBuyCall, encodeSellCall, encodeApproveCall, encodeTransferCall, P
81
81
  // ============================================================================
82
82
  // 捆绑交易
83
83
  // ============================================================================
84
- export { BundleExecutor, createBundleExecutor, bundleBuy, bundleSell, bundleBuySell, bundleSwap, bundleSwapSign, bundleBatchSwap, bundleBatchSwapSign, } from './bundle.js';
84
+ export { BundleExecutor, createBundleExecutor, bundleBuy, bundleSell, bundleBuySell, } from './bundle.js';
85
+ // ============================================================================
86
+ // 捆绑换手 (AASwap)
87
+ // ============================================================================
88
+ export { AAPortalSwapExecutor, } from './portal-bundle-swap.js';
89
+ export { AADexSwapExecutor, } from './dex-bundle-swap.js';
90
+ /**
91
+ * XLayer AA 换手签名 (卖 -> 买)
92
+ */
93
+ export async function bundleSwapSign(params) {
94
+ const { tradeType = 'FLAP' } = params;
95
+ if (tradeType === 'FLAP') {
96
+ return new (await import('./portal-bundle-swap.js')).AAPortalSwapExecutor(params.config).bundleSwapSign(params);
97
+ }
98
+ else {
99
+ return new (await import('./dex-bundle-swap.js')).AADexSwapExecutor(params.config).bundleSwapSign(params);
100
+ }
101
+ }
102
+ /**
103
+ * XLayer AA 批量换手签名 (一卖多买)
104
+ */
105
+ export async function bundleBatchSwapSign(params) {
106
+ const { tradeType = 'FLAP' } = params;
107
+ if (tradeType === 'FLAP') {
108
+ return new (await import('./portal-bundle-swap.js')).AAPortalSwapExecutor(params.config).bundleBatchSwapSign(params);
109
+ }
110
+ else {
111
+ return new (await import('./dex-bundle-swap.js')).AADexSwapExecutor(params.config).bundleBatchSwapSign(params);
112
+ }
113
+ }
85
114
  // ============================================================================
86
115
  // 刷量/做市
87
116
  // ============================================================================
@@ -112,22 +141,9 @@ export const xlayer = {
112
141
  const { bundleBuySell } = await import('./bundle.js');
113
142
  return bundleBuySell(...args);
114
143
  },
115
- bundleSwap: async (...args) => {
116
- const { bundleSwap } = await import('./bundle.js');
117
- return bundleSwap(...args);
118
- },
119
- bundleSwapSign: async (...args) => {
120
- const { bundleSwapSign } = await import('./bundle.js');
121
- return bundleSwapSign(...args);
122
- },
123
- bundleBatchSwap: async (...args) => {
124
- const { bundleBatchSwap } = await import('./bundle.js');
125
- return bundleBatchSwap(...args);
126
- },
127
- bundleBatchSwapSign: async (...args) => {
128
- const { bundleBatchSwapSign } = await import('./bundle.js');
129
- return bundleBatchSwapSign(...args);
130
- },
144
+ // 捆绑换手(AA):仅签名(raw signed tx)
145
+ bundleSwapSign: async (...args) => bundleSwapSign(...args),
146
+ bundleBatchSwapSign: async (...args) => bundleBatchSwapSign(...args),
131
147
  // 刷量
132
148
  makeVolume: async (...args) => {
133
149
  const { makeVolume } = await import('./volume.js');
@@ -0,0 +1,26 @@
1
+ /**
2
+ * XLayer AA 内盘 (Flap Portal) 捆绑换手实现
3
+ */
4
+ import { XLayerConfig, BundleSwapSignParams, BundleSwapSignResult, BundleBatchSwapSignParams, BundleBatchSwapSignResult } from './types.js';
5
+ /**
6
+ * XLayer AA 内盘换手执行器
7
+ */
8
+ export declare class AAPortalSwapExecutor {
9
+ private aaManager;
10
+ private portalQuery;
11
+ private bundleExecutor;
12
+ private config;
13
+ constructor(config?: XLayerConfig);
14
+ /**
15
+ * AA 内盘单钱包换手签名
16
+ */
17
+ bundleSwapSign(params: BundleSwapSignParams & {
18
+ skipApprovalCheck?: boolean;
19
+ }): Promise<BundleSwapSignResult>;
20
+ /**
21
+ * AA 内盘批量换手签名 (一卖多买)
22
+ */
23
+ bundleBatchSwapSign(params: BundleBatchSwapSignParams & {
24
+ skipApprovalCheck?: boolean;
25
+ }): Promise<BundleBatchSwapSignResult>;
26
+ }