@sip-protocol/sdk 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +267 -0
  2. package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
  3. package/dist/browser.d.mts +10 -4
  4. package/dist/browser.d.ts +10 -4
  5. package/dist/browser.js +47556 -19603
  6. package/dist/browser.mjs +628 -48
  7. package/dist/chunk-4GRJ5MAW.mjs +152 -0
  8. package/dist/chunk-5D7A3L3W.mjs +717 -0
  9. package/dist/chunk-64AYA5F5.mjs +7834 -0
  10. package/dist/chunk-GMDGB22A.mjs +379 -0
  11. package/dist/chunk-I534WKN7.mjs +328 -0
  12. package/dist/chunk-IBZVA5Y7.mjs +1003 -0
  13. package/dist/chunk-PRRZAWJE.mjs +223 -0
  14. package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
  15. package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
  16. package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
  17. package/dist/constants-LHAAUC2T.mjs +51 -0
  18. package/dist/dist-2OGQ7FED.mjs +3957 -0
  19. package/dist/dist-IFHPYLDX.mjs +254 -0
  20. package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
  21. package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
  22. package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
  23. package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
  24. package/dist/index.d.mts +9 -3
  25. package/dist/index.d.ts +9 -3
  26. package/dist/index.js +48396 -19623
  27. package/dist/index.mjs +537 -19
  28. package/dist/interface-Bf7w1PLW.d.mts +679 -0
  29. package/dist/interface-Bf7w1PLW.d.ts +679 -0
  30. package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
  31. package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
  32. package/dist/proofs/halo2.d.mts +151 -0
  33. package/dist/proofs/halo2.d.ts +151 -0
  34. package/dist/proofs/halo2.js +350 -0
  35. package/dist/proofs/halo2.mjs +11 -0
  36. package/dist/proofs/kimchi.d.mts +160 -0
  37. package/dist/proofs/kimchi.d.ts +160 -0
  38. package/dist/proofs/kimchi.js +431 -0
  39. package/dist/proofs/kimchi.mjs +13 -0
  40. package/dist/proofs/noir.d.mts +1 -1
  41. package/dist/proofs/noir.d.ts +1 -1
  42. package/dist/proofs/noir.js +74 -18
  43. package/dist/proofs/noir.mjs +84 -24
  44. package/dist/solana-U3MEGU7W.mjs +280 -0
  45. package/dist/validity_proof-3POXLPNY.mjs +21 -0
  46. package/package.json +44 -11
  47. package/src/adapters/index.ts +41 -0
  48. package/src/adapters/jupiter.ts +571 -0
  49. package/src/adapters/near-intents.ts +135 -0
  50. package/src/advisor/advisor.ts +653 -0
  51. package/src/advisor/index.ts +54 -0
  52. package/src/advisor/tools.ts +303 -0
  53. package/src/advisor/types.ts +164 -0
  54. package/src/chains/ethereum/announcement.ts +536 -0
  55. package/src/chains/ethereum/bnb-optimizations.ts +474 -0
  56. package/src/chains/ethereum/commitment.ts +522 -0
  57. package/src/chains/ethereum/constants.ts +462 -0
  58. package/src/chains/ethereum/deployment.ts +596 -0
  59. package/src/chains/ethereum/gas-estimation.ts +538 -0
  60. package/src/chains/ethereum/index.ts +268 -0
  61. package/src/chains/ethereum/optimizations.ts +614 -0
  62. package/src/chains/ethereum/privacy-adapter.ts +855 -0
  63. package/src/chains/ethereum/registry.ts +584 -0
  64. package/src/chains/ethereum/rpc.ts +905 -0
  65. package/src/chains/ethereum/stealth.ts +491 -0
  66. package/src/chains/ethereum/token.ts +790 -0
  67. package/src/chains/ethereum/transfer.ts +637 -0
  68. package/src/chains/ethereum/types.ts +456 -0
  69. package/src/chains/ethereum/viewing-key.ts +455 -0
  70. package/src/chains/near/commitment.ts +608 -0
  71. package/src/chains/near/constants.ts +284 -0
  72. package/src/chains/near/function-call.ts +871 -0
  73. package/src/chains/near/history.ts +654 -0
  74. package/src/chains/near/implicit-account.ts +840 -0
  75. package/src/chains/near/index.ts +393 -0
  76. package/src/chains/near/native-transfer.ts +658 -0
  77. package/src/chains/near/nep141.ts +775 -0
  78. package/src/chains/near/privacy-adapter.ts +889 -0
  79. package/src/chains/near/resolver.ts +971 -0
  80. package/src/chains/near/rpc.ts +1016 -0
  81. package/src/chains/near/stealth.ts +419 -0
  82. package/src/chains/near/types.ts +317 -0
  83. package/src/chains/near/viewing-key.ts +876 -0
  84. package/src/chains/solana/anchor-transfer.ts +386 -0
  85. package/src/chains/solana/commitment.ts +577 -0
  86. package/src/chains/solana/constants.ts +126 -12
  87. package/src/chains/solana/ephemeral-keys.ts +543 -0
  88. package/src/chains/solana/index.ts +252 -1
  89. package/src/chains/solana/key-derivation.ts +418 -0
  90. package/src/chains/solana/kit-compat.ts +334 -0
  91. package/src/chains/solana/optimizations.ts +560 -0
  92. package/src/chains/solana/privacy-adapter.ts +605 -0
  93. package/src/chains/solana/providers/generic.ts +47 -6
  94. package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
  95. package/src/chains/solana/providers/helius-enhanced.ts +623 -0
  96. package/src/chains/solana/providers/helius.ts +186 -33
  97. package/src/chains/solana/providers/index.ts +31 -0
  98. package/src/chains/solana/providers/interface.ts +61 -18
  99. package/src/chains/solana/providers/quicknode.ts +409 -0
  100. package/src/chains/solana/providers/triton.ts +426 -0
  101. package/src/chains/solana/providers/webhook.ts +338 -67
  102. package/src/chains/solana/rpc-client.ts +1150 -0
  103. package/src/chains/solana/scan.ts +83 -66
  104. package/src/chains/solana/sol-transfer.ts +732 -0
  105. package/src/chains/solana/spl-transfer.ts +886 -0
  106. package/src/chains/solana/stealth-scanner.ts +703 -0
  107. package/src/chains/solana/sunspot-verifier.ts +453 -0
  108. package/src/chains/solana/transaction-builder.ts +755 -0
  109. package/src/chains/solana/transfer.ts +74 -5
  110. package/src/chains/solana/types.ts +57 -6
  111. package/src/chains/solana/utils.ts +110 -0
  112. package/src/chains/solana/viewing-key.ts +807 -0
  113. package/src/compliance/fireblocks.ts +921 -0
  114. package/src/compliance/index.ts +23 -0
  115. package/src/compliance/range-sas.ts +398 -33
  116. package/src/config/endpoints.ts +100 -0
  117. package/src/crypto.ts +11 -8
  118. package/src/errors.ts +82 -0
  119. package/src/evm/erc4337-relayer.ts +830 -0
  120. package/src/evm/index.ts +47 -0
  121. package/src/fees/calculator.ts +396 -0
  122. package/src/fees/index.ts +87 -0
  123. package/src/fees/near-contract.ts +429 -0
  124. package/src/fees/types.ts +268 -0
  125. package/src/index.ts +686 -1
  126. package/src/intent.ts +6 -3
  127. package/src/logger.ts +324 -0
  128. package/src/network/index.ts +80 -0
  129. package/src/network/proxy.ts +691 -0
  130. package/src/optimizations/index.ts +541 -0
  131. package/src/oracle/types.ts +1 -0
  132. package/src/privacy-backends/arcium-types.ts +727 -0
  133. package/src/privacy-backends/arcium.ts +719 -0
  134. package/src/privacy-backends/combined-privacy.ts +866 -0
  135. package/src/privacy-backends/cspl-token.ts +595 -0
  136. package/src/privacy-backends/cspl-types.ts +512 -0
  137. package/src/privacy-backends/cspl.ts +907 -0
  138. package/src/privacy-backends/health.ts +488 -0
  139. package/src/privacy-backends/inco-types.ts +323 -0
  140. package/src/privacy-backends/inco.ts +616 -0
  141. package/src/privacy-backends/index.ts +254 -4
  142. package/src/privacy-backends/interface.ts +649 -6
  143. package/src/privacy-backends/lru-cache.ts +343 -0
  144. package/src/privacy-backends/magicblock.ts +458 -0
  145. package/src/privacy-backends/mock.ts +258 -0
  146. package/src/privacy-backends/privacycash.ts +13 -17
  147. package/src/privacy-backends/private-swap.ts +570 -0
  148. package/src/privacy-backends/rate-limiter.ts +683 -0
  149. package/src/privacy-backends/registry.ts +414 -2
  150. package/src/privacy-backends/router.ts +283 -3
  151. package/src/privacy-backends/shadowwire.ts +449 -0
  152. package/src/privacy-backends/sip-native.ts +3 -0
  153. package/src/privacy-logger.ts +191 -0
  154. package/src/production-safety.ts +373 -0
  155. package/src/proofs/aggregator.ts +1029 -0
  156. package/src/proofs/browser-composer.ts +1150 -0
  157. package/src/proofs/browser.ts +113 -25
  158. package/src/proofs/cache/index.ts +127 -0
  159. package/src/proofs/cache/interface.ts +545 -0
  160. package/src/proofs/cache/key-generator.ts +188 -0
  161. package/src/proofs/cache/lru-cache.ts +481 -0
  162. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  163. package/src/proofs/cache/persistent-cache.ts +788 -0
  164. package/src/proofs/compliance-proof.ts +872 -0
  165. package/src/proofs/composer/base.ts +923 -0
  166. package/src/proofs/composer/index.ts +25 -0
  167. package/src/proofs/composer/interface.ts +518 -0
  168. package/src/proofs/composer/types.ts +383 -0
  169. package/src/proofs/converters/halo2.ts +452 -0
  170. package/src/proofs/converters/index.ts +208 -0
  171. package/src/proofs/converters/interface.ts +363 -0
  172. package/src/proofs/converters/kimchi.ts +462 -0
  173. package/src/proofs/converters/noir.ts +451 -0
  174. package/src/proofs/fallback.ts +888 -0
  175. package/src/proofs/halo2.ts +42 -0
  176. package/src/proofs/index.ts +471 -0
  177. package/src/proofs/interface.ts +13 -0
  178. package/src/proofs/kimchi.ts +42 -0
  179. package/src/proofs/lazy.ts +1004 -0
  180. package/src/proofs/mock.ts +25 -1
  181. package/src/proofs/noir.ts +110 -29
  182. package/src/proofs/orchestrator.ts +960 -0
  183. package/src/proofs/parallel/concurrency.ts +297 -0
  184. package/src/proofs/parallel/dependency-graph.ts +602 -0
  185. package/src/proofs/parallel/executor.ts +420 -0
  186. package/src/proofs/parallel/index.ts +131 -0
  187. package/src/proofs/parallel/interface.ts +685 -0
  188. package/src/proofs/parallel/worker-pool.ts +644 -0
  189. package/src/proofs/providers/halo2.ts +560 -0
  190. package/src/proofs/providers/index.ts +34 -0
  191. package/src/proofs/providers/kimchi.ts +641 -0
  192. package/src/proofs/validator.ts +881 -0
  193. package/src/proofs/verifier.ts +867 -0
  194. package/src/quantum/index.ts +112 -0
  195. package/src/quantum/winternitz-vault.ts +639 -0
  196. package/src/quantum/wots.ts +611 -0
  197. package/src/settlement/backends/direct-chain.ts +1 -0
  198. package/src/settlement/index.ts +9 -0
  199. package/src/settlement/router.ts +732 -46
  200. package/src/solana/index.ts +72 -0
  201. package/src/solana/jito-relayer.ts +687 -0
  202. package/src/solana/noir-verifier-types.ts +430 -0
  203. package/src/solana/noir-verifier.ts +816 -0
  204. package/src/stealth/address-derivation.ts +193 -0
  205. package/src/stealth/ed25519.ts +431 -0
  206. package/src/stealth/index.ts +233 -0
  207. package/src/stealth/meta-address.ts +221 -0
  208. package/src/stealth/secp256k1.ts +368 -0
  209. package/src/stealth/utils.ts +194 -0
  210. package/src/stealth.ts +50 -1504
  211. package/src/sync/index.ts +106 -0
  212. package/src/sync/manager.ts +504 -0
  213. package/src/sync/mock-provider.ts +318 -0
  214. package/src/sync/oblivious.ts +625 -0
  215. package/src/tokens/index.ts +15 -0
  216. package/src/tokens/registry.ts +301 -0
  217. package/src/utils/deprecation.ts +94 -0
  218. package/src/utils/index.ts +9 -0
  219. package/src/wallet/ethereum/index.ts +68 -0
  220. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  221. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  222. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  223. package/src/wallet/ethereum/types.ts +3 -1
  224. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  225. package/src/wallet/hardware/index.ts +10 -0
  226. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  227. package/src/wallet/index.ts +71 -0
  228. package/src/wallet/near/adapter.ts +626 -0
  229. package/src/wallet/near/index.ts +86 -0
  230. package/src/wallet/near/meteor-wallet.ts +1153 -0
  231. package/src/wallet/near/my-near-wallet.ts +790 -0
  232. package/src/wallet/near/wallet-selector.ts +702 -0
  233. package/src/wallet/solana/adapter.ts +6 -4
  234. package/src/wallet/solana/index.ts +13 -0
  235. package/src/wallet/solana/privacy-adapter.ts +567 -0
  236. package/src/wallet/sui/types.ts +6 -4
  237. package/src/zcash/rpc-client.ts +13 -6
  238. package/dist/chunk-2XIVXWHA.mjs +0 -1930
  239. package/dist/chunk-3INS3PR5.mjs +0 -884
  240. package/dist/chunk-3OVABDRH.mjs +0 -17096
  241. package/dist/chunk-7RFRWDCW.mjs +0 -1504
  242. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  243. package/dist/chunk-E6SZWREQ.mjs +0 -57
  244. package/dist/chunk-F6F73W35.mjs +0 -16166
  245. package/dist/chunk-G33LB27A.mjs +0 -16166
  246. package/dist/chunk-HGU6HZRC.mjs +0 -231
  247. package/dist/chunk-L2K34JCU.mjs +0 -1496
  248. package/dist/chunk-OFDBEIEK.mjs +0 -16166
  249. package/dist/chunk-SF7YSLF5.mjs +0 -1515
  250. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  251. package/dist/chunk-WWUSGOXE.mjs +0 -17129
  252. package/dist/constants-VOI7BSLK.mjs +0 -27
  253. package/dist/index-B71aXVzk.d.ts +0 -13264
  254. package/dist/index-BYZbDjal.d.ts +0 -11390
  255. package/dist/index-CHB3KuOB.d.mts +0 -11859
  256. package/dist/index-CzWPI6Le.d.ts +0 -11859
  257. package/dist/index-pOIIuwfV.d.mts +0 -13264
  258. package/dist/index-xbWjohNq.d.mts +0 -11390
  259. package/dist/solana-4O4K45VU.mjs +0 -46
  260. package/dist/solana-5EMCTPTS.mjs +0 -46
  261. package/dist/solana-NDABAZ6P.mjs +0 -56
  262. package/dist/solana-Q4NAVBTS.mjs +0 -46
  263. 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
+ }