four-flap-meme-sdk 2.0.0 → 2.2.0

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.
Files changed (220) hide show
  1. package/dist/__tests__/subpath-exports.test.js +64 -0
  2. package/dist/chains/bsc/iro.d.ts +5 -0
  3. package/dist/chains/bsc/iro.js +4 -0
  4. package/dist/chains/eni/flat-aliases.d.ts +10 -0
  5. package/dist/chains/eni/flat-aliases.js +8 -0
  6. package/dist/chains/eni/index.d.ts +1 -0
  7. package/dist/chains/eni/index.js +1 -0
  8. package/dist/chains/index.d.ts +13 -0
  9. package/dist/chains/index.js +13 -0
  10. package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
  11. package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
  12. package/dist/chains/xlayer/eip7702/index.d.ts +1 -0
  13. package/dist/chains/xlayer/eip7702/index.js +1 -0
  14. package/dist/chains/xlayer/index.d.ts +3 -2
  15. package/dist/chains/xlayer/index.js +4 -7
  16. package/dist/flap/index.d.ts +10 -0
  17. package/dist/flap/index.js +8 -0
  18. package/dist/merkle/index.d.ts +12 -0
  19. package/dist/merkle/index.js +11 -0
  20. package/dist/shared/constants/index.d.ts +2 -0
  21. package/dist/shared/index.d.ts +2 -0
  22. package/dist/vanity/index.d.ts +5 -0
  23. package/dist/vanity/index.js +5 -0
  24. package/package.json +93 -2
  25. package/dist/chains/bsc/four/disperse.d.ts +0 -12
  26. package/dist/chains/bsc/four/disperse.js +0 -470
  27. package/dist/chains/bsc/four/pairwise.d.ts +0 -7
  28. package/dist/chains/bsc/four/pairwise.js +0 -308
  29. package/dist/chains/bsc/four/submit/blockrazor.d.ts +0 -18
  30. package/dist/chains/bsc/four/submit/blockrazor.js +0 -86
  31. package/dist/chains/bsc/four/submit/direct.d.ts +0 -66
  32. package/dist/chains/bsc/four/submit/direct.js +0 -452
  33. package/dist/chains/bsc/four/submit/helpers.d.ts +0 -18
  34. package/dist/chains/bsc/four/submit/helpers.js +0 -57
  35. package/dist/chains/bsc/four/submit/index.d.ts +0 -12
  36. package/dist/chains/bsc/four/submit/index.js +0 -11
  37. package/dist/chains/bsc/four/submit/merkle.d.ts +0 -18
  38. package/dist/chains/bsc/four/submit/merkle.js +0 -74
  39. package/dist/chains/bsc/four/submit/types.d.ts +0 -143
  40. package/dist/chains/bsc/four/swap/index.d.ts +0 -32
  41. package/dist/chains/bsc/four/swap/index.js +0 -829
  42. package/dist/chains/bsc/four/swap/types.d.ts +0 -70
  43. package/dist/chains/bsc/four/swap/types.js +0 -1
  44. package/dist/chains/bsc/four/sweep.d.ts +0 -13
  45. package/dist/chains/bsc/four/sweep.js +0 -788
  46. package/dist/chains/bsc/four/utils/index.d.ts +0 -20
  47. package/dist/chains/bsc/four/utils/index.js +0 -1558
  48. package/dist/chains/bsc/four/utils/types.d.ts +0 -1
  49. package/dist/chains/bsc/four/utils/types.js +0 -1
  50. package/dist/chains/bsc/pancake/bundle-buy-first/index.d.ts +0 -8
  51. package/dist/chains/bsc/pancake/bundle-buy-first/index.js +0 -907
  52. package/dist/chains/bsc/pancake/bundle-buy-first/types.d.ts +0 -73
  53. package/dist/chains/bsc/pancake/bundle-buy-first/types.js +0 -1
  54. package/dist/chains/bsc/pancake/bundle-swap/helpers.d.ts +0 -102
  55. package/dist/chains/bsc/pancake/bundle-swap/helpers.js +0 -572
  56. package/dist/chains/bsc/pancake/bundle-swap/index.d.ts +0 -50
  57. package/dist/chains/bsc/pancake/bundle-swap/index.js +0 -1066
  58. package/dist/chains/bsc/pancake/bundle-swap/types.d.ts +0 -202
  59. package/dist/chains/bsc/pancake/bundle-swap/types.js +0 -3
  60. package/dist/chains/xlayer/eip7702/bundle-swap/index.d.ts +0 -72
  61. package/dist/chains/xlayer/eip7702/bundle-swap/index.js +0 -921
  62. package/dist/chains/xlayer/eip7702/bundle-swap/types.d.ts +0 -65
  63. package/dist/chains/xlayer/eip7702/bundle-swap/types.js +0 -1
  64. package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.d.ts +0 -128
  65. package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.js +0 -857
  66. package/dist/chains/xlayer/eip7702/multi-hop-transfer/types.d.ts +0 -85
  67. package/dist/chains/xlayer/eip7702/multi-hop-transfer/types.js +0 -1
  68. package/dist/chains/xlayer/eip7702/volume/index.d.ts +0 -96
  69. package/dist/chains/xlayer/eip7702/volume/index.js +0 -793
  70. package/dist/chains/xlayer/eip7702/volume/types.d.ts +0 -124
  71. package/dist/chains/xlayer/eip7702/volume/types.js +0 -1
  72. package/dist/chains/xlayer/eoa/types-core.d.ts +0 -363
  73. package/dist/chains/xlayer/eoa/types-core.js +0 -53
  74. package/dist/chains/xlayer/eoa/types-create.d.ts +0 -413
  75. package/dist/chains/xlayer/eoa/types-create.js +0 -9
  76. package/dist/chains/xlayer/eoa/types-volume.d.ts +0 -209
  77. package/dist/chains/xlayer/eoa/types-volume.js +0 -13
  78. package/dist/dex/direct-router/index.d.ts +0 -70
  79. package/dist/dex/direct-router/index.js +0 -1410
  80. package/dist/dex/direct-router/types.d.ts +0 -81
  81. package/dist/dex/direct-router/types.js +0 -1
  82. package/dist/shared/abis/TaxToken.json +0 -969
  83. package/dist/shared/abis/TokenManager.json +0 -836
  84. package/dist/shared/abis/TokenManager2.json +0 -136
  85. package/dist/shared/abis/TokenManagerHelper3.json +0 -993
  86. package/dist/shared/abis 2/TaxToken.json +0 -105
  87. package/dist/shared/abis 2/TokenManager.json +0 -836
  88. package/dist/shared/abis 2/TokenManager2.json +0 -60
  89. package/dist/shared/abis 2/TokenManagerHelper3.json +0 -993
  90. package/dist/shared/abis 2/common.d.ts +0 -85
  91. package/dist/shared/abis 2/common.js +0 -254
  92. package/dist/shared/abis 2/index.d.ts +0 -8
  93. package/dist/shared/abis 2/index.js +0 -8
  94. package/dist/shared/clients 2/blockrazor.d.ts +0 -314
  95. package/dist/shared/clients 2/blockrazor.js +0 -596
  96. package/dist/shared/clients 2/club48.d.ts +0 -154
  97. package/dist/shared/clients 2/club48.js +0 -331
  98. package/dist/shared/clients 2/emitservice.d.ts +0 -47
  99. package/dist/shared/clients 2/emitservice.js +0 -44
  100. package/dist/shared/clients 2/four.d.ts +0 -132
  101. package/dist/shared/clients 2/four.js +0 -281
  102. package/dist/shared/clients 2/merkle.d.ts +0 -210
  103. package/dist/shared/clients 2/merkle.js +0 -400
  104. package/dist/shared/flap/__tests__/curve.test.d.ts +0 -1
  105. package/dist/shared/flap/__tests__/curve.test.js +0 -85
  106. package/dist/shared/flap/portal/index.d.ts +0 -12
  107. package/dist/shared/flap/portal/index.js +0 -11
  108. package/dist/shared/flap/portal/portal.d.ts +0 -47
  109. package/dist/shared/flap/portal/portal.js +0 -218
  110. package/dist/shared/flap/portal/types.d.ts +0 -227
  111. package/dist/shared/flap/portal/types.js +0 -80
  112. package/dist/shared/flap/portal/writer.d.ts +0 -121
  113. package/dist/shared/flap/portal/writer.js +0 -265
  114. package/dist/shared/flap/portal-bundle-merkle/core/index.d.ts +0 -18
  115. package/dist/shared/flap/portal-bundle-merkle/core/index.js +0 -938
  116. package/dist/shared/flap/portal-bundle-merkle/core/types.d.ts +0 -1
  117. package/dist/shared/flap/portal-bundle-merkle/core/types.js +0 -1
  118. package/dist/shared/flap/portal-bundle-merkle/swap/index.d.ts +0 -42
  119. package/dist/shared/flap/portal-bundle-merkle/swap/index.js +0 -1448
  120. package/dist/shared/flap/portal-bundle-merkle/swap/types.d.ts +0 -84
  121. package/dist/shared/flap/portal-bundle-merkle/swap/types.js +0 -1
  122. package/dist/shared/flap/portal-bundle-merkle/utils/index.d.ts +0 -17
  123. package/dist/shared/flap/portal-bundle-merkle/utils/index.js +0 -1024
  124. package/dist/shared/flap/portal-bundle-merkle/utils/types.d.ts +0 -16
  125. package/dist/shared/flap/portal-bundle-merkle/utils/types.js +0 -1
  126. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +0 -100
  127. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +0 -133
  128. package/dist/shared/flap 2/__tests__/curve.test.d.ts +0 -1
  129. package/dist/shared/flap 2/__tests__/curve.test.js +0 -85
  130. package/dist/shared/flap 2/abi.d.ts +0 -4
  131. package/dist/shared/flap 2/abi.js +0 -4
  132. package/dist/shared/flap 2/constants.d.ts +0 -128
  133. package/dist/shared/flap 2/constants.js +0 -143
  134. package/dist/shared/flap 2/curve.d.ts +0 -33
  135. package/dist/shared/flap 2/curve.js +0 -84
  136. package/dist/shared/flap 2/errors.d.ts +0 -37
  137. package/dist/shared/flap 2/errors.js +0 -114
  138. package/dist/shared/flap 2/index.d.ts +0 -22
  139. package/dist/shared/flap 2/index.js +0 -33
  140. package/dist/shared/flap 2/ipfs.d.ts +0 -21
  141. package/dist/shared/flap 2/ipfs.js +0 -38
  142. package/dist/shared/flap 2/meta.d.ts +0 -30
  143. package/dist/shared/flap 2/meta.js +0 -195
  144. package/dist/shared/flap 2/permit.d.ts +0 -16
  145. package/dist/shared/flap 2/permit.js +0 -67
  146. package/dist/shared/flap 2/pinata.d.ts +0 -40
  147. package/dist/shared/flap 2/pinata.js +0 -106
  148. package/dist/shared/flap 2/portal-bundle-merkle/config.d.ts +0 -79
  149. package/dist/shared/flap 2/portal-bundle-merkle/config.js +0 -133
  150. package/dist/shared/flap 2/portal-bundle-merkle/core.d.ts +0 -18
  151. package/dist/shared/flap 2/portal-bundle-merkle/core.js +0 -938
  152. package/dist/shared/flap 2/portal-bundle-merkle/create-to-dex.d.ts +0 -125
  153. package/dist/shared/flap 2/portal-bundle-merkle/create-to-dex.js +0 -665
  154. package/dist/shared/flap 2/portal-bundle-merkle/curve-to-dex.d.ts +0 -88
  155. package/dist/shared/flap 2/portal-bundle-merkle/curve-to-dex.js +0 -446
  156. package/dist/shared/flap 2/portal-bundle-merkle/index.d.ts +0 -14
  157. package/dist/shared/flap 2/portal-bundle-merkle/index.js +0 -26
  158. package/dist/shared/flap 2/portal-bundle-merkle/pancake-proxy.d.ts +0 -28
  159. package/dist/shared/flap 2/portal-bundle-merkle/pancake-proxy.js +0 -701
  160. package/dist/shared/flap 2/portal-bundle-merkle/private.d.ts +0 -17
  161. package/dist/shared/flap 2/portal-bundle-merkle/private.js +0 -549
  162. package/dist/shared/flap 2/portal-bundle-merkle/swap-buy-first.d.ts +0 -65
  163. package/dist/shared/flap 2/portal-bundle-merkle/swap-buy-first.js +0 -831
  164. package/dist/shared/flap 2/portal-bundle-merkle/swap.d.ts +0 -201
  165. package/dist/shared/flap 2/portal-bundle-merkle/swap.js +0 -1359
  166. package/dist/shared/flap 2/portal-bundle-merkle/types.d.ts +0 -358
  167. package/dist/shared/flap 2/portal-bundle-merkle/types.js +0 -1
  168. package/dist/shared/flap 2/portal-bundle-merkle/utils.d.ts +0 -89
  169. package/dist/shared/flap 2/portal-bundle-merkle/utils.js +0 -963
  170. package/dist/shared/flap 2/portal-bundle.d.ts +0 -119
  171. package/dist/shared/flap 2/portal-bundle.js +0 -584
  172. package/dist/shared/flap 2/portal.d.ts +0 -392
  173. package/dist/shared/flap 2/portal.js +0 -559
  174. package/dist/shared/flap 2/vanity.d.ts +0 -48
  175. package/dist/shared/flap 2/vanity.js +0 -110
  176. package/dist/shared/flap 2/vault.d.ts +0 -240
  177. package/dist/shared/flap 2/vault.js +0 -366
  178. package/dist/shared/four 2/index.d.ts +0 -7
  179. package/dist/shared/four 2/index.js +0 -22
  180. package/dist/shared/four 2/tax-token.d.ts +0 -176
  181. package/dist/shared/four 2/tax-token.js +0 -302
  182. package/dist/shared/index 2.js +0 -10
  183. package/dist/shared/index.d 2.ts +0 -10
  184. package/dist/types/distribute.d.ts +0 -72
  185. package/dist/types/distribute.js +0 -1
  186. package/dist/types 2/errors.d.ts +0 -27
  187. package/dist/types 2/errors.js +0 -34
  188. package/dist/utils/__tests__/errors.test.d.ts +0 -1
  189. package/dist/utils/__tests__/errors.test.js +0 -76
  190. package/dist/utils/airdrop-sweep-types.d.ts +0 -1
  191. package/dist/utils/airdrop-sweep-types.js +0 -1
  192. package/dist/utils/erc20/index.d.ts +0 -242
  193. package/dist/utils/erc20/index.js +0 -645
  194. package/dist/utils/erc20/types.d.ts +0 -77
  195. package/dist/utils/erc20/types.js +0 -1
  196. package/dist/utils/erc20-types.d.ts +0 -1
  197. package/dist/utils/erc20-types.js +0 -1
  198. package/dist/utils/holders-maker/helpers.d.ts +0 -43
  199. package/dist/utils/holders-maker/helpers.js +0 -371
  200. package/dist/utils/holders-maker/index.d.ts +0 -26
  201. package/dist/utils/holders-maker/index.js +0 -218
  202. package/dist/utils/holders-maker/types.d.ts +0 -72
  203. package/dist/utils/holders-maker/types.js +0 -4
  204. package/dist/utils/holders-maker-types.d.ts +0 -1
  205. package/dist/utils/holders-maker-types.js +0 -1
  206. package/dist/utils/lp-inspect/index.d.ts +0 -44
  207. package/dist/utils/lp-inspect/index.js +0 -937
  208. package/dist/utils/lp-inspect/types.d.ts +0 -100
  209. package/dist/utils/lp-inspect/types.js +0 -1
  210. package/dist/utils/lp-inspect-types.d.ts +0 -1
  211. package/dist/utils/lp-inspect-types.js +0 -1
  212. package/dist/utils/private-sale-types.d.ts +0 -1
  213. package/dist/utils/private-sale-types.js +0 -1
  214. package/dist/utils/quote-helpers/index.d.ts +0 -107
  215. package/dist/utils/quote-helpers/index.js +0 -346
  216. package/dist/utils/quote-helpers/types.d.ts +0 -16
  217. package/dist/utils/quote-helpers/types.js +0 -1
  218. package/dist/utils/quote-helpers-types.d.ts +0 -1
  219. package/dist/utils/quote-helpers-types.js +0 -1
  220. /package/dist/{chains/bsc/four/submit/types.js → __tests__/subpath-exports.test.d.ts} +0 -0
