@sip-protocol/sdk 0.7.3 → 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.
Files changed (264) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +267 -0
  3. package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
  4. package/dist/browser.d.mts +10 -4
  5. package/dist/browser.d.ts +10 -4
  6. package/dist/browser.js +47556 -19603
  7. package/dist/browser.mjs +628 -48
  8. package/dist/chunk-4GRJ5MAW.mjs +152 -0
  9. package/dist/chunk-5D7A3L3W.mjs +717 -0
  10. package/dist/chunk-64AYA5F5.mjs +7834 -0
  11. package/dist/chunk-GMDGB22A.mjs +379 -0
  12. package/dist/chunk-I534WKN7.mjs +328 -0
  13. package/dist/chunk-IBZVA5Y7.mjs +1003 -0
  14. package/dist/chunk-PRRZAWJE.mjs +223 -0
  15. package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
  16. package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
  17. package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
  18. package/dist/constants-LHAAUC2T.mjs +51 -0
  19. package/dist/dist-2OGQ7FED.mjs +3957 -0
  20. package/dist/dist-IFHPYLDX.mjs +254 -0
  21. package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
  22. package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
  23. package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
  24. package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
  25. package/dist/index.d.mts +9 -3
  26. package/dist/index.d.ts +9 -3
  27. package/dist/index.js +48396 -19623
  28. package/dist/index.mjs +537 -19
  29. package/dist/interface-Bf7w1PLW.d.mts +679 -0
  30. package/dist/interface-Bf7w1PLW.d.ts +679 -0
  31. package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
  32. package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
  33. package/dist/proofs/halo2.d.mts +151 -0
  34. package/dist/proofs/halo2.d.ts +151 -0
  35. package/dist/proofs/halo2.js +350 -0
  36. package/dist/proofs/halo2.mjs +11 -0
  37. package/dist/proofs/kimchi.d.mts +160 -0
  38. package/dist/proofs/kimchi.d.ts +160 -0
  39. package/dist/proofs/kimchi.js +431 -0
  40. package/dist/proofs/kimchi.mjs +13 -0
  41. package/dist/proofs/noir.d.mts +1 -1
  42. package/dist/proofs/noir.d.ts +1 -1
  43. package/dist/proofs/noir.js +74 -18
  44. package/dist/proofs/noir.mjs +84 -24
  45. package/dist/solana-U3MEGU7W.mjs +280 -0
  46. package/dist/validity_proof-3POXLPNY.mjs +21 -0
  47. package/package.json +54 -21
  48. package/src/adapters/index.ts +41 -0
  49. package/src/adapters/jupiter.ts +571 -0
  50. package/src/adapters/near-intents.ts +135 -0
  51. package/src/advisor/advisor.ts +653 -0
  52. package/src/advisor/index.ts +54 -0
  53. package/src/advisor/tools.ts +303 -0
  54. package/src/advisor/types.ts +164 -0
  55. package/src/chains/ethereum/announcement.ts +536 -0
  56. package/src/chains/ethereum/bnb-optimizations.ts +474 -0
  57. package/src/chains/ethereum/commitment.ts +522 -0
  58. package/src/chains/ethereum/constants.ts +462 -0
  59. package/src/chains/ethereum/deployment.ts +596 -0
  60. package/src/chains/ethereum/gas-estimation.ts +538 -0
  61. package/src/chains/ethereum/index.ts +268 -0
  62. package/src/chains/ethereum/optimizations.ts +614 -0
  63. package/src/chains/ethereum/privacy-adapter.ts +855 -0
  64. package/src/chains/ethereum/registry.ts +584 -0
  65. package/src/chains/ethereum/rpc.ts +905 -0
  66. package/src/chains/ethereum/stealth.ts +491 -0
  67. package/src/chains/ethereum/token.ts +790 -0
  68. package/src/chains/ethereum/transfer.ts +637 -0
  69. package/src/chains/ethereum/types.ts +456 -0
  70. package/src/chains/ethereum/viewing-key.ts +455 -0
  71. package/src/chains/near/commitment.ts +608 -0
  72. package/src/chains/near/constants.ts +284 -0
  73. package/src/chains/near/function-call.ts +871 -0
  74. package/src/chains/near/history.ts +654 -0
  75. package/src/chains/near/implicit-account.ts +840 -0
  76. package/src/chains/near/index.ts +393 -0
  77. package/src/chains/near/native-transfer.ts +658 -0
  78. package/src/chains/near/nep141.ts +775 -0
  79. package/src/chains/near/privacy-adapter.ts +889 -0
  80. package/src/chains/near/resolver.ts +971 -0
  81. package/src/chains/near/rpc.ts +1016 -0
  82. package/src/chains/near/stealth.ts +419 -0
  83. package/src/chains/near/types.ts +317 -0
  84. package/src/chains/near/viewing-key.ts +876 -0
  85. package/src/chains/solana/anchor-transfer.ts +386 -0
  86. package/src/chains/solana/commitment.ts +577 -0
  87. package/src/chains/solana/constants.ts +126 -12
  88. package/src/chains/solana/ephemeral-keys.ts +543 -0
  89. package/src/chains/solana/index.ts +252 -1
  90. package/src/chains/solana/key-derivation.ts +418 -0
  91. package/src/chains/solana/kit-compat.ts +334 -0
  92. package/src/chains/solana/optimizations.ts +560 -0
  93. package/src/chains/solana/privacy-adapter.ts +605 -0
  94. package/src/chains/solana/providers/generic.ts +47 -6
  95. package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
  96. package/src/chains/solana/providers/helius-enhanced.ts +623 -0
  97. package/src/chains/solana/providers/helius.ts +186 -33
  98. package/src/chains/solana/providers/index.ts +31 -0
  99. package/src/chains/solana/providers/interface.ts +61 -18
  100. package/src/chains/solana/providers/quicknode.ts +409 -0
  101. package/src/chains/solana/providers/triton.ts +426 -0
  102. package/src/chains/solana/providers/webhook.ts +338 -67
  103. package/src/chains/solana/rpc-client.ts +1150 -0
  104. package/src/chains/solana/scan.ts +83 -66
  105. package/src/chains/solana/sol-transfer.ts +732 -0
  106. package/src/chains/solana/spl-transfer.ts +886 -0
  107. package/src/chains/solana/stealth-scanner.ts +703 -0
  108. package/src/chains/solana/sunspot-verifier.ts +453 -0
  109. package/src/chains/solana/transaction-builder.ts +755 -0
  110. package/src/chains/solana/transfer.ts +74 -5
  111. package/src/chains/solana/types.ts +57 -6
  112. package/src/chains/solana/utils.ts +110 -0
  113. package/src/chains/solana/viewing-key.ts +807 -0
  114. package/src/compliance/fireblocks.ts +921 -0
  115. package/src/compliance/index.ts +23 -0
  116. package/src/compliance/range-sas.ts +398 -33
  117. package/src/config/endpoints.ts +100 -0
  118. package/src/crypto.ts +11 -8
  119. package/src/errors.ts +82 -0
  120. package/src/evm/erc4337-relayer.ts +830 -0
  121. package/src/evm/index.ts +47 -0
  122. package/src/fees/calculator.ts +396 -0
  123. package/src/fees/index.ts +87 -0
  124. package/src/fees/near-contract.ts +429 -0
  125. package/src/fees/types.ts +268 -0
  126. package/src/index.ts +686 -1
  127. package/src/intent.ts +6 -3
  128. package/src/logger.ts +324 -0
  129. package/src/network/index.ts +80 -0
  130. package/src/network/proxy.ts +691 -0
  131. package/src/optimizations/index.ts +541 -0
  132. package/src/oracle/types.ts +1 -0
  133. package/src/privacy-backends/arcium-types.ts +727 -0
  134. package/src/privacy-backends/arcium.ts +719 -0
  135. package/src/privacy-backends/combined-privacy.ts +866 -0
  136. package/src/privacy-backends/cspl-token.ts +595 -0
  137. package/src/privacy-backends/cspl-types.ts +512 -0
  138. package/src/privacy-backends/cspl.ts +907 -0
  139. package/src/privacy-backends/health.ts +488 -0
  140. package/src/privacy-backends/inco-types.ts +323 -0
  141. package/src/privacy-backends/inco.ts +616 -0
  142. package/src/privacy-backends/index.ts +254 -4
  143. package/src/privacy-backends/interface.ts +649 -6
  144. package/src/privacy-backends/lru-cache.ts +343 -0
  145. package/src/privacy-backends/magicblock.ts +458 -0
  146. package/src/privacy-backends/mock.ts +258 -0
  147. package/src/privacy-backends/privacycash.ts +13 -17
  148. package/src/privacy-backends/private-swap.ts +570 -0
  149. package/src/privacy-backends/rate-limiter.ts +683 -0
  150. package/src/privacy-backends/registry.ts +414 -2
  151. package/src/privacy-backends/router.ts +283 -3
  152. package/src/privacy-backends/shadowwire.ts +449 -0
  153. package/src/privacy-backends/sip-native.ts +3 -0
  154. package/src/privacy-logger.ts +191 -0
  155. package/src/production-safety.ts +373 -0
  156. package/src/proofs/aggregator.ts +1029 -0
  157. package/src/proofs/browser-composer.ts +1150 -0
  158. package/src/proofs/browser.ts +113 -25
  159. package/src/proofs/cache/index.ts +127 -0
  160. package/src/proofs/cache/interface.ts +545 -0
  161. package/src/proofs/cache/key-generator.ts +188 -0
  162. package/src/proofs/cache/lru-cache.ts +481 -0
  163. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  164. package/src/proofs/cache/persistent-cache.ts +788 -0
  165. package/src/proofs/compliance-proof.ts +872 -0
  166. package/src/proofs/composer/base.ts +923 -0
  167. package/src/proofs/composer/index.ts +25 -0
  168. package/src/proofs/composer/interface.ts +518 -0
  169. package/src/proofs/composer/types.ts +383 -0
  170. package/src/proofs/converters/halo2.ts +452 -0
  171. package/src/proofs/converters/index.ts +208 -0
  172. package/src/proofs/converters/interface.ts +363 -0
  173. package/src/proofs/converters/kimchi.ts +462 -0
  174. package/src/proofs/converters/noir.ts +451 -0
  175. package/src/proofs/fallback.ts +888 -0
  176. package/src/proofs/halo2.ts +42 -0
  177. package/src/proofs/index.ts +471 -0
  178. package/src/proofs/interface.ts +13 -0
  179. package/src/proofs/kimchi.ts +42 -0
  180. package/src/proofs/lazy.ts +1004 -0
  181. package/src/proofs/mock.ts +25 -1
  182. package/src/proofs/noir.ts +110 -29
  183. package/src/proofs/orchestrator.ts +960 -0
  184. package/src/proofs/parallel/concurrency.ts +297 -0
  185. package/src/proofs/parallel/dependency-graph.ts +602 -0
  186. package/src/proofs/parallel/executor.ts +420 -0
  187. package/src/proofs/parallel/index.ts +131 -0
  188. package/src/proofs/parallel/interface.ts +685 -0
  189. package/src/proofs/parallel/worker-pool.ts +644 -0
  190. package/src/proofs/providers/halo2.ts +560 -0
  191. package/src/proofs/providers/index.ts +34 -0
  192. package/src/proofs/providers/kimchi.ts +641 -0
  193. package/src/proofs/validator.ts +881 -0
  194. package/src/proofs/verifier.ts +867 -0
  195. package/src/quantum/index.ts +112 -0
  196. package/src/quantum/winternitz-vault.ts +639 -0
  197. package/src/quantum/wots.ts +611 -0
  198. package/src/settlement/backends/direct-chain.ts +1 -0
  199. package/src/settlement/index.ts +9 -0
  200. package/src/settlement/router.ts +732 -46
  201. package/src/solana/index.ts +72 -0
  202. package/src/solana/jito-relayer.ts +687 -0
  203. package/src/solana/noir-verifier-types.ts +430 -0
  204. package/src/solana/noir-verifier.ts +816 -0
  205. package/src/stealth/address-derivation.ts +193 -0
  206. package/src/stealth/ed25519.ts +431 -0
  207. package/src/stealth/index.ts +233 -0
  208. package/src/stealth/meta-address.ts +221 -0
  209. package/src/stealth/secp256k1.ts +368 -0
  210. package/src/stealth/utils.ts +194 -0
  211. package/src/stealth.ts +50 -1504
  212. package/src/sync/index.ts +106 -0
  213. package/src/sync/manager.ts +504 -0
  214. package/src/sync/mock-provider.ts +318 -0
  215. package/src/sync/oblivious.ts +625 -0
  216. package/src/tokens/index.ts +15 -0
  217. package/src/tokens/registry.ts +301 -0
  218. package/src/utils/deprecation.ts +94 -0
  219. package/src/utils/index.ts +9 -0
  220. package/src/wallet/ethereum/index.ts +68 -0
  221. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  222. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  223. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  224. package/src/wallet/ethereum/types.ts +3 -1
  225. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  226. package/src/wallet/hardware/index.ts +10 -0
  227. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  228. package/src/wallet/index.ts +71 -0
  229. package/src/wallet/near/adapter.ts +626 -0
  230. package/src/wallet/near/index.ts +86 -0
  231. package/src/wallet/near/meteor-wallet.ts +1153 -0
  232. package/src/wallet/near/my-near-wallet.ts +790 -0
  233. package/src/wallet/near/wallet-selector.ts +702 -0
  234. package/src/wallet/solana/adapter.ts +6 -4
  235. package/src/wallet/solana/index.ts +13 -0
  236. package/src/wallet/solana/privacy-adapter.ts +567 -0
  237. package/src/wallet/sui/types.ts +6 -4
  238. package/src/zcash/rpc-client.ts +13 -6
  239. package/dist/chunk-2XIVXWHA.mjs +0 -1930
  240. package/dist/chunk-3INS3PR5.mjs +0 -884
  241. package/dist/chunk-3OVABDRH.mjs +0 -17096
  242. package/dist/chunk-7RFRWDCW.mjs +0 -1504
  243. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  244. package/dist/chunk-E6SZWREQ.mjs +0 -57
  245. package/dist/chunk-F6F73W35.mjs +0 -16166
  246. package/dist/chunk-G33LB27A.mjs +0 -16166
  247. package/dist/chunk-HGU6HZRC.mjs +0 -231
  248. package/dist/chunk-L2K34JCU.mjs +0 -1496
  249. package/dist/chunk-OFDBEIEK.mjs +0 -16166
  250. package/dist/chunk-SF7YSLF5.mjs +0 -1515
  251. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  252. package/dist/chunk-WWUSGOXE.mjs +0 -17129
  253. package/dist/constants-VOI7BSLK.mjs +0 -27
  254. package/dist/index-B71aXVzk.d.ts +0 -13264
  255. package/dist/index-BYZbDjal.d.ts +0 -11390
  256. package/dist/index-CHB3KuOB.d.mts +0 -11859
  257. package/dist/index-CzWPI6Le.d.ts +0 -11859
  258. package/dist/index-pOIIuwfV.d.mts +0 -13264
  259. package/dist/index-xbWjohNq.d.mts +0 -11390
  260. package/dist/solana-4O4K45VU.mjs +0 -46
  261. package/dist/solana-5EMCTPTS.mjs +0 -46
  262. package/dist/solana-NDABAZ6P.mjs +0 -56
  263. package/dist/solana-Q4NAVBTS.mjs +0 -46
  264. package/dist/solana-ZYO63LY5.mjs +0 -46
@@ -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'