@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.
Files changed (262) 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 +48874 -18336
  7. package/dist/browser.mjs +674 -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-YWGJ77A2.mjs +33806 -0
  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-DXh2IGkz.d.ts +24681 -0
  24. package/dist/index-DeE1ZzA4.d.mts +24681 -0
  25. package/dist/index.d.mts +9 -3
  26. package/dist/index.d.ts +9 -3
  27. package/dist/index.js +48676 -17318
  28. package/dist/index.mjs +583 -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 +276 -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 +201 -0
  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 +402 -0
  98. package/src/chains/solana/providers/index.ts +85 -0
  99. package/src/chains/solana/providers/interface.ts +221 -0
  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 +790 -0
  103. package/src/chains/solana/rpc-client.ts +1150 -0
  104. package/src/chains/solana/scan.ts +170 -73
  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 +77 -7
  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 +37 -0
  116. package/src/compliance/range-sas.ts +956 -0
  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 +785 -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 +336 -0
  143. package/src/privacy-backends/interface.ts +906 -0
  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-types.ts +278 -0
  148. package/src/privacy-backends/privacycash.ts +456 -0
  149. package/src/privacy-backends/private-swap.ts +570 -0
  150. package/src/privacy-backends/rate-limiter.ts +683 -0
  151. package/src/privacy-backends/registry.ts +690 -0
  152. package/src/privacy-backends/router.ts +626 -0
  153. package/src/privacy-backends/shadowwire.ts +449 -0
  154. package/src/privacy-backends/sip-native.ts +256 -0
  155. package/src/privacy-logger.ts +191 -0
  156. package/src/production-safety.ts +373 -0
  157. package/src/proofs/aggregator.ts +1029 -0
  158. package/src/proofs/browser-composer.ts +1150 -0
  159. package/src/proofs/browser.ts +113 -25
  160. package/src/proofs/cache/index.ts +127 -0
  161. package/src/proofs/cache/interface.ts +545 -0
  162. package/src/proofs/cache/key-generator.ts +188 -0
  163. package/src/proofs/cache/lru-cache.ts +481 -0
  164. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  165. package/src/proofs/cache/persistent-cache.ts +788 -0
  166. package/src/proofs/compliance-proof.ts +872 -0
  167. package/src/proofs/composer/base.ts +923 -0
  168. package/src/proofs/composer/index.ts +25 -0
  169. package/src/proofs/composer/interface.ts +518 -0
  170. package/src/proofs/composer/types.ts +383 -0
  171. package/src/proofs/converters/halo2.ts +452 -0
  172. package/src/proofs/converters/index.ts +208 -0
  173. package/src/proofs/converters/interface.ts +363 -0
  174. package/src/proofs/converters/kimchi.ts +462 -0
  175. package/src/proofs/converters/noir.ts +451 -0
  176. package/src/proofs/fallback.ts +888 -0
  177. package/src/proofs/halo2.ts +42 -0
  178. package/src/proofs/index.ts +471 -0
  179. package/src/proofs/interface.ts +13 -0
  180. package/src/proofs/kimchi.ts +42 -0
  181. package/src/proofs/lazy.ts +1004 -0
  182. package/src/proofs/mock.ts +25 -1
  183. package/src/proofs/noir.ts +111 -30
  184. package/src/proofs/orchestrator.ts +960 -0
  185. package/src/proofs/parallel/concurrency.ts +297 -0
  186. package/src/proofs/parallel/dependency-graph.ts +602 -0
  187. package/src/proofs/parallel/executor.ts +420 -0
  188. package/src/proofs/parallel/index.ts +131 -0
  189. package/src/proofs/parallel/interface.ts +685 -0
  190. package/src/proofs/parallel/worker-pool.ts +644 -0
  191. package/src/proofs/providers/halo2.ts +560 -0
  192. package/src/proofs/providers/index.ts +34 -0
  193. package/src/proofs/providers/kimchi.ts +641 -0
  194. package/src/proofs/validator.ts +881 -0
  195. package/src/proofs/verifier.ts +867 -0
  196. package/src/quantum/index.ts +112 -0
  197. package/src/quantum/winternitz-vault.ts +639 -0
  198. package/src/quantum/wots.ts +611 -0
  199. package/src/settlement/backends/direct-chain.ts +1 -0
  200. package/src/settlement/index.ts +9 -0
  201. package/src/settlement/router.ts +732 -46
  202. package/src/solana/index.ts +72 -0
  203. package/src/solana/jito-relayer.ts +687 -0
  204. package/src/solana/noir-verifier-types.ts +430 -0
  205. package/src/solana/noir-verifier.ts +816 -0
  206. package/src/stealth/address-derivation.ts +193 -0
  207. package/src/stealth/ed25519.ts +431 -0
  208. package/src/stealth/index.ts +233 -0
  209. package/src/stealth/meta-address.ts +221 -0
  210. package/src/stealth/secp256k1.ts +368 -0
  211. package/src/stealth/utils.ts +194 -0
  212. package/src/stealth.ts +50 -1504
  213. package/src/surveillance/algorithms/address-reuse.ts +143 -0
  214. package/src/surveillance/algorithms/cluster.ts +247 -0
  215. package/src/surveillance/algorithms/exchange.ts +295 -0
  216. package/src/surveillance/algorithms/temporal.ts +337 -0
  217. package/src/surveillance/analyzer.ts +442 -0
  218. package/src/surveillance/index.ts +64 -0
  219. package/src/surveillance/scoring.ts +372 -0
  220. package/src/surveillance/types.ts +264 -0
  221. package/src/sync/index.ts +106 -0
  222. package/src/sync/manager.ts +504 -0
  223. package/src/sync/mock-provider.ts +318 -0
  224. package/src/sync/oblivious.ts +625 -0
  225. package/src/tokens/index.ts +15 -0
  226. package/src/tokens/registry.ts +301 -0
  227. package/src/utils/deprecation.ts +94 -0
  228. package/src/utils/index.ts +9 -0
  229. package/src/wallet/ethereum/index.ts +68 -0
  230. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  231. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  232. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  233. package/src/wallet/ethereum/types.ts +3 -1
  234. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  235. package/src/wallet/hardware/index.ts +10 -0
  236. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  237. package/src/wallet/index.ts +71 -0
  238. package/src/wallet/near/adapter.ts +626 -0
  239. package/src/wallet/near/index.ts +86 -0
  240. package/src/wallet/near/meteor-wallet.ts +1153 -0
  241. package/src/wallet/near/my-near-wallet.ts +790 -0
  242. package/src/wallet/near/wallet-selector.ts +702 -0
  243. package/src/wallet/solana/adapter.ts +6 -4
  244. package/src/wallet/solana/index.ts +13 -0
  245. package/src/wallet/solana/privacy-adapter.ts +567 -0
  246. package/src/wallet/sui/types.ts +6 -4
  247. package/src/zcash/rpc-client.ts +13 -6
  248. package/dist/chunk-3INS3PR5.mjs +0 -884
  249. package/dist/chunk-3OVABDRH.mjs +0 -17096
  250. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  251. package/dist/chunk-E6SZWREQ.mjs +0 -57
  252. package/dist/chunk-G33LB27A.mjs +0 -16166
  253. package/dist/chunk-HGU6HZRC.mjs +0 -231
  254. package/dist/chunk-L2K34JCU.mjs +0 -1496
  255. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  256. package/dist/constants-VOI7BSLK.mjs +0 -27
  257. package/dist/index-BYZbDjal.d.ts +0 -11390
  258. package/dist/index-CHB3KuOB.d.mts +0 -11859
  259. package/dist/index-CzWPI6Le.d.ts +0 -11859
  260. package/dist/index-xbWjohNq.d.mts +0 -11390
  261. package/dist/solana-5EMCTPTS.mjs +0 -46
  262. package/dist/solana-Q4NAVBTS.mjs +0 -46
