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