@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,462 @@
1
+ /**
2
+ * Kimchi Proof Format Converter
3
+ *
4
+ * Converts between Kimchi native proof format (Mina Protocol) 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 KimchiNativeProof,
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 Kimchi/o1js versions */
35
+ const SUPPORTED_KIMCHI_VERSIONS = ['0.15', '0.16', '0.17', '0.18', '1.0', '1.1', '1.2']
36
+
37
+ /** Pasta curve field modulus (Pallas) */
38
+ const PALLAS_MODULUS = BigInt('0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001')
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 Kimchi version is supported
65
+ */
66
+ function isSupportedKimchiVersion(version: string): boolean {
67
+ const majorMinor = version.split('.').slice(0, 2).join('.')
68
+ return SUPPORTED_KIMCHI_VERSIONS.some(v => majorMinor.startsWith(v))
69
+ }
70
+
71
+ /**
72
+ * Validate a Pasta field element (check if < field modulus)
73
+ */
74
+ function isValidPastaFieldElement(value: string): boolean {
75
+ try {
76
+ const bigInt = value.startsWith('0x') ? BigInt(value) : BigInt(value)
77
+ return bigInt >= 0n && bigInt < PALLAS_MODULUS
78
+ } catch {
79
+ return false
80
+ }
81
+ }
82
+
83
+ // ─── Kimchi Proof Converter ──────────────────────────────────────────────────
84
+
85
+ /**
86
+ * Converter for Kimchi proofs (Mina Protocol)
87
+ *
88
+ * Kimchi is the proving system used by Mina Protocol, using Pasta curves
89
+ * (Pallas and Vesta) for efficient recursive composition.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const converter = new KimchiProofConverter()
94
+ *
95
+ * // Convert to SIP format
96
+ * const result = converter.toSIP(kimchiProof)
97
+ * if (result.success) {
98
+ * console.log('SIP Proof:', result.result)
99
+ * }
100
+ * ```
101
+ */
102
+ export class KimchiProofConverter implements ProofConverter<KimchiNativeProof> {
103
+ readonly system = 'kimchi' as const
104
+ readonly version = CONVERTER_VERSION
105
+
106
+ /**
107
+ * Convert Kimchi native proof to SIP unified format
108
+ */
109
+ toSIP(
110
+ nativeProof: KimchiNativeProof,
111
+ options: ConversionOptions = {},
112
+ ): ConversionResult<SingleProof> {
113
+ const opts = { ...DEFAULT_CONVERSION_OPTIONS, ...options }
114
+ const startTime = Date.now()
115
+
116
+ try {
117
+ // Validate if requested
118
+ if (opts.validateBeforeConversion) {
119
+ const validation = this.validateNative(nativeProof)
120
+ if (!validation.valid) {
121
+ return this._createErrorResult(
122
+ new InvalidProofError('kimchi', 'sip', validation.errors),
123
+ startTime,
124
+ nativeProof.proofData.length,
125
+ )
126
+ }
127
+ }
128
+
129
+ // Check version support
130
+ if (nativeProof.kimchiVersion && !isSupportedKimchiVersion(nativeProof.kimchiVersion)) {
131
+ return this._createErrorResult(
132
+ new UnsupportedVersionError('kimchi', nativeProof.kimchiVersion, SUPPORTED_KIMCHI_VERSIONS),
133
+ startTime,
134
+ nativeProof.proofData.length,
135
+ )
136
+ }
137
+
138
+ // Convert proof data to hex
139
+ const proofHex = bytesToHex(nativeProof.proofData)
140
+
141
+ // Convert public inputs to hex format
142
+ // Kimchi uses Pasta field elements, ensure proper encoding
143
+ const publicInputsHex = nativeProof.publicInputs.map(input => {
144
+ if (input.startsWith('0x')) {
145
+ return input as HexString
146
+ }
147
+ const bigInt = BigInt(input)
148
+ // Pad to 64 chars (32 bytes) for consistency
149
+ return ('0x' + bigInt.toString(16).padStart(64, '0')) as HexString
150
+ })
151
+
152
+ // Convert verification key if present
153
+ const verificationKey = opts.includeVerificationKey && nativeProof.verificationKey
154
+ ? (typeof nativeProof.verificationKey === 'string'
155
+ ? nativeProof.verificationKey as HexString
156
+ : bytesToHex(nativeProof.verificationKey))
157
+ : undefined
158
+
159
+ // Build circuit identifier
160
+ const circuitId = nativeProof.verifierIndexCommitment
161
+ ? `kimchi-${nativeProof.verifierIndexCommitment.slice(0, 16)}`
162
+ : 'kimchi-unknown'
163
+
164
+ // Build metadata
165
+ const metadata: ProofMetadata = {
166
+ system: 'kimchi',
167
+ systemVersion: nativeProof.kimchiVersion || 'unknown',
168
+ circuitId,
169
+ circuitVersion: nativeProof.srsHash || 'unknown',
170
+ generatedAt: Date.now(),
171
+ proofSizeBytes: nativeProof.proofData.length,
172
+ targetChainId: opts.targetChainId || undefined,
173
+ }
174
+
175
+ // Build SIP proof
176
+ const sipProof: SingleProof = {
177
+ id: opts.idGenerator(),
178
+ proof: proofHex,
179
+ publicInputs: publicInputsHex,
180
+ verificationKey,
181
+ metadata,
182
+ }
183
+
184
+ const outputSize = proofHex.length / 2 - 1
185
+
186
+ return {
187
+ success: true,
188
+ result: sipProof,
189
+ lossless: true,
190
+ warnings: this._collectWarnings(nativeProof),
191
+ conversionMetadata: this._createConversionMetadata(
192
+ 'kimchi',
193
+ 'sip',
194
+ startTime,
195
+ nativeProof.proofData.length,
196
+ outputSize,
197
+ ),
198
+ }
199
+ } catch (error) {
200
+ return this._createErrorResult(
201
+ error instanceof ProofConversionError
202
+ ? error
203
+ : new ProofConversionError(
204
+ 'UNKNOWN_ERROR',
205
+ error instanceof Error ? error.message : 'Unknown conversion error',
206
+ 'kimchi',
207
+ 'sip',
208
+ error instanceof Error ? error : undefined,
209
+ ),
210
+ startTime,
211
+ nativeProof.proofData.length,
212
+ )
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Convert SIP unified format to Kimchi native proof
218
+ */
219
+ fromSIP(
220
+ sipProof: SingleProof,
221
+ options: ConversionOptions = {},
222
+ ): ConversionResult<KimchiNativeProof> {
223
+ const opts = { ...DEFAULT_CONVERSION_OPTIONS, ...options }
224
+ const startTime = Date.now()
225
+ const inputSize = sipProof.proof.length / 2 - 1
226
+
227
+ try {
228
+ // Check if this is a Kimchi proof
229
+ if (!this.canConvertFromSIP(sipProof)) {
230
+ return this._createErrorResult(
231
+ new ProofConversionError(
232
+ 'INVALID_INPUT',
233
+ `Cannot convert proof from system: ${sipProof.metadata.system}`,
234
+ sipProof.metadata.system,
235
+ 'kimchi',
236
+ ),
237
+ startTime,
238
+ inputSize,
239
+ )
240
+ }
241
+
242
+ // Convert proof hex to bytes
243
+ const proofData = hexToBytes(sipProof.proof)
244
+
245
+ // Convert public inputs from hex to field element strings
246
+ const publicInputs = sipProof.publicInputs.map(hex => {
247
+ const bigInt = BigInt(hex)
248
+ return bigInt.toString()
249
+ })
250
+
251
+ // Convert verification key if present
252
+ const verificationKey = sipProof.verificationKey
253
+ ? hexToBytes(sipProof.verificationKey)
254
+ : undefined
255
+
256
+ // Extract verifier index from circuit ID if present
257
+ const verifierMatch = sipProof.metadata.circuitId.match(/kimchi-(.+)/)
258
+ const verifierIndexCommitment = verifierMatch && verifierMatch[1] !== 'unknown'
259
+ ? ('0x' + verifierMatch[1]) as HexString
260
+ : undefined
261
+
262
+ // Build native proof
263
+ const nativeProof: KimchiNativeProof = {
264
+ system: 'kimchi',
265
+ proofData,
266
+ publicInputs,
267
+ verificationKey,
268
+ srsHash: sipProof.metadata.circuitVersion !== 'unknown'
269
+ ? sipProof.metadata.circuitVersion as HexString
270
+ : undefined,
271
+ kimchiVersion: sipProof.metadata.systemVersion,
272
+ verifierIndexCommitment,
273
+ nativeMetadata: opts.preserveNativeMetadata ? {
274
+ sipProofId: sipProof.id,
275
+ originalMetadata: sipProof.metadata,
276
+ } : undefined,
277
+ }
278
+
279
+ return {
280
+ success: true,
281
+ result: nativeProof,
282
+ lossless: true,
283
+ warnings: [],
284
+ conversionMetadata: this._createConversionMetadata(
285
+ 'sip' as any,
286
+ 'kimchi',
287
+ startTime,
288
+ inputSize,
289
+ proofData.length,
290
+ ),
291
+ }
292
+ } catch (error) {
293
+ return this._createErrorResult(
294
+ error instanceof ProofConversionError
295
+ ? error
296
+ : new ProofConversionError(
297
+ 'UNKNOWN_ERROR',
298
+ error instanceof Error ? error.message : 'Unknown conversion error',
299
+ 'kimchi',
300
+ 'sip',
301
+ error instanceof Error ? error : undefined,
302
+ ),
303
+ startTime,
304
+ inputSize,
305
+ )
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Validate a Kimchi native proof structure
311
+ */
312
+ validateNative(nativeProof: KimchiNativeProof): ValidationResult {
313
+ const errors: ValidationError[] = []
314
+ const warnings: string[] = []
315
+
316
+ // Check required fields
317
+ if (!nativeProof.proofData || nativeProof.proofData.length === 0) {
318
+ errors.push({
319
+ field: 'proofData',
320
+ message: 'Proof data is required and must not be empty',
321
+ code: 'REQUIRED_FIELD',
322
+ })
323
+ }
324
+
325
+ if (!nativeProof.publicInputs) {
326
+ errors.push({
327
+ field: 'publicInputs',
328
+ message: 'Public inputs array is required',
329
+ code: 'REQUIRED_FIELD',
330
+ })
331
+ }
332
+
333
+ // Validate public inputs are valid Pasta field elements
334
+ if (nativeProof.publicInputs) {
335
+ for (let i = 0; i < nativeProof.publicInputs.length; i++) {
336
+ const input = nativeProof.publicInputs[i]
337
+ if (!isValidPastaFieldElement(input)) {
338
+ errors.push({
339
+ field: `publicInputs[${i}]`,
340
+ message: `Invalid Pasta field element: ${input}`,
341
+ code: 'INVALID_FIELD_ELEMENT',
342
+ })
343
+ }
344
+ }
345
+ }
346
+
347
+ // Validate SRS hash format if present
348
+ if (nativeProof.srsHash) {
349
+ const cleanHash = nativeProof.srsHash.startsWith('0x')
350
+ ? nativeProof.srsHash.slice(2)
351
+ : nativeProof.srsHash
352
+ if (!/^[0-9a-fA-F]+$/.test(cleanHash)) {
353
+ errors.push({
354
+ field: 'srsHash',
355
+ message: 'SRS hash must be a valid hex string',
356
+ code: 'INVALID_FORMAT',
357
+ })
358
+ }
359
+ }
360
+
361
+ // Version warnings
362
+ if (nativeProof.kimchiVersion && !isSupportedKimchiVersion(nativeProof.kimchiVersion)) {
363
+ warnings.push(`Kimchi version ${nativeProof.kimchiVersion} may not be fully supported`)
364
+ }
365
+
366
+ // Missing optional field warnings
367
+ if (!nativeProof.srsHash) {
368
+ warnings.push('No SRS hash provided - proof may not be verifiable without matching SRS')
369
+ }
370
+
371
+ if (!nativeProof.verifierIndexCommitment) {
372
+ warnings.push('No verifier index commitment - proof traceability limited')
373
+ }
374
+
375
+ return {
376
+ valid: errors.length === 0,
377
+ errors,
378
+ warnings,
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Check if a SIP proof can be converted to Kimchi format
384
+ */
385
+ canConvertFromSIP(sipProof: SingleProof): boolean {
386
+ return sipProof.metadata.system === 'kimchi'
387
+ }
388
+
389
+ /**
390
+ * Get supported Kimchi versions
391
+ */
392
+ getSupportedVersions(): string[] {
393
+ return [...SUPPORTED_KIMCHI_VERSIONS]
394
+ }
395
+
396
+ // ─── Private Helpers ─────────────────────────────────────────────────────────
397
+
398
+ private _createConversionMetadata(
399
+ sourceSystem: 'kimchi' | 'sip',
400
+ targetSystem: 'kimchi' | 'sip',
401
+ startTime: number,
402
+ originalSize: number,
403
+ convertedSize: number,
404
+ ): ConversionMetadata {
405
+ return {
406
+ sourceSystem: sourceSystem === 'sip' ? 'kimchi' : sourceSystem,
407
+ targetSystem,
408
+ convertedAt: Date.now(),
409
+ converterVersion: this.version,
410
+ conversionTimeMs: Date.now() - startTime,
411
+ originalSize,
412
+ convertedSize,
413
+ }
414
+ }
415
+
416
+ private _createErrorResult<T>(
417
+ error: ProofConversionError,
418
+ startTime: number,
419
+ inputSize: number,
420
+ ): ConversionResult<T> {
421
+ return {
422
+ success: false,
423
+ error: error.message,
424
+ errorCode: error.code,
425
+ lossless: false,
426
+ conversionMetadata: this._createConversionMetadata(
427
+ error.sourceSystem as any,
428
+ error.targetSystem as any,
429
+ startTime,
430
+ inputSize,
431
+ 0,
432
+ ),
433
+ }
434
+ }
435
+
436
+ private _collectWarnings(nativeProof: KimchiNativeProof): string[] {
437
+ const warnings: string[] = []
438
+
439
+ if (!nativeProof.kimchiVersion) {
440
+ warnings.push('No Kimchi version specified - using unknown')
441
+ }
442
+
443
+ if (!nativeProof.srsHash) {
444
+ warnings.push('No SRS hash - verification may require external SRS')
445
+ }
446
+
447
+ if (!nativeProof.verifierIndexCommitment) {
448
+ warnings.push('No verifier index commitment - traceability limited')
449
+ }
450
+
451
+ return warnings
452
+ }
453
+ }
454
+
455
+ // ─── Factory Function ────────────────────────────────────────────────────────
456
+
457
+ /**
458
+ * Create a new Kimchi proof converter instance
459
+ */
460
+ export function createKimchiConverter(): KimchiProofConverter {
461
+ return new KimchiProofConverter()
462
+ }