four-flap-meme-sdk 1.4.31 → 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.
@@ -57,18 +57,31 @@ async function quoteSellOutput({ routeParams, sellAmountWei, provider }) {
57
57
  }
58
58
  async function buildSwapTransactions({ routeParams, sellAmountWei, buyAmountBNB, buyer, seller, tokenAddress, useNativeToken = true }) {
59
59
  const deadline = getDeadline();
60
- // ✅ ERC20 购买时,value 只需要 FLAT_FEE
61
- const buyValue = useNativeToken ? buyAmountBNB + FLAT_FEE : FLAT_FEE;
60
+ // ✅ ERC20 购买时,value = 0(通过代币授权支付)
61
+ const buyValue = useNativeToken ? buyAmountBNB + FLAT_FEE : 0n;
62
62
  if (routeParams.routeType === 'v2') {
63
63
  const { v2Path } = routeParams;
64
64
  const reversePath = [...v2Path].reverse();
65
65
  // ✅ 使用官方 V2 Router
66
66
  const v2RouterSeller = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, seller);
67
67
  const v2RouterBuyer = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, buyer);
68
- // 卖出:Token → BNB
69
- const sellUnsigned = await v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
70
- // 买入:BNB → Token
71
- const buyUnsigned = await v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, reversePath, buyer.address, deadline, { value: buyValue });
68
+ let sellUnsigned;
69
+ let buyUnsigned;
70
+ if (useNativeToken) {
71
+ // 原生代币模式(BNB)
72
+ // 卖出:Token → WBNB → BNB
73
+ sellUnsigned = await v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
74
+ // 买入:BNB → WBNB → Token
75
+ buyUnsigned = await v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, reversePath, buyer.address, deadline, { value: buyValue });
76
+ }
77
+ else {
78
+ // ✅ ERC20 模式(如 USDT)
79
+ // 卖出:Token → USDT
80
+ sellUnsigned = await v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
81
+ // 买入:USDT → Token
82
+ buyUnsigned = await v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(buyAmountBNB, // USDT 数量
83
+ 0n, reversePath, buyer.address, deadline);
84
+ }
72
85
  return { sellUnsigned, buyUnsigned };
73
86
  }
74
87
  if (routeParams.routeType === 'v3-single') {
@@ -586,7 +599,14 @@ export async function pancakeBatchSwapMerkle(params) {
586
599
  if (routeParams.routeType === 'v2') {
587
600
  const { v2Path } = routeParams;
588
601
  const v2RouterSeller = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, seller);
589
- 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
+ }
590
610
  }
591
611
  else if (routeParams.routeType === 'v3-single') {
592
612
  const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
@@ -595,13 +615,20 @@ export async function pancakeBatchSwapMerkle(params) {
595
615
  tokenIn: v3TokenIn,
596
616
  tokenOut: v3TokenOut,
597
617
  fee: v3Fee,
598
- recipient: PANCAKE_V3_ROUTER_ADDRESS,
618
+ recipient: useNativeToken ? PANCAKE_V3_ROUTER_ADDRESS : seller.address,
599
619
  amountIn: sellAmountWei,
600
620
  amountOutMinimum: 0n,
601
621
  sqrtPriceLimitX96: 0n
602
622
  }]);
603
- const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
604
- 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
+ }
605
632
  }
606
633
  else {
607
634
  throw new Error('V3 多跳路由暂不支持官方合约,请使用 V2 路由或 V3 单跳');
@@ -609,12 +636,20 @@ export async function pancakeBatchSwapMerkle(params) {
609
636
  // ✅ 并行构建多个买入交易(使用官方 Router)
610
637
  const buyUnsignedList = await Promise.all(buyers.map(async (buyer, i) => {
611
638
  const buyAmount = buyAmountsWei[i];
612
- const buyValue = useNativeToken ? buyAmount + FLAT_FEE : FLAT_FEE;
639
+ // ERC20 模式:value = 0(通过代币授权支付)
640
+ const buyValue = useNativeToken ? buyAmount + FLAT_FEE : 0n;
613
641
  if (routeParams.routeType === 'v2') {
614
642
  const { v2Path } = routeParams;
615
643
  const reversePath = [...v2Path].reverse();
616
644
  const v2RouterBuyer = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, buyer);
617
- 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
+ }
618
653
  }
619
654
  else if (routeParams.routeType === 'v3-single') {
620
655
  const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
@@ -941,7 +976,14 @@ export async function pancakeQuickBatchSwapMerkle(params) {
941
976
  if (routeParams.routeType === 'v2') {
942
977
  const { v2Path } = routeParams;
943
978
  const v2RouterSeller = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, seller);
944
- 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
+ }
945
987
  }
946
988
  else if (routeParams.routeType === 'v3-single') {
947
989
  const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
@@ -950,13 +992,20 @@ export async function pancakeQuickBatchSwapMerkle(params) {
950
992
  tokenIn: v3TokenIn,
951
993
  tokenOut: v3TokenOut,
952
994
  fee: v3Fee,
953
- recipient: PANCAKE_V3_ROUTER_ADDRESS,
995
+ recipient: useNativeToken ? PANCAKE_V3_ROUTER_ADDRESS : seller.address,
954
996
  amountIn: sellAmountWei,
955
997
  amountOutMinimum: 0n,
956
998
  sqrtPriceLimitX96: 0n
957
999
  }]);
958
- const sellUnwrapData = v3RouterIface2.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
959
- 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
+ }
960
1009
  }
961
1010
  else {
962
1011
  throw new Error('V3 多跳路由暂不支持官方合约,请使用 V2 路由或 V3 单跳');
@@ -1022,15 +1071,21 @@ export async function pancakeQuickBatchSwapMerkle(params) {
1022
1071
  : await Promise.all(buyers.map(buyer => nonceManager.getNextNonce(buyer)));
1023
1072
  const signedBuys = await Promise.all(buyers.map(async (buyer, i) => {
1024
1073
  const buyAmount = transferAmountsWei[i];
1025
- // BNB 模式:value = buyAmount + FLAT_FEE
1026
- // ERC20 模式:value = FLAT_FEE(买入金额通过授权支付)
1027
- const buyValue = useNativeToken ? buyAmount + FLAT_FEE : FLAT_FEE;
1074
+ // ERC20 模式:value = 0(通过代币授权支付)
1075
+ const buyValue = useNativeToken ? buyAmount + FLAT_FEE : 0n;
1028
1076
  let buyUnsigned;
1029
1077
  if (routeParams.routeType === 'v2') {
1030
1078
  const { v2Path } = routeParams;
1031
1079
  const reversePath = [...v2Path].reverse();
1032
1080
  const v2RouterBuyer = new Contract(PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, buyer);
1033
- 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
+ }
1034
1089
  }
1035
1090
  else if (routeParams.routeType === 'v3-single') {
1036
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.31",
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",