@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.
- 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 +47556 -19603
- package/dist/browser.mjs +628 -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-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
- 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-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
- package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48396 -19623
- package/dist/index.mjs +537 -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 +44 -11
- 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 +252 -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 +47 -6
- 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 +186 -33
- package/src/chains/solana/providers/index.ts +31 -0
- package/src/chains/solana/providers/interface.ts +61 -18
- 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 +338 -67
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +83 -66
- 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 +57 -6
- 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 +23 -0
- package/src/compliance/range-sas.ts +398 -33
- 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 +686 -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 +254 -4
- package/src/privacy-backends/interface.ts +649 -6
- 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.ts +13 -17
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +414 -2
- package/src/privacy-backends/router.ts +283 -3
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +3 -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 +110 -29
- 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/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-2XIVXWHA.mjs +0 -1930
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-7RFRWDCW.mjs +0 -1504
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-F6F73W35.mjs +0 -16166
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-OFDBEIEK.mjs +0 -16166
- package/dist/chunk-SF7YSLF5.mjs +0 -1515
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/chunk-WWUSGOXE.mjs +0 -17129
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-B71aXVzk.d.ts +0 -13264
- 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-pOIIuwfV.d.mts +0 -13264
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-4O4K45VU.mjs +0 -46
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-NDABAZ6P.mjs +0 -56
- package/dist/solana-Q4NAVBTS.mjs +0 -46
- package/dist/solana-ZYO63LY5.mjs +0 -46
package/src/evm/index.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EVM-specific modules for SIP Protocol
|
|
3
|
+
*
|
|
4
|
+
* Provides EVM chain support including:
|
|
5
|
+
* - ERC-4337 Account Abstraction for gas-sponsored privacy transactions
|
|
6
|
+
* - Gelato Relay integration (via ERC-4337)
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createPimlicoRelayer } from '@sip-protocol/sdk/evm'
|
|
11
|
+
*
|
|
12
|
+
* const relayer = createPimlicoRelayer({
|
|
13
|
+
* apiKey: process.env.PIMLICO_API_KEY!,
|
|
14
|
+
* chain: 'base',
|
|
15
|
+
* })
|
|
16
|
+
*
|
|
17
|
+
* // Relay a shielded transfer with sponsored gas
|
|
18
|
+
* const result = await relayer.relayTransaction({
|
|
19
|
+
* to: stealthAddress,
|
|
20
|
+
* data: transferCalldata,
|
|
21
|
+
* signer,
|
|
22
|
+
* })
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @packageDocumentation
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
// Main class
|
|
30
|
+
ERC4337Relayer,
|
|
31
|
+
ERC4337RelayerError,
|
|
32
|
+
ERC4337RelayerErrorCode,
|
|
33
|
+
// Factory functions
|
|
34
|
+
createPimlicoRelayer,
|
|
35
|
+
createStackupRelayer,
|
|
36
|
+
createBiconomyRelayer,
|
|
37
|
+
// Types
|
|
38
|
+
type ERC4337RelayerConfig,
|
|
39
|
+
type UserOperation,
|
|
40
|
+
type RelayTransactionRequest,
|
|
41
|
+
type RelayTransactionResult,
|
|
42
|
+
type SupportedEVMChain,
|
|
43
|
+
// Constants
|
|
44
|
+
EVM_CHAIN_IDS,
|
|
45
|
+
ENTRY_POINT_V07,
|
|
46
|
+
BUNDLER_ENDPOINTS,
|
|
47
|
+
} from './erc4337-relayer'
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fee Calculator for SIP Protocol
|
|
3
|
+
*
|
|
4
|
+
* Calculates protocol fees based on volume, tier, and configuration.
|
|
5
|
+
*
|
|
6
|
+
* @module fees/calculator
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { ChainId } from '@sip-protocol/types'
|
|
10
|
+
import type {
|
|
11
|
+
ChainFeeConfig,
|
|
12
|
+
FeeCalculationInput,
|
|
13
|
+
FeeCalculationResult,
|
|
14
|
+
FeeBreakdown,
|
|
15
|
+
FeeTier,
|
|
16
|
+
FeeWaiver,
|
|
17
|
+
} from './types'
|
|
18
|
+
|
|
19
|
+
// ─── Default Configuration ───────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Default fee tiers (volume-based discounts)
|
|
23
|
+
*/
|
|
24
|
+
export const DEFAULT_FEE_TIERS: FeeTier[] = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Standard',
|
|
27
|
+
minVolume: 0,
|
|
28
|
+
maxVolume: 1000,
|
|
29
|
+
basisPoints: 10, // 0.10%
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'Silver',
|
|
33
|
+
minVolume: 1000,
|
|
34
|
+
maxVolume: 10000,
|
|
35
|
+
basisPoints: 8, // 0.08%
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Gold',
|
|
39
|
+
minVolume: 10000,
|
|
40
|
+
maxVolume: 100000,
|
|
41
|
+
basisPoints: 5, // 0.05%
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'Platinum',
|
|
45
|
+
minVolume: 100000,
|
|
46
|
+
maxVolume: Infinity,
|
|
47
|
+
basisPoints: 3, // 0.03%
|
|
48
|
+
},
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Default chain fee configurations
|
|
53
|
+
*/
|
|
54
|
+
export const DEFAULT_CHAIN_FEES: Record<string, ChainFeeConfig> = {
|
|
55
|
+
near: {
|
|
56
|
+
chain: 'near',
|
|
57
|
+
model: 'tiered',
|
|
58
|
+
baseBps: 10, // 0.10% base
|
|
59
|
+
tiers: DEFAULT_FEE_TIERS,
|
|
60
|
+
minFeeUsd: 0.01, // $0.01 minimum
|
|
61
|
+
maxFeeUsd: 100, // $100 cap
|
|
62
|
+
viewingKeyDiscountBps: 5, // 50% discount with viewing key
|
|
63
|
+
},
|
|
64
|
+
ethereum: {
|
|
65
|
+
chain: 'ethereum',
|
|
66
|
+
model: 'tiered',
|
|
67
|
+
baseBps: 10,
|
|
68
|
+
tiers: DEFAULT_FEE_TIERS,
|
|
69
|
+
minFeeUsd: 0.10, // Higher minimum for Ethereum
|
|
70
|
+
maxFeeUsd: 100,
|
|
71
|
+
viewingKeyDiscountBps: 5,
|
|
72
|
+
},
|
|
73
|
+
solana: {
|
|
74
|
+
chain: 'solana',
|
|
75
|
+
model: 'tiered',
|
|
76
|
+
baseBps: 10,
|
|
77
|
+
tiers: DEFAULT_FEE_TIERS,
|
|
78
|
+
minFeeUsd: 0.01,
|
|
79
|
+
maxFeeUsd: 100,
|
|
80
|
+
viewingKeyDiscountBps: 5,
|
|
81
|
+
},
|
|
82
|
+
arbitrum: {
|
|
83
|
+
chain: 'arbitrum',
|
|
84
|
+
model: 'tiered',
|
|
85
|
+
baseBps: 10,
|
|
86
|
+
tiers: DEFAULT_FEE_TIERS,
|
|
87
|
+
minFeeUsd: 0.01,
|
|
88
|
+
maxFeeUsd: 100,
|
|
89
|
+
viewingKeyDiscountBps: 5,
|
|
90
|
+
},
|
|
91
|
+
bsc: {
|
|
92
|
+
chain: 'bsc',
|
|
93
|
+
model: 'tiered',
|
|
94
|
+
baseBps: 10,
|
|
95
|
+
tiers: DEFAULT_FEE_TIERS,
|
|
96
|
+
minFeeUsd: 0.01,
|
|
97
|
+
maxFeeUsd: 100,
|
|
98
|
+
viewingKeyDiscountBps: 5,
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ─── Fee Calculator ──────────────────────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Fee calculator options
|
|
106
|
+
*/
|
|
107
|
+
export interface FeeCalculatorOptions {
|
|
108
|
+
/** Custom chain configurations */
|
|
109
|
+
chainConfigs?: Record<string, ChainFeeConfig>
|
|
110
|
+
/** Active waivers */
|
|
111
|
+
waivers?: FeeWaiver[]
|
|
112
|
+
/** Override minimum fee (USD) */
|
|
113
|
+
minFeeUsd?: number
|
|
114
|
+
/** Override maximum fee (USD) */
|
|
115
|
+
maxFeeUsd?: number
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Fee Calculator
|
|
120
|
+
*
|
|
121
|
+
* Calculates protocol fees based on transaction parameters.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* const calculator = new FeeCalculator()
|
|
126
|
+
*
|
|
127
|
+
* const result = calculator.calculate({
|
|
128
|
+
* amount: 1000000000n, // 1 token
|
|
129
|
+
* amountUsd: 100, // $100
|
|
130
|
+
* sourceChain: 'near',
|
|
131
|
+
* destinationChain: 'ethereum',
|
|
132
|
+
* viewingKeyDisclosed: true,
|
|
133
|
+
* })
|
|
134
|
+
*
|
|
135
|
+
* console.log(`Fee: ${result.protocolFeeUsd} USD (${result.appliedBps} bps)`)
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export class FeeCalculator {
|
|
139
|
+
private readonly chainConfigs: Record<string, ChainFeeConfig>
|
|
140
|
+
private readonly waivers: FeeWaiver[]
|
|
141
|
+
private readonly minFeeUsd: number
|
|
142
|
+
private readonly maxFeeUsd: number
|
|
143
|
+
|
|
144
|
+
constructor(options: FeeCalculatorOptions = {}) {
|
|
145
|
+
this.chainConfigs = {
|
|
146
|
+
...DEFAULT_CHAIN_FEES,
|
|
147
|
+
...options.chainConfigs,
|
|
148
|
+
}
|
|
149
|
+
this.waivers = options.waivers ?? []
|
|
150
|
+
this.minFeeUsd = options.minFeeUsd ?? 0.01
|
|
151
|
+
this.maxFeeUsd = options.maxFeeUsd ?? 100
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Calculate fee for a transaction
|
|
156
|
+
*/
|
|
157
|
+
calculate(input: FeeCalculationInput): FeeCalculationResult {
|
|
158
|
+
// Get config for source chain (fees collected on source)
|
|
159
|
+
const config = this.getChainConfig(input.sourceChain)
|
|
160
|
+
|
|
161
|
+
// Determine base fee rate
|
|
162
|
+
let baseBps = config.baseBps
|
|
163
|
+
let tierName: string | undefined
|
|
164
|
+
|
|
165
|
+
// Apply tiered pricing if available
|
|
166
|
+
if (config.model === 'tiered' && config.tiers) {
|
|
167
|
+
const tier = this.getTierForVolume(config.tiers, input.amountUsd)
|
|
168
|
+
baseBps = tier.basisPoints
|
|
169
|
+
tierName = tier.name
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Apply custom override if provided
|
|
173
|
+
if (input.customBps !== undefined) {
|
|
174
|
+
baseBps = input.customBps
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Calculate discount
|
|
178
|
+
let discountBps = 0
|
|
179
|
+
|
|
180
|
+
// Viewing key discount
|
|
181
|
+
if (input.viewingKeyDisclosed) {
|
|
182
|
+
discountBps += config.viewingKeyDiscountBps
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Apply waivers
|
|
186
|
+
for (const waiver of this.waivers) {
|
|
187
|
+
if (this.isWaiverValid(waiver)) {
|
|
188
|
+
discountBps += waiver.discountBps
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Cap discount at base rate (can't go negative)
|
|
193
|
+
discountBps = Math.min(discountBps, baseBps)
|
|
194
|
+
|
|
195
|
+
// Final rate
|
|
196
|
+
const appliedBps = baseBps - discountBps
|
|
197
|
+
|
|
198
|
+
// Calculate fee amount
|
|
199
|
+
const originalFee = this.calculateFeeAmount(input.amount, baseBps)
|
|
200
|
+
const protocolFee = this.calculateFeeAmount(input.amount, appliedBps)
|
|
201
|
+
|
|
202
|
+
// Calculate USD values
|
|
203
|
+
const feeRatio = Number(protocolFee) / Number(input.amount)
|
|
204
|
+
let protocolFeeUsd = input.amountUsd * feeRatio
|
|
205
|
+
|
|
206
|
+
// Apply min/max caps
|
|
207
|
+
const minFee = Math.max(config.minFeeUsd, this.minFeeUsd)
|
|
208
|
+
const maxFee = Math.min(config.maxFeeUsd, this.maxFeeUsd)
|
|
209
|
+
|
|
210
|
+
if (protocolFeeUsd < minFee) {
|
|
211
|
+
protocolFeeUsd = minFee
|
|
212
|
+
} else if (protocolFeeUsd > maxFee) {
|
|
213
|
+
protocolFeeUsd = maxFee
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Build breakdown
|
|
217
|
+
const breakdown = this.buildBreakdown(protocolFee, input)
|
|
218
|
+
|
|
219
|
+
return {
|
|
220
|
+
protocolFee,
|
|
221
|
+
protocolFeeUsd,
|
|
222
|
+
appliedBps,
|
|
223
|
+
tierName,
|
|
224
|
+
discountBps,
|
|
225
|
+
originalFee,
|
|
226
|
+
breakdown,
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Get estimated fee for display (quick calculation)
|
|
232
|
+
*/
|
|
233
|
+
estimateFee(amountUsd: number, chain: ChainId): number {
|
|
234
|
+
const config = this.getChainConfig(chain)
|
|
235
|
+
let bps = config.baseBps
|
|
236
|
+
|
|
237
|
+
if (config.model === 'tiered' && config.tiers) {
|
|
238
|
+
bps = this.getTierForVolume(config.tiers, amountUsd).basisPoints
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const fee = amountUsd * (bps / 10000)
|
|
242
|
+
return Math.max(fee, config.minFeeUsd)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Get fee tier for a volume
|
|
247
|
+
*/
|
|
248
|
+
getTierForVolume(tiers: FeeTier[], volumeUsd: number): FeeTier {
|
|
249
|
+
for (const tier of tiers) {
|
|
250
|
+
if (volumeUsd >= tier.minVolume && volumeUsd < tier.maxVolume) {
|
|
251
|
+
return tier
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Default to first tier
|
|
255
|
+
return tiers[0]
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Get chain configuration
|
|
260
|
+
*/
|
|
261
|
+
getChainConfig(chain: ChainId): ChainFeeConfig {
|
|
262
|
+
const config = this.chainConfigs[chain]
|
|
263
|
+
if (config) {
|
|
264
|
+
return config
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Return default config for unknown chains
|
|
268
|
+
return {
|
|
269
|
+
chain,
|
|
270
|
+
model: 'percentage',
|
|
271
|
+
baseBps: 10,
|
|
272
|
+
minFeeUsd: 0.01,
|
|
273
|
+
maxFeeUsd: 100,
|
|
274
|
+
viewingKeyDiscountBps: 5,
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Update chain configuration
|
|
280
|
+
*/
|
|
281
|
+
updateChainConfig(chain: ChainId, config: Partial<ChainFeeConfig>): void {
|
|
282
|
+
const existing = this.chainConfigs[chain] ?? this.getChainConfig(chain)
|
|
283
|
+
this.chainConfigs[chain] = { ...existing, ...config }
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Add a waiver
|
|
288
|
+
*/
|
|
289
|
+
addWaiver(waiver: FeeWaiver): void {
|
|
290
|
+
this.waivers.push(waiver)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Remove a waiver by type
|
|
295
|
+
*/
|
|
296
|
+
removeWaiver(type: FeeWaiver['type']): void {
|
|
297
|
+
const index = this.waivers.findIndex((w) => w.type === type)
|
|
298
|
+
if (index >= 0) {
|
|
299
|
+
this.waivers.splice(index, 1)
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ─── Private Methods ─────────────────────────────────────────────────────────
|
|
304
|
+
|
|
305
|
+
private calculateFeeAmount(amount: bigint, bps: number): bigint {
|
|
306
|
+
// fee = amount * bps / 10000
|
|
307
|
+
return (amount * BigInt(bps)) / 10000n
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
private isWaiverValid(waiver: FeeWaiver): boolean {
|
|
311
|
+
// Check expiry
|
|
312
|
+
if (waiver.expiresAt && waiver.expiresAt < Date.now()) {
|
|
313
|
+
return false
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Check max uses
|
|
317
|
+
if (waiver.maxUses && waiver.currentUses >= waiver.maxUses) {
|
|
318
|
+
return false
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return true
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private buildBreakdown(
|
|
325
|
+
protocolFee: bigint,
|
|
326
|
+
_input: FeeCalculationInput
|
|
327
|
+
): FeeBreakdown {
|
|
328
|
+
// Network fee is estimated separately (not calculated here)
|
|
329
|
+
const networkFee = 0n
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
baseFee: protocolFee,
|
|
333
|
+
networkFee,
|
|
334
|
+
totalFee: protocolFee + networkFee,
|
|
335
|
+
components: [
|
|
336
|
+
{
|
|
337
|
+
name: 'Protocol Fee',
|
|
338
|
+
amount: protocolFee,
|
|
339
|
+
description: 'SIP Protocol privacy service fee',
|
|
340
|
+
},
|
|
341
|
+
],
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ─── Utility Functions ───────────────────────────────────────────────────────
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Create a fee calculator with default configuration
|
|
350
|
+
*/
|
|
351
|
+
export function createFeeCalculator(
|
|
352
|
+
options?: FeeCalculatorOptions
|
|
353
|
+
): FeeCalculator {
|
|
354
|
+
return new FeeCalculator(options)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Quick fee estimate (stateless)
|
|
359
|
+
*/
|
|
360
|
+
export function estimateFee(
|
|
361
|
+
amountUsd: number,
|
|
362
|
+
chain: ChainId,
|
|
363
|
+
viewingKeyDisclosed = false
|
|
364
|
+
): number {
|
|
365
|
+
const calculator = new FeeCalculator()
|
|
366
|
+
const result = calculator.calculate({
|
|
367
|
+
amount: BigInt(Math.floor(amountUsd * 1e6)), // Assume 6 decimals
|
|
368
|
+
amountUsd,
|
|
369
|
+
sourceChain: chain,
|
|
370
|
+
destinationChain: chain,
|
|
371
|
+
viewingKeyDisclosed,
|
|
372
|
+
})
|
|
373
|
+
return result.protocolFeeUsd
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Format fee for display
|
|
378
|
+
*/
|
|
379
|
+
export function formatFee(feeUsd: number, bps: number): string {
|
|
380
|
+
const percent = (bps / 100).toFixed(2)
|
|
381
|
+
return `$${feeUsd.toFixed(2)} (${percent}%)`
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Format basis points as percentage
|
|
386
|
+
*/
|
|
387
|
+
export function bpsToPercent(bps: number): string {
|
|
388
|
+
return `${(bps / 100).toFixed(2)}%`
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Convert percentage to basis points
|
|
393
|
+
*/
|
|
394
|
+
export function percentToBps(percent: number): number {
|
|
395
|
+
return Math.round(percent * 100)
|
|
396
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fee Module for SIP Protocol
|
|
3
|
+
*
|
|
4
|
+
* Provides fee calculation, collection, and treasury management
|
|
5
|
+
* for protocol revenue.
|
|
6
|
+
*
|
|
7
|
+
* @module fees
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import {
|
|
12
|
+
* FeeCalculator,
|
|
13
|
+
* NEARFeeContract,
|
|
14
|
+
* estimateFee,
|
|
15
|
+
* } from '@sip-protocol/sdk/fees'
|
|
16
|
+
*
|
|
17
|
+
* // Quick fee estimate
|
|
18
|
+
* const feeUsd = estimateFee(100, 'near') // $100 swap on NEAR
|
|
19
|
+
*
|
|
20
|
+
* // Full calculation
|
|
21
|
+
* const calculator = new FeeCalculator()
|
|
22
|
+
* const result = calculator.calculate({
|
|
23
|
+
* amount: 1000000000000000000000000n,
|
|
24
|
+
* amountUsd: 5.00,
|
|
25
|
+
* sourceChain: 'near',
|
|
26
|
+
* destinationChain: 'ethereum',
|
|
27
|
+
* viewingKeyDisclosed: true,
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* // With NEAR contract
|
|
31
|
+
* const feeContract = new NEARFeeContract({ network: 'mainnet' })
|
|
32
|
+
* const fee = await feeContract.calculateFee({
|
|
33
|
+
* amount: swapAmount,
|
|
34
|
+
* amountUsd: 100,
|
|
35
|
+
* sourceChain: 'near',
|
|
36
|
+
* destinationChain: 'solana',
|
|
37
|
+
* })
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
export type {
|
|
44
|
+
FeeModel,
|
|
45
|
+
FeeTier,
|
|
46
|
+
ChainFeeConfig,
|
|
47
|
+
FeeCalculationInput,
|
|
48
|
+
FeeCalculationResult,
|
|
49
|
+
FeeBreakdown,
|
|
50
|
+
TreasuryConfig,
|
|
51
|
+
FeeCollectionEvent,
|
|
52
|
+
FeeStats,
|
|
53
|
+
FeeContractState,
|
|
54
|
+
FeeContractMethods,
|
|
55
|
+
FeeWaiverType,
|
|
56
|
+
FeeWaiver,
|
|
57
|
+
FeeGovernanceProposal,
|
|
58
|
+
} from './types'
|
|
59
|
+
|
|
60
|
+
// ─── Calculator ──────────────────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
FeeCalculator,
|
|
64
|
+
createFeeCalculator,
|
|
65
|
+
estimateFee,
|
|
66
|
+
formatFee,
|
|
67
|
+
bpsToPercent,
|
|
68
|
+
percentToBps,
|
|
69
|
+
DEFAULT_FEE_TIERS,
|
|
70
|
+
DEFAULT_CHAIN_FEES,
|
|
71
|
+
type FeeCalculatorOptions,
|
|
72
|
+
} from './calculator'
|
|
73
|
+
|
|
74
|
+
// ─── NEAR Contract ───────────────────────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
export {
|
|
77
|
+
NEARFeeContract,
|
|
78
|
+
createNEARFeeContract,
|
|
79
|
+
createMainnetFeeContract,
|
|
80
|
+
createTestnetFeeContract,
|
|
81
|
+
calculateFeeForSwap,
|
|
82
|
+
NEAR_FEE_CONTRACTS,
|
|
83
|
+
DEFAULT_TREASURY,
|
|
84
|
+
type NEARFeeContractOptions,
|
|
85
|
+
type FeeCollectionParams,
|
|
86
|
+
type FeeCollectionResult,
|
|
87
|
+
} from './near-contract'
|