@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,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
+ }