@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
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Noir Proof Format Converter
3
+ *
4
+ * Converts between Noir native proof format (Barretenberg) and SIP unified format.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+
9
+ import type {
10
+ SingleProof,
11
+ ProofMetadata,
12
+ HexString,
13
+ } from '@sip-protocol/types'
14
+
15
+ import {
16
+ type ProofConverter,
17
+ type NoirNativeProof,
18
+ type ConversionOptions,
19
+ type ConversionResult,
20
+ type ConversionMetadata,
21
+ type ValidationResult,
22
+ type ValidationError,
23
+ DEFAULT_CONVERSION_OPTIONS,
24
+ ProofConversionError,
25
+ InvalidProofError,
26
+ UnsupportedVersionError,
27
+ } from './interface'
28
+
29
+ // ─── Constants ───────────────────────────────────────────────────────────────
30
+
31
+ /** Converter version */
32
+ const CONVERTER_VERSION = '1.0.0'
33
+
34
+ /** Supported Noir versions */
35
+ const SUPPORTED_NOIR_VERSIONS = ['0.30', '0.31', '0.32', '0.33', '0.34', '0.35', '1.0']
36
+
37
+ /** Supported Barretenberg versions */
38
+ const SUPPORTED_BB_VERSIONS = ['0.47', '0.48', '0.49', '0.50', '0.51', '0.52', '0.53']
39
+
40
+ // ─── Utility Functions ───────────────────────────────────────────────────────
41
+
42
+ /**
43
+ * Convert Uint8Array to hex string
44
+ */
45
+ function bytesToHex(bytes: Uint8Array): HexString {
46
+ return ('0x' + Array.from(bytes)
47
+ .map(b => b.toString(16).padStart(2, '0'))
48
+ .join('')) as HexString
49
+ }
50
+
51
+ /**
52
+ * Convert hex string to Uint8Array
53
+ */
54
+ function hexToBytes(hex: HexString): Uint8Array {
55
+ const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex
56
+ const bytes = new Uint8Array(cleanHex.length / 2)
57
+ for (let i = 0; i < bytes.length; i++) {
58
+ bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16)
59
+ }
60
+ return bytes
61
+ }
62
+
63
+ /**
64
+ * Check if a Noir version is supported
65
+ */
66
+ function isSupportedNoirVersion(version: string): boolean {
67
+ const majorMinor = version.split('.').slice(0, 2).join('.')
68
+ return SUPPORTED_NOIR_VERSIONS.some(v => majorMinor.startsWith(v))
69
+ }
70
+
71
+ /**
72
+ * Check if a Barretenberg version is supported
73
+ */
74
+ function isSupportedBBVersion(version: string): boolean {
75
+ const majorMinor = version.split('.').slice(0, 2).join('.')
76
+ return SUPPORTED_BB_VERSIONS.some(v => majorMinor.startsWith(v))
77
+ }
78
+
79
+ // ─── Noir Proof Converter ────────────────────────────────────────────────────
80
+
81
+ /**
82
+ * Converter for Noir proofs (Barretenberg backend)
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * const converter = new NoirProofConverter()
87
+ *
88
+ * // Convert to SIP format
89
+ * const result = converter.toSIP(noirProof)
90
+ * if (result.success) {
91
+ * console.log('SIP Proof:', result.result)
92
+ * }
93
+ *
94
+ * // Convert back to Noir format
95
+ * const nativeResult = converter.fromSIP(sipProof)
96
+ * if (nativeResult.success) {
97
+ * console.log('Noir Proof:', nativeResult.result)
98
+ * }
99
+ * ```
100
+ */
101
+ export class NoirProofConverter implements ProofConverter<NoirNativeProof> {
102
+ readonly system = 'noir' as const
103
+ readonly version = CONVERTER_VERSION
104
+
105
+ /**
106
+ * Convert Noir native proof to SIP unified format
107
+ */
108
+ toSIP(
109
+ nativeProof: NoirNativeProof,
110
+ options: ConversionOptions = {},
111
+ ): ConversionResult<SingleProof> {
112
+ const opts = { ...DEFAULT_CONVERSION_OPTIONS, ...options }
113
+ const startTime = Date.now()
114
+
115
+ try {
116
+ // Validate if requested
117
+ if (opts.validateBeforeConversion) {
118
+ const validation = this.validateNative(nativeProof)
119
+ if (!validation.valid) {
120
+ return this._createErrorResult(
121
+ new InvalidProofError('noir', 'sip', validation.errors),
122
+ startTime,
123
+ nativeProof.proofData.length,
124
+ )
125
+ }
126
+ }
127
+
128
+ // Check version support
129
+ if (nativeProof.noirVersion && !isSupportedNoirVersion(nativeProof.noirVersion)) {
130
+ return this._createErrorResult(
131
+ new UnsupportedVersionError('noir', nativeProof.noirVersion, SUPPORTED_NOIR_VERSIONS),
132
+ startTime,
133
+ nativeProof.proofData.length,
134
+ )
135
+ }
136
+
137
+ // Convert proof data to hex
138
+ const proofHex = bytesToHex(nativeProof.proofData)
139
+
140
+ // Convert public inputs to hex format
141
+ const publicInputsHex = nativeProof.publicInputs.map(input => {
142
+ // If already hex, ensure proper format
143
+ if (input.startsWith('0x')) {
144
+ return input as HexString
145
+ }
146
+ // Convert decimal/field element to hex
147
+ const bigInt = BigInt(input)
148
+ return ('0x' + bigInt.toString(16).padStart(64, '0')) as HexString
149
+ })
150
+
151
+ // Convert verification key if present
152
+ const verificationKey = opts.includeVerificationKey && nativeProof.verificationKey
153
+ ? (typeof nativeProof.verificationKey === 'string'
154
+ ? nativeProof.verificationKey as HexString
155
+ : bytesToHex(nativeProof.verificationKey))
156
+ : undefined
157
+
158
+ // Build metadata
159
+ const metadata: ProofMetadata = {
160
+ system: 'noir',
161
+ systemVersion: nativeProof.noirVersion || 'unknown',
162
+ circuitId: nativeProof.circuitHash || 'unknown',
163
+ circuitVersion: nativeProof.backendVersion || 'unknown',
164
+ generatedAt: Date.now(),
165
+ proofSizeBytes: nativeProof.proofData.length,
166
+ targetChainId: opts.targetChainId || undefined,
167
+ }
168
+
169
+ // Build SIP proof
170
+ const sipProof: SingleProof = {
171
+ id: opts.idGenerator(),
172
+ proof: proofHex,
173
+ publicInputs: publicInputsHex,
174
+ verificationKey,
175
+ metadata,
176
+ }
177
+
178
+ // Calculate output size
179
+ const outputSize = proofHex.length / 2 - 1 // Hex chars / 2 minus 0x
180
+
181
+ return {
182
+ success: true,
183
+ result: sipProof,
184
+ lossless: true,
185
+ warnings: this._collectWarnings(nativeProof),
186
+ conversionMetadata: this._createConversionMetadata(
187
+ 'noir',
188
+ 'sip',
189
+ startTime,
190
+ nativeProof.proofData.length,
191
+ outputSize,
192
+ ),
193
+ }
194
+ } catch (error) {
195
+ return this._createErrorResult(
196
+ error instanceof ProofConversionError
197
+ ? error
198
+ : new ProofConversionError(
199
+ 'UNKNOWN_ERROR',
200
+ error instanceof Error ? error.message : 'Unknown conversion error',
201
+ 'noir',
202
+ 'sip',
203
+ error instanceof Error ? error : undefined,
204
+ ),
205
+ startTime,
206
+ nativeProof.proofData.length,
207
+ )
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Convert SIP unified format to Noir native proof
213
+ */
214
+ fromSIP(
215
+ sipProof: SingleProof,
216
+ options: ConversionOptions = {},
217
+ ): ConversionResult<NoirNativeProof> {
218
+ const opts = { ...DEFAULT_CONVERSION_OPTIONS, ...options }
219
+ const startTime = Date.now()
220
+ const inputSize = sipProof.proof.length / 2 - 1
221
+
222
+ try {
223
+ // Check if this is a Noir proof
224
+ if (!this.canConvertFromSIP(sipProof)) {
225
+ return this._createErrorResult(
226
+ new ProofConversionError(
227
+ 'INVALID_INPUT',
228
+ `Cannot convert proof from system: ${sipProof.metadata.system}`,
229
+ sipProof.metadata.system,
230
+ 'noir',
231
+ ),
232
+ startTime,
233
+ inputSize,
234
+ )
235
+ }
236
+
237
+ // Convert proof hex to bytes
238
+ const proofData = hexToBytes(sipProof.proof)
239
+
240
+ // Convert public inputs from hex to field element strings
241
+ const publicInputs = sipProof.publicInputs.map(hex => {
242
+ const bigInt = BigInt(hex)
243
+ return bigInt.toString()
244
+ })
245
+
246
+ // Convert verification key if present
247
+ const verificationKey = sipProof.verificationKey
248
+ ? hexToBytes(sipProof.verificationKey)
249
+ : undefined
250
+
251
+ // Build native proof
252
+ const nativeProof: NoirNativeProof = {
253
+ system: 'noir',
254
+ proofData,
255
+ publicInputs,
256
+ verificationKey,
257
+ circuitHash: sipProof.metadata.circuitId,
258
+ noirVersion: sipProof.metadata.systemVersion,
259
+ backendVersion: sipProof.metadata.circuitVersion,
260
+ nativeMetadata: opts.preserveNativeMetadata ? {
261
+ sipProofId: sipProof.id,
262
+ originalMetadata: sipProof.metadata,
263
+ } : undefined,
264
+ }
265
+
266
+ return {
267
+ success: true,
268
+ result: nativeProof,
269
+ lossless: true,
270
+ warnings: [],
271
+ conversionMetadata: this._createConversionMetadata(
272
+ 'sip' as any,
273
+ 'noir',
274
+ startTime,
275
+ inputSize,
276
+ proofData.length,
277
+ ),
278
+ }
279
+ } catch (error) {
280
+ return this._createErrorResult(
281
+ error instanceof ProofConversionError
282
+ ? error
283
+ : new ProofConversionError(
284
+ 'UNKNOWN_ERROR',
285
+ error instanceof Error ? error.message : 'Unknown conversion error',
286
+ 'noir',
287
+ 'sip',
288
+ error instanceof Error ? error : undefined,
289
+ ),
290
+ startTime,
291
+ inputSize,
292
+ )
293
+ }
294
+ }
295
+
296
+ /**
297
+ * Validate a Noir native proof structure
298
+ */
299
+ validateNative(nativeProof: NoirNativeProof): ValidationResult {
300
+ const errors: ValidationError[] = []
301
+ const warnings: string[] = []
302
+
303
+ // Check required fields
304
+ if (!nativeProof.proofData || nativeProof.proofData.length === 0) {
305
+ errors.push({
306
+ field: 'proofData',
307
+ message: 'Proof data is required and must not be empty',
308
+ code: 'REQUIRED_FIELD',
309
+ })
310
+ }
311
+
312
+ if (!nativeProof.publicInputs) {
313
+ errors.push({
314
+ field: 'publicInputs',
315
+ message: 'Public inputs array is required',
316
+ code: 'REQUIRED_FIELD',
317
+ })
318
+ }
319
+
320
+ // Validate proof data format (basic structure check)
321
+ if (nativeProof.proofData && nativeProof.proofData.length < 32) {
322
+ errors.push({
323
+ field: 'proofData',
324
+ message: 'Proof data is too short (minimum 32 bytes)',
325
+ code: 'INVALID_FORMAT',
326
+ })
327
+ }
328
+
329
+ // Validate public inputs format
330
+ if (nativeProof.publicInputs) {
331
+ for (let i = 0; i < nativeProof.publicInputs.length; i++) {
332
+ const input = nativeProof.publicInputs[i]
333
+ try {
334
+ // Try to parse as BigInt (hex or decimal)
335
+ if (input.startsWith('0x')) {
336
+ BigInt(input)
337
+ } else {
338
+ BigInt(input)
339
+ }
340
+ } catch {
341
+ errors.push({
342
+ field: `publicInputs[${i}]`,
343
+ message: `Invalid field element format: ${input}`,
344
+ code: 'INVALID_FORMAT',
345
+ })
346
+ }
347
+ }
348
+ }
349
+
350
+ // Version warnings
351
+ if (nativeProof.noirVersion && !isSupportedNoirVersion(nativeProof.noirVersion)) {
352
+ warnings.push(`Noir version ${nativeProof.noirVersion} may not be fully supported`)
353
+ }
354
+
355
+ if (nativeProof.backendVersion && !isSupportedBBVersion(nativeProof.backendVersion)) {
356
+ warnings.push(`Barretenberg version ${nativeProof.backendVersion} may not be fully supported`)
357
+ }
358
+
359
+ // Missing optional field warnings
360
+ if (!nativeProof.circuitHash) {
361
+ warnings.push('No circuit hash provided - proof may not be fully traceable')
362
+ }
363
+
364
+ if (!nativeProof.verificationKey) {
365
+ warnings.push('No verification key included - may need external key for verification')
366
+ }
367
+
368
+ return {
369
+ valid: errors.length === 0,
370
+ errors,
371
+ warnings,
372
+ }
373
+ }
374
+
375
+ /**
376
+ * Check if a SIP proof can be converted to Noir format
377
+ */
378
+ canConvertFromSIP(sipProof: SingleProof): boolean {
379
+ return sipProof.metadata.system === 'noir'
380
+ }
381
+
382
+ /**
383
+ * Get supported Noir versions
384
+ */
385
+ getSupportedVersions(): string[] {
386
+ return [...SUPPORTED_NOIR_VERSIONS]
387
+ }
388
+
389
+ // ─── Private Helpers ─────────────────────────────────────────────────────────
390
+
391
+ private _createConversionMetadata(
392
+ sourceSystem: 'noir' | 'sip',
393
+ targetSystem: 'noir' | 'sip',
394
+ startTime: number,
395
+ originalSize: number,
396
+ convertedSize: number,
397
+ ): ConversionMetadata {
398
+ return {
399
+ sourceSystem: sourceSystem === 'sip' ? 'noir' : sourceSystem,
400
+ targetSystem,
401
+ convertedAt: Date.now(),
402
+ converterVersion: this.version,
403
+ conversionTimeMs: Date.now() - startTime,
404
+ originalSize,
405
+ convertedSize,
406
+ }
407
+ }
408
+
409
+ private _createErrorResult<T>(
410
+ error: ProofConversionError,
411
+ startTime: number,
412
+ inputSize: number,
413
+ ): ConversionResult<T> {
414
+ return {
415
+ success: false,
416
+ error: error.message,
417
+ errorCode: error.code,
418
+ lossless: false,
419
+ conversionMetadata: this._createConversionMetadata(
420
+ error.sourceSystem as any,
421
+ error.targetSystem as any,
422
+ startTime,
423
+ inputSize,
424
+ 0,
425
+ ),
426
+ }
427
+ }
428
+
429
+ private _collectWarnings(nativeProof: NoirNativeProof): string[] {
430
+ const warnings: string[] = []
431
+
432
+ if (!nativeProof.noirVersion) {
433
+ warnings.push('No Noir version specified - using unknown')
434
+ }
435
+
436
+ if (!nativeProof.circuitHash) {
437
+ warnings.push('No circuit hash - traceability limited')
438
+ }
439
+
440
+ return warnings
441
+ }
442
+ }
443
+
444
+ // ─── Factory Function ────────────────────────────────────────────────────────
445
+
446
+ /**
447
+ * Create a new Noir proof converter instance
448
+ */
449
+ export function createNoirConverter(): NoirProofConverter {
450
+ return new NoirProofConverter()
451
+ }