four-flap-meme-sdk 1.4.32 → 1.4.33

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.
@@ -599,7 +599,14 @@ export async function pancakeBatchSwapMerkle(params) {
599
599
  if (routeParams.routeType === 'v2') {
600
600
  const { v2Path } = routeParams;
601
601
  const v2RouterSeller = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, seller);
602
- sellUnsigned = await v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
602
+ if (useNativeToken) {
603
+ // ✅ 原生代币模式(BNB):Token → WBNB → BNB
604
+ sellUnsigned = await v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
605
+ }
606
+ else {
607
+ // ✅ ERC20 模式(USDT):Token → USDT
608
+ sellUnsigned = await v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
609
+ }
603
610
  }
604
611
  else if (routeParams.routeType === 'v3-single') {
605
612
  const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
@@ -608,13 +615,20 @@ export async function pancakeBatchSwapMerkle(params) {
608
615
  tokenIn: v3TokenIn,
609
616
  tokenOut: v3TokenOut,
610
617
  fee: v3Fee,
611
- recipient: PANCAKE_V3_ROUTER_ADDRESS,
618
+ recipient: useNativeToken ? PANCAKE_V3_ROUTER_ADDRESS : seller.address,
612
619
  amountIn: sellAmountWei,
613
620
  amountOutMinimum: 0n,
614
621
  sqrtPriceLimitX96: 0n
615
622
  }]);
616
- const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
617
- sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
623
+ if (useNativeToken) {
624
+ // 原生代币:需要 unwrap WBNB
625
+ const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
626
+ sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
627
+ }
628
+ else {
629
+ // ERC20:直接接收代币
630
+ sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData]);
631
+ }
618
632
  }
619
633
  else {
620
634
  throw new Error('V3 多跳路由暂不支持官方合约,请使用 V2 路由或 V3 单跳');
@@ -622,12 +636,20 @@ export async function pancakeBatchSwapMerkle(params) {
622
636
  // ✅ 并行构建多个买入交易(使用官方 Router)
623
637
  const buyUnsignedList = await Promise.all(buyers.map(async (buyer, i) => {
624
638
  const buyAmount = buyAmountsWei[i];
625
- const buyValue = useNativeToken ? buyAmount + FLAT_FEE : FLAT_FEE;
639
+ // ERC20 模式:value = 0(通过代币授权支付)
640
+ const buyValue = useNativeToken ? buyAmount + FLAT_FEE : 0n;
626
641
  if (routeParams.routeType === 'v2') {
627
642
  const { v2Path } = routeParams;
628
643
  const reversePath = [...v2Path].reverse();
629
644
  const v2RouterBuyer = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, buyer);
630
- return await v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, reversePath, buyer.address, deadline, { value: buyValue });
645
+ if (useNativeToken) {
646
+ // ✅ 原生代币模式(BNB):BNB → WBNB → Token
647
+ return await v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, reversePath, buyer.address, deadline, { value: buyValue });
648
+ }
649
+ else {
650
+ // ✅ ERC20 模式(USDT):USDT → Token
651
+ return await v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(buyAmount, 0n, reversePath, buyer.address, deadline);
652
+ }
631
653
  }
632
654
  else if (routeParams.routeType === 'v3-single') {
633
655
  const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
@@ -954,7 +976,14 @@ export async function pancakeQuickBatchSwapMerkle(params) {
954
976
  if (routeParams.routeType === 'v2') {
955
977
  const { v2Path } = routeParams;
956
978
  const v2RouterSeller = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, seller);
957
- sellUnsigned = await v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
979
+ if (useNativeToken) {
980
+ // ✅ 原生代币模式(BNB):Token → WBNB → BNB
981
+ sellUnsigned = await v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
982
+ }
983
+ else {
984
+ // ✅ ERC20 模式(USDT):Token → USDT
985
+ sellUnsigned = await v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
986
+ }
958
987
  }
959
988
  else if (routeParams.routeType === 'v3-single') {
960
989
  const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
@@ -963,13 +992,20 @@ export async function pancakeQuickBatchSwapMerkle(params) {
963
992
  tokenIn: v3TokenIn,
964
993
  tokenOut: v3TokenOut,
965
994
  fee: v3Fee,
966
- recipient: PANCAKE_V3_ROUTER_ADDRESS,
995
+ recipient: useNativeToken ? PANCAKE_V3_ROUTER_ADDRESS : seller.address,
967
996
  amountIn: sellAmountWei,
968
997
  amountOutMinimum: 0n,
969
998
  sqrtPriceLimitX96: 0n
970
999
  }]);
971
- const sellUnwrapData = v3RouterIface2.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
972
- sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
1000
+ if (useNativeToken) {
1001
+ // 原生代币:需要 unwrap WBNB
1002
+ const sellUnwrapData = v3RouterIface2.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
1003
+ sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
1004
+ }
1005
+ else {
1006
+ // ERC20:直接接收代币
1007
+ sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData]);
1008
+ }
973
1009
  }
974
1010
  else {
975
1011
  throw new Error('V3 多跳路由暂不支持官方合约,请使用 V2 路由或 V3 单跳');
@@ -1035,15 +1071,21 @@ export async function pancakeQuickBatchSwapMerkle(params) {
1035
1071
  : await Promise.all(buyers.map(buyer => nonceManager.getNextNonce(buyer)));
1036
1072
  const signedBuys = await Promise.all(buyers.map(async (buyer, i) => {
1037
1073
  const buyAmount = transferAmountsWei[i];
1038
- // BNB 模式:value = buyAmount + FLAT_FEE
1039
- // ERC20 模式:value = FLAT_FEE(买入金额通过授权支付)
1040
- const buyValue = useNativeToken ? buyAmount + FLAT_FEE : FLAT_FEE;
1074
+ // ERC20 模式:value = 0(通过代币授权支付)
1075
+ const buyValue = useNativeToken ? buyAmount + FLAT_FEE : 0n;
1041
1076
  let buyUnsigned;
1042
1077
  if (routeParams.routeType === 'v2') {
1043
1078
  const { v2Path } = routeParams;
1044
1079
  const reversePath = [...v2Path].reverse();
1045
1080
  const v2RouterBuyer = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, buyer);
1046
- buyUnsigned = await v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, reversePath, buyer.address, deadline, { value: buyValue });
1081
+ if (useNativeToken) {
1082
+ // ✅ 原生代币模式(BNB):BNB → WBNB → Token
1083
+ buyUnsigned = await v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, reversePath, buyer.address, deadline, { value: buyValue });
1084
+ }
1085
+ else {
1086
+ // ✅ ERC20 模式(USDT):USDT → Token
1087
+ buyUnsigned = await v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(buyAmount, 0n, reversePath, buyer.address, deadline);
1088
+ }
1047
1089
  }
1048
1090
  else if (routeParams.routeType === 'v3-single') {
1049
1091
  const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "four-flap-meme-sdk",
3
- "version": "1.4.32",
3
+ "version": "1.4.33",
4
4
  "description": "SDK for Flap bonding curve and four.meme TokenManager",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",