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.
- package/dist/pancake/bundle-swap.js +75 -20
- package/package.json +1 -1
|
@@ -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
|
|
61
|
-
const buyValue = useNativeToken ? buyAmountBNB + 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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
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
|
-
|
|
604
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
959
|
-
|
|
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
|
-
//
|
|
1026
|
-
|
|
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
|
-
|
|
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;
|