@sip-protocol/sdk 0.7.3 → 0.8.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 (263) hide show
  1. package/README.md +267 -0
  2. package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
  3. package/dist/browser.d.mts +10 -4
  4. package/dist/browser.d.ts +10 -4
  5. package/dist/browser.js +47556 -19603
  6. package/dist/browser.mjs +628 -48
  7. package/dist/chunk-4GRJ5MAW.mjs +152 -0
  8. package/dist/chunk-5D7A3L3W.mjs +717 -0
  9. package/dist/chunk-64AYA5F5.mjs +7834 -0
  10. package/dist/chunk-GMDGB22A.mjs +379 -0
  11. package/dist/chunk-I534WKN7.mjs +328 -0
  12. package/dist/chunk-IBZVA5Y7.mjs +1003 -0
  13. package/dist/chunk-PRRZAWJE.mjs +223 -0
  14. package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
  15. package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
  16. package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
  17. package/dist/constants-LHAAUC2T.mjs +51 -0
  18. package/dist/dist-2OGQ7FED.mjs +3957 -0
  19. package/dist/dist-IFHPYLDX.mjs +254 -0
  20. package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
  21. package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
  22. package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
  23. package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
  24. package/dist/index.d.mts +9 -3
  25. package/dist/index.d.ts +9 -3
  26. package/dist/index.js +48396 -19623
  27. package/dist/index.mjs +537 -19
  28. package/dist/interface-Bf7w1PLW.d.mts +679 -0
  29. package/dist/interface-Bf7w1PLW.d.ts +679 -0
  30. package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
  31. package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
  32. package/dist/proofs/halo2.d.mts +151 -0
  33. package/dist/proofs/halo2.d.ts +151 -0
  34. package/dist/proofs/halo2.js +350 -0
  35. package/dist/proofs/halo2.mjs +11 -0
  36. package/dist/proofs/kimchi.d.mts +160 -0
  37. package/dist/proofs/kimchi.d.ts +160 -0
  38. package/dist/proofs/kimchi.js +431 -0
  39. package/dist/proofs/kimchi.mjs +13 -0
  40. package/dist/proofs/noir.d.mts +1 -1
  41. package/dist/proofs/noir.d.ts +1 -1
  42. package/dist/proofs/noir.js +74 -18
  43. package/dist/proofs/noir.mjs +84 -24
  44. package/dist/solana-U3MEGU7W.mjs +280 -0
  45. package/dist/validity_proof-3POXLPNY.mjs +21 -0
  46. package/package.json +44 -11
  47. package/src/adapters/index.ts +41 -0
  48. package/src/adapters/jupiter.ts +571 -0
  49. package/src/adapters/near-intents.ts +135 -0
  50. package/src/advisor/advisor.ts +653 -0
  51. package/src/advisor/index.ts +54 -0
  52. package/src/advisor/tools.ts +303 -0
  53. package/src/advisor/types.ts +164 -0
  54. package/src/chains/ethereum/announcement.ts +536 -0
  55. package/src/chains/ethereum/bnb-optimizations.ts +474 -0
  56. package/src/chains/ethereum/commitment.ts +522 -0
  57. package/src/chains/ethereum/constants.ts +462 -0
  58. package/src/chains/ethereum/deployment.ts +596 -0
  59. package/src/chains/ethereum/gas-estimation.ts +538 -0
  60. package/src/chains/ethereum/index.ts +268 -0
  61. package/src/chains/ethereum/optimizations.ts +614 -0
  62. package/src/chains/ethereum/privacy-adapter.ts +855 -0
  63. package/src/chains/ethereum/registry.ts +584 -0
  64. package/src/chains/ethereum/rpc.ts +905 -0
  65. package/src/chains/ethereum/stealth.ts +491 -0
  66. package/src/chains/ethereum/token.ts +790 -0
  67. package/src/chains/ethereum/transfer.ts +637 -0
  68. package/src/chains/ethereum/types.ts +456 -0
  69. package/src/chains/ethereum/viewing-key.ts +455 -0
  70. package/src/chains/near/commitment.ts +608 -0
  71. package/src/chains/near/constants.ts +284 -0
  72. package/src/chains/near/function-call.ts +871 -0
  73. package/src/chains/near/history.ts +654 -0
  74. package/src/chains/near/implicit-account.ts +840 -0
  75. package/src/chains/near/index.ts +393 -0
  76. package/src/chains/near/native-transfer.ts +658 -0
  77. package/src/chains/near/nep141.ts +775 -0
  78. package/src/chains/near/privacy-adapter.ts +889 -0
  79. package/src/chains/near/resolver.ts +971 -0
  80. package/src/chains/near/rpc.ts +1016 -0
  81. package/src/chains/near/stealth.ts +419 -0
  82. package/src/chains/near/types.ts +317 -0
  83. package/src/chains/near/viewing-key.ts +876 -0
  84. package/src/chains/solana/anchor-transfer.ts +386 -0
  85. package/src/chains/solana/commitment.ts +577 -0
  86. package/src/chains/solana/constants.ts +126 -12
  87. package/src/chains/solana/ephemeral-keys.ts +543 -0
  88. package/src/chains/solana/index.ts +252 -1
  89. package/src/chains/solana/key-derivation.ts +418 -0
  90. package/src/chains/solana/kit-compat.ts +334 -0
  91. package/src/chains/solana/optimizations.ts +560 -0
  92. package/src/chains/solana/privacy-adapter.ts +605 -0
  93. package/src/chains/solana/providers/generic.ts +47 -6
  94. package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
  95. package/src/chains/solana/providers/helius-enhanced.ts +623 -0
  96. package/src/chains/solana/providers/helius.ts +186 -33
  97. package/src/chains/solana/providers/index.ts +31 -0
  98. package/src/chains/solana/providers/interface.ts +61 -18
  99. package/src/chains/solana/providers/quicknode.ts +409 -0
  100. package/src/chains/solana/providers/triton.ts +426 -0
  101. package/src/chains/solana/providers/webhook.ts +338 -67
  102. package/src/chains/solana/rpc-client.ts +1150 -0
  103. package/src/chains/solana/scan.ts +83 -66
  104. package/src/chains/solana/sol-transfer.ts +732 -0
  105. package/src/chains/solana/spl-transfer.ts +886 -0
  106. package/src/chains/solana/stealth-scanner.ts +703 -0
  107. package/src/chains/solana/sunspot-verifier.ts +453 -0
  108. package/src/chains/solana/transaction-builder.ts +755 -0
  109. package/src/chains/solana/transfer.ts +74 -5
  110. package/src/chains/solana/types.ts +57 -6
  111. package/src/chains/solana/utils.ts +110 -0
  112. package/src/chains/solana/viewing-key.ts +807 -0
  113. package/src/compliance/fireblocks.ts +921 -0
  114. package/src/compliance/index.ts +23 -0
  115. package/src/compliance/range-sas.ts +398 -33
  116. package/src/config/endpoints.ts +100 -0
  117. package/src/crypto.ts +11 -8
  118. package/src/errors.ts +82 -0
  119. package/src/evm/erc4337-relayer.ts +830 -0
  120. package/src/evm/index.ts +47 -0
  121. package/src/fees/calculator.ts +396 -0
  122. package/src/fees/index.ts +87 -0
  123. package/src/fees/near-contract.ts +429 -0
  124. package/src/fees/types.ts +268 -0
  125. package/src/index.ts +686 -1
  126. package/src/intent.ts +6 -3
  127. package/src/logger.ts +324 -0
  128. package/src/network/index.ts +80 -0
  129. package/src/network/proxy.ts +691 -0
  130. package/src/optimizations/index.ts +541 -0
  131. package/src/oracle/types.ts +1 -0
  132. package/src/privacy-backends/arcium-types.ts +727 -0
  133. package/src/privacy-backends/arcium.ts +719 -0
  134. package/src/privacy-backends/combined-privacy.ts +866 -0
  135. package/src/privacy-backends/cspl-token.ts +595 -0
  136. package/src/privacy-backends/cspl-types.ts +512 -0
  137. package/src/privacy-backends/cspl.ts +907 -0
  138. package/src/privacy-backends/health.ts +488 -0
  139. package/src/privacy-backends/inco-types.ts +323 -0
  140. package/src/privacy-backends/inco.ts +616 -0
  141. package/src/privacy-backends/index.ts +254 -4
  142. package/src/privacy-backends/interface.ts +649 -6
  143. package/src/privacy-backends/lru-cache.ts +343 -0
  144. package/src/privacy-backends/magicblock.ts +458 -0
  145. package/src/privacy-backends/mock.ts +258 -0
  146. package/src/privacy-backends/privacycash.ts +13 -17
  147. package/src/privacy-backends/private-swap.ts +570 -0
  148. package/src/privacy-backends/rate-limiter.ts +683 -0
  149. package/src/privacy-backends/registry.ts +414 -2
  150. package/src/privacy-backends/router.ts +283 -3
  151. package/src/privacy-backends/shadowwire.ts +449 -0
  152. package/src/privacy-backends/sip-native.ts +3 -0
  153. package/src/privacy-logger.ts +191 -0
  154. package/src/production-safety.ts +373 -0
  155. package/src/proofs/aggregator.ts +1029 -0
  156. package/src/proofs/browser-composer.ts +1150 -0
  157. package/src/proofs/browser.ts +113 -25
  158. package/src/proofs/cache/index.ts +127 -0
  159. package/src/proofs/cache/interface.ts +545 -0
  160. package/src/proofs/cache/key-generator.ts +188 -0
  161. package/src/proofs/cache/lru-cache.ts +481 -0
  162. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  163. package/src/proofs/cache/persistent-cache.ts +788 -0
  164. package/src/proofs/compliance-proof.ts +872 -0
  165. package/src/proofs/composer/base.ts +923 -0
  166. package/src/proofs/composer/index.ts +25 -0
  167. package/src/proofs/composer/interface.ts +518 -0
  168. package/src/proofs/composer/types.ts +383 -0
  169. package/src/proofs/converters/halo2.ts +452 -0
  170. package/src/proofs/converters/index.ts +208 -0
  171. package/src/proofs/converters/interface.ts +363 -0
  172. package/src/proofs/converters/kimchi.ts +462 -0
  173. package/src/proofs/converters/noir.ts +451 -0
  174. package/src/proofs/fallback.ts +888 -0
  175. package/src/proofs/halo2.ts +42 -0
  176. package/src/proofs/index.ts +471 -0
  177. package/src/proofs/interface.ts +13 -0
  178. package/src/proofs/kimchi.ts +42 -0
  179. package/src/proofs/lazy.ts +1004 -0
  180. package/src/proofs/mock.ts +25 -1
  181. package/src/proofs/noir.ts +110 -29
  182. package/src/proofs/orchestrator.ts +960 -0
  183. package/src/proofs/parallel/concurrency.ts +297 -0
  184. package/src/proofs/parallel/dependency-graph.ts +602 -0
  185. package/src/proofs/parallel/executor.ts +420 -0
  186. package/src/proofs/parallel/index.ts +131 -0
  187. package/src/proofs/parallel/interface.ts +685 -0
  188. package/src/proofs/parallel/worker-pool.ts +644 -0
  189. package/src/proofs/providers/halo2.ts +560 -0
  190. package/src/proofs/providers/index.ts +34 -0
  191. package/src/proofs/providers/kimchi.ts +641 -0
  192. package/src/proofs/validator.ts +881 -0
  193. package/src/proofs/verifier.ts +867 -0
  194. package/src/quantum/index.ts +112 -0
  195. package/src/quantum/winternitz-vault.ts +639 -0
  196. package/src/quantum/wots.ts +611 -0
  197. package/src/settlement/backends/direct-chain.ts +1 -0
  198. package/src/settlement/index.ts +9 -0
  199. package/src/settlement/router.ts +732 -46
  200. package/src/solana/index.ts +72 -0
  201. package/src/solana/jito-relayer.ts +687 -0
  202. package/src/solana/noir-verifier-types.ts +430 -0
  203. package/src/solana/noir-verifier.ts +816 -0
  204. package/src/stealth/address-derivation.ts +193 -0
  205. package/src/stealth/ed25519.ts +431 -0
  206. package/src/stealth/index.ts +233 -0
  207. package/src/stealth/meta-address.ts +221 -0
  208. package/src/stealth/secp256k1.ts +368 -0
  209. package/src/stealth/utils.ts +194 -0
  210. package/src/stealth.ts +50 -1504
  211. package/src/sync/index.ts +106 -0
  212. package/src/sync/manager.ts +504 -0
  213. package/src/sync/mock-provider.ts +318 -0
  214. package/src/sync/oblivious.ts +625 -0
  215. package/src/tokens/index.ts +15 -0
  216. package/src/tokens/registry.ts +301 -0
  217. package/src/utils/deprecation.ts +94 -0
  218. package/src/utils/index.ts +9 -0
  219. package/src/wallet/ethereum/index.ts +68 -0
  220. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  221. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  222. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  223. package/src/wallet/ethereum/types.ts +3 -1
  224. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  225. package/src/wallet/hardware/index.ts +10 -0
  226. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  227. package/src/wallet/index.ts +71 -0
  228. package/src/wallet/near/adapter.ts +626 -0
  229. package/src/wallet/near/index.ts +86 -0
  230. package/src/wallet/near/meteor-wallet.ts +1153 -0
  231. package/src/wallet/near/my-near-wallet.ts +790 -0
  232. package/src/wallet/near/wallet-selector.ts +702 -0
  233. package/src/wallet/solana/adapter.ts +6 -4
  234. package/src/wallet/solana/index.ts +13 -0
  235. package/src/wallet/solana/privacy-adapter.ts +567 -0
  236. package/src/wallet/sui/types.ts +6 -4
  237. package/src/zcash/rpc-client.ts +13 -6
  238. package/dist/chunk-2XIVXWHA.mjs +0 -1930
  239. package/dist/chunk-3INS3PR5.mjs +0 -884
  240. package/dist/chunk-3OVABDRH.mjs +0 -17096
  241. package/dist/chunk-7RFRWDCW.mjs +0 -1504
  242. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  243. package/dist/chunk-E6SZWREQ.mjs +0 -57
  244. package/dist/chunk-F6F73W35.mjs +0 -16166
  245. package/dist/chunk-G33LB27A.mjs +0 -16166
  246. package/dist/chunk-HGU6HZRC.mjs +0 -231
  247. package/dist/chunk-L2K34JCU.mjs +0 -1496
  248. package/dist/chunk-OFDBEIEK.mjs +0 -16166
  249. package/dist/chunk-SF7YSLF5.mjs +0 -1515
  250. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  251. package/dist/chunk-WWUSGOXE.mjs +0 -17129
  252. package/dist/constants-VOI7BSLK.mjs +0 -27
  253. package/dist/index-B71aXVzk.d.ts +0 -13264
  254. package/dist/index-BYZbDjal.d.ts +0 -11390
  255. package/dist/index-CHB3KuOB.d.mts +0 -11859
  256. package/dist/index-CzWPI6Le.d.ts +0 -11859
  257. package/dist/index-pOIIuwfV.d.mts +0 -13264
  258. package/dist/index-xbWjohNq.d.mts +0 -11390
  259. package/dist/solana-4O4K45VU.mjs +0 -46
  260. package/dist/solana-5EMCTPTS.mjs +0 -46
  261. package/dist/solana-NDABAZ6P.mjs +0 -56
  262. package/dist/solana-Q4NAVBTS.mjs +0 -46
  263. package/dist/solana-ZYO63LY5.mjs +0 -46