@@ -1,16 +0,0 @@
1
- /** 分散参数 */
2
- export type FlapDisperseSignParams = {
3
- chain: 'BSC' | 'MONAD' | 'XLAYER';
4
- };
5
- /** 分散结果 */
6
- export type FlapDisperseMerkleResult = {
7
- signedTransactions: string[];
8
- };
9
- /** 归集参数 */
10
- export type FlapSweepSignParams = {
11
- chain: 'BSC' | 'MONAD' | 'XLAYER';
12
- };
13
- /** 归集结果 */
14
- export type FlapSweepMerkleResult = {
15
- signedTransactions: string[];
16
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,100 +0,0 @@
1
- import { JsonRpcProvider } from 'ethers';
2
- import type { FlapSignConfig } from './types.js';
3
- import type { GeneratedWallet } from '../../../utils/wallet.js';
4
- /** 分散参数 */
5
- export type FlapDisperseSignParams = {
6
- chain: 'BSC' | 'MONAD' | 'XLAYER';
7
- fromPrivateKey: string;
8
- recipients: string[];
9
- amount?: string;
10
- amounts?: string[];
11
- tokenAddress?: string;
12
- tokenDecimals?: number;
13
- hopCount?: number | number[];
14
- hopPrivateKeys?: string[][];
15
- items?: {
16
- recipient: string;
17
- amount: string | bigint;
18
- hopCount?: number;
19
- hopPrivateKeys?: string[];
20
- }[];
21
- config: FlapSignConfig;
22
- startNonce?: number;
23
- };
24
- /** 分散结果 */
25
- export type FlapDisperseMerkleResult = {
26
- signedTransactions: string[];
27
- hopWallets?: (string | GeneratedWallet)[][];
28
- profitHopWallets?: GeneratedWallet[];
29
- metadata?: {
30
- totalAmount: string;
31
- profitAmount: string;
32
- profitRecipient: string;
33
- recipientCount: number;
34
- isNative: boolean;
35
- tokenAddress?: string;
36
- };
37
- };
38
- /** 归集参数 */
39
- export type FlapSweepSignParams = {
40
- chain: 'BSC' | 'MONAD' | 'XLAYER';
41
- sourcePrivateKeys: string[];
42
- target: string;
43
- ratioPct?: number;
44
- ratios?: number[];
45
- amount?: string;
46
- amounts?: string[];
47
- tokenAddress?: string;
48
- tokenDecimals?: number;
49
- skipIfInsufficient?: boolean;
50
- hopCount?: number | number[];
51
- hopPrivateKeys?: string[][];
52
- sources?: {
53
- privateKey: string;
54
- ratioPct?: number;
55
- amount?: string;
56
- hopCount?: number;
57
- hopPrivateKeys?: string[];
58
- }[];
59
- config: FlapSignConfig;
60
- startNonce?: number;
61
- };
62
- /** 归集结果 */
63
- export type FlapSweepMerkleResult = {
64
- signedTransactions: string[];
65
- hopWallets?: (string | GeneratedWallet)[][];
66
- profitHopWallets?: GeneratedWallet[];
67
- metadata?: {
68
- totalAmount: string;
69
- profitAmount: string;
70
- profitRecipient: string;
71
- sourceCount: number;
72
- isNative: boolean;
73
- tokenAddress?: string;
74
- };
75
- };
76
- export declare const CHAIN_ID_MAP: Record<string, number>;
77
- export declare const MULTICALL3_ADDRESS: "0xcA11bde05977b3631167028862bE2a173976CA11";
78
- export declare const decimalsCache: Map<string, number>;
79
- export declare function getErc20Decimals(provider: JsonRpcProvider, token: string): Promise<number>;
80
- /**
81
- * ✅ 生成多跳中间钱包(返回完整钱包信息:地址 + 私钥)
82
- */
83
- export declare function generateHopWallets(recipientCount: number, hopCount: number | number[]): GeneratedWallet[][] | null;
84
- export declare function normalizeAmounts(recipients: string[], amount?: string, amounts?: string[]): string[];
85
- export declare function batchGetBalances(provider: JsonRpcProvider, addresses: string[], tokenAddress?: string): Promise<bigint[]>;
86
- /**
87
- * 计算 Gas Limit
88
- * - 原生代币转账:21000 gas(固定)
89
- * - ERC20 标准 transfer:约 45000-55000 gas,使用 55000 作为安全值
90
- *
91
- * ✅ 优化:降低 ERC20 gas limit,减少中转钱包 BNB 残留
92
- */
93
- export declare function calculateGasLimit(config: FlapSignConfig, isNative: boolean, hasHops: boolean, _hopCount?: number): bigint;
94
- export declare function isNativeTokenAddress(tokenAddress?: string): boolean;
95
- /**
96
- * Flap Protocol: 分散(仅签名版本)
97
- * ✅ 支持利润提取(按地址数量收取固定费用)
98
- * ✅ 支持多跳
99
- * ✅ 支持 Multicall3 批量获取余额
100
- */
@@ -1,133 +0,0 @@
1
- import { ethers, Wallet } from 'ethers';
2
- import { ADDRESSES } from '../../../utils/constants.js';
3
- import { MULTICALL3_ABI, ERC20_BALANCE_ABI } from '../../abis/common.js';
4
- // ==================== 链配置 ====================
5
- export const CHAIN_ID_MAP = {
6
- 'BSC': 56,
7
- 'MONAD': 143,
8
- 'XLAYER': 196
9
- };
10
- // ==================== 链常量 ====================
11
- // ✅ 使用公共模块
12
- export const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
13
- // ==================== 内部辅助函数 ====================
14
- export const decimalsCache = new Map();
15
- export async function getErc20Decimals(provider, token) {
16
- const network = await provider.getNetwork();
17
- const key = `${network.chainId}_${token.toLowerCase()}`;
18
- if (decimalsCache.has(key))
19
- return decimalsCache.get(key);
20
- try {
21
- const erc20 = new ethers.Contract(token, ['function decimals() view returns (uint8)'], provider);
22
- const d = await erc20.decimals();
23
- if (!Number.isFinite(d) || d < 0 || d > 36)
24
- return 18;
25
- decimalsCache.set(key, d);
26
- return d;
27
- }
28
- catch {
29
- return 18;
30
- }
31
- }
32
- /**
33
- * ✅ 生成多跳中间钱包(返回完整钱包信息:地址 + 私钥)
34
- */
35
- export function generateHopWallets(recipientCount, hopCount) {
36
- const hopCounts = Array.isArray(hopCount) ? hopCount : new Array(recipientCount).fill(hopCount);
37
- if (hopCounts.every(h => h <= 0))
38
- return null;
39
- const result = [];
40
- for (let i = 0; i < recipientCount; i++) {
41
- const chain = [];
42
- for (let j = 0; j < hopCounts[i]; j++) {
43
- const wallet = Wallet.createRandom();
44
- chain.push({
45
- address: wallet.address,
46
- privateKey: wallet.privateKey
47
- });
48
- }
49
- result.push(chain);
50
- }
51
- return result;
52
- }
53
- export function normalizeAmounts(recipients, amount, amounts) {
54
- if (amounts && amounts.length > 0) {
55
- if (amounts.length !== recipients.length) {
56
- throw new Error(`amounts length (${amounts.length}) must match recipients length (${recipients.length})`);
57
- }
58
- return amounts;
59
- }
60
- if (amount !== undefined && amount.trim().length > 0) {
61
- return new Array(recipients.length).fill(amount);
62
- }
63
- throw new Error('Either amount or amounts must be provided');
64
- }
65
- export async function batchGetBalances(provider, addresses, tokenAddress) {
66
- if (addresses.length === 0)
67
- return [];
68
- if (!tokenAddress) {
69
- return Promise.all(addresses.map(addr => provider.getBalance(addr).catch(() => 0n)));
70
- }
71
- else {
72
- // ✅ 使用公共模块
73
- const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
74
- const iface = new ethers.Interface(ERC20_BALANCE_ABI);
75
- const calls = addresses.map(addr => ({
76
- target: tokenAddress,
77
- allowFailure: true,
78
- callData: iface.encodeFunctionData('balanceOf', [addr])
79
- }));
80
- try {
81
- const results = await multicall.aggregate3(calls);
82
- return results.map((result) => {
83
- if (result.success) {
84
- return iface.decodeFunctionResult('balanceOf', result.returnData)[0];
85
- }
86
- return 0n;
87
- });
88
- }
89
- catch {
90
- const fallbackCalls = addresses.map(addr => provider
91
- .call({ to: tokenAddress, data: iface.encodeFunctionData('balanceOf', [addr]) })
92
- .then(raw => iface.decodeFunctionResult('balanceOf', raw)[0])
93
- .catch(() => 0n));
94
- return Promise.all(fallbackCalls);
95
- }
96
- }
97
- }
98
- /**
99
- * 计算 Gas Limit
100
- * - 原生代币转账:21000 gas(固定)
101
- * - ERC20 标准 transfer:约 45000-55000 gas,使用 55000 作为安全值
102
- *
103
- * ✅ 优化:降低 ERC20 gas limit,减少中转钱包 BNB 残留
104
- */
105
- export function calculateGasLimit(config, isNative, hasHops, _hopCount = 0) {
106
- if (config.gasLimit !== undefined) {
107
- return BigInt(config.gasLimit);
108
- }
109
- // ✅ 原生代币: 21000, ERC20 标准 transfer: 48000(USDT 最低约 46815)
110
- const baseGas = isNative ? 21000 : 48000;
111
- // ✅ 多跳时每个中转钱包只执行一笔 transfer,使用较小的安全系数
112
- const multiplier = config.gasLimitMultiplier ?? 1.1;
113
- return BigInt(Math.ceil(baseGas * multiplier));
114
- }
115
- export function isNativeTokenAddress(tokenAddress) {
116
- if (!tokenAddress)
117
- return true;
118
- const v = tokenAddress.trim().toLowerCase();
119
- if (!v)
120
- return true;
121
- if (v === 'native')
122
- return true;
123
- if (v === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')
124
- return true;
125
- return false;
126
- }
127
- // ==================== 分散函数 ====================
128
- /**
129
- * Flap Protocol: 分散(仅签名版本)
130
- * ✅ 支持利润提取(按地址数量收取固定费用)
131
- * ✅ 支持多跳
132
- * ✅ 支持 Multicall3 批量获取余额
133
- */
@@ -1 +0,0 @@
1
- export {};
@@ -1,85 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { CDPV2 } from '../curve.js';
3
- describe('CDPV2', () => {
4
- describe('getCurve', () => {
5
- it('creates curve with default h and k when only r is provided', () => {
6
- const curve = CDPV2.getCurve(0.1);
7
- expect(curve.r).toBe(0.1);
8
- expect(curve.h).toBe(0);
9
- expect(curve.k).toBe(1e9 * 0.1);
10
- });
11
- it('creates curve with explicit h and k', () => {
12
- const curve = CDPV2.getCurve(0.1, 1000, 500000);
13
- expect(curve.r).toBe(0.1);
14
- expect(curve.h).toBe(1000);
15
- expect(curve.k).toBe(500000);
16
- });
17
- });
18
- describe('estimateSupply', () => {
19
- it('returns 0 for empty reserve', () => {
20
- const curve = CDPV2.getCurve(0.1);
21
- expect(curve.estimateSupply('0').toString()).toBe('0.0');
22
- });
23
- it('returns 0 for falsy reserve', () => {
24
- const curve = CDPV2.getCurve(0.1);
25
- expect(curve.estimateSupply('').toString()).toBe('0.0');
26
- });
27
- it('calculates supply correctly for given reserve', () => {
28
- const curve = CDPV2.getCurve(0.1);
29
- const supply = curve.estimateSupply('1000000');
30
- expect(supply.toUnsafeFloat()).toBeGreaterThan(0);
31
- expect(supply.toUnsafeFloat()).toBeLessThan(1000000000);
32
- });
33
- });
34
- describe('estimateReserve', () => {
35
- it('returns 0 for empty amount', () => {
36
- const curve = CDPV2.getCurve(0.1);
37
- expect(curve.estimateReserve('0').toString()).toBe('0.0');
38
- });
39
- it('returns 0 for falsy amount', () => {
40
- const curve = CDPV2.getCurve(0.1);
41
- expect(curve.estimateReserve('').toString()).toBe('0.0');
42
- });
43
- it('calculates reserve inversely proportional to supply', () => {
44
- const curve = CDPV2.getCurve(0.1);
45
- const reserve = curve.estimateReserve('500000000');
46
- expect(reserve.toUnsafeFloat()).toBeGreaterThan(0);
47
- });
48
- it('supply and reserve are mutually consistent', () => {
49
- const curve = CDPV2.getCurve(0.1);
50
- const initialReserve = '1000000';
51
- const supply = curve.estimateSupply(initialReserve);
52
- const reserveBack = curve.estimateReserve(supply.toString());
53
- // Allow small rounding differences
54
- const diff = Math.abs(reserveBack.toUnsafeFloat() - 1000000);
55
- expect(diff).toBeLessThan(1);
56
- });
57
- });
58
- describe('price', () => {
59
- it('returns positive price for valid supply', () => {
60
- const curve = CDPV2.getCurve(0.1);
61
- const p = curve.price('500000000');
62
- expect(p.toUnsafeFloat()).toBeGreaterThan(0);
63
- });
64
- it('price increases as supply increases (bonding curve)', () => {
65
- const curve = CDPV2.getCurve(0.1);
66
- const priceLow = curve.price('100000000');
67
- const priceHigh = curve.price('500000000');
68
- expect(priceHigh.toUnsafeFloat()).toBeGreaterThan(priceLow.toUnsafeFloat());
69
- });
70
- });
71
- describe('fdv', () => {
72
- it('calculates FDV as price * 1B', () => {
73
- const curve = CDPV2.getCurve(0.1);
74
- const supply = '500000000';
75
- const p = curve.price(supply);
76
- const f = curve.fdv(supply);
77
- expect(f.toUnsafeFloat()).toBeCloseTo(p.toUnsafeFloat() * 1000000000, -3);
78
- });
79
- });
80
- describe('defaultDexSupplyThreshold', () => {
81
- it('returns 800M', () => {
82
- expect(CDPV2.defaultDexSupplyThreshold().toString()).toBe('800000000.0');
83
- });
84
- });
85
- });
@@ -1,4 +0,0 @@
1
- /**
2
- * @deprecated 请从 'src/abis/flap/portal-events.js' 导入 PORTAL_EVENTS_ABI
3
- */
4
- export { PORTAL_EVENTS_ABI } from '../../abis/flap/portal-events.js';
@@ -1,4 +0,0 @@
1
- /**
2
- * @deprecated 请从 'src/abis/flap/portal-events.js' 导入 PORTAL_EVENTS_ABI
3
- */
4
- export { PORTAL_EVENTS_ABI } from '../../abis/flap/portal-events.js';
@@ -1,128 +0,0 @@
1
- /**
2
- * Flap Protocol Portal 代理合约地址(收费版)
3
- * 注意:这些是代理合约地址,会自动收取手续费
4
- * 用于交易、Permit 签名等操作
5
- */
6
- export declare const FLAP_PORTAL_ADDRESSES: {
7
- readonly BSC: "0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0";
8
- readonly BASE: "0x00214f8C22A076575f4B67f3B4AA62f99E166e36";
9
- readonly XLAYER: "0xb30D8c4216E1f21F27444D2FfAee3ad577808678";
10
- readonly MORPH: "0x6aB823408672c0Db1DE1a18F1750d62E5F995A58";
11
- readonly MONAD: "0x30e8ee7b5881bf2E158A0514f2150aabe2c68b23";
12
- };
13
- /**
14
- * Flap Protocol 平台原始 Portal 合约地址
15
- * 注意:这些是 Flap 平台的原始合约地址(非代理)
16
- * 用于 CREATE2 vanity 地址生成
17
- */
18
- export declare const FLAP_ORIGINAL_PORTAL_ADDRESSES: {
19
- readonly BSC: "0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0";
20
- readonly BASE: "0xF3c514E04f83166E80718f29f0d34F206be40A0A";
21
- readonly XLAYER: "0xb30D8c4216E1f21F27444D2FfAee3ad577808678";
22
- readonly MORPH: "0x4267F317adee7C6478a5EE92985c2BD5D855E274";
23
- readonly MONAD: "0x30e8ee7b5881bf2E158A0514f2150aabe2c68b23";
24
- };
25
- /**
26
- * Flap Protocol Token 实现合约地址
27
- */
28
- export declare const FLAP_TOKEN_IMPL_ADDRESSES: {
29
- readonly BSC_NORMAL: "0x8b4329947e34b6d56d71a3385cac122bade7d78d";
30
- readonly BSC_TAXED: "0x29e6383F0ce68507b5A72a53c2B118a118332aA8";
31
- readonly BSC_TAXED_V5: "0xae562c6A05b798499507c6276C6Ed796027807BA";
32
- readonly BASE: "0xF3c514E04f83166E80718f29f0d34F206be40A0A";
33
- readonly XLAYER: "0x12Dc83157Bf1cfCB8Db5952b3ba5bb56Cc38f8C9";
34
- readonly MORPH: "0x8b4329947e34b6d56d71a3385cac122bade7d78d";
35
- readonly MONAD_NORMAL: "0xB88189aA1162850D75A1c1e16F837b7979994184";
36
- readonly MONAD_TAXED: "0x1C8847736521f5cD725dFB8f33c7c610826e7C42";
37
- };
38
- /**
39
- * 不同链的默认手续费率
40
- * 数据来源:Example-Code 配置文件
41
- */
42
- export declare const FLAP_DEFAULT_FEE_RATES: {
43
- readonly BSC: {
44
- readonly buy: 0.01;
45
- readonly sell: 0.01;
46
- };
47
- readonly MORPH: {
48
- readonly buy: 0.025;
49
- readonly sell: 0.025;
50
- };
51
- readonly XLAYER: {
52
- readonly buy: 0.015;
53
- readonly sell: 0.015;
54
- };
55
- readonly BASE: {
56
- readonly buy: 0.025;
57
- readonly sell: 0.025;
58
- };
59
- readonly MONAD: {
60
- readonly buy: 0.01;
61
- readonly sell: 0.01;
62
- };
63
- };
64
- /**
65
- * Flap IPFS API 端点
66
- * 警告:这是一个占位符端点,实际 Flap 官方 IPFS 端点未公开
67
- * 用户需要:
68
- * 1. 联系 Flap 团队获取真实的 IPFS GraphQL 端点
69
- * 2. 或使用自己的 IPFS 服务(Pinata、Infura、Web3.Storage 等)
70
- * 3. 或在调用 uploadTokenMeta 时传入自定义端点作为第三个参数
71
- */
72
- export declare const FLAP_IPFS_API_URL = "https://api.flap.sh/graphql";
73
- /**
74
- * Vanity 地址后缀配置
75
- * 根据截图中的合约部署信息:
76
- * - BNB Chain: standard:8888, Tax:7777
77
- * - Toshimart (BASE): standard:8453
78
- * - X Layer: standard:1111 (无 Tax)
79
- * - Muffun: standard:8888
80
- * - Monad: standard:8888, Tax:1111
81
- */
82
- export declare const FLAP_VANITY_SUFFIX: {
83
- readonly NORMAL: "8888";
84
- readonly TAXED: "7777";
85
- readonly BSC_NORMAL: "8888";
86
- readonly BSC_TAXED: "7777";
87
- readonly BASE_NORMAL: "8453";
88
- readonly XLAYER_NORMAL: "1111";
89
- readonly MONAD_NORMAL: "8888";
90
- readonly MONAD_TAXED: "1111";
91
- };
92
- /**
93
- * 各链是否支持 Tax 代币
94
- */
95
- export declare const CHAIN_TAX_SUPPORT: Record<string, boolean>;
96
- /**
97
- * 根据链获取 Vanity 后缀
98
- * @param chain 链名称
99
- * @param taxed 是否为税版代币
100
- * @returns Vanity 后缀
101
- */
102
- export declare function getVanitySuffix(chain: string, taxed?: boolean): string;
103
- /**
104
- * 检查链是否支持 Tax 代币
105
- * @param chain 链名称
106
- * @returns 是否支持 Tax
107
- */
108
- export declare function isChainSupportTax(chain: string): boolean;
109
- /**
110
- * 默认 DEX 迁移阈值(占总供应量的比例)
111
- */
112
- export declare const FLAP_DEX_THRESHOLDS: {
113
- readonly TWO_THIRDS: 0.6667;
114
- readonly FOUR_FIFTHS: 0.8;
115
- readonly HALF: 0.5;
116
- readonly _95_PERCENT: 0.95;
117
- readonly _81_PERCENT: 0.81;
118
- readonly _1_PERCENT: 0.01;
119
- };
120
- /**
121
- * 代币总供应量(固定为 10 亿)
122
- */
123
- export declare const FLAP_TOTAL_SUPPLY: bigint;
124
- /**
125
- * 零地址(用于表示原生代币)
126
- * ✅ 从公共模块重新导出
127
- */
128
- export { ZERO_ADDRESS } from '../../utils/constants.js';
@@ -1,143 +0,0 @@
1
- /**
2
- * Flap Protocol Portal 代理合约地址(收费版)
3
- * 注意:这些是代理合约地址,会自动收取手续费
4
- * 用于交易、Permit 签名等操作
5
- */
6
- export const FLAP_PORTAL_ADDRESSES = {
7
- BSC: '0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0',
8
- BASE: '0x00214f8C22A076575f4B67f3B4AA62f99E166e36',
9
- XLAYER: '0xb30D8c4216E1f21F27444D2FfAee3ad577808678',
10
- MORPH: '0x6aB823408672c0Db1DE1a18F1750d62E5F995A58',
11
- // ✅ 新增 Monad 链 Portal 地址
12
- MONAD: '0x30e8ee7b5881bf2E158A0514f2150aabe2c68b23',
13
- };
14
- /**
15
- * Flap Protocol 平台原始 Portal 合约地址
16
- * 注意:这些是 Flap 平台的原始合约地址(非代理)
17
- * 用于 CREATE2 vanity 地址生成
18
- */
19
- export const FLAP_ORIGINAL_PORTAL_ADDRESSES = {
20
- BSC: '0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0',
21
- BASE: '0xF3c514E04f83166E80718f29f0d34F206be40A0A',
22
- XLAYER: '0xb30D8c4216E1f21F27444D2FfAee3ad577808678',
23
- MORPH: '0x4267F317adee7C6478a5EE92985c2BD5D855E274',
24
- // ✅ 新增 Monad 链原始 Portal 地址
25
- MONAD: '0x30e8ee7b5881bf2E158A0514f2150aabe2c68b23',
26
- };
27
- /**
28
- * Flap Protocol Token 实现合约地址
29
- */
30
- export const FLAP_TOKEN_IMPL_ADDRESSES = {
31
- BSC_NORMAL: '0x8b4329947e34b6d56d71a3385cac122bade7d78d',
32
- BSC_TAXED: '0x29e6383F0ce68507b5A72a53c2B118a118332aA8', // V2: 只有运营钱包的税代币
33
- BSC_TAXED_V5: '0xae562c6A05b798499507c6276C6Ed796027807BA', // V5: 高级税代币 (mkt/deflation/dividend/lp)
34
- BASE: '0xF3c514E04f83166E80718f29f0d34F206be40A0A',
35
- XLAYER: '0x12Dc83157Bf1cfCB8Db5952b3ba5bb56Cc38f8C9',
36
- MORPH: '0x8b4329947e34b6d56d71a3385cac122bade7d78d', // 暂时使用 BSC NORMAL 地址
37
- // ✅ 新增 Monad 链 Token 实现地址
38
- MONAD_NORMAL: '0xB88189aA1162850D75A1c1e16F837b7979994184',
39
- MONAD_TAXED: '0x1C8847736521f5cD725dFB8f33c7c610826e7C42',
40
- };
41
- /**
42
- * 不同链的默认手续费率
43
- * 数据来源:Example-Code 配置文件
44
- */
45
- export const FLAP_DEFAULT_FEE_RATES = {
46
- BSC: { buy: 0.01, sell: 0.01 }, // 1% (100 bps)
47
- MORPH: { buy: 0.025, sell: 0.025 }, // 2.5% (250 bps)
48
- XLAYER: { buy: 0.015, sell: 0.015 }, // 1.5% (150 bps)
49
- BASE: { buy: 0.025, sell: 0.025 }, // 2.5% (默认)
50
- // ✅ 新增 Monad 链默认费率
51
- MONAD: { buy: 0.01, sell: 0.01 }, // 1% (100 bps) - 与 BSC 相同
52
- };
53
- /**
54
- * Flap IPFS API 端点
55
- * 警告:这是一个占位符端点,实际 Flap 官方 IPFS 端点未公开
56
- * 用户需要:
57
- * 1. 联系 Flap 团队获取真实的 IPFS GraphQL 端点
58
- * 2. 或使用自己的 IPFS 服务(Pinata、Infura、Web3.Storage 等)
59
- * 3. 或在调用 uploadTokenMeta 时传入自定义端点作为第三个参数
60
- */
61
- export const FLAP_IPFS_API_URL = 'https://api.flap.sh/graphql'; // ⚠️ 占位符,需替换为真实端点
62
- /**
63
- * Vanity 地址后缀配置
64
- * 根据截图中的合约部署信息:
65
- * - BNB Chain: standard:8888, Tax:7777
66
- * - Toshimart (BASE): standard:8453
67
- * - X Layer: standard:1111 (无 Tax)
68
- * - Muffun: standard:8888
69
- * - Monad: standard:8888, Tax:1111
70
- */
71
- export const FLAP_VANITY_SUFFIX = {
72
- // 默认后缀
73
- NORMAL: '8888',
74
- TAXED: '7777',
75
- // 各链特定后缀
76
- BSC_NORMAL: '8888',
77
- BSC_TAXED: '7777',
78
- BASE_NORMAL: '8453',
79
- XLAYER_NORMAL: '1111',
80
- MONAD_NORMAL: '8888',
81
- MONAD_TAXED: '1111',
82
- };
83
- /**
84
- * 各链是否支持 Tax 代币
85
- */
86
- export const CHAIN_TAX_SUPPORT = {
87
- BSC: true,
88
- BASE: false,
89
- XLAYER: false,
90
- MORPH: false,
91
- MONAD: true,
92
- };
93
- /**
94
- * 根据链获取 Vanity 后缀
95
- * @param chain 链名称
96
- * @param taxed 是否为税版代币
97
- * @returns Vanity 后缀
98
- */
99
- export function getVanitySuffix(chain, taxed = false) {
100
- const chainUpper = chain.toUpperCase();
101
- switch (chainUpper) {
102
- case 'BSC':
103
- return taxed ? FLAP_VANITY_SUFFIX.BSC_TAXED : FLAP_VANITY_SUFFIX.BSC_NORMAL;
104
- case 'BASE':
105
- return FLAP_VANITY_SUFFIX.BASE_NORMAL; // BASE 不支持 Tax
106
- case 'XLAYER':
107
- return FLAP_VANITY_SUFFIX.XLAYER_NORMAL; // XLayer 不支持 Tax
108
- case 'MONAD':
109
- return taxed ? FLAP_VANITY_SUFFIX.MONAD_TAXED : FLAP_VANITY_SUFFIX.MONAD_NORMAL;
110
- case 'MORPH':
111
- return FLAP_VANITY_SUFFIX.NORMAL; // MORPH 暂时使用默认
112
- default:
113
- return taxed ? FLAP_VANITY_SUFFIX.TAXED : FLAP_VANITY_SUFFIX.NORMAL;
114
- }
115
- }
116
- /**
117
- * 检查链是否支持 Tax 代币
118
- * @param chain 链名称
119
- * @returns 是否支持 Tax
120
- */
121
- export function isChainSupportTax(chain) {
122
- return CHAIN_TAX_SUPPORT[chain.toUpperCase()] ?? false;
123
- }
124
- /**
125
- * 默认 DEX 迁移阈值(占总供应量的比例)
126
- */
127
- export const FLAP_DEX_THRESHOLDS = {
128
- TWO_THIRDS: 0.6667, // 66.67%
129
- FOUR_FIFTHS: 0.8, // 80%
130
- HALF: 0.5, // 50%
131
- _95_PERCENT: 0.95, // 95%
132
- _81_PERCENT: 0.81, // 81%
133
- _1_PERCENT: 0.01, // 1% (测试用)
134
- };
135
- /**
136
- * 代币总供应量(固定为 10 亿)
137
- */
138
- export const FLAP_TOTAL_SUPPLY = BigInt(1000000000) * BigInt(10 ** 18);
139
- /**
140
- * 零地址(用于表示原生代币)
141
- * ✅ 从公共模块重新导出
142
- */
143
- export { ZERO_ADDRESS } from '../../utils/constants.js';
@@ -1,33 +0,0 @@
1
- import { FixedNumber } from 'ethers';
2
- export declare class CDPV2 {
3
- r: number;
4
- h: number;
5
- k: number;
6
- static defaultDexSupplyThreshold(): FixedNumber;
7
- static getCurve(r: number, h?: number, k?: number): CDPV2;
8
- constructor(r: number, h?: number, k?: number);
9
- /**
10
- * 根据储备量估算供应量
11
- * Supply = BILLION + h - k / (reserve + r)
12
- * @returns FixedNumber 对象,保持高精度
13
- */
14
- estimateSupply(reserve: string): FixedNumber;
15
- /**
16
- * 根据供应量估算储备量
17
- * Reserve = k / (BILLION + h - amount) - r
18
- * @returns FixedNumber 对象,保持高精度
19
- */
20
- estimateReserve(amount: string): FixedNumber;
21
- /**
22
- * 计算当前价格
23
- * Price = k / (BILLION + h - supply)²
24
- * @returns FixedNumber 对象,保持高精度
25
- */
26
- price(supply: string): FixedNumber;
27
- /**
28
- * 计算完全稀释估值 (FDV)
29
- * FDV = price * BILLION
30
- * @returns FixedNumber 对象,保持高精度
31
- */
32
- fdv(supply: string): FixedNumber;
33
- }