@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.
- 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 +47556 -19603
- package/dist/browser.mjs +628 -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-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
- 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-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
- package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48396 -19623
- package/dist/index.mjs +537 -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 +252 -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 +47 -6
- 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 +186 -33
- package/src/chains/solana/providers/index.ts +31 -0
- package/src/chains/solana/providers/interface.ts +61 -18
- 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 +338 -67
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +83 -66
- 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 +57 -6
- 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 +23 -0
- package/src/compliance/range-sas.ts +398 -33
- 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 +686 -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 +254 -4
- package/src/privacy-backends/interface.ts +649 -6
- 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.ts +13 -17
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +414 -2
- package/src/privacy-backends/router.ts +283 -3
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +3 -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 +110 -29
- 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/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-2XIVXWHA.mjs +0 -1930
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-7RFRWDCW.mjs +0 -1504
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-F6F73W35.mjs +0 -16166
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-OFDBEIEK.mjs +0 -16166
- package/dist/chunk-SF7YSLF5.mjs +0 -1515
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/chunk-WWUSGOXE.mjs +0 -17129
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-B71aXVzk.d.ts +0 -13264
- 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-pOIIuwfV.d.mts +0 -13264
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-4O4K45VU.mjs +0 -46
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-NDABAZ6P.mjs +0 -56
- package/dist/solana-Q4NAVBTS.mjs +0 -46
- package/dist/solana-ZYO63LY5.mjs +0 -46
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arcium SDK Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the @arcium-hq/client and @arcium-hq/reader packages.
|
|
5
|
+
* Arcium provides MPC (Multi-Party Computation) for encrypted computation on Solana.
|
|
6
|
+
*
|
|
7
|
+
* ## Architecture
|
|
8
|
+
*
|
|
9
|
+
* - **Client SDK**: Handles encryption/decryption and computation submission
|
|
10
|
+
* - **Reader SDK**: Queries computation state and subscribes to updates
|
|
11
|
+
* - **MPC Nodes**: Process encrypted data without seeing plaintext
|
|
12
|
+
*
|
|
13
|
+
* @see https://docs.arcium.com/developers
|
|
14
|
+
* @see https://ts.arcium.com/api
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { CipherType, ComputationStatus } from './interface'
|
|
18
|
+
import { SIPError, ErrorCode } from '../errors'
|
|
19
|
+
|
|
20
|
+
// ─── Re-export from interface ────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
export type { CipherType, ComputationStatus }
|
|
23
|
+
|
|
24
|
+
// ─── Arcium-Specific Types ───────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Arcium network configuration
|
|
28
|
+
*/
|
|
29
|
+
export type ArciumNetwork = 'devnet' | 'testnet' | 'mainnet-beta'
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Configuration for Arcium SDK connection
|
|
33
|
+
*/
|
|
34
|
+
export interface ArciumConfig {
|
|
35
|
+
/** Solana RPC endpoint URL */
|
|
36
|
+
rpcUrl: string
|
|
37
|
+
/** Network type */
|
|
38
|
+
network: ArciumNetwork
|
|
39
|
+
/** Default MPC cluster to use */
|
|
40
|
+
cluster?: string
|
|
41
|
+
/** Default cipher for encryption */
|
|
42
|
+
defaultCipher?: CipherType
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* MPC cluster information
|
|
47
|
+
*
|
|
48
|
+
* Clusters are groups of MPC nodes that coordinate computation.
|
|
49
|
+
*/
|
|
50
|
+
export interface ArciumCluster {
|
|
51
|
+
/** Cluster identifier */
|
|
52
|
+
id: string
|
|
53
|
+
/** Human-readable cluster name */
|
|
54
|
+
name: string
|
|
55
|
+
/** Number of MPC nodes in the cluster */
|
|
56
|
+
nodes: number
|
|
57
|
+
/** Cluster operational status */
|
|
58
|
+
status: 'active' | 'inactive' | 'maintenance'
|
|
59
|
+
/** Minimum nodes required for computation */
|
|
60
|
+
threshold: number
|
|
61
|
+
/** Supported cipher types */
|
|
62
|
+
supportedCiphers: CipherType[]
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Circuit definition for MPC computation
|
|
67
|
+
*
|
|
68
|
+
* Circuits define the computation logic that runs on encrypted data.
|
|
69
|
+
*/
|
|
70
|
+
export interface ArciumCircuit {
|
|
71
|
+
/** Circuit identifier */
|
|
72
|
+
id: string
|
|
73
|
+
/** Human-readable circuit name */
|
|
74
|
+
name: string
|
|
75
|
+
/** Number of encrypted inputs */
|
|
76
|
+
inputCount: number
|
|
77
|
+
/** Number of outputs */
|
|
78
|
+
outputCount: number
|
|
79
|
+
/** Circuit version */
|
|
80
|
+
version?: string
|
|
81
|
+
/** Circuit description */
|
|
82
|
+
description?: string
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Parameters for submitting a computation to Arcium
|
|
87
|
+
*/
|
|
88
|
+
export interface SubmitComputationParams {
|
|
89
|
+
/** Circuit to execute */
|
|
90
|
+
circuitId: string
|
|
91
|
+
/** Encrypted input data */
|
|
92
|
+
encryptedInputs: Uint8Array[]
|
|
93
|
+
/** MPC cluster to use */
|
|
94
|
+
cluster: string
|
|
95
|
+
/** Callback program address for results */
|
|
96
|
+
callback?: string
|
|
97
|
+
/** Priority level (affects ordering) */
|
|
98
|
+
priority?: 'low' | 'normal' | 'high'
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Result from a completed computation
|
|
103
|
+
*/
|
|
104
|
+
export interface ComputationOutput {
|
|
105
|
+
/** Unique computation identifier */
|
|
106
|
+
computationId: string
|
|
107
|
+
/** Decrypted output data */
|
|
108
|
+
output: Uint8Array
|
|
109
|
+
/** Proof of correct computation */
|
|
110
|
+
proof: string
|
|
111
|
+
/** Completion timestamp */
|
|
112
|
+
timestamp: number
|
|
113
|
+
/** Cluster that processed the computation */
|
|
114
|
+
cluster: string
|
|
115
|
+
/** Number of MPC nodes that participated */
|
|
116
|
+
participatingNodes: number
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Computation state information
|
|
121
|
+
*/
|
|
122
|
+
export interface ComputationInfo {
|
|
123
|
+
/** Computation identifier */
|
|
124
|
+
id: string
|
|
125
|
+
/** Current status */
|
|
126
|
+
status: ComputationStatus
|
|
127
|
+
/** Circuit being executed */
|
|
128
|
+
circuitId: string
|
|
129
|
+
/** Cluster processing the computation */
|
|
130
|
+
cluster: string
|
|
131
|
+
/** Submission timestamp */
|
|
132
|
+
submittedAt: number
|
|
133
|
+
/** Completion timestamp (if completed) */
|
|
134
|
+
completedAt?: number
|
|
135
|
+
/** Error message (if failed) */
|
|
136
|
+
error?: string
|
|
137
|
+
/** Progress percentage (0-100) */
|
|
138
|
+
progress?: number
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Encryption result from the client SDK
|
|
143
|
+
*/
|
|
144
|
+
export interface EncryptionResult {
|
|
145
|
+
/** Encrypted data */
|
|
146
|
+
ciphertext: Uint8Array
|
|
147
|
+
/** Cipher type used */
|
|
148
|
+
cipher: CipherType
|
|
149
|
+
/** Encryption nonce/IV */
|
|
150
|
+
nonce: Uint8Array
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Decryption result from the client SDK
|
|
155
|
+
*/
|
|
156
|
+
export interface DecryptionResult {
|
|
157
|
+
/** Decrypted plaintext */
|
|
158
|
+
plaintext: Uint8Array
|
|
159
|
+
/** Whether decryption was verified */
|
|
160
|
+
verified: boolean
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ─── SDK Interfaces ──────────────────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Arcium Client SDK interface
|
|
167
|
+
*
|
|
168
|
+
* The actual SDK is @arcium-hq/client.
|
|
169
|
+
* This interface defines the expected API for our adapter.
|
|
170
|
+
*/
|
|
171
|
+
export interface IArciumClient {
|
|
172
|
+
/**
|
|
173
|
+
* Initialize connection to Arcium network
|
|
174
|
+
*/
|
|
175
|
+
connect(config: ArciumConfig): Promise<void>
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Disconnect from Arcium network
|
|
179
|
+
*/
|
|
180
|
+
disconnect(): Promise<void>
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Encrypt data for MPC computation
|
|
184
|
+
*
|
|
185
|
+
* @param data - Plaintext data to encrypt
|
|
186
|
+
* @param cipher - Cipher type to use
|
|
187
|
+
* @returns Encrypted data
|
|
188
|
+
*/
|
|
189
|
+
encrypt(data: Uint8Array, cipher: CipherType): Promise<EncryptionResult>
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Decrypt computation output
|
|
193
|
+
*
|
|
194
|
+
* @param ciphertext - Encrypted data
|
|
195
|
+
* @returns Decrypted data
|
|
196
|
+
*/
|
|
197
|
+
decrypt(ciphertext: Uint8Array): Promise<DecryptionResult>
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Upload a circuit definition
|
|
201
|
+
*
|
|
202
|
+
* @param circuit - Circuit to upload
|
|
203
|
+
* @returns Circuit ID
|
|
204
|
+
*/
|
|
205
|
+
uploadCircuit(circuit: ArciumCircuit): Promise<string>
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Submit a computation to the MPC network
|
|
209
|
+
*
|
|
210
|
+
* @param params - Computation parameters
|
|
211
|
+
* @returns Computation ID for tracking
|
|
212
|
+
*/
|
|
213
|
+
submitComputation(params: SubmitComputationParams): Promise<string>
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Wait for computation to complete
|
|
217
|
+
*
|
|
218
|
+
* @param computationId - Computation to wait for
|
|
219
|
+
* @param timeout - Optional timeout in milliseconds
|
|
220
|
+
* @returns Computation output
|
|
221
|
+
*/
|
|
222
|
+
awaitFinalization(
|
|
223
|
+
computationId: string,
|
|
224
|
+
timeout?: number
|
|
225
|
+
): Promise<ComputationOutput>
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Get computation status
|
|
229
|
+
*
|
|
230
|
+
* @param computationId - Computation to check
|
|
231
|
+
* @returns Current status
|
|
232
|
+
*/
|
|
233
|
+
getComputationStatus(computationId: string): Promise<ComputationStatus>
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Get detailed computation info
|
|
237
|
+
*
|
|
238
|
+
* @param computationId - Computation to query
|
|
239
|
+
* @returns Full computation info
|
|
240
|
+
*/
|
|
241
|
+
getComputationInfo(computationId: string): Promise<ComputationInfo>
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* List available MPC clusters
|
|
245
|
+
*
|
|
246
|
+
* @returns Array of available clusters
|
|
247
|
+
*/
|
|
248
|
+
listClusters(): Promise<ArciumCluster[]>
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get cluster by ID
|
|
252
|
+
*
|
|
253
|
+
* @param clusterId - Cluster identifier
|
|
254
|
+
* @returns Cluster info
|
|
255
|
+
*/
|
|
256
|
+
getCluster(clusterId: string): Promise<ArciumCluster>
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Arcium Reader SDK interface
|
|
261
|
+
*
|
|
262
|
+
* The actual SDK is @arcium-hq/reader.
|
|
263
|
+
* This interface defines the expected API for querying state.
|
|
264
|
+
*/
|
|
265
|
+
export interface IArciumReader {
|
|
266
|
+
/**
|
|
267
|
+
* Get computation account info
|
|
268
|
+
*
|
|
269
|
+
* @param computationId - Computation identifier
|
|
270
|
+
* @returns Computation info
|
|
271
|
+
*/
|
|
272
|
+
getComputationAccInfo(computationId: string): Promise<ComputationInfo>
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Subscribe to computation updates
|
|
276
|
+
*
|
|
277
|
+
* @param computationId - Computation to watch
|
|
278
|
+
* @param callback - Called on status changes
|
|
279
|
+
* @returns Unsubscribe function
|
|
280
|
+
*/
|
|
281
|
+
subscribeComputation(
|
|
282
|
+
computationId: string,
|
|
283
|
+
callback: (info: ComputationInfo) => void
|
|
284
|
+
): () => void
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Get cluster account info
|
|
288
|
+
*
|
|
289
|
+
* @param clusterId - Cluster identifier
|
|
290
|
+
* @returns Cluster info
|
|
291
|
+
*/
|
|
292
|
+
getClusterAccInfo(clusterId: string): Promise<ArciumCluster>
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Default Arcium clusters on different networks
|
|
299
|
+
*/
|
|
300
|
+
export const ARCIUM_CLUSTERS: Record<ArciumNetwork, string> = {
|
|
301
|
+
devnet: 'devnet-cluster-1',
|
|
302
|
+
testnet: 'testnet-cluster-1',
|
|
303
|
+
'mainnet-beta': 'mainnet-cluster-1',
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Arcium program addresses on Solana
|
|
308
|
+
*
|
|
309
|
+
* NOTE: These are PLACEHOLDER addresses for type safety only.
|
|
310
|
+
* Real program IDs come from @arcium-hq/client SDK at runtime.
|
|
311
|
+
* The PLACEHOLDER prefix makes them obviously invalid to prevent
|
|
312
|
+
* accidental use in production or devnet testing.
|
|
313
|
+
*/
|
|
314
|
+
export const ARCIUM_PROGRAM_IDS: Record<ArciumNetwork, string> = {
|
|
315
|
+
devnet: 'PLACEHLDRArciumDevnet11111111111111111111111',
|
|
316
|
+
testnet: 'PLACEHLDRArciumTestnet1111111111111111111111',
|
|
317
|
+
'mainnet-beta': 'PLACEHLDRArciumMainnet1111111111111111111111',
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Default timeout for computation finalization (5 minutes)
|
|
322
|
+
*/
|
|
323
|
+
export const DEFAULT_COMPUTATION_TIMEOUT_MS = 300_000
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Estimated time for MPC computation (varies by circuit complexity)
|
|
327
|
+
*/
|
|
328
|
+
export const ESTIMATED_COMPUTATION_TIME_MS = 60_000
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Base cost for Arcium computation (in lamports)
|
|
332
|
+
* Actual cost depends on circuit complexity and cluster fees
|
|
333
|
+
*/
|
|
334
|
+
export const BASE_COMPUTATION_COST_LAMPORTS = BigInt(50_000_000) // ~0.05 SOL
|
|
335
|
+
|
|
336
|
+
// ─── Cost Calculation Constants ───────────────────────────────────────────────
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Cost per encrypted input in lamports (~0.001 SOL)
|
|
340
|
+
* Used in computation cost estimation
|
|
341
|
+
*/
|
|
342
|
+
export const COST_PER_ENCRYPTED_INPUT_LAMPORTS = BigInt(1_000_000)
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Cost per kilobyte of input data in lamports (~0.0005 SOL)
|
|
346
|
+
* Used in computation cost estimation for larger payloads
|
|
347
|
+
*/
|
|
348
|
+
export const COST_PER_INPUT_KB_LAMPORTS = BigInt(500_000)
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Bytes per kilobyte for size calculations
|
|
352
|
+
* Using 1000 (SI standard) rather than 1024 (binary)
|
|
353
|
+
*/
|
|
354
|
+
export const BYTES_PER_KB = 1000
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Solana slot time in milliseconds
|
|
358
|
+
* Average time between Solana slots (~400ms)
|
|
359
|
+
* @see https://docs.solana.com/cluster/synchronization
|
|
360
|
+
*/
|
|
361
|
+
export const SOLANA_SLOT_TIME_MS = 400
|
|
362
|
+
|
|
363
|
+
// ─── Upper Bound Validation Constants ─────────────────────────────────────────
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Default maximum number of encrypted inputs per computation
|
|
367
|
+
* Prevents excessive MPC coordination overhead
|
|
368
|
+
*/
|
|
369
|
+
export const DEFAULT_MAX_ENCRYPTED_INPUTS = 100
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* @deprecated Use DEFAULT_MAX_ENCRYPTED_INPUTS instead
|
|
373
|
+
*/
|
|
374
|
+
export const MAX_ENCRYPTED_INPUTS = DEFAULT_MAX_ENCRYPTED_INPUTS
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Default maximum size of a single encrypted input (1 MB)
|
|
378
|
+
* Prevents memory exhaustion during encryption/decryption
|
|
379
|
+
*/
|
|
380
|
+
export const DEFAULT_MAX_INPUT_SIZE_BYTES = 1_048_576
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* @deprecated Use DEFAULT_MAX_INPUT_SIZE_BYTES instead
|
|
384
|
+
*/
|
|
385
|
+
export const MAX_INPUT_SIZE_BYTES = DEFAULT_MAX_INPUT_SIZE_BYTES
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Default maximum total size of all inputs combined (10 MB)
|
|
389
|
+
* Prevents excessive network/computation load
|
|
390
|
+
*/
|
|
391
|
+
export const DEFAULT_MAX_TOTAL_INPUT_SIZE_BYTES = 10_485_760
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* @deprecated Use DEFAULT_MAX_TOTAL_INPUT_SIZE_BYTES instead
|
|
395
|
+
*/
|
|
396
|
+
export const MAX_TOTAL_INPUT_SIZE_BYTES = DEFAULT_MAX_TOTAL_INPUT_SIZE_BYTES
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Default maximum reasonable computation cost (~1 SOL)
|
|
400
|
+
* Prevents overflow and unreasonable cost estimates
|
|
401
|
+
*/
|
|
402
|
+
export const DEFAULT_MAX_COMPUTATION_COST_LAMPORTS = BigInt(1_000_000_000)
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* @deprecated Use DEFAULT_MAX_COMPUTATION_COST_LAMPORTS instead
|
|
406
|
+
*/
|
|
407
|
+
export const MAX_COMPUTATION_COST_LAMPORTS = DEFAULT_MAX_COMPUTATION_COST_LAMPORTS
|
|
408
|
+
|
|
409
|
+
// ─── Configurable Limits Types ────────────────────────────────────────────────
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Configuration for Arcium validation limits.
|
|
413
|
+
* All fields are optional - defaults from DEFAULT_* constants are used if not specified.
|
|
414
|
+
*/
|
|
415
|
+
export interface ArciumLimitsConfig {
|
|
416
|
+
/** Maximum number of encrypted inputs per computation */
|
|
417
|
+
maxEncryptedInputs?: number
|
|
418
|
+
/** Maximum size of a single encrypted input in bytes */
|
|
419
|
+
maxInputSizeBytes?: number
|
|
420
|
+
/** Maximum total size of all inputs combined in bytes */
|
|
421
|
+
maxTotalInputSizeBytes?: number
|
|
422
|
+
/** Maximum computation cost in lamports */
|
|
423
|
+
maxComputationCostLamports?: bigint
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Resolved limits configuration with all values set.
|
|
428
|
+
* Used internally after merging user config with defaults.
|
|
429
|
+
*/
|
|
430
|
+
export interface ArciumLimitsResolved {
|
|
431
|
+
maxEncryptedInputs: number
|
|
432
|
+
maxInputSizeBytes: number
|
|
433
|
+
maxTotalInputSizeBytes: number
|
|
434
|
+
maxComputationCostLamports: bigint
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// ─── Error Types ──────────────────────────────────────────────────────────────
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Arcium-specific error codes
|
|
441
|
+
*/
|
|
442
|
+
export type ArciumErrorCode =
|
|
443
|
+
| 'ARCIUM_ERROR'
|
|
444
|
+
| 'ARCIUM_INVALID_NETWORK'
|
|
445
|
+
| 'ARCIUM_COMPUTATION_FAILED'
|
|
446
|
+
| 'ARCIUM_COMPUTATION_TIMEOUT'
|
|
447
|
+
| 'ARCIUM_CLUSTER_UNAVAILABLE'
|
|
448
|
+
| 'ARCIUM_CIRCUIT_NOT_FOUND'
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Error thrown by Arcium backend operations
|
|
452
|
+
*
|
|
453
|
+
* Extends SIPError with Arcium-specific context and error codes.
|
|
454
|
+
*
|
|
455
|
+
* @example
|
|
456
|
+
* ```typescript
|
|
457
|
+
* throw new ArciumError('Invalid network', 'ARCIUM_INVALID_NETWORK', {
|
|
458
|
+
* context: { network: 'invalid', validNetworks: ['devnet', 'testnet', 'mainnet-beta'] }
|
|
459
|
+
* })
|
|
460
|
+
* ```
|
|
461
|
+
*/
|
|
462
|
+
export class ArciumError extends SIPError {
|
|
463
|
+
/** Arcium-specific error code */
|
|
464
|
+
readonly arciumCode: ArciumErrorCode
|
|
465
|
+
|
|
466
|
+
/** Network where error occurred */
|
|
467
|
+
readonly network?: ArciumNetwork
|
|
468
|
+
|
|
469
|
+
/** Computation ID if applicable */
|
|
470
|
+
readonly computationId?: string
|
|
471
|
+
|
|
472
|
+
/** Cluster involved if applicable */
|
|
473
|
+
readonly cluster?: string
|
|
474
|
+
|
|
475
|
+
constructor(
|
|
476
|
+
message: string,
|
|
477
|
+
arciumCode: ArciumErrorCode = 'ARCIUM_ERROR',
|
|
478
|
+
options?: {
|
|
479
|
+
cause?: Error
|
|
480
|
+
context?: Record<string, unknown>
|
|
481
|
+
network?: ArciumNetwork
|
|
482
|
+
computationId?: string
|
|
483
|
+
cluster?: string
|
|
484
|
+
}
|
|
485
|
+
) {
|
|
486
|
+
// Map Arcium code to SIP error code
|
|
487
|
+
let sipCode: ErrorCode
|
|
488
|
+
switch (arciumCode) {
|
|
489
|
+
case 'ARCIUM_INVALID_NETWORK':
|
|
490
|
+
sipCode = ErrorCode.ARCIUM_INVALID_NETWORK
|
|
491
|
+
break
|
|
492
|
+
case 'ARCIUM_COMPUTATION_FAILED':
|
|
493
|
+
sipCode = ErrorCode.ARCIUM_COMPUTATION_FAILED
|
|
494
|
+
break
|
|
495
|
+
case 'ARCIUM_COMPUTATION_TIMEOUT':
|
|
496
|
+
sipCode = ErrorCode.ARCIUM_COMPUTATION_TIMEOUT
|
|
497
|
+
break
|
|
498
|
+
case 'ARCIUM_CLUSTER_UNAVAILABLE':
|
|
499
|
+
sipCode = ErrorCode.ARCIUM_CLUSTER_UNAVAILABLE
|
|
500
|
+
break
|
|
501
|
+
case 'ARCIUM_CIRCUIT_NOT_FOUND':
|
|
502
|
+
sipCode = ErrorCode.ARCIUM_CIRCUIT_NOT_FOUND
|
|
503
|
+
break
|
|
504
|
+
default:
|
|
505
|
+
sipCode = ErrorCode.ARCIUM_ERROR
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
super(message, sipCode, options)
|
|
509
|
+
this.name = 'ArciumError'
|
|
510
|
+
this.arciumCode = arciumCode
|
|
511
|
+
this.network = options?.network
|
|
512
|
+
this.computationId = options?.computationId
|
|
513
|
+
this.cluster = options?.cluster
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Check if this is a network configuration error
|
|
518
|
+
*/
|
|
519
|
+
isNetworkError(): boolean {
|
|
520
|
+
return this.arciumCode === 'ARCIUM_INVALID_NETWORK'
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Check if this is a computation-related error
|
|
525
|
+
*/
|
|
526
|
+
isComputationError(): boolean {
|
|
527
|
+
return (
|
|
528
|
+
this.arciumCode === 'ARCIUM_COMPUTATION_FAILED' ||
|
|
529
|
+
this.arciumCode === 'ARCIUM_COMPUTATION_TIMEOUT'
|
|
530
|
+
)
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Check if this is a cluster-related error
|
|
535
|
+
*/
|
|
536
|
+
isClusterError(): boolean {
|
|
537
|
+
return this.arciumCode === 'ARCIUM_CLUSTER_UNAVAILABLE'
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Check if an error is an ArciumError
|
|
543
|
+
*/
|
|
544
|
+
export function isArciumError(error: unknown): error is ArciumError {
|
|
545
|
+
return error instanceof ArciumError
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// ─── Environment Variable Configuration ──────────────────────────────────────
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* Environment variable names for Arcium configuration
|
|
552
|
+
*
|
|
553
|
+
* Allows runtime override of SDK settings without code changes.
|
|
554
|
+
* Priority: network-specific env → generic env → config → default
|
|
555
|
+
*
|
|
556
|
+
* @example
|
|
557
|
+
* ```bash
|
|
558
|
+
* # Generic RPC URL (used if network-specific not set)
|
|
559
|
+
* export ARCIUM_RPC_URL=https://my-rpc.example.com
|
|
560
|
+
*
|
|
561
|
+
* # Network-specific RPC URLs (highest priority)
|
|
562
|
+
* export ARCIUM_RPC_URL_DEVNET=https://devnet.my-rpc.example.com
|
|
563
|
+
* export ARCIUM_RPC_URL_MAINNET=https://mainnet.my-rpc.example.com
|
|
564
|
+
*
|
|
565
|
+
* # Other settings
|
|
566
|
+
* export ARCIUM_NETWORK=devnet
|
|
567
|
+
* export ARCIUM_TIMEOUT_MS=600000
|
|
568
|
+
* ```
|
|
569
|
+
*/
|
|
570
|
+
export const ARCIUM_ENV_VARS = {
|
|
571
|
+
/** Generic RPC URL (fallback if network-specific not set) */
|
|
572
|
+
RPC_URL: 'ARCIUM_RPC_URL',
|
|
573
|
+
/** Devnet-specific RPC URL */
|
|
574
|
+
RPC_URL_DEVNET: 'ARCIUM_RPC_URL_DEVNET',
|
|
575
|
+
/** Testnet-specific RPC URL */
|
|
576
|
+
RPC_URL_TESTNET: 'ARCIUM_RPC_URL_TESTNET',
|
|
577
|
+
/** Mainnet-specific RPC URL */
|
|
578
|
+
RPC_URL_MAINNET: 'ARCIUM_RPC_URL_MAINNET',
|
|
579
|
+
/** Default network */
|
|
580
|
+
NETWORK: 'ARCIUM_NETWORK',
|
|
581
|
+
/** Default MPC cluster */
|
|
582
|
+
CLUSTER: 'ARCIUM_CLUSTER',
|
|
583
|
+
/** Default cipher type */
|
|
584
|
+
CIPHER: 'ARCIUM_CIPHER',
|
|
585
|
+
/** Computation timeout in milliseconds */
|
|
586
|
+
TIMEOUT_MS: 'ARCIUM_TIMEOUT_MS',
|
|
587
|
+
} as const
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* Default Solana RPC endpoints per network
|
|
591
|
+
*
|
|
592
|
+
* Used as fallback when no env var or config is provided.
|
|
593
|
+
*/
|
|
594
|
+
export const DEFAULT_RPC_ENDPOINTS: Record<ArciumNetwork, string> = {
|
|
595
|
+
devnet: 'https://api.devnet.solana.com',
|
|
596
|
+
testnet: 'https://api.testnet.solana.com',
|
|
597
|
+
'mainnet-beta': 'https://api.mainnet-beta.solana.com',
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Get environment variable value (cross-platform)
|
|
602
|
+
*
|
|
603
|
+
* Works in both Node.js and browser environments.
|
|
604
|
+
*
|
|
605
|
+
* @param name - Environment variable name
|
|
606
|
+
* @returns Value if set, undefined otherwise
|
|
607
|
+
*/
|
|
608
|
+
export function getEnvVar(name: string): string | undefined {
|
|
609
|
+
// Node.js environment
|
|
610
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
611
|
+
return process.env[name]
|
|
612
|
+
}
|
|
613
|
+
// Browser environment (globalThis fallback)
|
|
614
|
+
if (typeof globalThis !== 'undefined') {
|
|
615
|
+
const global = globalThis as Record<string, unknown>
|
|
616
|
+
if (global[name] !== undefined) {
|
|
617
|
+
return String(global[name])
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
return undefined
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* Resolve RPC URL with fallback chain
|
|
625
|
+
*
|
|
626
|
+
* Priority: network-specific env → generic env → config → default
|
|
627
|
+
*
|
|
628
|
+
* @param network - Target network
|
|
629
|
+
* @param configUrl - URL from config (optional)
|
|
630
|
+
* @returns Resolved RPC URL
|
|
631
|
+
*
|
|
632
|
+
* @example
|
|
633
|
+
* ```typescript
|
|
634
|
+
* // Uses ARCIUM_RPC_URL_DEVNET if set, else ARCIUM_RPC_URL, else config, else default
|
|
635
|
+
* const rpcUrl = resolveRpcUrl('devnet', config.rpcUrl)
|
|
636
|
+
* ```
|
|
637
|
+
*/
|
|
638
|
+
export function resolveRpcUrl(
|
|
639
|
+
network: ArciumNetwork,
|
|
640
|
+
configUrl?: string
|
|
641
|
+
): string {
|
|
642
|
+
// Map network to its specific env var
|
|
643
|
+
const networkEnvMap: Record<ArciumNetwork, string> = {
|
|
644
|
+
devnet: ARCIUM_ENV_VARS.RPC_URL_DEVNET,
|
|
645
|
+
testnet: ARCIUM_ENV_VARS.RPC_URL_TESTNET,
|
|
646
|
+
'mainnet-beta': ARCIUM_ENV_VARS.RPC_URL_MAINNET,
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// 1. Check network-specific env var (highest priority)
|
|
650
|
+
const networkEnvUrl = getEnvVar(networkEnvMap[network])
|
|
651
|
+
if (networkEnvUrl) {
|
|
652
|
+
return networkEnvUrl
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// 2. Check generic env var
|
|
656
|
+
const genericEnvUrl = getEnvVar(ARCIUM_ENV_VARS.RPC_URL)
|
|
657
|
+
if (genericEnvUrl) {
|
|
658
|
+
return genericEnvUrl
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// 3. Use config value if provided
|
|
662
|
+
if (configUrl) {
|
|
663
|
+
return configUrl
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// 4. Fall back to default
|
|
667
|
+
return DEFAULT_RPC_ENDPOINTS[network]
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/**
|
|
671
|
+
* Resolve network from env or config
|
|
672
|
+
*
|
|
673
|
+
* @param configNetwork - Network from config (optional)
|
|
674
|
+
* @returns Resolved network, defaults to 'devnet'
|
|
675
|
+
*/
|
|
676
|
+
export function resolveNetwork(configNetwork?: ArciumNetwork): ArciumNetwork {
|
|
677
|
+
const envNetwork = getEnvVar(ARCIUM_ENV_VARS.NETWORK)
|
|
678
|
+
if (envNetwork && isValidNetwork(envNetwork)) {
|
|
679
|
+
return envNetwork as ArciumNetwork
|
|
680
|
+
}
|
|
681
|
+
return configNetwork ?? 'devnet'
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
/**
|
|
685
|
+
* Resolve computation timeout from env or config
|
|
686
|
+
*
|
|
687
|
+
* @param configTimeout - Timeout from config in ms (optional)
|
|
688
|
+
* @returns Resolved timeout in ms
|
|
689
|
+
*/
|
|
690
|
+
export function resolveTimeout(configTimeout?: number): number {
|
|
691
|
+
const envTimeout = getEnvVar(ARCIUM_ENV_VARS.TIMEOUT_MS)
|
|
692
|
+
if (envTimeout) {
|
|
693
|
+
const parsed = parseInt(envTimeout, 10)
|
|
694
|
+
if (!isNaN(parsed) && parsed > 0) {
|
|
695
|
+
return parsed
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
return configTimeout ?? DEFAULT_COMPUTATION_TIMEOUT_MS
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
/**
|
|
702
|
+
* Resolve cluster from env or config
|
|
703
|
+
*
|
|
704
|
+
* @param network - Target network (for default cluster selection)
|
|
705
|
+
* @param configCluster - Cluster from config (optional)
|
|
706
|
+
* @returns Resolved cluster ID
|
|
707
|
+
*/
|
|
708
|
+
export function resolveCluster(
|
|
709
|
+
network: ArciumNetwork,
|
|
710
|
+
configCluster?: string
|
|
711
|
+
): string {
|
|
712
|
+
const envCluster = getEnvVar(ARCIUM_ENV_VARS.CLUSTER)
|
|
713
|
+
if (envCluster) {
|
|
714
|
+
return envCluster
|
|
715
|
+
}
|
|
716
|
+
return configCluster ?? ARCIUM_CLUSTERS[network]
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/**
|
|
720
|
+
* Check if a string is a valid ArciumNetwork value
|
|
721
|
+
*
|
|
722
|
+
* @param value - String to validate
|
|
723
|
+
* @returns True if valid network
|
|
724
|
+
*/
|
|
725
|
+
function isValidNetwork(value: string): value is ArciumNetwork {
|
|
726
|
+
return value === 'devnet' || value === 'testnet' || value === 'mainnet-beta'
|
|
727
|
+
}
|