@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.
- package/LICENSE +21 -0
- package/README.md +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +48874 -18336
- package/dist/browser.mjs +674 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/chunk-YWGJ77A2.mjs +33806 -0
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/index-DXh2IGkz.d.ts +24681 -0
- package/dist/index-DeE1ZzA4.d.mts +24681 -0
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48676 -17318
- package/dist/index.mjs +583 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +54 -21
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +276 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +201 -0
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +402 -0
- package/src/chains/solana/providers/index.ts +85 -0
- package/src/chains/solana/providers/interface.ts +221 -0
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +790 -0
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +170 -73
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +77 -7
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +37 -0
- package/src/compliance/range-sas.ts +956 -0
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +785 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +336 -0
- package/src/privacy-backends/interface.ts +906 -0
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash-types.ts +278 -0
- package/src/privacy-backends/privacycash.ts +456 -0
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +690 -0
- package/src/privacy-backends/router.ts +626 -0
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +256 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +111 -30
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- package/src/surveillance/algorithms/address-reuse.ts +143 -0
- package/src/surveillance/algorithms/cluster.ts +247 -0
- package/src/surveillance/algorithms/exchange.ts +295 -0
- package/src/surveillance/algorithms/temporal.ts +337 -0
- package/src/surveillance/analyzer.ts +442 -0
- package/src/surveillance/index.ts +64 -0
- package/src/surveillance/scoring.ts +372 -0
- package/src/surveillance/types.ts +264 -0
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-Q4NAVBTS.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
|
+
}
|