package/src/intent.ts CHANGED
@@ -44,6 +44,9 @@ import {
44
44
  isValidPrivacyLevel,
45
45
  isValidStealthMetaAddress,
46
46
  } from './validation'
47
+ import { createLogger } from './logger'
48
+
49
+ const log = createLogger('intent')
47
50
 
48
51
  /**
49
52
  * Options for creating a shielded intent
@@ -606,9 +609,9 @@ export async function createShieldedIntent(
606
609
  // Placeholder mode with no senderSecret - use random bytes (won't verify)
607
610
  effectiveOwnershipSig = randomBytes(64)
608
611
  effectiveAuthSig = randomBytes(64)
609
- console.warn(
610
- '[createShieldedIntent] WARNING: Using placeholder signatures for proof generation. ' +
611
- 'These proofs are NOT cryptographically valid. Do NOT use in production!'
612
+ log.warn(
613
+ { allowPlaceholders: true, hasSenderSecret: false },
614
+ 'Using placeholder signatures for proof generation - NOT cryptographically valid'
612
615
  )
613
616
  } else {
614
617
  // Generate real ECDSA signatures using senderSecret
package/src/logger.ts ADDED
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Structured Logger for SIP SDK
3
+ *
4
+ * Provides production-ready logging using pino with:
5
+ * - Structured JSON output for log aggregators
6
+ * - Configurable log levels via SIP_LOG_LEVEL
7
+ * - Silent mode for tests (SIP_LOG_SILENT=true)
8
+ * - Privacy-aware redaction of sensitive data
9
+ * - Child loggers for module-specific context
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { logger, createLogger } from '@sip-protocol/sdk'
14
+ *
15
+ * // Use global logger
16
+ * logger.info({ module: 'stealth' }, 'Generating stealth address')
17
+ *
18
+ * // Create module-specific logger
19
+ * const log = createLogger('stealth')
20
+ * log.info('Generating address')
21
+ * log.warn({ deprecated: 'createCommitment' }, 'Function deprecated')
22
+ * ```
23
+ *
24
+ * @example Environment Configuration
25
+ * ```bash
26
+ * SIP_LOG_LEVEL=debug # trace, debug, info, warn, error, fatal, silent
27
+ * SIP_LOG_SILENT=true # Disable all logging (for tests)
28
+ * ```
29
+ */
30
+
31
+ import pino, { type Logger as PinoLogger, type LoggerOptions } from 'pino'
32
+
33
+ // Re-export pino types for convenience
34
+ export type { Logger as PinoLogger } from 'pino'
35
+
36
+ /**
37
+ * Log levels supported by the SDK
38
+ */
39
+ export type SIPLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | 'silent'
40
+
41
+ /**
42
+ * Configuration options for the SIP logger
43
+ */
44
+ export interface SIPLoggerConfig {
45
+ /** Log level (default: from SIP_LOG_LEVEL env or 'info') */
46
+ level?: SIPLogLevel
47
+ /** Logger name (shown in logs) */
48
+ name?: string
49
+ /** Custom pino options */
50
+ options?: LoggerOptions
51
+ }
52
+
53
+ /**
54
+ * Sensitive fields that should be redacted in logs
55
+ */
56
+ const SENSITIVE_FIELDS = new Set([
57
+ 'privateKey',
58
+ 'secretKey',
59
+ 'seed',
60
+ 'mnemonic',
61
+ 'password',
62
+ 'secret',
63
+ 'blindingFactor',
64
+ 'viewingPrivateKey',
65
+ 'spendingPrivateKey',
66
+ ])
67
+
68
+ /**
69
+ * Fields that should be partially redacted (show first/last chars)
70
+ */
71
+ const PARTIAL_REDACT_FIELDS = new Set([
72
+ 'address',
73
+ 'publicKey',
74
+ 'pubkey',
75
+ 'from',
76
+ 'to',
77
+ 'owner',
78
+ 'sender',
79
+ 'recipient',
80
+ 'wallet',
81
+ 'signature',
82
+ 'txHash',
83
+ 'txSignature',
84
+ 'transactionHash',
85
+ 'stealthAddress',
86
+ 'ephemeralPubkey',
87
+ ])
88
+
89
+ /**
90
+ * Get the configured log level from environment
91
+ */
92
+ function getLogLevel(): SIPLogLevel {
93
+ // Check for silent mode first
94
+ const silent = process.env.SIP_LOG_SILENT
95
+ if (silent === 'true' || silent === '1') {
96
+ return 'silent'
97
+ }
98
+
99
+ // Check for explicit level
100
+ const level = process.env.SIP_LOG_LEVEL?.toLowerCase()
101
+ const validLevels: SIPLogLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent']
102
+ if (level && validLevels.includes(level as SIPLogLevel)) {
103
+ return level as SIPLogLevel
104
+ }
105
+
106
+ // Default to warn in production, info otherwise
107
+ return process.env.NODE_ENV === 'production' ? 'warn' : 'info'
108
+ }
109
+
110
+ /**
111
+ * Check if running in test environment
112
+ */
113
+ function isTestEnvironment(): boolean {
114
+ return (
115
+ process.env.NODE_ENV === 'test' ||
116
+ process.env.VITEST === 'true' ||
117
+ process.env.JEST_WORKER_ID !== undefined ||
118
+ process.env.SIP_LOG_SILENT === 'true'
119
+ )
120
+ }
121
+
122
+ /**
123
+ * Redact a string value for logging
124
+ */
125
+ function redactValue(value: string, chars: number = 4): string {
126
+ if (!value || typeof value !== 'string') return '[invalid]'
127
+ if (value.length <= chars * 2 + 3) return value
128
+ return `${value.slice(0, chars)}...${value.slice(-chars)}`
129
+ }
130
+
131
+ /**
132
+ * Custom serializer that redacts sensitive data
133
+ */
134
+ function createRedactingSerializer() {
135
+ return {
136
+ // Redact sensitive object properties
137
+ obj: (obj: Record<string, unknown>): Record<string, unknown> => {
138
+ if (!obj || typeof obj !== 'object') return obj
139
+
140
+ const result: Record<string, unknown> = {}
141
+ for (const [key, value] of Object.entries(obj)) {
142
+ const lowerKey = key.toLowerCase()
143
+
144
+ // Fully redact sensitive fields
145
+ if (SENSITIVE_FIELDS.has(key) || SENSITIVE_FIELDS.has(lowerKey)) {
146
+ result[key] = '[REDACTED]'
147
+ continue
148
+ }
149
+
150
+ // Partially redact address-like fields
151
+ if (
152
+ (PARTIAL_REDACT_FIELDS.has(key) || PARTIAL_REDACT_FIELDS.has(lowerKey)) &&
153
+ typeof value === 'string'
154
+ ) {
155
+ result[key] = redactValue(value)
156
+ continue
157
+ }
158
+
159
+ // Recursively handle nested objects
160
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
161
+ result[key] = createRedactingSerializer().obj(value as Record<string, unknown>)
162
+ continue
163
+ }
164
+
165
+ result[key] = value
166
+ }
167
+ return result
168
+ },
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Create the base pino logger instance
174
+ */
175
+ function createBaseLogger(config: SIPLoggerConfig = {}): PinoLogger {
176
+ const level = config.level ?? getLogLevel()
177
+
178
+ // In test environment, always use silent unless explicitly set
179
+ const effectiveLevel = isTestEnvironment() && !config.level ? 'silent' : level
180
+
181
+ const options: LoggerOptions = {
182
+ name: config.name ?? 'sip-sdk',
183
+ level: effectiveLevel,
184
+ formatters: {
185
+ level: (label) => ({ level: label }),
186
+ },
187
+ // Timestamp in ISO format for log aggregators
188
+ timestamp: pino.stdTimeFunctions.isoTime,
189
+ // Custom serializers for objects
190
+ serializers: createRedactingSerializer(),
191
+ ...config.options,
192
+ }
193
+
194
+ return pino(options)
195
+ }
196
+
197
+ /**
198
+ * Global SDK logger instance
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * import { logger } from '@sip-protocol/sdk'
203
+ *
204
+ * logger.info('SDK initialized')
205
+ * logger.warn({ deprecated: 'oldFunc' }, 'Function deprecated')
206
+ * logger.error({ err }, 'Operation failed')
207
+ * ```
208
+ */
209
+ export const logger = createBaseLogger()
210
+
211
+ /**
212
+ * Create a child logger for a specific module
213
+ *
214
+ * Child loggers inherit the parent's configuration and add
215
+ * a 'module' field to all log entries.
216
+ *
217
+ * @param module - Module name to add to all log entries
218
+ * @param config - Optional additional configuration
219
+ * @returns Child logger instance
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * import { createLogger } from '@sip-protocol/sdk'
224
+ *
225
+ * const log = createLogger('stealth')
226
+ * log.info('Generating stealth address')
227
+ * // Output: {"level":"info","time":"...","module":"stealth","msg":"Generating stealth address"}
228
+ *
229
+ * log.warn({ deprecated: 'oldFunc', replacement: 'newFunc' }, 'Function deprecated')
230
+ * // Output: {"level":"warn","time":"...","module":"stealth","deprecated":"oldFunc","replacement":"newFunc","msg":"Function deprecated"}
231
+ * ```
232
+ */
233
+ export function createLogger(module: string, config?: SIPLoggerConfig): PinoLogger {
234
+ if (config) {
235
+ return createBaseLogger({ ...config, name: `sip-sdk:${module}` }).child({ module })
236
+ }
237
+ return logger.child({ module })
238
+ }
239
+
240
+ /**
241
+ * Configure the global logger
242
+ *
243
+ * Note: This creates a new logger instance. Existing child loggers
244
+ * will not be affected.
245
+ *
246
+ * @param config - Logger configuration options
247
+ *
248
+ * @example
249
+ * ```typescript
250
+ * import { configureLogger } from '@sip-protocol/sdk'
251
+ *
252
+ * // Enable debug logging
253
+ * configureLogger({ level: 'debug' })
254
+ *
255
+ * // Silent mode for tests
256
+ * configureLogger({ level: 'silent' })
257
+ * ```
258
+ */
259
+ export function configureLogger(config: SIPLoggerConfig): PinoLogger {
260
+ return createBaseLogger(config)
261
+ }
262
+
263
+ /**
264
+ * Silence all logging (useful for tests)
265
+ *
266
+ * @example
267
+ * ```typescript
268
+ * import { silenceLogger } from '@sip-protocol/sdk'
269
+ *
270
+ * beforeAll(() => {
271
+ * silenceLogger()
272
+ * })
273
+ * ```
274
+ */
275
+ export function silenceLogger(): void {
276
+ logger.level = 'silent'
277
+ }
278
+
279
+ /**
280
+ * Set the log level at runtime
281
+ *
282
+ * @param level - New log level
283
+ *
284
+ * @example
285
+ * ```typescript
286
+ * import { setLogLevel } from '@sip-protocol/sdk'
287
+ *
288
+ * setLogLevel('debug') // Enable verbose logging
289
+ * setLogLevel('error') // Only show errors
290
+ * ```
291
+ */
292
+ export function setLogLevel(level: SIPLogLevel): void {
293
+ logger.level = level
294
+ }
295
+
296
+ /**
297
+ * Get the current log level
298
+ *
299
+ * @returns Current log level
300
+ */
301
+ export function getLogLevelName(): SIPLogLevel {
302
+ return logger.level as SIPLogLevel
303
+ }
304
+
305
+ /**
306
+ * Check if a specific log level is enabled
307
+ *
308
+ * @param level - Log level to check
309
+ * @returns true if the level would produce output
310
+ *
311
+ * @example
312
+ * ```typescript
313
+ * import { isLevelEnabled } from '@sip-protocol/sdk'
314
+ *
315
+ * if (isLevelEnabled('debug')) {
316
+ * // Expensive debug computation
317
+ * const details = computeExpensiveDebugInfo()
318
+ * logger.debug(details, 'Debug info')
319
+ * }
320
+ * ```
321
+ */
322
+ export function isLevelEnabled(level: SIPLogLevel): boolean {
323
+ return logger.isLevelEnabled(level)
324
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Network Privacy Module
3
+ *
4
+ * Provides network-level privacy features for SIP SDK including:
5
+ * - Tor integration for anonymous RPC calls
6
+ * - SOCKS5 proxy support
7
+ * - HTTP/HTTPS proxy support
8
+ * - Circuit rotation for unlinkability
9
+ *
10
+ * ## Quick Start
11
+ *
12
+ * ```typescript
13
+ * import { createNetworkPrivacyClient } from '@sip-protocol/sdk'
14
+ *
15
+ * // Using Tor (auto-detect)
16
+ * const network = await createNetworkPrivacyClient({
17
+ * proxy: 'tor',
18
+ * rotateCircuit: true,
19
+ * })
20
+ *
21
+ * // All API calls through Tor
22
+ * const response = await network.fetch('https://api.example.com/data')
23
+ * ```
24
+ *
25
+ * ## Proxy Types
26
+ *
27
+ * | Type | Example | Description |
28
+ * |------|---------|-------------|
29
+ * | Tor | `'tor'` | Auto-detect local Tor on ports 9050/9150 |
30
+ * | SOCKS5 | `'socks5://host:port'` | Generic SOCKS5 proxy |
31
+ * | HTTP | `'http://host:port'` | HTTP proxy |
32
+ * | Direct | `undefined` | No proxy (default) |
33
+ *
34
+ * ## Environment Variables
35
+ *
36
+ * Set `SIP_PROXY` environment variable to configure proxy:
37
+ *
38
+ * ```bash
39
+ * # Use Tor
40
+ * export SIP_PROXY=tor
41
+ *
42
+ * # Use custom SOCKS5
43
+ * export SIP_PROXY=socks5://127.0.0.1:1080
44
+ * ```
45
+ *
46
+ * @module network
47
+ * @see https://github.com/sip-protocol/sip-protocol/issues/489
48
+ */
49
+
50
+ // Core proxy functionality
51
+ export {
52
+ // Types
53
+ type ProxyConfig,
54
+ type ProxyType,
55
+ type ParsedProxyConfig,
56
+ type ProxyAgentOptions,
57
+ type ProxyCheckResult,
58
+ type ProxiedFetch,
59
+ type NetworkPrivacyConfig,
60
+
61
+ // Constants
62
+ TOR_PORTS,
63
+ TOR_HOST,
64
+ TOR_CONTROL_PORT,
65
+ DEFAULT_PROXY_TIMEOUT,
66
+ PROXY_ENV_VAR,
67
+ PROXY_ENV_VARS,
68
+ DEFAULT_NETWORK_CONFIG,
69
+
70
+ // Functions
71
+ parseProxyConfig,
72
+ getProxyFromEnv,
73
+ isTorAvailable,
74
+ detectTorPort,
75
+ checkProxyAvailability,
76
+ createProxyAgent,
77
+ createProxiedFetch,
78
+ rotateCircuit,
79
+ createNetworkPrivacyClient,
80
+ } from './proxy'