import { PublicKey, Keypair, Connection, TransactionInstruction, Transaction } from '@solana/web3.js'; import { OracleJob } from '@switchboard-xyz/common'; import { Program } from '@coral-xyz/anchor'; import { Wallet } from '@coral-xyz/anchor/dist/cjs/provider'; import { C as CircuitPaths } from './constants-B4mozXHP.cjs'; type IndexerAsset = string | { mint?: string; asset?: string; } | null; /** Frontend wallet adapter or backend {@link Keypair}. */ type EncryptKeyWallet = Keypair | { signMessage: (message: Uint8Array) => Promise | Uint8Array; }; type BuildDepositTxParams = { senderPublicKey: PublicKey | string; /** Pre-generated secret note from {@link generateDepositParams}. */ note: string; onChainBackup?: boolean; computeUnitPrice?: number; tempSigner?: PublicKey | string; }; type FetchWalletBalanceOptions = { includeDeposits?: boolean; indexerAsset?: IndexerAsset; }; type BuildRelayPayloadParams = { args: unknown[]; proofHex: string; denomination: number | bigint | string; withdrawAddress: unknown; relayerPubkey: unknown; mint?: unknown; }; type RelayPayload = Record; type DepositParams = { nullifier: string; secret: string; amount: string; commitment: string; nullifierHash: string; mint: string | null; }; type GenerateDepositParamsResult = { params: DepositParams; note: string; }; type GenerateWithdrawProofOptions = { /** Override WASM path/URL (for bundled frontends, use a Vite `?url` import). */ circuitWasmPath?: string; /** Override zkey path/URL (for bundled frontends, use a Vite `?url` import). */ circuitZkeyPath?: string; }; type Network = "mainnet" | "devnet"; declare const MAINNET_TOKEN_MINTS: { readonly Arcane: "3jSL5nnnYcRLmTqFmwvY1Mikh42fQsT7p7NvXPYzanon"; readonly Bitcoin: "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh"; readonly Ethereum: "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs"; readonly USDC: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; }; type TokenSymbol = keyof typeof MAINNET_TOKEN_MINTS; declare const TOKEN_DECIMALS: { readonly Solana: 9; readonly Arcane: 9; readonly Ethereum: 8; readonly Bitcoin: 8; readonly USDC: 6; }; type TokenDecimalsSymbol = keyof typeof TOKEN_DECIMALS; /** Supported deposit denominations per token (same on mainnet and devnet). */ declare const DEPOSIT_AMOUNTS: { readonly Solana: readonly [0.1, 1, 5, 10, 50, 100, 500]; readonly Arcane: readonly [10000, 50000, 100000, 500000, 1000000, 10000000]; readonly Bitcoin: readonly [0.01, 0.05, 0.1, 0.5, 1, 5]; readonly Ethereum: readonly [0.1, 1, 10, 50, 100, 500]; readonly USDC: readonly [1, 10, 50, 100, 1000, 10000, 100000, 1000000]; }; type DepositTokenSymbol = keyof typeof DEPOSIT_AMOUNTS; type Relayer = { isValid: true; label: string; url: string; key: number; value: string; fee: unknown; recentActivities: unknown; userPubkey: unknown; workers: unknown; totalFeeEarningsSol: unknown; totalWithdrawCount: unknown; stakedAmount: unknown; volume24hSol: unknown; volume7dSol: unknown; }; interface ArcaneSdkInitOptions { /** Range API key (frontend: VITE_RANGE_API_KEY). */ rangeApiKey: string; /** Wallet for Anchor provider transactions. */ wallet: Wallet; /** * Solana JSON-RPC endpoint (Node/scripts). Omit when passing {@link connection} * from `@solana/wallet-adapter-react` (`useConnection()`). */ rpcEndpoint?: string; /** Existing connection (e.g. `useConnection()` in React). */ connection?: Connection; /** * Cluster override when the RPC URL does not contain `devnet` / `mainnet` hints * (common with private RPC providers). */ network: Network; /** * Base URL/path for withdraw circuit artifacts in the browser. * Defaults to `/node_modules//dist/circuits/` on localhost and the * pinned, SHA-256-verified jsDelivr CDN in production (domain-independent). * Set this to self-host instead, e.g. `"/circuits/"` (verified, with CDN fallback) * or `"https://cdn.example.com/arcane/circuits/"`. */ circuitPathsBase?: string; } interface ArcaneSdkRuntimeConfig { rangeApiKey: string; rpcEndpoint: string; /** Cluster inferred from {@link rpcEndpoint}. */ network: Network; programId: string; /** Active relayers for {@link network}, loaded at SDK initialization. */ relayers: Relayer[]; connection: Connection; wallet: Wallet; program: Program; /** Set by {@link ArcaneSDK.getEncryptionKey}; required for on-chain note backup. */ encryptKey?: Uint8Array; /** Resolved withdraw circuit wasm/zkey URLs for browser proof generation. */ circuitPaths?: CircuitPaths; } type WithdrawParams = { /** Secret note from the original deposit. */ note: string; /** Withdrawal recipient public key. */ recipient: PublicKey | string; /** Mode for normal withdraw or arcane transfer. */ arcaneTransferMode?: boolean; }; type WithdrawStatus = "success" | "failed"; type WithdrawResult = { txHash: string; status: WithdrawStatus; }; type QuoteRelayer = { url: string; [key: string]: unknown; }; type QuoteTransaction = Record; type QuoteSplit = { denomination: number; totalRelayerFee: number; relayer: QuoteRelayer; transaction: QuoteTransaction; }; type Quote = { amount: number; transactionCount: number; recipientAmount: number; totalRelayerFee: number; etaSeconds: number; splits: QuoteSplit[]; platformFee?: number; }; type GetQuoteResponse = { success: boolean; quote: Quote; }; type GetQuoteParams = { amount: number | string; amountLamports: number | string | bigint; recipient: PublicKey | string; /** Indexer asset label (default `SOL`). */ asset?: string; /** Cluster for the quote (default active SDK network). */ network?: Network; }; /** Fetch a withdraw quote from the indexer. Requires SDK init or an active instance context. */ declare function getQuote(params: GetQuoteParams): Promise; type ResolvedNoteAsset = { key: string; tokenName: TokenDecimalsSymbol; unit: string; multiplier: bigint; mint: string | null; poolAmounts: readonly number[]; decimals: number; }; type ArcaneTransferItem = { mint: PublicKey; /** Human-readable token amount (e.g. `"1.5"` SOL). */ amount: string; recipient: PublicKey; }; type ArcaneTransferDepositFailure = { amount: string; mint: string; recipient: string; }; type ArcaneTransferWithdrawFailure = { note: string; recipient: string; }; type ArcaneTransferResult = { error: boolean; depositFailed: ArcaneTransferDepositFailure[]; withdrawFailed: ArcaneTransferWithdrawFailure[]; depositSuccess: string[]; }; type ArcaneTransferOptions = { /** When true, all withdraws use the same randomly selected relayer. */ uniqueRelayer?: boolean; }; /** * Arcane SDK client. Create one instance per configuration (network, RPC, API keys). * * @example * ```js * const { ArcaneSDK } = require('arcane-privacy-sdk'); * const sdk = await ArcaneSDK.create({ * rangeApiKey: process.env.RANGE_API_KEY, * rpcEndpoint: 'https://api.devnet.solana.com', * wallet, * }); * console.log(sdk.config.relayers); * ``` * * @example React (wallet-adapter) * ```tsx * import { useArcaneSdk } from 'arcane-privacy-sdk/react'; * * function MyComponent() { * const sdk = useArcaneSdk({ rangeApiKey: import.meta.env.VITE_RANGE_API_KEY }); * if (!sdk) return null; * // ... * } * ``` * * @example * ```ts * import { ArcaneSDK } from 'arcane-privacy-sdk'; * const sdk = await ArcaneSDK.create({ rangeApiKey, rpcEndpoint, wallet }); * await sdk.getEncryptionKey(wallet); * const { note } = sdk.generateDepositParams(1_000_000_000n, null); * await sdk.buildDepositTx({ senderPublicKey: wallet.publicKey, note, onChainBackup: true }); * ``` */ declare class ArcaneSDK { static readonly VERSION = "0.0.1"; readonly config: ArcaneSdkRuntimeConfig; private constructor(); /** Create an SDK instance (loads relayers for the inferred network). */ static create(options: ArcaneSdkInitOptions): Promise; private run; private runAsync; getConfig(): ArcaneSdkRuntimeConfig; getRangeApiKey(): string; getRpcEndpoint(): string; getNetwork(): Network; getProgramIdString(): string; /** Encryption key derived by {@link getEncryptionKey}; undefined until set. */ get encryptKey(): Uint8Array | undefined; /** Relayers loaded at initialization; use {@link fetchRelayers} to refresh. */ get relayers(): Relayer[]; getIndexerUrl(): string; getRiskApiUrl(): string; getTokenMints(): { Solana: string; Arcane: "3jSL5nnnYcRLmTqFmwvY1Mikh42fQsT7p7NvXPYzanon" | "ARCxcL6oX2pd4bKmUxhdoARaaHdKU6TJrTTthPANPQtQ"; Bitcoin: "" | "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh"; Ethereum: "" | "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs"; USDC: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" | "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"; }; getArcaneTokenMint(): string; getTokenMint(symbol: TokenSymbol): string; getDepositAmounts(symbol: DepositTokenSymbol): readonly number[]; getTokenDecimals(symbol: TokenDecimalsSymbol): number; resolveCircuitPaths(base?: string): Promise; getRangeRiskScoreJob(address: string): OracleJob; getOracleQuote(payer: Keypair | PublicKey, addressToCheck: string): Promise<{ queueAccount: PublicKey; sigVerifyIx: TransactionInstruction; }>; getProgramId(): PublicKey; getPoolPDA(denominationLamports: number | bigint): [PublicKey, number]; getTokenPoolPDA(mint: PublicKey | string, denominationSmallestUnits: number | bigint): [PublicKey, number]; getTreasuryPDA(): [PublicKey, number]; getCommitmentPDA(commitmentBigInt: bigint | number | string): [PublicKey, number]; getNullifierPDA(nullifierHashBigInt: bigint | number | string): [PublicKey, number]; getNetworkStatePDA(): [PublicKey, number]; buildDepositTx(params: BuildDepositTxParams): Promise<{ tx: Transaction; note: string; }>; /** * Withdraw to `recipient` using a secret `note`. * Relayer is chosen at random from {@link config.relayers}, or by {@link WithdrawParams.relayerIdx}. */ withdraw(params: WithdrawParams, relayerIdx?: number): Promise; /** * Private transfer: deposit into the pool (split by supported denominations), * then withdraw each successful note to the recipient. * * Requires {@link getEncryptionKey} before calling (deposits use on-chain backup). */ arcaneTransfer(items: ArcaneTransferItem[]): Promise; /** Validate a withdraw recipient against the risk API. */ assertWithdrawRecipientAllowed(address: string): Promise; /** Resolve the token asset encoded in a secret note. */ resolveNoteAsset(amount: string, mint?: string | null, tokenNameHint?: TokenDecimalsSymbol): ResolvedNoteAsset; fetchPlatformFee(): Promise; /** Fetch a withdraw quote from the indexer. */ getQuote(params: GetQuoteParams): Promise; fetchCommitments(denomination: number | bigint | string, indexerAsset?: IndexerAsset): Promise; validateNullifier(nullifierHash: string, indexerAsset?: IndexerAsset): Promise; fetchTxStatus(commitmentHex: string, nullifierHashHex: string, indexerAsset?: IndexerAsset): Promise; fetchDepositCountByCommitment(commitment: string, denomination: number | bigint | string, indexerAsset?: IndexerAsset): Promise; fetchWalletBalance(wallet: string, options?: FetchWalletBalanceOptions): Promise; /** Re-fetch relayers from the indexer and update {@link config.relayers}. */ fetchRelayers(): Promise; fetchLatestTransactions(type?: string, indexerAsset?: IndexerAsset): Promise; fetchTxCounts(type?: string, indexerAsset?: IndexerAsset): Promise; normalizePubkeyString(value: unknown): string; buildRelayPayload(params: BuildRelayPayloadParams): RelayPayload; submitToRelayer(relayerUrl: string, payload: RelayPayload): Promise; pollRelayerJob(relayerUrl: string, jobId: string, maxWaitMs?: number): Promise; /** * Derives the note encryption key from a wallet signature and stores it on * {@link config.encryptKey}. Required before {@link buildDepositTx} with * `onChainBackup: true`. * * Accepts a frontend wallet adapter (`signMessage`) or a backend {@link Keypair}. */ getEncryptionKey(wallet: EncryptKeyWallet): Promise; encryptData(key: Uint8Array, plaintext: string): Uint8Array; decryptData(key: Uint8Array, combined: Uint8Array): string; generateRandomFieldElement(): bigint; createCommitment(nullifier: bigint | number | string, secret: bigint | number | string): bigint; createNullifierHash(nullifier: bigint | number | string): bigint; generateDepositParams(amountLamports: bigint | number | string, mint?: string | null): GenerateDepositParamsResult; parseSecretNote(note: string): Record; publicKeyToFieldElement(publicKeyBytes: Uint8Array | number[]): bigint; amountToFieldElement(amount: bigint | number | string): bigint; generateMerkleProof(depositParams: Record, leaves: unknown[]): unknown; generateWithdrawProof(depositParams: Record, leaves: unknown[], recipient: PublicKey | string, relayer: PublicKey | string, fee: bigint | number | string, refund: bigint | number | string, options?: GenerateWithdrawProofOptions): Promise; convertProofToBytes(proof: unknown): Promise>; to32ByteBuffer(bigInt: bigint | number | string): Uint8Array; toFixedHex(value: bigint | number | string, length?: number): string; toFieldElementHex(value: bigint | number | string): string; formatNoteForDisplay(note: string, segmentLen?: number): string; appendIndexerAsset(params: URLSearchParams, indexerAsset?: IndexerAsset): void; /** Program ID for a cluster without an SDK instance. */ static getProgramIdForNetwork(network: Network): string; } export { ArcaneSDK as A, type BuildDepositTxParams as B, type DepositTokenSymbol as D, type EncryptKeyWallet as E, type FetchWalletBalanceOptions as F, type GenerateDepositParamsResult as G, type IndexerAsset as I, type Network as N, type Quote as Q, type RelayPayload as R, type TokenDecimalsSymbol as T, type WithdrawParams as W, type ArcaneSdkInitOptions as a, type ArcaneSdkRuntimeConfig as b, type ArcaneTransferDepositFailure as c, type ArcaneTransferItem as d, type ArcaneTransferOptions as e, type ArcaneTransferResult as f, type ArcaneTransferWithdrawFailure as g, type BuildRelayPayloadParams as h, type GenerateWithdrawProofOptions as i, type GetQuoteParams as j, type GetQuoteResponse as k, type QuoteRelayer as l, type QuoteSplit as m, type QuoteTransaction as n, type Relayer as o, type ResolvedNoteAsset as p, type TokenSymbol as q, type WithdrawResult as r, type WithdrawStatus as s, getQuote as t };