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,302 +0,0 @@
1
- /**
2
- * Four.meme TaxToken 工具模块
3
- *
4
- * 提供 TaxToken 的识别、状态查询、奖励领取等功能。
5
- * 基于 Four.meme 官方文档: API-Contract-TaxToken.md
6
- */
7
- import { ethers, Contract, Wallet, JsonRpcProvider } from 'ethers';
8
- import TaxTokenAbi from '../abis/TaxToken.json' with { type: 'json' };
9
- // ============================================================================
10
- // 常量
11
- // ============================================================================
12
- /** Four.meme TokenManager2 合约地址(BSC) */
13
- const TOKEN_MANAGER_2_ADDRESS = '0x5c952063c7fc8610FFDB798152D69F0B9550762b';
14
- /** TaxToken 的 creatorType 值 */
15
- const TOKEN_TYPE_TAX = 5;
16
- /** TokenManager2 最小 ABI(用于查询 _tokenInfos 和 _tokenInfoEx1s) */
17
- const TOKEN_MANAGER_QUERY_ABI = [
18
- 'function _tokenInfos(address) view returns (uint256 template)',
19
- 'function _tokenInfoEx1s(address) view returns (uint256 launchFee, uint256 pcFee, uint256 feeSetting, uint256 blockNumber, uint256 extraFee)',
20
- ];
21
- /** TaxToken 读取 ABI(ethers human-readable 格式,比 JSON 更轻) */
22
- const TAX_TOKEN_READ_ABI = [
23
- 'function feeRate() view returns (uint256)',
24
- 'function rateFounder() view returns (uint256)',
25
- 'function rateHolder() view returns (uint256)',
26
- 'function rateBurn() view returns (uint256)',
27
- 'function rateLiquidity() view returns (uint256)',
28
- 'function founder() view returns (address)',
29
- 'function quote() view returns (address)',
30
- 'function pair() view returns (address)',
31
- 'function _mode() view returns (uint256)',
32
- 'function minDispatch() view returns (uint256)',
33
- 'function minShare() view returns (uint256)',
34
- 'function totalShares() view returns (uint256)',
35
- 'function feePerShare() view returns (uint256)',
36
- 'function feeAccumulated() view returns (uint256)',
37
- 'function feeDispatched() view returns (uint256)',
38
- 'function feeFounder() view returns (uint256)',
39
- 'function feeHolder() view returns (uint256)',
40
- 'function feeBurn() view returns (uint256)',
41
- 'function feeLiquidity() view returns (uint256)',
42
- 'function quoteFounder() view returns (uint256)',
43
- 'function quoteHolder() view returns (uint256)',
44
- 'function quoteClaimed() view returns (uint256)',
45
- 'function claimableFee(address) view returns (uint256)',
46
- 'function claimedFee(address) view returns (uint256)',
47
- 'function userInfo(address) view returns (uint256 share, uint256 rewardDebt, uint256 claimable, uint256 claimed)',
48
- 'function claimFee()',
49
- ];
50
- // ============================================================================
51
- // 类型
52
- // ============================================================================
53
- /** TaxToken 转账模式 */
54
- export var TransferMode;
55
- (function (TransferMode) {
56
- /** 正常转账模式 - 允许所有转账 */
57
- TransferMode[TransferMode["NORMAL"] = 0] = "NORMAL";
58
- /** 限制转账模式 - 禁止所有转账 */
59
- TransferMode[TransferMode["RESTRICTED"] = 1] = "RESTRICTED";
60
- /** 受控转账模式 - 只允许与 owner 相关的转账 */
61
- TransferMode[TransferMode["CONTROLLED"] = 2] = "CONTROLLED";
62
- })(TransferMode || (TransferMode = {}));
63
- // ============================================================================
64
- // 识别方法
65
- // ============================================================================
66
- /**
67
- * 链上判断代币是否是 TaxToken
68
- *
69
- * 原理:读取 TokenManager2._tokenInfos[token].template,
70
- * 提取 creatorType = (template >> 10) & 0x3F,判断是否等于 5
71
- *
72
- * @param tokenAddress - 代币合约地址
73
- * @param rpcUrl - BSC RPC URL
74
- * @returns 是否为 TaxToken
75
- */
76
- export async function isTaxToken(tokenAddress, rpcUrl) {
77
- const provider = new JsonRpcProvider(rpcUrl);
78
- const tm2 = new Contract(TOKEN_MANAGER_2_ADDRESS, TOKEN_MANAGER_QUERY_ABI, provider);
79
- const template = await tm2._tokenInfos(tokenAddress);
80
- const creatorType = Number((template >> 10n) & 0x3fn);
81
- return creatorType === TOKEN_TYPE_TAX;
82
- }
83
- /**
84
- * 链上判断代币是否启用了 AntiSniperFeeMode
85
- *
86
- * 原理:读取 TokenManager2._tokenInfoEx1s[token].feeSetting > 0
87
- *
88
- * @param tokenAddress - 代币合约地址
89
- * @param rpcUrl - BSC RPC URL
90
- * @returns 是否启用 AntiSniperFeeMode
91
- */
92
- export async function isAntiSniperFeeMode(tokenAddress, rpcUrl) {
93
- const provider = new JsonRpcProvider(rpcUrl);
94
- const tm2 = new Contract(TOKEN_MANAGER_2_ADDRESS, TOKEN_MANAGER_QUERY_ABI, provider);
95
- const info = await tm2._tokenInfoEx1s(tokenAddress);
96
- return BigInt(info.feeSetting) > 0n;
97
- }
98
- /**
99
- * 获取代币的 creatorType
100
- *
101
- * @param tokenAddress - 代币合约地址
102
- * @param rpcUrl - BSC RPC URL
103
- * @returns creatorType 数值
104
- */
105
- export async function getCreatorType(tokenAddress, rpcUrl) {
106
- const provider = new JsonRpcProvider(rpcUrl);
107
- const tm2 = new Contract(TOKEN_MANAGER_2_ADDRESS, TOKEN_MANAGER_QUERY_ABI, provider);
108
- const template = await tm2._tokenInfos(tokenAddress);
109
- return Number((template >> 10n) & 0x3fn);
110
- }
111
- // ============================================================================
112
- // TaxToken 状态查询
113
- // ============================================================================
114
- /**
115
- * 获取 TaxToken 的完整配置信息
116
- *
117
- * @param tokenAddress - TaxToken 合约地址
118
- * @param rpcUrl - BSC RPC URL
119
- * @returns 税收配置 + 奖励统计
120
- */
121
- export async function getTaxTokenInfo(tokenAddress, rpcUrl) {
122
- const provider = new JsonRpcProvider(rpcUrl);
123
- const token = new Contract(tokenAddress, TAX_TOKEN_READ_ABI, provider);
124
- // 批量查询所有状态(利用 Promise.all 减少 RPC 调用轮次)
125
- const [feeRate, rateFounder, rateHolder, rateBurn, rateLiquidity, founder, quote, pair, mode, minDispatch, minShare, totalShares, feePerShare, feeAccumulated, feeDispatched, feeFounderVal, feeHolderVal, feeBurnVal, feeLiquidityVal, quoteFounderVal, quoteHolderVal, quoteClaimed,] = await Promise.all([
126
- token.feeRate(), token.rateFounder(), token.rateHolder(), token.rateBurn(), token.rateLiquidity(),
127
- token.founder(), token.quote(), token.pair(), token._mode(), token.minDispatch(), token.minShare(),
128
- token.totalShares(), token.feePerShare(), token.feeAccumulated(), token.feeDispatched(),
129
- token.feeFounder(), token.feeHolder(), token.feeBurn(), token.feeLiquidity(),
130
- token.quoteFounder(), token.quoteHolder(), token.quoteClaimed(),
131
- ]);
132
- return {
133
- config: {
134
- feeRate: BigInt(feeRate),
135
- rateFounder: BigInt(rateFounder),
136
- rateHolder: BigInt(rateHolder),
137
- rateBurn: BigInt(rateBurn),
138
- rateLiquidity: BigInt(rateLiquidity),
139
- founder: String(founder),
140
- quote: String(quote),
141
- pair: String(pair),
142
- mode: Number(mode),
143
- minDispatch: BigInt(minDispatch),
144
- minShare: BigInt(minShare),
145
- },
146
- rewardStats: {
147
- totalShares: BigInt(totalShares),
148
- feePerShare: BigInt(feePerShare),
149
- feeAccumulated: BigInt(feeAccumulated),
150
- feeDispatched: BigInt(feeDispatched),
151
- feeFounder: BigInt(feeFounderVal),
152
- feeHolder: BigInt(feeHolderVal),
153
- feeBurn: BigInt(feeBurnVal),
154
- feeLiquidity: BigInt(feeLiquidityVal),
155
- quoteFounder: BigInt(quoteFounderVal),
156
- quoteHolder: BigInt(quoteHolderVal),
157
- quoteClaimed: BigInt(quoteClaimed),
158
- },
159
- };
160
- }
161
- // ============================================================================
162
- // 用户奖励查询
163
- // ============================================================================
164
- /**
165
- * 查询用户在 TaxToken 中的可领取奖励
166
- *
167
- * @param tokenAddress - TaxToken 合约地址
168
- * @param account - 用户钱包地址
169
- * @param rpcUrl - BSC RPC URL
170
- * @returns 可领取的报价代币数量(wei)
171
- */
172
- export async function getClaimableFee(tokenAddress, account, rpcUrl) {
173
- const provider = new JsonRpcProvider(rpcUrl);
174
- const token = new Contract(tokenAddress, TAX_TOKEN_READ_ABI, provider);
175
- return BigInt(await token.claimableFee(account));
176
- }
177
- /**
178
- * 查询用户在 TaxToken 中的已领取奖励
179
- *
180
- * @param tokenAddress - TaxToken 合约地址
181
- * @param account - 用户钱包地址
182
- * @param rpcUrl - BSC RPC URL
183
- * @returns 已领取的报价代币数量(wei)
184
- */
185
- export async function getClaimedFee(tokenAddress, account, rpcUrl) {
186
- const provider = new JsonRpcProvider(rpcUrl);
187
- const token = new Contract(tokenAddress, TAX_TOKEN_READ_ABI, provider);
188
- return BigInt(await token.claimedFee(account));
189
- }
190
- /**
191
- * 查询用户在 TaxToken 中的完整奖励信息
192
- *
193
- * @param tokenAddress - TaxToken 合约地址
194
- * @param account - 用户钱包地址
195
- * @param rpcUrl - BSC RPC URL
196
- * @returns 用户奖励信息(份额、债务、可领取、已领取)
197
- */
198
- export async function getUserRewardInfo(tokenAddress, account, rpcUrl) {
199
- const provider = new JsonRpcProvider(rpcUrl);
200
- const token = new Contract(tokenAddress, TAX_TOKEN_READ_ABI, provider);
201
- const info = await token.userInfo(account);
202
- return {
203
- share: BigInt(info.share),
204
- rewardDebt: BigInt(info.rewardDebt),
205
- claimable: BigInt(info.claimable),
206
- claimed: BigInt(info.claimed),
207
- };
208
- }
209
- // ============================================================================
210
- // 奖励领取
211
- // ============================================================================
212
- /**
213
- * 构建 TaxToken 奖励领取的签名交易(不发送)
214
- *
215
- * @param tokenAddress - TaxToken 合约地址
216
- * @param privateKey - 用户私钥
217
- * @param rpcUrl - BSC RPC URL
218
- * @returns 签名后的交易 hex
219
- */
220
- export async function buildClaimFeeTx(tokenAddress, privateKey, rpcUrl) {
221
- const provider = new JsonRpcProvider(rpcUrl);
222
- const wallet = new Wallet(privateKey, provider);
223
- const token = new Contract(tokenAddress, TAX_TOKEN_READ_ABI, wallet);
224
- const tx = await token.claimFee.populateTransaction();
225
- const nonce = await provider.getTransactionCount(wallet.address, 'latest');
226
- const feeData = await provider.getFeeData();
227
- const signedTx = await wallet.signTransaction({
228
- to: tokenAddress,
229
- data: tx.data,
230
- nonce,
231
- gasLimit: 200000n,
232
- gasPrice: feeData.gasPrice ?? ethers.parseUnits('3', 'gwei'),
233
- chainId: 56,
234
- type: 0,
235
- });
236
- return signedTx;
237
- }
238
- /**
239
- * 批量构建 TaxToken 奖励领取交易(多个钱包)
240
- *
241
- * @param tokenAddress - TaxToken 合约地址
242
- * @param privateKeys - 用户私钥数组
243
- * @param rpcUrl - BSC RPC URL
244
- * @returns 签名后的交易 hex 数组
245
- */
246
- export async function buildBatchClaimFeeTxs(tokenAddress, privateKeys, rpcUrl) {
247
- const provider = new JsonRpcProvider(rpcUrl);
248
- const iface = new ethers.Interface(TAX_TOKEN_READ_ABI);
249
- const claimData = iface.encodeFunctionData('claimFee', []);
250
- const feeData = await provider.getFeeData();
251
- const gasPrice = feeData.gasPrice ?? ethers.parseUnits('3', 'gwei');
252
- const signedTxs = await Promise.all(privateKeys.map(async (pk) => {
253
- const wallet = new Wallet(pk, provider);
254
- const nonce = await provider.getTransactionCount(wallet.address, 'latest');
255
- return wallet.signTransaction({
256
- to: tokenAddress,
257
- data: claimData,
258
- nonce,
259
- gasLimit: 200000n,
260
- gasPrice,
261
- chainId: 56,
262
- type: 0,
263
- });
264
- }));
265
- return signedTxs;
266
- }
267
- // ============================================================================
268
- // 校验工具
269
- // ============================================================================
270
- /**
271
- * 验证 FourTokenTaxInfo 参数合法性
272
- *
273
- * @param info - 税币配置
274
- * @returns 验证结果,valid=true 表示合法
275
- */
276
- export function validateFourTokenTaxInfo(info) {
277
- // feeRate 必须是 1, 3, 5, 10 之一
278
- if (![1, 3, 5, 10].includes(info.feeRate)) {
279
- return { valid: false, error: `feeRate 必须为 1, 3, 5 或 10,当前: ${info.feeRate}` };
280
- }
281
- // 四项比例之和必须为 100
282
- const rateSum = info.burnRate + info.divideRate + info.liquidityRate + info.recipientRate;
283
- if (rateSum !== 100) {
284
- return { valid: false, error: `burnRate + divideRate + liquidityRate + recipientRate 必须等于 100,当前: ${rateSum}` };
285
- }
286
- // 每项比例 >= 0
287
- if (info.burnRate < 0 || info.divideRate < 0 || info.liquidityRate < 0 || info.recipientRate < 0) {
288
- return { valid: false, error: '所有比例值不能为负数' };
289
- }
290
- // minSharing 验证: d × 10^n, n >= 5, 1 <= d <= 9
291
- if (info.minSharing > 0) {
292
- const str = String(info.minSharing);
293
- // 必须形如 d000...0(d 为 1-9 的数字,后面至少 5 个 0)
294
- const match = str.match(/^([1-9])(0+)$/);
295
- if (!match || match[2].length < 5) {
296
- return { valid: false, error: `minSharing 必须满足 d × 10^n (n≥5, 1≤d≤9),当前: ${info.minSharing}` };
297
- }
298
- }
299
- return { valid: true };
300
- }
301
- // 导出 ABI 供外部使用
302
- export { TaxTokenAbi as TAX_TOKEN_ABI };
@@ -1,10 +0,0 @@
1
- /**
2
- * Shared 模块统一导出
3
- *
4
- * 包含所有跨链共享的功能:
5
- * - constants: 常量定义
6
- * - clients: API 客户端
7
- * - four: Four.meme 工具(TaxToken 等)
8
- */
9
- export * from './constants/index.js';
10
- export * as FourUtils from './four/index.js';
@@ -1,10 +0,0 @@
1
- /**
2
- * Shared 模块统一导出
3
- *
4
- * 包含所有跨链共享的功能:
5
- * - constants: 常量定义
6
- * - clients: API 客户端
7
- * - four: Four.meme 工具(TaxToken 等)
8
- */
9
- export * from './constants/index.js';
10
- export * as FourUtils from './four/index.js';
@@ -1,72 +0,0 @@
1
- import type { GeneratedWallet } from '../utils/wallet.js';
2
- import type { TokenPoolType, QuoteTokenType } from '../chains/bsc/four/types.js';
3
- /**
4
- * 跳板钱包条目
5
- * - string: 私钥(hex 字符串)
6
- * - GeneratedWallet: { address, privateKey }
7
- * - null / undefined: 空占位
8
- */
9
- export type HopWalletEntry = string | GeneratedWallet | null | undefined;
10
- /** 跳板钱包组(一组跳板钱包条目) */
11
- export type HopWalletGroup = HopWalletEntry[];
12
- /** 分发/归集/多对多 流程统一结果 */
13
- export type DistributeFlowResult = {
14
- ok: boolean;
15
- error?: string;
16
- successBatches: number;
17
- totalBatches: number;
18
- hopWallets: HopWalletGroup[];
19
- profitHopWallets?: HopWalletGroup[];
20
- };
21
- /** 分发/归集/多对多 共用的基础参数(SDK 类型版本,不依赖外部 StoredWallet) */
22
- export type BaseFlowParams = {
23
- chain: string;
24
- supportsBundleFeature: boolean;
25
- unitLabel: string;
26
- tokenAddress: string;
27
- tokenDecimals: number;
28
- tokenPoolType: TokenPoolType | string;
29
- quoteToken: QuoteTokenType | string;
30
- tokenKey: string;
31
- tokenSymbol: string;
32
- hopCount?: number;
33
- bribeAmount?: number;
34
- gasLimit: number;
35
- gasPriceGwei: number;
36
- submitToBlockRazor: (signedTransactions: string[], options?: Record<string, unknown>) => Promise<Record<string, unknown>>;
37
- submitDirectWithTransferHops?: (params: Record<string, unknown>) => Promise<Record<string, unknown>>;
38
- txLogs: Record<string, unknown>;
39
- delay: (ms: number) => Promise<void>;
40
- onBatchConfirmed: (addresses: string[]) => Promise<void>;
41
- /** 跳板钱包生成回调 */
42
- onHopWalletsGenerated?: (params: {
43
- operation: string;
44
- hopWallets: HopWalletGroup[];
45
- profitHopWallets?: HopWalletGroup[];
46
- batchIndex: number;
47
- totalBatches: number;
48
- }) => void;
49
- };
50
- /** 分发流程参数(SDK 类型版本) */
51
- export type DisperseFlowParams = BaseFlowParams & {
52
- fundWalletId: number;
53
- fundWallet: Record<string, unknown>;
54
- selectedWallets: Record<string, unknown>[];
55
- minDistribute: number;
56
- maxDistribute: number;
57
- erc20BalanceMap: Record<string, string>;
58
- };
59
- /** 归集流程参数(SDK 类型版本) */
60
- export type CollectFlowParams = BaseFlowParams & {
61
- mainWalletId: number;
62
- mainWallet: Record<string, unknown>;
63
- selectedWallets: Record<string, unknown>[];
64
- collectRatioPct: number;
65
- erc20BalanceMap: Record<string, string>;
66
- };
67
- /** 多对多转账流程参数(SDK 类型版本) */
68
- export type PairwiseFlowParams = BaseFlowParams & {
69
- senderWallets: Record<string, unknown>[];
70
- receiverAddresses: string[];
71
- amounts: string[];
72
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,27 +0,0 @@
1
- /**
2
- * 统一 SDK 错误代码
3
- *
4
- * 合并 Four.meme (parseFourError) 和 Flap Protocol (parseFlapError) 的错误代码。
5
- */
6
- export declare enum SdkErrorCode {
7
- UNKNOWN_ERROR = "UNKNOWN_ERROR",
8
- INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
9
- SLIPPAGE_EXCEEDED = "SLIPPAGE_EXCEEDED",
10
- TRANSACTION_FAILED = "TRANSACTION_FAILED",
11
- TOKEN_ALREADY_EXISTS = "TOKEN_ALREADY_EXISTS",
12
- TOKEN_NOT_FOUND = "TOKEN_NOT_FOUND",
13
- TOKEN_NOT_TRADABLE = "TOKEN_NOT_TRADABLE",
14
- ALREADY_ON_DEX = "ALREADY_ON_DEX",
15
- FOUR_GWEI_PRECISION = "FOUR_GWEI_PRECISION",
16
- FOUR_ZERO_ADDRESS = "FOUR_ZERO_ADDRESS",
17
- FOUR_SLIPPAGE = "FOUR_SLIPPAGE",
18
- FOUR_INSUFFICIENT_FUNDS = "FOUR_INSUFFICIENT_FUNDS",
19
- FOUR_FEE_TOO_HIGH = "FOUR_FEE_TOO_HIGH",
20
- FOUR_ORDER_TOO_SMALL = "FOUR_ORDER_TOO_SMALL",
21
- INVALID_AMOUNT = "INVALID_AMOUNT",
22
- INVALID_TOKEN = "INVALID_TOKEN",
23
- INVALID_QUOTE_TOKEN = "INVALID_QUOTE_TOKEN",
24
- TAX_RATE_TOO_HIGH = "TAX_RATE_TOO_HIGH",
25
- PERMIT_EXPIRED = "PERMIT_EXPIRED",
26
- PERMIT_INVALID = "PERMIT_INVALID"
27
- }
@@ -1,34 +0,0 @@
1
- /**
2
- * 统一 SDK 错误代码
3
- *
4
- * 合并 Four.meme (parseFourError) 和 Flap Protocol (parseFlapError) 的错误代码。
5
- */
6
- export var SdkErrorCode;
7
- (function (SdkErrorCode) {
8
- // Generic
9
- SdkErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
10
- // Transaction / Bundle
11
- SdkErrorCode["INSUFFICIENT_BALANCE"] = "INSUFFICIENT_BALANCE";
12
- SdkErrorCode["SLIPPAGE_EXCEEDED"] = "SLIPPAGE_EXCEEDED";
13
- SdkErrorCode["TRANSACTION_FAILED"] = "TRANSACTION_FAILED";
14
- // Token state
15
- SdkErrorCode["TOKEN_ALREADY_EXISTS"] = "TOKEN_ALREADY_EXISTS";
16
- SdkErrorCode["TOKEN_NOT_FOUND"] = "TOKEN_NOT_FOUND";
17
- SdkErrorCode["TOKEN_NOT_TRADABLE"] = "TOKEN_NOT_TRADABLE";
18
- SdkErrorCode["ALREADY_ON_DEX"] = "ALREADY_ON_DEX";
19
- // Four.meme specific
20
- SdkErrorCode["FOUR_GWEI_PRECISION"] = "FOUR_GWEI_PRECISION";
21
- SdkErrorCode["FOUR_ZERO_ADDRESS"] = "FOUR_ZERO_ADDRESS";
22
- SdkErrorCode["FOUR_SLIPPAGE"] = "FOUR_SLIPPAGE";
23
- SdkErrorCode["FOUR_INSUFFICIENT_FUNDS"] = "FOUR_INSUFFICIENT_FUNDS";
24
- SdkErrorCode["FOUR_FEE_TOO_HIGH"] = "FOUR_FEE_TOO_HIGH";
25
- SdkErrorCode["FOUR_ORDER_TOO_SMALL"] = "FOUR_ORDER_TOO_SMALL";
26
- // Validation
27
- SdkErrorCode["INVALID_AMOUNT"] = "INVALID_AMOUNT";
28
- SdkErrorCode["INVALID_TOKEN"] = "INVALID_TOKEN";
29
- SdkErrorCode["INVALID_QUOTE_TOKEN"] = "INVALID_QUOTE_TOKEN";
30
- SdkErrorCode["TAX_RATE_TOO_HIGH"] = "TAX_RATE_TOO_HIGH";
31
- // Permit
32
- SdkErrorCode["PERMIT_EXPIRED"] = "PERMIT_EXPIRED";
33
- SdkErrorCode["PERMIT_INVALID"] = "PERMIT_INVALID";
34
- })(SdkErrorCode || (SdkErrorCode = {}));
@@ -1 +0,0 @@
1
- export {};
@@ -1,76 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parseFourError, parseSdkError, SdkError, SdkErrorCode } from '../errors.js';
3
- describe('parseFourError', () => {
4
- it.each([
5
- ['GW: amount precision', 'GW', 'Amount precision is not aligned to GWEI'],
6
- ['ZA: zero address', 'ZA', "The 'to' address should not be address(0)"],
7
- ['TO: pancake pair', 'TO', 'The to address should not be set to the PancakePair address'],
8
- ['Slippage exceeded', 'Slippage', 'Slippage exceeded limit'],
9
- ['More BNB needed', 'More BNB', 'Insufficient BNB sent in msg.value'],
10
- ['FR: fee rate', 'FR', 'Fee rate exceeds 5%'],
11
- ['SO: order too small', 'SO', 'Order amount is too small'],
12
- ])('parses %s error correctly', (_label, code, message) => {
13
- const result1 = parseFourError({ message: `execution reverted: ${code}` });
14
- expect(result1.code).toBe(code);
15
- expect(result1.message).toBe(message);
16
- const result2 = parseFourError(code);
17
- expect(result2.code).toBe(code);
18
- expect(result2.message).toBe(message);
19
- });
20
- it('returns unknown message when no code matches', () => {
21
- const result = parseFourError({ message: 'some random error' });
22
- expect(result.code).toBeUndefined();
23
- expect(result.message).toBe('some random error');
24
- });
25
- });
26
- describe('SdkError', () => {
27
- it('creates error with code and message', () => {
28
- const err = new SdkError(SdkErrorCode.SLIPPAGE_EXCEEDED, 'Slippage too high');
29
- expect(err.code).toBe(SdkErrorCode.SLIPPAGE_EXCEEDED);
30
- expect(err.message).toBe('Slippage too high');
31
- expect(err.name).toBe('SdkError');
32
- expect(err.cause).toBeUndefined();
33
- });
34
- it('preserves cause when provided', () => {
35
- const cause = new Error('original error');
36
- const err = new SdkError(SdkErrorCode.TRANSACTION_FAILED, 'Failed', cause);
37
- expect(err.cause).toBe(cause);
38
- });
39
- });
40
- describe('parseSdkError', () => {
41
- it('returns the same instance for SdkError', () => {
42
- const original = new SdkError(SdkErrorCode.TOKEN_NOT_FOUND, 'not found');
43
- const parsed = parseSdkError(original);
44
- expect(parsed).toBe(original);
45
- });
46
- it('parses Four.meme GW error', () => {
47
- const err = parseSdkError({ message: 'GW: amount precision' });
48
- expect(err.code).toBe(SdkErrorCode.FOUR_GWEI_PRECISION);
49
- });
50
- it('parses Flap token exists error', () => {
51
- const err = parseSdkError({ message: 'execution reverted: token already exists' });
52
- expect(err.code).toBe(SdkErrorCode.TOKEN_ALREADY_EXISTS);
53
- });
54
- it('parses slippage error', () => {
55
- const err = parseSdkError({ message: 'slippage exceeded' });
56
- expect(err.code).toBe(SdkErrorCode.SLIPPAGE_EXCEEDED);
57
- });
58
- it('parses insufficient balance error', () => {
59
- const err = parseSdkError({ message: 'insufficient funds for gas' });
60
- expect(err.code).toBe(SdkErrorCode.INSUFFICIENT_BALANCE);
61
- });
62
- it('parses permit expired error', () => {
63
- const err = parseSdkError({ message: 'permit expired' });
64
- expect(err.code).toBe(SdkErrorCode.PERMIT_EXPIRED);
65
- });
66
- it('returns UNKNOWN_ERROR for unrecognized errors', () => {
67
- const err = parseSdkError({ message: 'completely unknown error' });
68
- expect(err.code).toBe(SdkErrorCode.UNKNOWN_ERROR);
69
- });
70
- it('handles null/undefined', () => {
71
- const err1 = parseSdkError(null);
72
- expect(err1.code).toBe(SdkErrorCode.UNKNOWN_ERROR);
73
- const err2 = parseSdkError(undefined);
74
- expect(err2.code).toBe(SdkErrorCode.UNKNOWN_ERROR);
75
- });
76
- });
@@ -1 +0,0 @@
1
- export type { BundleSubmitResult, SignedTransactionsResult, AirdropDisperseParams, AirdropDisperseSignParams, AirdropSweepParams, AirdropSweepSignParams, DisperseParams, DisperseSignParams, SweepParams, SweepSignParams, } from '../shared/foundation/types/airdrop-sweep.js';
@@ -1 +0,0 @@
1
- export {};