@sip-protocol/sdk 0.7.2 → 0.7.4
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/LICENSE +21 -0
- package/README.md +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +48874 -18336
- package/dist/browser.mjs +674 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/chunk-YWGJ77A2.mjs +33806 -0
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/index-DXh2IGkz.d.ts +24681 -0
- package/dist/index-DeE1ZzA4.d.mts +24681 -0
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48676 -17318
- package/dist/index.mjs +583 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +54 -21
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +276 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +201 -0
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +402 -0
- package/src/chains/solana/providers/index.ts +85 -0
- package/src/chains/solana/providers/interface.ts +221 -0
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +790 -0
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +170 -73
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +77 -7
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +37 -0
- package/src/compliance/range-sas.ts +956 -0
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +785 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +336 -0
- package/src/privacy-backends/interface.ts +906 -0
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash-types.ts +278 -0
- package/src/privacy-backends/privacycash.ts +456 -0
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +690 -0
- package/src/privacy-backends/router.ts +626 -0
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +256 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +111 -30
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- package/src/surveillance/algorithms/address-reuse.ts +143 -0
- package/src/surveillance/algorithms/cluster.ts +247 -0
- package/src/surveillance/algorithms/exchange.ts +295 -0
- package/src/surveillance/algorithms/temporal.ts +337 -0
- package/src/surveillance/analyzer.ts +442 -0
- package/src/surveillance/index.ts +64 -0
- package/src/surveillance/scoring.ts +372 -0
- package/src/surveillance/types.ts +264 -0
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-Q4NAVBTS.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
|
+
}
|