@@ -0,0 +1,474 @@
1
+ /**
2
+ * BNB Chain (BSC) Specific Optimizations
3
+ *
4
+ * Extends EVM optimizations with BSC-specific features:
5
+ * - Lower gas costs than Ethereum mainnet
6
+ * - PancakeSwap integration for DEX operations
7
+ * - BEP-20 token handling (18 decimals for USDC/USDT)
8
+ * - Cross-chain considerations (BSC ↔ Ethereum)
9
+ *
10
+ * @module chains/ethereum/bnb-optimizations
11
+ */
12
+
13
+ import {
14
+ BSC_TOKEN_CONTRACTS,
15
+ BSC_TOKEN_DECIMALS,
16
+ PANCAKESWAP_CONTRACTS,
17
+ PANCAKESWAP_TESTNET_CONTRACTS,
18
+ type EthereumNetwork,
19
+ } from './constants'
20
+ import {
21
+ type EVMTransactionComplexity,
22
+ type GasProfile,
23
+ type EVMOptimizationResult,
24
+ EVM_GAS_COSTS,
25
+ } from './optimizations'
26
+
27
+ // ─── Types ────────────────────────────────────────────────────────────────────
28
+
29
+ /**
30
+ * BNB Chain network type
31
+ */
32
+ export type BNBNetwork = 'bsc' | 'bsc-testnet'
33
+
34
+ /**
35
+ * PancakeSwap router version
36
+ */
37
+ export type PancakeSwapVersion = 'v2' | 'v3' | 'smart'
38
+
39
+ /**
40
+ * DEX swap optimization result
41
+ */
42
+ export interface SwapOptimizationResult {
43
+ /** Recommended router address */
44
+ routerAddress: string
45
+ /** Recommended version */
46
+ version: PancakeSwapVersion
47
+ /** Estimated gas limit */
48
+ gasLimit: bigint
49
+ /** Route recommendation */
50
+ routeRecommendation: string
51
+ /** Whether to use multi-hop */
52
+ useMultiHop: boolean
53
+ }
54
+
55
+ /**
56
+ * Cross-chain optimization result
57
+ */
58
+ export interface CrossChainOptimizationResult {
59
+ /** Source chain gas estimate */
60
+ sourceGas: bigint
61
+ /** Bridge recommendation */
62
+ bridgeRecommendation: string
63
+ /** Estimated total time (seconds) */
64
+ estimatedTime: number
65
+ /** Cost comparison */
66
+ costSavings?: string
67
+ }
68
+
69
+ // ─── Constants ────────────────────────────────────────────────────────────────
70
+
71
+ /**
72
+ * BSC-specific gas costs (generally lower than Ethereum)
73
+ */
74
+ export const BSC_GAS_COSTS = {
75
+ /** Base transaction cost (same as EVM) */
76
+ txBase: 21000n,
77
+ /** BEP-20 transfer (similar to ERC-20) */
78
+ bep20Transfer: 65000n,
79
+ /** BEP-20 approve */
80
+ bep20Approve: 46000n,
81
+ /** PancakeSwap V2 swap (single hop) */
82
+ pancakeV2Swap: 150000n,
83
+ /** PancakeSwap V3 swap (single hop) */
84
+ pancakeV3Swap: 200000n,
85
+ /** PancakeSwap multi-hop (per additional hop) */
86
+ additionalHop: 80000n,
87
+ } as const
88
+
89
+ /**
90
+ * BSC baseline gas price (~3-5 gwei)
91
+ */
92
+ export const BSC_BASE_GAS_PRICE = 3_000_000_000n // 3 gwei
93
+
94
+ /**
95
+ * Gas profile multipliers for BSC
96
+ * Lower than Ethereum due to cheaper gas
97
+ */
98
+ const BSC_PROFILE_MULTIPLIERS: Record<GasProfile, number> = {
99
+ economy: 0.9,
100
+ standard: 1.0,
101
+ fast: 1.2,
102
+ instant: 1.5,
103
+ }
104
+
105
+ /**
106
+ * Common swap routes on BSC
107
+ */
108
+ export const COMMON_BSC_ROUTES = {
109
+ /** BNB → USDT (direct) */
110
+ 'BNB-USDT': [BSC_TOKEN_CONTRACTS.WBNB, BSC_TOKEN_CONTRACTS.USDT],
111
+ /** BNB → USDC (direct) */
112
+ 'BNB-USDC': [BSC_TOKEN_CONTRACTS.WBNB, BSC_TOKEN_CONTRACTS.USDC],
113
+ /** USDT → USDC (direct) */
114
+ 'USDT-USDC': [BSC_TOKEN_CONTRACTS.USDT, BSC_TOKEN_CONTRACTS.USDC],
115
+ /** ETH → BNB (via WBNB) */
116
+ 'ETH-BNB': [BSC_TOKEN_CONTRACTS.ETH, BSC_TOKEN_CONTRACTS.WBNB],
117
+ /** BTCB → BNB */
118
+ 'BTCB-BNB': [BSC_TOKEN_CONTRACTS.BTCB, BSC_TOKEN_CONTRACTS.WBNB],
119
+ } as const
120
+
121
+ // ─── BSC-Specific Functions ───────────────────────────────────────────────────
122
+
123
+ /**
124
+ * Check if network is BNB Chain
125
+ */
126
+ export function isBNBNetwork(network: EthereumNetwork): network is BNBNetwork {
127
+ return network === 'bsc' || network === 'bsc-testnet'
128
+ }
129
+
130
+ /**
131
+ * PancakeSwap contract addresses type
132
+ */
133
+ export type PancakeSwapAddresses = {
134
+ SMART_ROUTER: string
135
+ V3_ROUTER: string
136
+ V2_ROUTER: string
137
+ V3_FACTORY: string
138
+ V2_FACTORY: string
139
+ QUOTER_V2: string
140
+ }
141
+
142
+ /**
143
+ * Get PancakeSwap contracts for network
144
+ */
145
+ export function getPancakeSwapContracts(network: BNBNetwork): PancakeSwapAddresses {
146
+ return network === 'bsc' ? PANCAKESWAP_CONTRACTS : PANCAKESWAP_TESTNET_CONTRACTS
147
+ }
148
+
149
+ /**
150
+ * Get optimal router for swap
151
+ *
152
+ * @param tokenIn - Input token address
153
+ * @param tokenOut - Output token address
154
+ * @param amountIn - Input amount
155
+ * @param network - BSC network
156
+ * @returns Swap optimization result
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * const result = getOptimalRouter(
161
+ * BSC_TOKEN_CONTRACTS.WBNB,
162
+ * BSC_TOKEN_CONTRACTS.USDT,
163
+ * 1000000000000000000n, // 1 BNB
164
+ * 'bsc'
165
+ * )
166
+ * console.log(result.routerAddress) // SmartRouter address
167
+ * ```
168
+ */
169
+ export function getOptimalRouter(
170
+ tokenIn: string,
171
+ tokenOut: string,
172
+ amountIn: bigint,
173
+ network: BNBNetwork
174
+ ): SwapOptimizationResult {
175
+ const contracts = getPancakeSwapContracts(network)
176
+
177
+ // For large swaps, use SmartRouter for best routing
178
+ const useSmartRouter = amountIn > 10n ** 18n // > 1 token (assuming 18 decimals)
179
+
180
+ // Check if direct pair exists (simplified check)
181
+ const hasDirectPair = isDirectPairAvailable(tokenIn, tokenOut)
182
+
183
+ let version: PancakeSwapVersion
184
+ let routerAddress: string
185
+ let gasLimit: bigint
186
+ let routeRecommendation: string
187
+
188
+ if (useSmartRouter) {
189
+ version = 'smart'
190
+ routerAddress = contracts.SMART_ROUTER
191
+ gasLimit = BSC_GAS_COSTS.pancakeV3Swap + BSC_GAS_COSTS.additionalHop
192
+ routeRecommendation = 'SmartRouter finds optimal route across V2/V3 pools'
193
+ } else if (hasDirectPair) {
194
+ // For small swaps with direct pair, V2 is often cheaper
195
+ version = 'v2'
196
+ routerAddress = contracts.V2_ROUTER
197
+ gasLimit = BSC_GAS_COSTS.pancakeV2Swap
198
+ routeRecommendation = 'Direct V2 swap (lowest gas)'
199
+ } else {
200
+ // V3 for concentrated liquidity benefits
201
+ version = 'v3'
202
+ routerAddress = contracts.V3_ROUTER
203
+ gasLimit = BSC_GAS_COSTS.pancakeV3Swap
204
+ routeRecommendation = 'V3 for better price impact'
205
+ }
206
+
207
+ return {
208
+ routerAddress,
209
+ version,
210
+ gasLimit,
211
+ routeRecommendation,
212
+ useMultiHop: !hasDirectPair,
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Check if direct swap pair is available (simplified)
218
+ */
219
+ function isDirectPairAvailable(tokenIn: string, tokenOut: string): boolean {
220
+ const directPairs = new Set([
221
+ `${BSC_TOKEN_CONTRACTS.WBNB}-${BSC_TOKEN_CONTRACTS.USDT}`,
222
+ `${BSC_TOKEN_CONTRACTS.USDT}-${BSC_TOKEN_CONTRACTS.WBNB}`,
223
+ `${BSC_TOKEN_CONTRACTS.WBNB}-${BSC_TOKEN_CONTRACTS.USDC}`,
224
+ `${BSC_TOKEN_CONTRACTS.USDC}-${BSC_TOKEN_CONTRACTS.WBNB}`,
225
+ `${BSC_TOKEN_CONTRACTS.USDT}-${BSC_TOKEN_CONTRACTS.USDC}`,
226
+ `${BSC_TOKEN_CONTRACTS.USDC}-${BSC_TOKEN_CONTRACTS.USDT}`,
227
+ `${BSC_TOKEN_CONTRACTS.WBNB}-${BSC_TOKEN_CONTRACTS.CAKE}`,
228
+ `${BSC_TOKEN_CONTRACTS.CAKE}-${BSC_TOKEN_CONTRACTS.WBNB}`,
229
+ ])
230
+
231
+ return directPairs.has(`${tokenIn}-${tokenOut}`)
232
+ }
233
+
234
+ /**
235
+ * Estimate gas for BSC privacy transaction
236
+ *
237
+ * @param options - Transaction options
238
+ * @returns Gas estimate optimized for BSC
239
+ */
240
+ export function estimateBSCPrivacyGas(options: {
241
+ transferCount: number
242
+ includesApproval: boolean
243
+ includesSwap: boolean
244
+ swapVersion?: PancakeSwapVersion
245
+ hopCount?: number
246
+ }): bigint {
247
+ let gas = EVM_GAS_COSTS.txBase
248
+
249
+ // BEP-20 transfers
250
+ gas += BSC_GAS_COSTS.bep20Transfer * BigInt(options.transferCount)
251
+
252
+ // Approval
253
+ if (options.includesApproval) {
254
+ gas += BSC_GAS_COSTS.bep20Approve
255
+ }
256
+
257
+ // Swap
258
+ if (options.includesSwap) {
259
+ const baseSwapGas =
260
+ options.swapVersion === 'v2'
261
+ ? BSC_GAS_COSTS.pancakeV2Swap
262
+ : BSC_GAS_COSTS.pancakeV3Swap
263
+
264
+ const additionalHops = (options.hopCount ?? 1) - 1
265
+ gas += baseSwapGas + BSC_GAS_COSTS.additionalHop * BigInt(additionalHops)
266
+ }
267
+
268
+ return gas
269
+ }
270
+
271
+ /**
272
+ * Optimize BSC transaction
273
+ *
274
+ * @param complexity - Transaction complexity
275
+ * @param profile - Gas profile
276
+ * @param currentGasPrice - Current gas price (optional)
277
+ * @returns Optimization result
278
+ */
279
+ export function optimizeBSCTransaction(
280
+ complexity: EVMTransactionComplexity,
281
+ profile: GasProfile = 'standard',
282
+ currentGasPrice?: bigint
283
+ ): EVMOptimizationResult {
284
+ const multiplier = BSC_PROFILE_MULTIPLIERS[profile]
285
+ const baseGasPrice = currentGasPrice ?? BSC_BASE_GAS_PRICE
286
+
287
+ // BSC has much lower gas prices, so we can afford higher limits
288
+ const gasLimit = (complexity.estimatedGas * 130n) / 100n // 30% buffer
289
+
290
+ const maxPriorityFeePerGas = BigInt(Math.ceil(1_000_000_000 * multiplier)) // 1 gwei base
291
+ const maxFeePerGas = BigInt(Math.ceil(Number(baseGasPrice) * multiplier)) + maxPriorityFeePerGas
292
+
293
+ const strategies: string[] = []
294
+
295
+ // BSC-specific recommendations
296
+ strategies.push('BSC gas is 10-100x cheaper than Ethereum mainnet')
297
+
298
+ if (complexity.multicallRecommended) {
299
+ strategies.push('Use Multicall3 for batch operations')
300
+ }
301
+
302
+ if (complexity.storageWrites > 5) {
303
+ strategies.push('Consider batching writes to reduce per-tx overhead')
304
+ }
305
+
306
+ return {
307
+ gasLimit,
308
+ maxFeePerGas,
309
+ maxPriorityFeePerGas,
310
+ strategies,
311
+ useMulticall: complexity.multicallRecommended,
312
+ useBlobs: false, // BSC doesn't support EIP-4844
313
+ }
314
+ }
315
+
316
+ // ─── Cross-Chain Optimization ─────────────────────────────────────────────────
317
+
318
+ /**
319
+ * Compare cost between BSC and Ethereum for same operation
320
+ *
321
+ * @param complexity - Transaction complexity
322
+ * @param ethGasPrice - Ethereum gas price (wei)
323
+ * @param bscGasPrice - BSC gas price (wei)
324
+ * @returns Cost comparison
325
+ */
326
+ export function compareBSCvsEthereum(
327
+ complexity: EVMTransactionComplexity,
328
+ ethGasPrice: bigint,
329
+ bscGasPrice: bigint = BSC_BASE_GAS_PRICE
330
+ ): {
331
+ ethCostWei: bigint
332
+ bscCostWei: bigint
333
+ savingsPercent: number
334
+ recommendation: string
335
+ } {
336
+ const ethCostWei = complexity.estimatedGas * ethGasPrice
337
+ const bscCostWei = complexity.estimatedGas * bscGasPrice
338
+
339
+ const savingsPercent =
340
+ ethCostWei > 0n
341
+ ? Number((ethCostWei - bscCostWei) * 100n / ethCostWei)
342
+ : 0
343
+
344
+ let recommendation: string
345
+ if (savingsPercent > 90) {
346
+ recommendation = 'BSC significantly cheaper - use BSC if asset liquidity allows'
347
+ } else if (savingsPercent > 50) {
348
+ recommendation = 'BSC cheaper - consider bridging for frequent operations'
349
+ } else {
350
+ recommendation = 'Cost difference minimal - choose based on liquidity/speed'
351
+ }
352
+
353
+ return {
354
+ ethCostWei,
355
+ bscCostWei,
356
+ savingsPercent,
357
+ recommendation,
358
+ }
359
+ }
360
+
361
+ /**
362
+ * Get cross-chain optimization for BSC ↔ Ethereum
363
+ *
364
+ * @param sourceNetwork - Source network
365
+ * @param targetNetwork - Target network
366
+ * @param complexity - Transaction complexity
367
+ * @returns Cross-chain optimization result
368
+ */
369
+ export function getCrossChainOptimization(
370
+ sourceNetwork: EthereumNetwork,
371
+ targetNetwork: EthereumNetwork,
372
+ complexity: EVMTransactionComplexity
373
+ ): CrossChainOptimizationResult {
374
+ const isBscSource = isBNBNetwork(sourceNetwork)
375
+ const isBscTarget = isBNBNetwork(targetNetwork)
376
+
377
+ // Estimate source chain gas
378
+ const sourceGas = complexity.estimatedGas
379
+
380
+ let bridgeRecommendation: string
381
+ let estimatedTime: number
382
+
383
+ if (isBscSource && !isBscTarget) {
384
+ // BSC → Ethereum
385
+ bridgeRecommendation = 'Use Stargate or Celer for BSC→ETH bridging'
386
+ estimatedTime = 600 // ~10 minutes
387
+ } else if (!isBscSource && isBscTarget) {
388
+ // Ethereum → BSC
389
+ bridgeRecommendation = 'Use official Binance Bridge or Stargate'
390
+ estimatedTime = 300 // ~5 minutes
391
+ } else {
392
+ bridgeRecommendation = 'Same-chain transfer - no bridge needed'
393
+ estimatedTime = 15 // ~15 seconds block time
394
+ }
395
+
396
+ return {
397
+ sourceGas,
398
+ bridgeRecommendation,
399
+ estimatedTime,
400
+ }
401
+ }
402
+
403
+ // ─── BEP-20 Utilities ─────────────────────────────────────────────────────────
404
+
405
+ /**
406
+ * Get BEP-20 token decimals
407
+ *
408
+ * Note: BSC USDC/USDT use 18 decimals (not 6 like Ethereum)
409
+ */
410
+ export function getBEP20Decimals(symbol: string): number {
411
+ return BSC_TOKEN_DECIMALS[symbol] ?? 18
412
+ }
413
+
414
+ /**
415
+ * Get BEP-20 token address
416
+ */
417
+ export function getBEP20Address(symbol: string): string | undefined {
418
+ return BSC_TOKEN_CONTRACTS[symbol as keyof typeof BSC_TOKEN_CONTRACTS]
419
+ }
420
+
421
+ /**
422
+ * Convert amount between BSC and Ethereum decimals
423
+ *
424
+ * @param amount - Amount in source decimals
425
+ * @param symbol - Token symbol
426
+ * @param direction - Conversion direction
427
+ * @returns Converted amount
428
+ *
429
+ * @example
430
+ * ```typescript
431
+ * // 1 USDC on Ethereum (6 decimals) = 1e6
432
+ * // 1 USDC on BSC (18 decimals) = 1e18
433
+ * const bscAmount = convertDecimals(1_000_000n, 'USDC', 'eth-to-bsc')
434
+ * // Returns 1_000_000_000_000_000_000n
435
+ * ```
436
+ */
437
+ export function convertDecimals(
438
+ amount: bigint,
439
+ symbol: string,
440
+ direction: 'eth-to-bsc' | 'bsc-to-eth'
441
+ ): bigint {
442
+ // Known decimal differences
443
+ const decimalDiff: Record<string, number> = {
444
+ USDC: 12, // 18 - 6
445
+ USDT: 12, // 18 - 6
446
+ }
447
+
448
+ const diff = decimalDiff[symbol]
449
+ if (!diff) return amount // Same decimals
450
+
451
+ if (direction === 'eth-to-bsc') {
452
+ return amount * 10n ** BigInt(diff)
453
+ } else {
454
+ return amount / 10n ** BigInt(diff)
455
+ }
456
+ }
457
+
458
+ // ─── Utility Functions ────────────────────────────────────────────────────────
459
+
460
+ /**
461
+ * Format BNB amount for display
462
+ */
463
+ export function formatBNB(wei: bigint, decimals: number = 4): string {
464
+ const bnb = Number(wei) / 1e18
465
+ return `${bnb.toFixed(decimals)} BNB`
466
+ }
467
+
468
+ /**
469
+ * Convert wei to gwei string for BSC
470
+ */
471
+ export function weiToGwei(wei: bigint): string {
472
+ const gwei = Number(wei) / 1e9
473
+ return `${gwei.toFixed(2)} Gwei`
474
+ }