four-flap-meme-sdk 2.0.0 → 2.1.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.
- package/dist/__tests__/subpath-exports.test.js +34 -0
- package/dist/chains/index.d.ts +13 -0
- package/dist/chains/index.js +13 -0
- package/dist/chains/xlayer/eip7702/index.d.ts +2 -0
- package/dist/flap/index.d.ts +10 -0
- package/dist/flap/index.js +8 -0
- package/dist/shared/constants/index.d.ts +2 -0
- package/dist/shared/index.d.ts +2 -0
- package/package.json +66 -1
- package/dist/chains/bsc/four/disperse.d.ts +0 -12
- package/dist/chains/bsc/four/disperse.js +0 -470
- package/dist/chains/bsc/four/pairwise.d.ts +0 -7
- package/dist/chains/bsc/four/pairwise.js +0 -308
- package/dist/chains/bsc/four/submit/blockrazor.d.ts +0 -18
- package/dist/chains/bsc/four/submit/blockrazor.js +0 -86
- package/dist/chains/bsc/four/submit/direct.d.ts +0 -66
- package/dist/chains/bsc/four/submit/direct.js +0 -452
- package/dist/chains/bsc/four/submit/helpers.d.ts +0 -18
- package/dist/chains/bsc/four/submit/helpers.js +0 -57
- package/dist/chains/bsc/four/submit/index.d.ts +0 -12
- package/dist/chains/bsc/four/submit/index.js +0 -11
- package/dist/chains/bsc/four/submit/merkle.d.ts +0 -18
- package/dist/chains/bsc/four/submit/merkle.js +0 -74
- package/dist/chains/bsc/four/submit/types.d.ts +0 -143
- package/dist/chains/bsc/four/swap/index.d.ts +0 -32
- package/dist/chains/bsc/four/swap/index.js +0 -829
- package/dist/chains/bsc/four/swap/types.d.ts +0 -70
- package/dist/chains/bsc/four/swap/types.js +0 -1
- package/dist/chains/bsc/four/sweep.d.ts +0 -13
- package/dist/chains/bsc/four/sweep.js +0 -788
- package/dist/chains/bsc/four/utils/index.d.ts +0 -20
- package/dist/chains/bsc/four/utils/index.js +0 -1558
- package/dist/chains/bsc/four/utils/types.d.ts +0 -1
- package/dist/chains/bsc/four/utils/types.js +0 -1
- package/dist/chains/bsc/pancake/bundle-buy-first/index.d.ts +0 -8
- package/dist/chains/bsc/pancake/bundle-buy-first/index.js +0 -907
- package/dist/chains/bsc/pancake/bundle-buy-first/types.d.ts +0 -73
- package/dist/chains/bsc/pancake/bundle-buy-first/types.js +0 -1
- package/dist/chains/bsc/pancake/bundle-swap/helpers.d.ts +0 -102
- package/dist/chains/bsc/pancake/bundle-swap/helpers.js +0 -572
- package/dist/chains/bsc/pancake/bundle-swap/index.d.ts +0 -50
- package/dist/chains/bsc/pancake/bundle-swap/index.js +0 -1066
- package/dist/chains/bsc/pancake/bundle-swap/types.d.ts +0 -202
- package/dist/chains/bsc/pancake/bundle-swap/types.js +0 -3
- package/dist/chains/xlayer/eip7702/bundle-swap/index.d.ts +0 -72
- package/dist/chains/xlayer/eip7702/bundle-swap/index.js +0 -921
- package/dist/chains/xlayer/eip7702/bundle-swap/types.d.ts +0 -65
- package/dist/chains/xlayer/eip7702/bundle-swap/types.js +0 -1
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.d.ts +0 -128
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.js +0 -857
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/types.d.ts +0 -85
- package/dist/chains/xlayer/eip7702/multi-hop-transfer/types.js +0 -1
- package/dist/chains/xlayer/eip7702/volume/index.d.ts +0 -96
- package/dist/chains/xlayer/eip7702/volume/index.js +0 -793
- package/dist/chains/xlayer/eip7702/volume/types.d.ts +0 -124
- package/dist/chains/xlayer/eip7702/volume/types.js +0 -1
- package/dist/chains/xlayer/eoa/types-core.d.ts +0 -363
- package/dist/chains/xlayer/eoa/types-core.js +0 -53
- package/dist/chains/xlayer/eoa/types-create.d.ts +0 -413
- package/dist/chains/xlayer/eoa/types-create.js +0 -9
- package/dist/chains/xlayer/eoa/types-volume.d.ts +0 -209
- package/dist/chains/xlayer/eoa/types-volume.js +0 -13
- package/dist/dex/direct-router/index.d.ts +0 -70
- package/dist/dex/direct-router/index.js +0 -1410
- package/dist/dex/direct-router/types.d.ts +0 -81
- package/dist/dex/direct-router/types.js +0 -1
- package/dist/shared/abis/TaxToken.json +0 -969
- package/dist/shared/abis/TokenManager.json +0 -836
- package/dist/shared/abis/TokenManager2.json +0 -136
- package/dist/shared/abis/TokenManagerHelper3.json +0 -993
- package/dist/shared/abis 2/TaxToken.json +0 -105
- package/dist/shared/abis 2/TokenManager.json +0 -836
- package/dist/shared/abis 2/TokenManager2.json +0 -60
- package/dist/shared/abis 2/TokenManagerHelper3.json +0 -993
- package/dist/shared/abis 2/common.d.ts +0 -85
- package/dist/shared/abis 2/common.js +0 -254
- package/dist/shared/abis 2/index.d.ts +0 -8
- package/dist/shared/abis 2/index.js +0 -8
- package/dist/shared/clients 2/blockrazor.d.ts +0 -314
- package/dist/shared/clients 2/blockrazor.js +0 -596
- package/dist/shared/clients 2/club48.d.ts +0 -154
- package/dist/shared/clients 2/club48.js +0 -331
- package/dist/shared/clients 2/emitservice.d.ts +0 -47
- package/dist/shared/clients 2/emitservice.js +0 -44
- package/dist/shared/clients 2/four.d.ts +0 -132
- package/dist/shared/clients 2/four.js +0 -281
- package/dist/shared/clients 2/merkle.d.ts +0 -210
- package/dist/shared/clients 2/merkle.js +0 -400
- package/dist/shared/flap/__tests__/curve.test.d.ts +0 -1
- package/dist/shared/flap/__tests__/curve.test.js +0 -85
- package/dist/shared/flap/portal/index.d.ts +0 -12
- package/dist/shared/flap/portal/index.js +0 -11
- package/dist/shared/flap/portal/portal.d.ts +0 -47
- package/dist/shared/flap/portal/portal.js +0 -218
- package/dist/shared/flap/portal/types.d.ts +0 -227
- package/dist/shared/flap/portal/types.js +0 -80
- package/dist/shared/flap/portal/writer.d.ts +0 -121
- package/dist/shared/flap/portal/writer.js +0 -265
- package/dist/shared/flap/portal-bundle-merkle/core/index.d.ts +0 -18
- package/dist/shared/flap/portal-bundle-merkle/core/index.js +0 -938
- package/dist/shared/flap/portal-bundle-merkle/core/types.d.ts +0 -1
- package/dist/shared/flap/portal-bundle-merkle/core/types.js +0 -1
- package/dist/shared/flap/portal-bundle-merkle/swap/index.d.ts +0 -42
- package/dist/shared/flap/portal-bundle-merkle/swap/index.js +0 -1448
- package/dist/shared/flap/portal-bundle-merkle/swap/types.d.ts +0 -84
- package/dist/shared/flap/portal-bundle-merkle/swap/types.js +0 -1
- package/dist/shared/flap/portal-bundle-merkle/utils/index.d.ts +0 -17
- package/dist/shared/flap/portal-bundle-merkle/utils/index.js +0 -1024
- package/dist/shared/flap/portal-bundle-merkle/utils/types.d.ts +0 -16
- package/dist/shared/flap/portal-bundle-merkle/utils/types.js +0 -1
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +0 -100
- package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +0 -133
- package/dist/shared/flap 2/__tests__/curve.test.d.ts +0 -1
- package/dist/shared/flap 2/__tests__/curve.test.js +0 -85
- package/dist/shared/flap 2/abi.d.ts +0 -4
- package/dist/shared/flap 2/abi.js +0 -4
- package/dist/shared/flap 2/constants.d.ts +0 -128
- package/dist/shared/flap 2/constants.js +0 -143
- package/dist/shared/flap 2/curve.d.ts +0 -33
- package/dist/shared/flap 2/curve.js +0 -84
- package/dist/shared/flap 2/errors.d.ts +0 -37
- package/dist/shared/flap 2/errors.js +0 -114
- package/dist/shared/flap 2/index.d.ts +0 -22
- package/dist/shared/flap 2/index.js +0 -33
- package/dist/shared/flap 2/ipfs.d.ts +0 -21
- package/dist/shared/flap 2/ipfs.js +0 -38
- package/dist/shared/flap 2/meta.d.ts +0 -30
- package/dist/shared/flap 2/meta.js +0 -195
- package/dist/shared/flap 2/permit.d.ts +0 -16
- package/dist/shared/flap 2/permit.js +0 -67
- package/dist/shared/flap 2/pinata.d.ts +0 -40
- package/dist/shared/flap 2/pinata.js +0 -106
- package/dist/shared/flap 2/portal-bundle-merkle/config.d.ts +0 -79
- package/dist/shared/flap 2/portal-bundle-merkle/config.js +0 -133
- package/dist/shared/flap 2/portal-bundle-merkle/core.d.ts +0 -18
- package/dist/shared/flap 2/portal-bundle-merkle/core.js +0 -938
- package/dist/shared/flap 2/portal-bundle-merkle/create-to-dex.d.ts +0 -125
- package/dist/shared/flap 2/portal-bundle-merkle/create-to-dex.js +0 -665
- package/dist/shared/flap 2/portal-bundle-merkle/curve-to-dex.d.ts +0 -88
- package/dist/shared/flap 2/portal-bundle-merkle/curve-to-dex.js +0 -446
- package/dist/shared/flap 2/portal-bundle-merkle/index.d.ts +0 -14
- package/dist/shared/flap 2/portal-bundle-merkle/index.js +0 -26
- package/dist/shared/flap 2/portal-bundle-merkle/pancake-proxy.d.ts +0 -28
- package/dist/shared/flap 2/portal-bundle-merkle/pancake-proxy.js +0 -701
- package/dist/shared/flap 2/portal-bundle-merkle/private.d.ts +0 -17
- package/dist/shared/flap 2/portal-bundle-merkle/private.js +0 -549
- package/dist/shared/flap 2/portal-bundle-merkle/swap-buy-first.d.ts +0 -65
- package/dist/shared/flap 2/portal-bundle-merkle/swap-buy-first.js +0 -831
- package/dist/shared/flap 2/portal-bundle-merkle/swap.d.ts +0 -201
- package/dist/shared/flap 2/portal-bundle-merkle/swap.js +0 -1359
- package/dist/shared/flap 2/portal-bundle-merkle/types.d.ts +0 -358
- package/dist/shared/flap 2/portal-bundle-merkle/types.js +0 -1
- package/dist/shared/flap 2/portal-bundle-merkle/utils.d.ts +0 -89
- package/dist/shared/flap 2/portal-bundle-merkle/utils.js +0 -963
- package/dist/shared/flap 2/portal-bundle.d.ts +0 -119
- package/dist/shared/flap 2/portal-bundle.js +0 -584
- package/dist/shared/flap 2/portal.d.ts +0 -392
- package/dist/shared/flap 2/portal.js +0 -559
- package/dist/shared/flap 2/vanity.d.ts +0 -48
- package/dist/shared/flap 2/vanity.js +0 -110
- package/dist/shared/flap 2/vault.d.ts +0 -240
- package/dist/shared/flap 2/vault.js +0 -366
- package/dist/shared/four 2/index.d.ts +0 -7
- package/dist/shared/four 2/index.js +0 -22
- package/dist/shared/four 2/tax-token.d.ts +0 -176
- package/dist/shared/four 2/tax-token.js +0 -302
- package/dist/shared/index 2.js +0 -10
- package/dist/shared/index.d 2.ts +0 -10
- package/dist/types/distribute.d.ts +0 -72
- package/dist/types/distribute.js +0 -1
- package/dist/types 2/errors.d.ts +0 -27
- package/dist/types 2/errors.js +0 -34
- package/dist/utils/__tests__/errors.test.d.ts +0 -1
- package/dist/utils/__tests__/errors.test.js +0 -76
- package/dist/utils/airdrop-sweep-types.d.ts +0 -1
- package/dist/utils/airdrop-sweep-types.js +0 -1
- package/dist/utils/erc20/index.d.ts +0 -242
- package/dist/utils/erc20/index.js +0 -645
- package/dist/utils/erc20/types.d.ts +0 -77
- package/dist/utils/erc20/types.js +0 -1
- package/dist/utils/erc20-types.d.ts +0 -1
- package/dist/utils/erc20-types.js +0 -1
- package/dist/utils/holders-maker/helpers.d.ts +0 -43
- package/dist/utils/holders-maker/helpers.js +0 -371
- package/dist/utils/holders-maker/index.d.ts +0 -26
- package/dist/utils/holders-maker/index.js +0 -218
- package/dist/utils/holders-maker/types.d.ts +0 -72
- package/dist/utils/holders-maker/types.js +0 -4
- package/dist/utils/holders-maker-types.d.ts +0 -1
- package/dist/utils/holders-maker-types.js +0 -1
- package/dist/utils/lp-inspect/index.d.ts +0 -44
- package/dist/utils/lp-inspect/index.js +0 -937
- package/dist/utils/lp-inspect/types.d.ts +0 -100
- package/dist/utils/lp-inspect/types.js +0 -1
- package/dist/utils/lp-inspect-types.d.ts +0 -1
- package/dist/utils/lp-inspect-types.js +0 -1
- package/dist/utils/private-sale-types.d.ts +0 -1
- package/dist/utils/private-sale-types.js +0 -1
- package/dist/utils/quote-helpers/index.d.ts +0 -107
- package/dist/utils/quote-helpers/index.js +0 -346
- package/dist/utils/quote-helpers/types.d.ts +0 -16
- package/dist/utils/quote-helpers/types.js +0 -1
- package/dist/utils/quote-helpers-types.d.ts +0 -1
- package/dist/utils/quote-helpers-types.js +0 -1
- /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,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
|
-
}
|