@vocdoni/davinci-sdk 0.0.1
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 +661 -0
- package/README.md +635 -0
- package/dist/contracts.d.ts +512 -0
- package/dist/index.d.ts +1388 -0
- package/dist/index.js +2045 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2000 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.umd.js +2045 -0
- package/dist/sequencer.d.ts +538 -0
- package/package.json +103 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/core/types/metadata.ts","../src/core/api/BaseService.ts","../src/census/CensusService.ts","../src/census/types.ts","../src/sequencer/api/helpers.ts","../src/sequencer/SequencerService.ts","../src/core/api/ApiService.ts","../src/core/config/urls.ts","../src/contracts/SmartContractService.ts","../src/contracts/errors.ts","../src/contracts/ProcessRegistryService.ts","../src/core/process/ProcessOrchestrationService.ts","../src/sequencer/CircomProofService.ts","../src/sequencer/api/types.ts","../src/core/vote/VoteOrchestrationService.ts","../src/contracts/OrganizationRegistry.ts","../src/sequencer/DavinciCryptoService.ts","../src/DavinciSDK.ts"],"sourcesContent":["// Basic JSON types\nexport type AnyJson = boolean | number | string | null | JsonArray | JsonMap | any;\nexport interface JsonMap {\n [key: string]: AnyJson;\n}\nexport interface JsonArray extends Array<AnyJson> {}\n\n// Custom metadata type\nexport type CustomMeta = AnyJson | JsonArray | JsonMap;\n\n// Multi-language support\nexport type MultiLanguage<T> = {\n default: T;\n [lang: string]: T;\n};\n\n// Election choice types\nexport interface IChoice {\n title: MultiLanguage<string>;\n value: number;\n meta?: CustomMeta;\n results?: string;\n answer?: number;\n}\n\nexport type Choice = Pick<IChoice, 'title' | 'value' | 'meta'>;\n\n// Election question types\nexport interface IQuestion {\n title: MultiLanguage<string>;\n description?: MultiLanguage<string>;\n numAbstains?: string;\n meta?: CustomMeta;\n choices: Array<IChoice>;\n}\n\nexport type Question = Pick<IQuestion, 'title' | 'description' | 'choices' | 'meta'>;\n\n// Election result types\nexport enum ElectionResultsTypeNames {\n SINGLE_CHOICE_MULTIQUESTION = 'single-choice-multiquestion',\n MULTIPLE_CHOICE = 'multiple-choice',\n BUDGET = 'budget-based',\n APPROVAL = 'approval',\n QUADRATIC = 'quadratic',\n}\n\n// Properties for different election types\nexport interface AbstainProperties {\n canAbstain: boolean;\n abstainValues: Array<string>;\n}\n\nexport interface ChoiceProperties {\n repeatChoice: boolean;\n numChoices: {\n min: number;\n max: number;\n };\n}\n\nexport interface BudgetProperties {\n useCensusWeightAsBudget: boolean;\n maxBudget: number;\n minStep: number;\n forceFullBudget: boolean;\n}\n\nexport interface ApprovalProperties {\n rejectValue: number;\n acceptValue: number;\n}\n\nexport interface QuadraticProperties extends BudgetProperties {\n quadraticCost: number;\n}\n\n// Election result type definitions\nexport type ElectionResultsType =\n | {\n name: ElectionResultsTypeNames.SINGLE_CHOICE_MULTIQUESTION;\n properties: Record<string, never>;\n }\n | {\n name: ElectionResultsTypeNames.MULTIPLE_CHOICE;\n properties: AbstainProperties & ChoiceProperties;\n }\n | {\n name: ElectionResultsTypeNames.BUDGET;\n properties: BudgetProperties;\n }\n | {\n name: ElectionResultsTypeNames.APPROVAL;\n properties: ApprovalProperties;\n }\n | {\n name: ElectionResultsTypeNames.QUADRATIC;\n properties: QuadraticProperties;\n };\n\n// Protocol version type\nexport type ProtocolVersion = '1.1' | '1.2';\n\n// Main election metadata interface\nexport interface ElectionMetadata {\n version: ProtocolVersion;\n title: MultiLanguage<string>;\n description: MultiLanguage<string>;\n media: {\n header: string;\n logo: string;\n };\n meta?: {\n [key: string]: any;\n };\n questions: Array<IQuestion>;\n type: ElectionResultsType;\n}\n\n// Template for creating new election metadata\nexport const ElectionMetadataTemplate: ElectionMetadata = {\n version: '1.2',\n title: {\n default: '',\n },\n description: {\n default: '',\n },\n media: {\n header: '',\n logo: '',\n },\n meta: {},\n questions: [\n {\n title: {\n default: '',\n },\n description: {\n default: '',\n },\n meta: {},\n choices: [\n {\n title: {\n default: 'Yes',\n },\n value: 0,\n meta: {},\n },\n {\n title: {\n default: 'No',\n },\n value: 1,\n meta: {},\n },\n ],\n },\n ],\n type: {\n name: ElectionResultsTypeNames.SINGLE_CHOICE_MULTIQUESTION,\n properties: {},\n },\n};\n\n// Helper function to create a new metadata template\nexport const getElectionMetadataTemplate = (): ElectionMetadata => {\n return JSON.parse(JSON.stringify(ElectionMetadataTemplate));\n};\n","import axios, { AxiosInstance, AxiosError, AxiosRequestConfig } from \"axios\";\n\nexport interface ApiError {\n error: string;\n code: number;\n}\n\nexport class BaseService {\n protected axios: AxiosInstance;\n\n constructor(baseURL: string, config?: AxiosRequestConfig) {\n this.axios = axios.create({ baseURL, ...config });\n }\n\n protected async request<T>(config: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.axios.request<T>(config);\n return response.data;\n } catch (err) {\n const error = err as AxiosError<ApiError>;\n const message = error.response?.data?.error || error.message;\n const code = error.response?.data?.code || error.code || error.response?.status || 500;\n const e = new Error(message);\n (e as any).code = code;\n throw e;\n }\n }\n}\n","import { BaseService } from \"../core/api/BaseService\";\nimport { \n CensusParticipant, \n CensusProof, \n PublishCensusResponse, \n SnapshotsResponse, \n SnapshotsQueryParams, \n Snapshot, \n CensusSizeResponse, \n HealthResponse \n} from \"./types\";\n\nfunction isUUId(str: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str);\n}\n\nexport class VocdoniCensusService extends BaseService {\n constructor(baseURL: string) {\n super(baseURL);\n }\n\n /**\n * Constructs the URI for accessing a census by its root\n * @param censusRoot - The census root (hex-prefixed)\n * @returns The constructed URI for the census\n */\n getCensusUri(censusRoot: string): string {\n return `${this.axios.defaults.baseURL}/censuses/${censusRoot}`;\n }\n\n createCensus(): Promise<string> {\n return this.request<{ census: string }>({\n method: \"POST\",\n url: \"/censuses\"\n }).then(res => res.census);\n }\n\n async addParticipants(censusId: string, participants: CensusParticipant[]): Promise<void> {\n if (!isUUId(censusId)) throw new Error(\"Invalid census ID format\");\n\n await this.request({\n method: \"POST\",\n url: `/censuses/${censusId}/participants`,\n data: { participants }\n });\n }\n\n getParticipants(censusId: string): Promise<CensusParticipant[]> {\n if (!isUUId(censusId)) throw new Error(\"Invalid census ID format\");\n\n return this.request<{ participants: CensusParticipant[] }>({\n method: \"GET\",\n url: `/censuses/${censusId}/participants`\n }).then(res => res.participants);\n }\n\n getCensusRoot(censusId: string): Promise<string> {\n if (!isUUId(censusId)) throw new Error(\"Invalid census ID format\");\n\n return this.request<{ root: string }>({\n method: \"GET\",\n url: `/censuses/${censusId}/root`\n }).then(res => res.root);\n }\n\n getCensusSizeById(censusId: string): Promise<number> {\n if (!isUUId(censusId)) throw new Error(\"Invalid census ID format\");\n\n return this.request<{ size: number }>({\n method: \"GET\",\n url: `/censuses/${censusId}/size`\n }).then(res => res.size);\n }\n\n getCensusSizeByRoot(censusRoot: string): Promise<number> {\n return this.request<CensusSizeResponse>({\n method: \"GET\",\n url: `/censuses/${censusRoot}/size`\n }).then(res => res.size);\n }\n\n getCensusSize(censusIdOrRoot: string): Promise<number> {\n if (isUUId(censusIdOrRoot)) {\n return this.getCensusSizeById(censusIdOrRoot);\n } else {\n return this.getCensusSizeByRoot(censusIdOrRoot);\n }\n }\n\n async deleteCensus(censusId: string): Promise<void> {\n if (!isUUId(censusId)) throw new Error(\"Invalid census ID format\");\n\n await this.request({\n method: \"DELETE\",\n url: `/censuses/${censusId}`\n });\n }\n\n getCensusProof(censusRoot: string, key: string): Promise<CensusProof> {\n return this.request<CensusProof>({\n method: \"GET\",\n url: `/censuses/${censusRoot}/proof`,\n params: {key}\n });\n }\n\n publishCensus(censusId: string): Promise<PublishCensusResponse> {\n if (!isUUId(censusId)) throw new Error(\"Invalid census ID format\");\n\n return this.request<Omit<PublishCensusResponse, 'uri'>>({\n method: \"POST\",\n url: `/censuses/${censusId}/publish`\n }).then(response => ({\n ...response,\n uri: this.getCensusUri(response.root)\n }));\n }\n\n // BigQuery endpoints\n\n getSnapshots(params?: SnapshotsQueryParams): Promise<SnapshotsResponse> {\n return this.request<SnapshotsResponse>({\n method: \"GET\",\n url: \"/snapshots\",\n params\n });\n }\n\n getLatestSnapshot(): Promise<Snapshot> {\n return this.request<Snapshot>({\n method: \"GET\",\n url: \"/snapshots/latest\"\n });\n }\n\n getHealth(): Promise<HealthResponse> {\n return this.request<HealthResponse>({\n method: \"GET\",\n url: \"/health\"\n });\n }\n}\n","/**\n * Census origin types\n */\nexport enum CensusOrigin {\n /** Indicates that the census is derived from a Merkle Tree structure */\n CensusOriginMerkleTree = 1,\n /** Indicates that the census is provided by a Credential Service Provider (CSP) */\n CensusOriginCSP = 2\n}\n\nexport interface CensusParticipant {\n key: string;\n weight?: string;\n}\n\nexport interface BaseCensusProof {\n /** The Merkle root (hex-prefixed). */\n root: string;\n /** The voter's address (hex-prefixed). */\n address: string;\n /** The weight as a decimal string. */\n weight: string;\n /** Census origin type: CensusOriginMerkleTree for merkle proofs, CensusOriginCSP for csp proofs */\n censusOrigin: CensusOrigin;\n}\n\nexport interface MerkleCensusProof extends BaseCensusProof {\n censusOrigin: CensusOrigin.CensusOriginMerkleTree;\n /** The leaf value (hex-prefixed weight). */\n value: string;\n /** The serialized sibling path (hex-prefixed). */\n siblings: string;\n}\n\nexport interface CSPCensusProof extends BaseCensusProof {\n censusOrigin: CensusOrigin.CensusOriginCSP;\n /** The process id signed with the address (hex-prefixed). */\n processId: string;\n /** The public key of the csp (hex-prefixed). */\n publicKey: string;\n /** The signature that proves that the voter is in the census (hex-prefixed). */\n signature: string;\n}\n\nexport type CensusProof = MerkleCensusProof | CSPCensusProof;\n\n/**\n * Provider function for Merkle census proofs\n */\nexport type MerkleCensusProofProvider = (args: {\n censusRoot: string;\n address: string;\n}) => Promise<MerkleCensusProof>;\n\n/**\n * Provider function for CSP census proofs\n */\nexport type CSPCensusProofProvider = (args: {\n processId: string;\n address: string;\n}) => Promise<CSPCensusProof>;\n\n/**\n * Configuration for census proof providers\n */\nexport interface CensusProviders {\n /** Optional override for Merkle census proof fetching */\n merkle?: MerkleCensusProofProvider;\n /** Required provider for CSP census proof generation */\n csp?: CSPCensusProofProvider;\n}\n\n/**\n * Runtime validation functions for census proofs\n */\n\n/**\n * Type guard to check if an object is a valid BaseCensusProof\n */\nfunction isBaseCensusProof(proof: any): proof is BaseCensusProof {\n return (\n !!proof &&\n typeof proof.root === 'string' &&\n typeof proof.address === 'string' &&\n typeof proof.weight === 'string' &&\n typeof proof.censusOrigin === 'number' &&\n Object.values(CensusOrigin).includes(proof.censusOrigin)\n );\n}\n\n/**\n * Type guard to check if an object is a valid MerkleCensusProof\n */\nexport function isMerkleCensusProof(proof: any): proof is MerkleCensusProof {\n return (\n isBaseCensusProof(proof) &&\n proof.censusOrigin === CensusOrigin.CensusOriginMerkleTree &&\n typeof (proof as any).value === 'string' &&\n typeof (proof as any).siblings === 'string'\n );\n}\n\n/**\n * Type guard to check if an object is a valid CSPCensusProof\n */\nexport function isCSPCensusProof(proof: any): proof is CSPCensusProof {\n return (\n isBaseCensusProof(proof) &&\n proof.censusOrigin === CensusOrigin.CensusOriginCSP &&\n typeof (proof as any).processId === 'string' &&\n typeof (proof as any).publicKey === 'string' &&\n typeof (proof as any).signature === 'string'\n );\n}\n\n/**\n * Assertion function to validate MerkleCensusProof\n */\nexport function assertMerkleCensusProof(proof: unknown): asserts proof is MerkleCensusProof {\n if (!isMerkleCensusProof(proof)) {\n throw new Error(\"Invalid Merkle census proof payload\");\n }\n}\n\n/**\n * Assertion function to validate CSPCensusProof\n */\nexport function assertCSPCensusProof(proof: unknown): asserts proof is CSPCensusProof {\n if (!isCSPCensusProof(proof)) {\n throw new Error(\"Invalid CSP census proof payload\");\n }\n}\n\nexport interface PublishCensusResponse {\n /** The Merkle root of the published census (hex-prefixed). */\n root: string;\n /** The number of participants in the census. */\n participantCount: number;\n /** ISO timestamp when the working census was created. */\n createdAt: string;\n /** ISO timestamp when the census was published. */\n publishedAt: string;\n /** The constructed URI for accessing the census */\n uri: string;\n}\n\nexport interface Snapshot {\n /** ISO timestamp of the snapshot date. */\n snapshotDate: string;\n /** The Merkle root of the census (hex-prefixed). */\n censusRoot: string;\n /** The number of participants in the census. */\n participantCount: number;\n /** Minimum balance filter applied. */\n minBalance: number;\n /** User-defined query name. */\n queryName: string;\n /** ISO timestamp when the snapshot was created. */\n createdAt: string;\n /** Type of query executed (optional). */\n queryType?: string;\n /** Token decimals (optional). */\n decimals?: number;\n /** Query execution period (optional). */\n period?: string;\n /** Query parameters (optional). */\n parameters?: Record<string, any>;\n /** Weight configuration (optional). */\n weightConfig?: {\n strategy: string;\n targetMinWeight: number;\n maxWeight: number;\n };\n}\n\nexport interface SnapshotsResponse {\n /** Array of snapshots. */\n snapshots: Snapshot[];\n /** Total number of snapshots. */\n total: number;\n /** Current page number. */\n page: number;\n /** Number of items per page. */\n pageSize: number;\n /** Whether there is a next page. */\n hasNext: boolean;\n /** Whether there is a previous page. */\n hasPrev: boolean;\n}\n\nexport interface SnapshotsQueryParams {\n /** Page number (default: 1). */\n page?: number;\n /** Items per page (default: 20, max: 100). */\n pageSize?: number;\n /** Filter by minimum balance. */\n minBalance?: number;\n /** Filter by user-defined query name. */\n queryName?: string;\n}\n\nexport interface CensusSizeResponse {\n /** The number of participants in the census. */\n size: number;\n}\n\nexport interface HealthResponse {\n /** Service status. */\n status: string;\n /** ISO timestamp of the health check. */\n timestamp: string;\n /** Service name. */\n service: string;\n}\n","import { Signer, Wallet } from 'ethers';\n\n/**\n * Creates the signature message for process creation.\n * @param processId - The process ID (with or without 0x prefix)\n * @returns The message string to be signed\n */\nexport function createProcessSignatureMessage(processId: string): string {\n // Remove 0x prefix if present and ensure lowercase\n const cleanProcessId = processId.replace(/^0x/, '').toLowerCase();\n return `I am creating a new voting process for the davinci.vote protocol identified with id ${cleanProcessId}`;\n}\n\n/**\n * Signs the process creation message with the provided signer.\n * @param processId - The process ID (with or without 0x prefix)\n * @param signer - The signer (Wallet or Signer) to sign with\n * @returns Promise resolving to the signature string\n */\nexport async function signProcessCreation(processId: string, signer: Signer | Wallet): Promise<string> {\n const message = createProcessSignatureMessage(processId);\n return await signer.signMessage(message);\n}\n\n/**\n * Validates that a process ID is a valid 64-character hex string (32 bytes).\n * @param processId - The process ID to validate\n * @returns True if valid, false otherwise\n */\nexport function validateProcessId(processId: string): boolean {\n // Check if it's a valid 64-character hex string (32 bytes)\n const cleanId = processId.replace(/^0x/, '');\n return /^[0-9a-fA-F]{64}$/.test(cleanId);\n}\n","import {BaseService} from \"../core/api/BaseService\";\nimport {\n CreateProcessRequest,\n CreateProcessResponse,\n GetProcessResponse,\n InfoResponse,\n ListProcessesResponse,\n SequencerStats,\n VoteBallot,\n VoteRequest, \n VoteStatusResponse,\n WorkersResponse,\n} from \"./api/types\";\nimport { validateProcessId } from \"./api/helpers\";\nimport { ElectionMetadata } from \"../core\";\n\nfunction isHexString(str: string): boolean {\n return /^0x[0-9a-f]{64}$/i.test(str);\n}\n\nexport class VocdoniSequencerService extends BaseService {\n constructor(baseURL: string) {\n super(baseURL);\n }\n\n async ping(): Promise<void> {\n await this.request({ method: \"GET\", url: \"/ping\" });\n }\n\n createProcess(body: CreateProcessRequest): Promise<CreateProcessResponse> {\n // Validate processId format\n if (!validateProcessId(body.processId)) {\n throw new Error(\"Invalid processId format. Must be a 64-character hex string (32 bytes)\");\n }\n\n return this.request({\n method: \"POST\",\n url: \"/processes\",\n data: body\n });\n }\n\n getProcess(processId: string): Promise<GetProcessResponse> {\n return this.request({\n method: \"GET\",\n url: `/processes/${processId}`\n });\n }\n\n listProcesses(): Promise<string[]> {\n return this.request<ListProcessesResponse>({\n method: \"GET\",\n url: \"/processes\"\n }).then(res => res.processes);\n }\n\n async submitVote(vote: VoteRequest): Promise<void> {\n await this.request({\n method: \"POST\",\n url: \"/votes\",\n data: vote,\n });\n }\n\n getVoteStatus(\n processId: string,\n voteId: string\n ): Promise<VoteStatusResponse> {\n return this.request<VoteStatusResponse>({\n method: \"GET\",\n url: `/votes/${processId}/voteId/${voteId}`,\n });\n }\n\n async hasAddressVoted(\n processId: string,\n address: string\n ): Promise<boolean> {\n try {\n await this.request({\n method: \"GET\",\n url: `/votes/${processId}/address/${address}`,\n });\n return true;\n } catch (error: any) {\n if (error?.code === 40001) {\n return false;\n }\n throw error;\n }\n }\n\n getInfo(): Promise<InfoResponse> {\n return this.request<InfoResponse>({\n method: \"GET\",\n url: \"/info\"\n });\n }\n\n pushMetadata(metadata: ElectionMetadata): Promise<string> {\n return this.request<{ hash: string }>({\n method: \"POST\",\n url: \"/metadata\",\n data: metadata\n }).then(res => res.hash);\n }\n\n async getMetadata(hashOrUrl: string): Promise<ElectionMetadata> {\n // Check if it's a URL\n if (hashOrUrl.startsWith('http://') || hashOrUrl.startsWith('https://')) {\n // Make direct HTTP request to the URL\n try {\n const response = await fetch(hashOrUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch metadata from URL: ${response.status} ${response.statusText}`);\n }\n return await response.json();\n } catch (error) {\n throw new Error(`Failed to fetch metadata from URL: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n \n // Treat as hash\n if (!isHexString(hashOrUrl)) {\n throw new Error(\"Invalid metadata hash format\");\n }\n\n return this.request<ElectionMetadata>({\n method: \"GET\",\n url: `/metadata/${hashOrUrl}`\n });\n }\n\n getMetadataUrl(hash: string): string {\n if (!isHexString(hash)) throw new Error(\"Invalid metadata hash format\");\n return `${this.axios.defaults.baseURL}/metadata/${hash}`;\n }\n\n getStats(): Promise<SequencerStats> {\n return this.request<SequencerStats>({\n method: \"GET\",\n url: \"/sequencer/stats\"\n });\n }\n\n getWorkers(): Promise<WorkersResponse> {\n return this.request<WorkersResponse>({\n method: \"GET\",\n url: \"/sequencer/workers\"\n });\n }\n}\n","import { VocdoniCensusService } from \"../../census\";\nimport { VocdoniSequencerService } from \"../../sequencer/SequencerService\";\n\nexport interface VocdoniApiServiceConfig {\n sequencerURL: string;\n censusURL: string;\n}\n\nexport class VocdoniApiService {\n public readonly census: VocdoniCensusService;\n public readonly sequencer: VocdoniSequencerService;\n\n constructor(config: VocdoniApiServiceConfig) {\n this.sequencer = new VocdoniSequencerService(config.sequencerURL);\n this.census = new VocdoniCensusService(config.censusURL);\n }\n}\n","import { EnvironmentConfig, Environment, ServiceUrls, ChainConfig, EnvironmentOptions } from './types';\n\n/**\n * Default URL and chain configuration for all environments\n */\nexport const DEFAULT_ENVIRONMENT_URLS: EnvironmentConfig = {\n dev: {\n sequencer: \"https://sequencer-dev.davinci.vote\",\n census: \"https://c3-dev.davinci.vote\",\n chain: \"sepolia\"\n },\n stg: {\n sequencer: \"https://sequencer1.davinci.vote\",\n census: \"https://c3.davinci.vote\",\n chain: \"sepolia\"\n },\n prod: {\n // TODO: Add production URLs when available\n sequencer: \"\",\n census: \"\",\n chain: \"mainnet\"\n }\n};\n\n/**\n * Get URLs and chain configuration for a specific environment\n */\nexport function getEnvironmentConfig(environment: Environment): ServiceUrls & ChainConfig {\n return DEFAULT_ENVIRONMENT_URLS[environment];\n}\n\n/**\n * Get only URLs for a specific environment\n */\nexport function getEnvironmentUrls(environment: Environment): ServiceUrls {\n const config = DEFAULT_ENVIRONMENT_URLS[environment];\n return {\n sequencer: config.sequencer,\n census: config.census\n };\n}\n\n/**\n * Get chain configuration for a specific environment\n */\nexport function getEnvironmentChain(environment: Environment): ChainConfig['chain'] {\n return DEFAULT_ENVIRONMENT_URLS[environment].chain;\n}\n\n/**\n * Resolve URLs and chain based on environment and custom overrides\n */\nexport function resolveConfiguration(options: EnvironmentOptions = {}): ServiceUrls & ChainConfig {\n const environment = options.environment || 'prod';\n const defaultConfig = getEnvironmentConfig(environment);\n \n // Start with default configuration\n const resolvedConfig = { ...defaultConfig };\n \n // Override URLs if provided (only override with non-undefined values)\n if (options.customUrls) {\n if (options.customUrls.sequencer !== undefined) {\n resolvedConfig.sequencer = options.customUrls.sequencer;\n }\n if (options.customUrls.census !== undefined) {\n resolvedConfig.census = options.customUrls.census;\n }\n }\n \n // Override chain if provided\n if (options.customChain) {\n resolvedConfig.chain = options.customChain;\n }\n \n return resolvedConfig;\n}\n\n/**\n * Resolve only URLs based on environment and custom overrides\n */\nexport function resolveUrls(options: EnvironmentOptions = {}): ServiceUrls {\n const config = resolveConfiguration(options);\n return {\n sequencer: config.sequencer,\n census: config.census\n };\n}\n","import type { ContractTransactionResponse } from \"ethers\";\nimport addressesJson from \"@vocdoni/davinci-contracts/deployed_contracts_addresses.json\";\n\n/**\n * Interface defining the structure of deployed contract addresses across different networks.\n * Each contract has addresses for both Sepolia testnet and Ethereum mainnet.\n */\nexport interface DeployedAddresses {\n /** Process Registry contract addresses */\n processRegistry: {\n /** Sepolia testnet address */\n sepolia: string;\n /** Ethereum mainnet address */\n mainnet: string;\n };\n /** Organization Registry contract addresses */\n organizationRegistry: {\n /** Sepolia testnet address */\n sepolia: string;\n /** Ethereum mainnet address */\n mainnet: string;\n };\n /** State Transition Verifier contract addresses */\n stateTransitionVerifierGroth16: {\n /** Sepolia testnet address */\n sepolia: string;\n /** Ethereum mainnet address */\n mainnet: string;\n };\n /** Results Verifier contract addresses */\n resultsVerifierGroth16: {\n /** Sepolia testnet address */\n sepolia: string;\n /** Ethereum mainnet address */\n mainnet: string;\n };\n /** Sequencer Registry contract addresses */\n sequencerRegistry: {\n /** Sepolia testnet address */\n sepolia: string;\n /** Ethereum mainnet address */\n mainnet: string;\n };\n}\n\n/**\n * Deployed contract addresses imported from @vocdoni/davinci-contracts package.\n * These addresses are used to interact with the Vocdoni voting protocol contracts\n * on different networks.\n */\nexport const deployedAddresses: DeployedAddresses = addressesJson;\n\n/**\n * Enum representing the possible states of a transaction during its lifecycle.\n * Used to track and report transaction status in the event stream.\n */\nexport enum TxStatus {\n /** Transaction has been submitted and is waiting to be mined */\n Pending = \"pending\",\n /** Transaction has been successfully mined and executed */\n Completed = \"completed\",\n /** Transaction was mined but reverted during execution */\n Reverted = \"reverted\",\n /** Transaction failed before or during submission */\n Failed = \"failed\",\n}\n\n/**\n * Union type representing the different events that can occur during a transaction's lifecycle.\n * Each event includes relevant data based on the transaction status.\n * \n * @template T - The type of the successful response data\n */\nexport type TxStatusEvent<T = any> =\n | { status: TxStatus.Pending; hash: string }\n | { status: TxStatus.Completed; response: T }\n | { status: TxStatus.Reverted; reason?: string }\n | { status: TxStatus.Failed; error: Error };\n\n/**\n * Abstract base class providing common functionality for smart contract interactions.\n * Implements transaction handling, status monitoring, and event normalization.\n */\nexport abstract class SmartContractService {\n /**\n * Sends a transaction and yields status events during its lifecycle.\n * This method handles the complete transaction flow from submission to completion,\n * including error handling and status updates.\n * \n * @template T - The type of the successful response data\n * @param txPromise - Promise resolving to the transaction response\n * @param responseHandler - Function to process the successful transaction result\n * @returns AsyncGenerator yielding transaction status events\n * \n * @example\n * ```typescript\n * const txStream = await this.sendTx(\n * contract.someMethod(),\n * async () => await contract.getUpdatedValue()\n * );\n * \n * for await (const event of txStream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(`Transaction pending: ${event.hash}`);\n * break;\n * case TxStatus.Completed:\n * console.log(`Transaction completed:`, event.response);\n * break;\n * }\n * }\n * ```\n */\n protected async *sendTx<T>(\n txPromise: Promise<ContractTransactionResponse>,\n responseHandler: () => Promise<T>\n ): AsyncGenerator<TxStatusEvent<T>, void, unknown> {\n try {\n const tx = await txPromise;\n yield { status: TxStatus.Pending, hash: tx.hash };\n\n const receipt = await tx.wait();\n\n if (!receipt) {\n yield { status: TxStatus.Reverted, reason: \"Transaction was dropped or not mined.\" };\n } else if (receipt.status === 0) {\n yield { status: TxStatus.Reverted, reason: \"Transaction reverted.\" };\n } else {\n const result = await responseHandler();\n yield { status: TxStatus.Completed, response: result };\n }\n } catch (err: any) {\n yield {\n status: TxStatus.Failed,\n error: err instanceof Error ? err : new Error(\"Unknown transaction error\"),\n };\n }\n }\n\n /**\n * Executes a transaction stream and returns the result or throws an error.\n * This is a convenience method that processes a transaction stream and either\n * returns the successful result or throws an appropriate error.\n * \n * @template T - The type of the successful response data\n * @param stream - AsyncGenerator of transaction status events\n * @returns Promise resolving to the successful response data\n * @throws Error if the transaction fails or reverts\n * \n * @example\n * ```typescript\n * try {\n * const result = await SmartContractService.executeTx(\n * contract.someMethod()\n * );\n * console.log('Transaction successful:', result);\n * } catch (error) {\n * console.error('Transaction failed:', error);\n * }\n * ```\n */\n static async executeTx<T>(\n stream: AsyncGenerator<TxStatusEvent<T>>\n ): Promise<T> {\n for await (const event of stream) {\n switch (event.status) {\n case TxStatus.Completed:\n return event.response;\n case TxStatus.Failed:\n throw event.error;\n case TxStatus.Reverted:\n throw new Error(`Transaction reverted: ${event.reason || \"unknown reason\"}`);\n }\n }\n throw new Error(\"Transaction stream ended unexpectedly\");\n }\n\n /**\n * Normalizes event listener arguments between different ethers.js versions.\n * This helper method ensures consistent event argument handling regardless of\n * whether the event payload follows ethers v5 or v6 format.\n * \n * @template Args - Tuple type representing the expected event arguments\n * @param callback - The event callback function to normalize\n * @returns Normalized event listener function\n * \n * @example\n * ```typescript\n * contract.on('Transfer', this.normalizeListener((from: string, to: string, amount: BigInt) => {\n * console.log(`Transfer from ${from} to ${to}: ${amount}`);\n * }));\n * ```\n */\n protected normalizeListener<Args extends any[]>(\n callback: (...args: Args) => void\n ): (...listenerArgs: any[]) => void {\n return (...listenerArgs: any[]) => {\n let args: any[];\n if (listenerArgs.length === 1 && listenerArgs[0]?.args) {\n args = listenerArgs[0].args;\n } else {\n args = listenerArgs;\n }\n callback(...(args as Args));\n };\n }\n}\n","/**\n * @fileoverview Standardized error classes for contract services\n * \n * This module provides a consistent error hierarchy for all contract service operations.\n * All errors extend from ContractServiceError and include operation context for better debugging.\n */\n\n/**\n * Abstract base class for all contract service errors.\n * Provides consistent error structure with operation context.\n */\nexport abstract class ContractServiceError extends Error {\n /**\n * Creates a new ContractServiceError instance.\n * \n * @param message - The error message describing what went wrong\n * @param operation - The operation that was being performed when the error occurred\n */\n constructor(message: string, public readonly operation: string) {\n super(message);\n this.name = this.constructor.name;\n }\n}\n\n// ─── ORGANIZATION REGISTRY ERRORS ──────────────────────────────────────────\n\n/**\n * Error thrown when organization creation fails.\n */\nexport class OrganizationCreateError extends ContractServiceError {}\n\n/**\n * Error thrown when organization update fails.\n */\nexport class OrganizationUpdateError extends ContractServiceError {}\n\n/**\n * Error thrown when organization deletion fails.\n */\nexport class OrganizationDeleteError extends ContractServiceError {}\n\n/**\n * Error thrown when administrator operations fail.\n */\nexport class OrganizationAdministratorError extends ContractServiceError {}\n\n// ─── PROCESS REGISTRY ERRORS ───────────────────────────────────────────────\n\n/**\n * Error thrown when process creation fails.\n */\nexport class ProcessCreateError extends ContractServiceError {}\n\n/**\n * Error thrown when process status change fails.\n */\nexport class ProcessStatusError extends ContractServiceError {}\n\n/**\n * Error thrown when process census update fails.\n */\nexport class ProcessCensusError extends ContractServiceError {}\n\n/**\n * Error thrown when process duration change fails.\n */\nexport class ProcessDurationError extends ContractServiceError {}\n\n/**\n * Error thrown when state transition submission fails.\n */\nexport class ProcessStateTransitionError extends ContractServiceError {}\n\n/**\n * Error thrown when process result setting fails.\n */\nexport class ProcessResultError extends ContractServiceError {}\n","// src/ProcessRegistryService.ts\nimport {\n ProcessRegistry__factory,\n type ProcessRegistry,\n type IProcessRegistry\n} from \"@vocdoni/davinci-contracts\";\nimport { SmartContractService } from \"./SmartContractService\";\nimport type { ContractRunner } from \"ethers\";\nimport { BallotMode, Census, EncryptionKey } from '../core';\nimport {\n ProcessCreateError,\n ProcessStatusError,\n ProcessCensusError,\n ProcessDurationError,\n ProcessStateTransitionError,\n ProcessResultError,\n} from \"./errors\";\nimport type {\n ProcessCreatedCallback,\n ProcessStatusChangedCallback,\n ProcessCensusUpdatedCallback,\n ProcessDurationChangedCallback,\n ProcessStateRootUpdatedCallback,\n ProcessResultsSetCallback,\n} from \"./types\";\n\nexport enum ProcessStatus {\n READY = 0,\n ENDED = 1,\n CANCELED= 2,\n PAUSED = 3,\n RESULTS = 4,\n}\n\nexport class ProcessRegistryService extends SmartContractService {\n private contract: ProcessRegistry;\n\n constructor(contractAddress: string, runner: ContractRunner) {\n super();\n this.contract = ProcessRegistry__factory.connect(contractAddress, runner);\n }\n\n // ─── READS ─────────────────────────────────────────────────────────\n\n async getProcess(processID: string) {\n return this.contract.getProcess(processID);\n }\n\n async getProcessCount(): Promise<number> {\n const c = await this.contract.processCount();\n return Number(c);\n }\n\n async getChainID(): Promise<string> {\n const chainId = await this.contract.chainID();\n return chainId.toString();\n }\n\n async getNextProcessId(organizationId: string): Promise<string> {\n return this.contract.getNextProcessId(organizationId);\n }\n\n async getProcessEndTime(processID: string): Promise<bigint> {\n return this.contract.getProcessEndTime(processID);\n }\n\n async getRVerifierVKeyHash(): Promise<string> {\n return this.contract.getRVerifierVKeyHash();\n }\n\n async getSTVerifierVKeyHash(): Promise<string> {\n return this.contract.getSTVerifierVKeyHash();\n }\n\n async getMaxCensusOrigin(): Promise<bigint> {\n return this.contract.MAX_CENSUS_ORIGIN();\n }\n\n async getMaxStatus(): Promise<bigint> {\n return this.contract.MAX_STATUS();\n }\n\n async getProcessNonce(address: string): Promise<bigint> {\n return this.contract.processNonce(address);\n }\n\n async getProcessDirect(processID: string) {\n return this.contract.processes(processID);\n }\n\n async getRVerifier(): Promise<string> {\n return this.contract.rVerifier();\n }\n\n async getSTVerifier(): Promise<string> {\n return this.contract.stVerifier();\n }\n\n // ─── WRITES ────────────────────────────────────────────────────────\n\n newProcess(\n status: ProcessStatus,\n startTime: number,\n duration: number,\n ballotMode: BallotMode,\n census: Census,\n metadata: string,\n encryptionKey: EncryptionKey,\n initStateRoot: bigint\n ) {\n // Convert Census type from core to contract format\n const contractCensus: IProcessRegistry.CensusStruct = {\n censusOrigin: BigInt(census.censusOrigin),\n maxVotes: BigInt(census.maxVotes),\n censusRoot: census.censusRoot,\n censusURI: census.censusURI\n };\n\n return this.sendTx(\n this.contract.newProcess(\n status,\n startTime,\n duration,\n ballotMode,\n contractCensus,\n metadata,\n encryptionKey,\n initStateRoot\n ).catch(e => { throw new ProcessCreateError(e.message, 'create') }),\n async () => ({ success: true })\n );\n }\n\n setProcessStatus(processID: string, newStatus: ProcessStatus) {\n return this.sendTx(\n this.contract.setProcessStatus(processID, newStatus).catch(e => {\n throw new ProcessStatusError(e.message, 'setStatus');\n }),\n async () => ({ success: true })\n );\n }\n\n setProcessCensus(processID: string, census: Census) {\n // Convert Census type from core to contract format\n const contractCensus: IProcessRegistry.CensusStruct = {\n censusOrigin: BigInt(census.censusOrigin),\n maxVotes: BigInt(census.maxVotes),\n censusRoot: census.censusRoot,\n censusURI: census.censusURI\n };\n\n return this.sendTx(\n this.contract.setProcessCensus(processID, contractCensus).catch(e => {\n throw new ProcessCensusError(e.message, 'setCensus');\n }),\n async () => ({ success: true })\n );\n }\n\n setProcessDuration(processID: string, duration: number) {\n return this.sendTx(\n this.contract.setProcessDuration(processID, duration).catch(e => {\n throw new ProcessDurationError(e.message, 'setDuration');\n }),\n async () => ({ success: true })\n );\n }\n\n /**\n * Matches the on-chain `submitStateTransition(processId, proof, input)`\n */\n submitStateTransition(\n processID: string,\n proof: string,\n input: string\n ) {\n return this.sendTx(\n this.contract\n .submitStateTransition(processID, proof, input)\n .catch(e => {\n throw new ProcessStateTransitionError(e.message, 'submitStateTransition');\n }),\n async () => ({ success: true })\n );\n }\n\n /**\n * Sets the results for a voting process.\n * \n * @param processID - The ID of the process to set results for\n * @param proof - Zero-knowledge proof validating the results\n * @param input - Input data for the proof verification\n * @returns A transaction stream that resolves to success status\n */\n setProcessResults(processID: string, proof: string, input: string) {\n return this.sendTx(\n this.contract.setProcessResults(\n processID,\n proof,\n input\n ).catch(e => {\n throw new ProcessResultError(e.message, 'setResults');\n }),\n async () => ({ success: true })\n );\n }\n\n // ─── EVENT LISTENERS ───────────────────────────────────────────────────────\n\n onProcessCreated(cb: ProcessCreatedCallback): void {\n this.contract.on(\n this.contract.filters.ProcessCreated(),\n this.normalizeListener<[string, string]>(cb)\n );\n }\n\n onProcessStatusChanged(cb: ProcessStatusChangedCallback): void {\n this.contract.on(\n this.contract.filters.ProcessStatusChanged(),\n this.normalizeListener<[string, bigint, bigint]>(cb)\n );\n }\n\n onCensusUpdated(cb: ProcessCensusUpdatedCallback): void {\n this.contract.on(\n this.contract.filters.CensusUpdated(),\n this.normalizeListener<[string, string, string, bigint]>(cb)\n );\n }\n\n onProcessDurationChanged(cb: ProcessDurationChangedCallback): void {\n this.contract.on(\n this.contract.filters.ProcessDurationChanged(),\n this.normalizeListener<[string, bigint]>(cb)\n );\n }\n\n onStateRootUpdated(cb: ProcessStateRootUpdatedCallback): void {\n this.contract.on(\n this.contract.filters.ProcessStateRootUpdated(),\n this.normalizeListener<[string, string, bigint]>(cb)\n );\n }\n\n onProcessResultsSet(cb: ProcessResultsSetCallback): void {\n this.contract.on(\n this.contract.filters.ProcessResultsSet(),\n this.normalizeListener<[string, string, bigint[]]>(cb)\n );\n }\n\n removeAllListeners(): void {\n this.contract.removeAllListeners();\n }\n}\n","import { Signer } from \"ethers\";\nimport { VocdoniApiService } from \"../api/ApiService\";\nimport { ProcessRegistryService, ProcessStatus } from \"../../contracts/ProcessRegistryService\";\nimport { OrganizationRegistryService } from \"../../contracts/OrganizationRegistry\";\nimport { DavinciCrypto } from \"../../sequencer/DavinciCryptoService\";\nimport { signProcessCreation } from \"../../sequencer/api/helpers\";\nimport { BallotMode, Census, EncryptionKey } from \"../types\";\nimport { CensusOrigin } from \"../../census/types\";\nimport { getElectionMetadataTemplate } from \"../types/metadata\";\n\n/**\n * Base interface with shared fields between ProcessConfig and ProcessInfo\n */\nexport interface BaseProcess {\n /** Process title */\n title: string;\n \n /** Process description (optional) */\n description?: string;\n \n /** Census configuration */\n census: {\n /** Census type - MerkleTree or CSP */\n type: CensusOrigin;\n /** Census root */\n root: string;\n /** Census size */\n size: number;\n /** Census URI */\n uri: string;\n };\n \n /** Ballot configuration */\n ballot: BallotMode;\n \n /** Election questions and choices (required) */\n questions: Array<{\n title: string;\n description?: string;\n choices: Array<{\n title: string;\n value: number;\n }>;\n }>;\n}\n\n/**\n * Configuration for creating a process\n */\nexport interface ProcessConfig extends BaseProcess {\n /** Process timing - use either duration-based or date-based configuration */\n timing: {\n /** Start date/time (Date object, ISO string, or Unix timestamp, default: now + 60 seconds) */\n startDate?: Date | string | number;\n /** Duration in seconds (required if endDate is not provided) */\n duration?: number;\n /** End date/time (Date object, ISO string, or Unix timestamp, cannot be used with duration) */\n endDate?: Date | string | number;\n };\n}\n\n/**\n * Result of process creation\n */\nexport interface ProcessCreationResult {\n /** The created process ID */\n processId: string;\n /** Transaction hash of the on-chain process creation */\n transactionHash: string;\n}\n\n/**\n * User-friendly process information that extends the base process with additional runtime data\n */\nexport interface ProcessInfo extends BaseProcess {\n /** The process ID */\n processId: string;\n \n /** Current process status */\n status: ProcessStatus;\n \n /** Process creator address */\n creator: string;\n \n /** Start date as Date object */\n startDate: Date;\n \n /** End date as Date object */\n endDate: Date;\n \n /** Duration in seconds */\n duration: number;\n \n /** Time remaining in seconds (0 if ended, negative if not started) */\n timeRemaining: number;\n \n /** Process results (array of BigInt values) */\n result: bigint[];\n \n /** Number of votes cast */\n voteCount: number;\n \n /** Number of vote overwrites */\n voteOverwriteCount: number;\n \n /** Metadata URI */\n metadataURI: string;\n \n /** Raw contract data (for advanced users) */\n raw?: any;\n}\n\n/**\n * Service that orchestrates the complete process creation workflow\n */\nexport class ProcessOrchestrationService {\n constructor(\n private processRegistry: ProcessRegistryService,\n private apiService: VocdoniApiService,\n private organizationRegistry: OrganizationRegistryService,\n private getCrypto: () => Promise<DavinciCrypto>,\n private signer: Signer\n ) {}\n\n /**\n * Gets user-friendly process information by transforming raw contract data\n * @param processId - The process ID to fetch\n * @returns Promise resolving to the user-friendly process information\n */\n async getProcess(processId: string): Promise<ProcessInfo> {\n // 1. Get raw process data from contract\n const rawProcess = await this.processRegistry.getProcess(processId);\n \n // 2. Fetch and parse metadata\n let metadata: any = null;\n let title: string | undefined;\n let description: string | undefined;\n let questions: ProcessConfig['questions'] = [];\n \n try {\n if (rawProcess.metadataURI) {\n metadata = await this.apiService.sequencer.getMetadata(rawProcess.metadataURI);\n title = metadata?.title?.default;\n description = metadata?.description?.default;\n \n // Transform metadata questions to ProcessConfig format\n if (metadata?.questions) {\n questions = metadata.questions.map((q: any) => ({\n title: q.title?.default,\n description: q.description?.default,\n choices: q.choices?.map((c: any) => ({\n title: c.title?.default,\n value: c.value\n })) || []\n }));\n }\n }\n } catch (error) {\n console.warn(`Failed to fetch metadata for process ${processId}:`, error);\n }\n \n // 3. Calculate timing information\n const now = Math.floor(Date.now() / 1000);\n const startTime = Number(rawProcess.startTime);\n const duration = Number(rawProcess.duration);\n const endTime = startTime + duration;\n \n const timeRemaining = now >= endTime ? 0 : (now >= startTime ? endTime - now : startTime - now);\n \n // 4. Transform census information\n const census = {\n type: Number(rawProcess.census.censusOrigin) as CensusOrigin,\n root: rawProcess.census.censusRoot,\n size: Number(rawProcess.census.maxVotes),\n uri: rawProcess.census.censusURI || \"\"\n };\n \n // 5. Transform ballot mode (convert BigInt fields to appropriate types)\n const ballot: BallotMode = {\n numFields: Number(rawProcess.ballotMode.numFields),\n maxValue: rawProcess.ballotMode.maxValue.toString(),\n minValue: rawProcess.ballotMode.minValue.toString(),\n uniqueValues: rawProcess.ballotMode.uniqueValues,\n costFromWeight: rawProcess.ballotMode.costFromWeight,\n costExponent: Number(rawProcess.ballotMode.costExponent),\n maxValueSum: rawProcess.ballotMode.maxValueSum.toString(),\n minValueSum: rawProcess.ballotMode.minValueSum.toString()\n };\n \n // 6. Return user-friendly process info\n return {\n processId,\n title: title!,\n description: description!,\n census,\n ballot,\n questions,\n status: Number(rawProcess.status) as ProcessStatus,\n creator: rawProcess.organizationId,\n startDate: new Date(startTime * 1000),\n endDate: new Date(endTime * 1000),\n duration,\n timeRemaining,\n result: rawProcess.result,\n voteCount: Number(rawProcess.voteCount),\n voteOverwriteCount: Number(rawProcess.voteOverwriteCount),\n metadataURI: rawProcess.metadataURI,\n raw: rawProcess\n };\n }\n\n /**\n * Creates a complete voting process with minimal configuration\n * This method handles all the complex orchestration internally\n */\n async createProcess(config: ProcessConfig): Promise<ProcessCreationResult> {\n // 1. Validate and calculate timing\n const { startTime, duration } = this.calculateTiming(config.timing);\n\n // 2. Get the next process ID\n const signerAddress = await this.signer.getAddress();\n const processId = await this.processRegistry.getNextProcessId(signerAddress);\n\n // 3. Use provided census values directly\n const censusRoot = config.census.root;\n\n // 4. Use ballot mode configuration directly\n const ballotMode = config.ballot;\n\n // 5. Create and push metadata\n const metadata = this.createMetadata(config);\n const metadataHash = await this.apiService.sequencer.pushMetadata(metadata);\n const metadataUri = this.apiService.sequencer.getMetadataUrl(metadataHash);\n\n // 6. Create process via sequencer API (this gets encryption key and state root)\n const signature = await signProcessCreation(processId, this.signer);\n const sequencerResult = await this.apiService.sequencer.createProcess({\n processId,\n censusRoot,\n ballotMode,\n signature,\n censusOrigin: config.census.type\n });\n\n // 7. Create census object for on-chain call\n const census: Census = {\n censusOrigin: config.census.type,\n maxVotes: config.census.size.toString(),\n censusRoot,\n censusURI: config.census.uri\n };\n\n // 8. Create encryption key object\n const encryptionKey: EncryptionKey = {\n x: sequencerResult.encryptionPubKey[0],\n y: sequencerResult.encryptionPubKey[1]\n };\n\n // 9. Submit on-chain transaction\n const txStream = this.processRegistry.newProcess(\n ProcessStatus.READY,\n startTime,\n duration,\n ballotMode,\n census,\n metadataUri,\n encryptionKey,\n BigInt(sequencerResult.stateRoot)\n );\n\n // Execute the transaction and capture the hash\n let transactionHash = \"unknown\";\n for await (const event of txStream) {\n if (event.status === \"pending\") {\n transactionHash = event.hash;\n } else if (event.status === \"completed\") {\n break;\n } else if (event.status === \"failed\") {\n throw event.error;\n } else if (event.status === \"reverted\") {\n throw new Error(`Transaction reverted: ${event.reason || \"unknown reason\"}`);\n }\n }\n\n return {\n processId,\n transactionHash\n };\n }\n\n /**\n * Validates and calculates timing parameters\n */\n private calculateTiming(timing: ProcessConfig['timing']): { startTime: number; duration: number } {\n const { startDate, duration, endDate } = timing;\n\n // Validate that duration and endDate are not both provided\n if (duration !== undefined && endDate !== undefined) {\n throw new Error(\"Cannot specify both 'duration' and 'endDate'. Use one or the other.\");\n }\n\n // Ensure at least one of duration or endDate is provided\n if (duration === undefined && endDate === undefined) {\n throw new Error(\"Must specify either 'duration' (in seconds) or 'endDate'.\");\n }\n\n // Calculate start time\n const startTime = startDate ? this.dateToUnixTimestamp(startDate) : Math.floor(Date.now() / 1000) + 60;\n\n // Calculate duration\n let calculatedDuration: number;\n if (duration !== undefined) {\n // Duration provided directly\n calculatedDuration = duration;\n } else {\n // Calculate duration from endDate\n const endTime = this.dateToUnixTimestamp(endDate!);\n calculatedDuration = endTime - startTime;\n \n if (calculatedDuration <= 0) {\n throw new Error(\"End date must be after start date.\");\n }\n }\n\n // Validate that start time is not in the past (with 30 second buffer)\n const now = Math.floor(Date.now() / 1000);\n if (startTime < now - 30) {\n throw new Error(\"Start date cannot be in the past.\");\n }\n\n return { startTime, duration: calculatedDuration };\n }\n\n /**\n * Converts various date formats to Unix timestamp\n */\n private dateToUnixTimestamp(date: Date | string | number): number {\n if (typeof date === 'number') {\n // Already a timestamp - validate it's reasonable (not milliseconds)\n if (date > 1e10) {\n // Likely milliseconds, convert to seconds\n return Math.floor(date / 1000);\n }\n return Math.floor(date);\n }\n\n if (typeof date === 'string') {\n // ISO string or other parseable date string\n const parsed = new Date(date);\n if (isNaN(parsed.getTime())) {\n throw new Error(`Invalid date string: ${date}`);\n }\n return Math.floor(parsed.getTime() / 1000);\n }\n\n if (date instanceof Date) {\n // Date object\n if (isNaN(date.getTime())) {\n throw new Error(\"Invalid Date object provided.\");\n }\n return Math.floor(date.getTime() / 1000);\n }\n\n throw new Error(\"Invalid date format. Use Date object, ISO string, or Unix timestamp.\");\n }\n\n /**\n * Creates metadata from the simplified configuration\n */\n private createMetadata(config: ProcessConfig) {\n const metadata = getElectionMetadataTemplate();\n \n metadata.title.default = config.title;\n metadata.description.default = config.description || \"\";\n\n // Questions are required\n if (!config.questions || config.questions.length === 0) {\n throw new Error(\"Questions are required. Please provide at least one question with choices.\");\n }\n\n metadata.questions = config.questions.map(q => ({\n title: { default: q.title },\n description: { default: q.description || \"\" },\n meta: {},\n choices: q.choices.map(c => ({\n title: { default: c.title },\n value: c.value,\n meta: {}\n }))\n }));\n\n return metadata;\n }\n}\n","// src/ProofGenerator.ts\nimport { groth16 } from \"snarkjs\";\nimport { sha256 } from \"ethers\";\n\nexport interface ProofInputs {\n fields: string[];\n num_fields: string;\n unique_values: string;\n max_value: string;\n min_value: string;\n max_value_sum: string;\n min_value_sum: string;\n cost_exponent: string;\n cost_from_weight: string;\n address: string;\n weight: string;\n process_id: string;\n vote_id: string;\n encryption_pubkey: [string, string];\n k: string;\n cipherfields: string[];\n inputs_hash: string;\n}\n\nexport interface Groth16Proof {\n pi_a: [string, string, string];\n pi_b: [[string, string], [string, string], [string, string]];\n pi_c: [string, string, string];\n protocol: string;\n curve: string;\n}\n\nexport interface CircomProofOptions {\n wasmUrl?: string;\n zkeyUrl?: string;\n vkeyUrl?: string;\n /** Optional SHA-256 hash to verify circuit WASM file integrity */\n wasmHash?: string;\n /** Optional SHA-256 hash to verify proving key file integrity */\n zkeyHash?: string;\n /** Optional SHA-256 hash to verify verification key file integrity */\n vkeyHash?: string;\n}\n\nexport class CircomProof {\n private readonly wasmUrl?: string;\n private readonly zkeyUrl?: string;\n private readonly vkeyUrl?: string;\n private readonly wasmHash?: string;\n private readonly zkeyHash?: string;\n private readonly vkeyHash?: string;\n\n // simple in-memory cache keyed by URL\n private wasmCache = new Map<string, Uint8Array>();\n private zkeyCache = new Map<string, Uint8Array>();\n private vkeyCache = new Map<string, any>();\n\n constructor(opts: CircomProofOptions = {}) {\n this.wasmUrl = opts.wasmUrl;\n this.zkeyUrl = opts.zkeyUrl;\n this.vkeyUrl = opts.vkeyUrl;\n this.wasmHash = opts.wasmHash;\n this.zkeyHash = opts.zkeyHash;\n this.vkeyHash = opts.vkeyHash;\n }\n\n /**\n * Computes SHA-256 hash of the given data and compares it with the expected hash.\n * @param data - The data to hash (string or ArrayBuffer or Uint8Array)\n * @param expectedHash - The expected SHA-256 hash in hexadecimal format\n * @param filename - The filename for error reporting\n * @throws Error if the computed hash doesn't match the expected hash\n */\n private verifyHash(data: string | ArrayBuffer | Uint8Array, expectedHash: string, filename: string): void {\n // Convert data to Uint8Array for hashing\n let bytes: Uint8Array;\n if (typeof data === 'string') {\n bytes = new TextEncoder().encode(data);\n } else if (data instanceof ArrayBuffer) {\n bytes = new Uint8Array(data);\n } else {\n bytes = data;\n }\n\n // Compute SHA-256 hash using ethers\n const computedHash = sha256(bytes).slice(2); // Remove '0x' prefix\n\n // Compare hashes (case-insensitive)\n if (computedHash.toLowerCase() !== expectedHash.toLowerCase()) {\n throw new Error(\n `Hash verification failed for ${filename}. ` +\n `Expected: ${expectedHash.toLowerCase()}, ` +\n `Computed: ${computedHash.toLowerCase()}`\n );\n }\n }\n\n /**\n * Generate a zk‐SNARK proof.\n * If you didn't pass wasmUrl/zkeyUrl in the constructor you must supply them here.\n */\n async generate(\n inputs: ProofInputs,\n urls: { wasmUrl?: string; zkeyUrl?: string } = {}\n ): Promise<{ proof: Groth16Proof; publicSignals: string[] }> {\n const wasmUrl = urls.wasmUrl ?? this.wasmUrl;\n const zkeyUrl = urls.zkeyUrl ?? this.zkeyUrl;\n if (!wasmUrl) throw new Error(\"`wasmUrl` is required to generate a proof\");\n if (!zkeyUrl) throw new Error(\"`zkeyUrl` is required to generate a proof\");\n\n // fetch+cache .wasm\n let wasmBin = this.wasmCache.get(wasmUrl);\n if (!wasmBin) {\n const r = await fetch(wasmUrl);\n if (!r.ok) throw new Error(`Failed to fetch wasm at ${wasmUrl}: ${r.status}`);\n const buf = await r.arrayBuffer();\n wasmBin = new Uint8Array(buf);\n \n // Verify hash if provided\n if (this.wasmHash) {\n this.verifyHash(wasmBin, this.wasmHash, 'circuit.wasm');\n }\n \n this.wasmCache.set(wasmUrl, wasmBin);\n }\n\n // fetch+cache .zkey\n let zkeyBin = this.zkeyCache.get(zkeyUrl);\n if (!zkeyBin) {\n const r = await fetch(zkeyUrl);\n if (!r.ok) throw new Error(`Failed to fetch zkey at ${zkeyUrl}: ${r.status}`);\n const buf = await r.arrayBuffer();\n zkeyBin = new Uint8Array(buf);\n \n // Verify hash if provided\n if (this.zkeyHash) {\n this.verifyHash(zkeyBin, this.zkeyHash, 'proving_key.zkey');\n }\n \n this.zkeyCache.set(zkeyUrl, zkeyBin);\n }\n\n const { proof, publicSignals } = await groth16.fullProve(\n inputs,\n wasmBin,\n zkeyBin\n );\n return {\n proof: proof as unknown as Groth16Proof,\n publicSignals: publicSignals as string[],\n };\n }\n\n async verify(\n proof: Groth16Proof,\n publicSignals: string[],\n urlOverride?: string\n ): Promise<boolean> {\n const vkeyUrl = urlOverride ?? this.vkeyUrl;\n if (!vkeyUrl) throw new Error(\"`vkeyUrl` is required to verify a proof\");\n\n // fetch+cache vkey JSON\n let vk = this.vkeyCache.get(vkeyUrl);\n if (!vk) {\n const r = await fetch(vkeyUrl);\n if (!r.ok) throw new Error(`Failed to fetch vkey at ${vkeyUrl}: ${r.status}`);\n const vkeyText = await r.text();\n \n // Verify hash if provided\n if (this.vkeyHash) {\n this.verifyHash(vkeyText, this.vkeyHash, 'verification_key.json');\n }\n \n vk = JSON.parse(vkeyText);\n this.vkeyCache.set(vkeyUrl, vk);\n }\n\n return groth16.verify(vk, publicSignals, proof);\n }\n}\n","import { BallotMode, Census, EncryptionKey } from '../../core/types';\nimport { CensusOrigin, CensusProof } from '../../census/types';\n\nexport interface CreateProcessRequest {\n processId: string;\n censusRoot: string;\n ballotMode: BallotMode;\n signature: string;\n /**\n * The censusOrigin specifies the origin type of the census used in the request.\n * This attribute allows the API to determine how the census data should be processed or verified.\n */\n censusOrigin: CensusOrigin;\n}\n\nexport interface CreateProcessResponse {\n processId: string;\n encryptionPubKey: [string, string];\n stateRoot: string;\n ballotMode: BallotMode;\n}\n\nexport interface GetProcessResponse {\n id: string;\n status: number;\n organizationId: string;\n encryptionKey: EncryptionKey;\n stateRoot: string;\n result: string[];\n startTime: number;\n duration: number;\n metadataURI: string;\n ballotMode: BallotMode;\n census: Census;\n metadata: {\n title: Record<string, string>;\n description: Record<string, string>;\n media: {\n header: string;\n logo: string;\n };\n questions: {\n title: Record<string, string>;\n description: Record<string, string>;\n choices: {\n title: Record<string, string>;\n value: number;\n meta: Record<string, string>;\n }[];\n meta: Record<string, string>;\n }[];\n processType: {\n name: string;\n properties: Record<string, string>;\n };\n };\n voteCount: string;\n voteOverwrittenCount: string;\n isAcceptingVotes: boolean;\n sequencerStats: {\n stateTransitionCount: number;\n lastStateTransitionDate: string;\n settledStateTransitionCount: number;\n aggregatedVotesCount: number;\n verifiedVotesCount: number;\n pendingVotesCount: number;\n currentBatchSize: number;\n lastBatchSize: number;\n };\n}\n\n\nexport interface VoteCiphertext {\n c1: [string, string];\n c2: [string, string];\n}\n\nexport interface VoteBallot {\n curveType: string;\n ciphertexts: VoteCiphertext[];\n}\n\nexport interface VoteProof {\n pi_a: [string, string, string];\n pi_b: [ [string, string], [string, string], [string, string] ];\n pi_c: [string, string, string];\n protocol: string;\n}\n\nexport interface VoteRequest {\n /** The `processId` you obtained when creating the process. */\n processId: string;\n /** Your Merkle‐proof that you're in the census. */\n censusProof: CensusProof;\n /** Your encrypted ballot. */\n ballot: VoteBallot;\n /** The zkSNARK proof that the ballot is well‐formed. */\n ballotProof: VoteProof;\n /** Hash of the ballot inputs (decimal string). */\n ballotInputsHash: string;\n /** Your Ethereum address (hex-prefixed). */\n address: string;\n /** Signature over the raw bytes of the voteId. */\n signature: string;\n /** The vote ID (hex-prefixed). */\n voteId: string;\n}\n\nexport interface InfoResponse {\n circuitUrl: string;\n circuitHash: string;\n provingKeyUrl: string;\n provingKeyHash: string;\n verificationKeyUrl: string;\n verificationKeyHash: string;\n ballotProofWasmHelperUrl: string;\n ballotProofWasmHelperHash: string;\n ballotProofWasmHelperExecJsUrl: string;\n ballotProofWasmHelperExecJsHash: string;\n contracts: {\n process: string;\n organization: string;\n stateTransitionVerifier: string;\n resultsVerifier: string;\n };\n network: {\n [key: string]: number;\n };\n}\n\nexport enum VoteStatus {\n Pending = \"pending\",\n Verified = \"verified\",\n Aggregated = \"aggregated\",\n Processed = \"processed\",\n Settled = \"settled\",\n Error = \"error\",\n}\n\nexport interface VoteStatusResponse {\n status: VoteStatus;\n}\n\nexport interface ListProcessesResponse {\n processes: string[];\n}\n\nexport interface SequencerStats {\n activeProcesses: number;\n pendingVotes: number;\n verifiedVotes: number;\n aggregatedVotes: number;\n stateTransitions: number;\n settledStateTransitions: number;\n lastStateTransitionDate: string;\n}\n\nexport interface WorkerStats {\n name: string;\n successCount: number;\n failedCount: number;\n}\n\nexport interface WorkersResponse {\n workers: WorkerStats[];\n}\n","import { Signer } from \"ethers\";\nimport { VocdoniApiService } from \"../api/ApiService\";\nimport { DavinciCrypto, DavinciCryptoInputs, DavinciCryptoOutput } from \"../../sequencer/DavinciCryptoService\";\nimport { CircomProof, Groth16Proof, ProofInputs as Groth16ProofInputs } from \"../../sequencer/CircomProofService\";\nimport { CensusOrigin, CensusProof, CensusProviders, assertMerkleCensusProof, assertCSPCensusProof } from \"../../census/types\";\nimport { VoteRequest, VoteBallot, VoteProof, VoteStatus } from \"../../sequencer/api/types\";\nimport { BallotMode } from \"../types\";\n\n/**\n * Simplified vote configuration interface for end users\n */\nexport interface VoteConfig {\n /** The process ID to vote in */\n processId: string;\n \n /** The voter's choices - array of selected values for each question */\n choices: number[];\n \n /** Optional: Custom randomness for vote encryption (will be generated if not provided) */\n randomness?: string;\n}\n\n/**\n * Result of vote submission\n */\nexport interface VoteResult {\n /** The unique vote ID */\n voteId: string;\n \n /** The transaction signature */\n signature: string;\n \n /** The voter's address */\n voterAddress: string;\n \n /** The process ID */\n processId: string;\n \n /** Current vote status */\n status: VoteStatus;\n}\n\n/**\n * Vote status information\n */\nexport interface VoteStatusInfo {\n /** The vote ID */\n voteId: string;\n \n /** Current status of the vote */\n status: VoteStatus;\n \n /** The process ID */\n processId: string;\n}\n\n/**\n * Service that orchestrates the complete voting workflow\n * Handles all the complex cryptographic operations and API calls internally\n */\nexport class VoteOrchestrationService {\n constructor(\n private apiService: VocdoniApiService,\n private getCrypto: () => Promise<DavinciCrypto>,\n private signer: Signer,\n private censusProviders: CensusProviders = {}\n ) {}\n\n /**\n * Submit a vote with simplified configuration\n * This method handles all the complex orchestration internally:\n * - Fetches process information and encryption keys\n * - Gets census proof (Merkle or CSP)\n * - Generates cryptographic proofs\n * - Signs and submits the vote\n * \n * @param config - Simplified vote configuration\n * @returns Promise resolving to vote submission result\n */\n async submitVote(config: VoteConfig): Promise<VoteResult> {\n // 1. Get process information\n const process = await this.apiService.sequencer.getProcess(config.processId);\n \n if (!process.isAcceptingVotes) {\n throw new Error(\"Process is not currently accepting votes\");\n }\n\n // 2. Get voter address from signer\n const voterAddress = await this.signer.getAddress();\n\n // 3. Get census proof (weight will be retrieved from the proof)\n const censusProof = await this.getCensusProof(\n process.census.censusOrigin,\n process.census.censusRoot,\n voterAddress,\n config.processId\n );\n\n // 4. Generate vote proof inputs\n const { voteId, cryptoOutput, circomInputs } = await this.generateVoteProofInputs(\n config.processId,\n voterAddress,\n process.encryptionKey,\n process.ballotMode,\n config.choices,\n censusProof.weight,\n config.randomness\n );\n\n // 5. Generate zk-SNARK proof\n const { proof } = await this.generateZkProof(circomInputs);\n\n // 6. Sign the vote\n const signature = await this.signVote(voteId);\n\n // 7. Submit the vote\n await this.submitVoteRequest({\n processId: config.processId,\n censusProof,\n ballot: cryptoOutput.ballot,\n ballotProof: proof,\n ballotInputsHash: cryptoOutput.ballotInputsHash,\n address: voterAddress,\n signature,\n voteId\n });\n\n // 8. Get initial vote status\n const status = await this.apiService.sequencer.getVoteStatus(config.processId, voteId);\n\n return {\n voteId,\n signature,\n voterAddress,\n processId: config.processId,\n status: status.status\n };\n }\n\n /**\n * Get the status of a submitted vote\n * \n * @param processId - The process ID\n * @param voteId - The vote ID\n * @returns Promise resolving to vote status information\n */\n async getVoteStatus(processId: string, voteId: string): Promise<VoteStatusInfo> {\n const status = await this.apiService.sequencer.getVoteStatus(processId, voteId);\n \n return {\n voteId,\n status: status.status,\n processId\n };\n }\n\n /**\n * Check if an address has voted in a process\n * \n * @param processId - The process ID\n * @param address - The voter's address\n * @returns Promise resolving to boolean indicating if the address has voted\n */\n async hasAddressVoted(processId: string, address: string): Promise<boolean> {\n return this.apiService.sequencer.hasAddressVoted(processId, address);\n }\n\n /**\n * Wait for a vote to reach a specific status\n * \n * @param processId - The process ID\n * @param voteId - The vote ID\n * @param targetStatus - The target status to wait for (default: \"settled\")\n * @param timeoutMs - Maximum time to wait in milliseconds (default: 300000 = 5 minutes)\n * @param pollIntervalMs - Polling interval in milliseconds (default: 5000 = 5 seconds)\n * @returns Promise resolving to final vote status\n */\n async waitForVoteStatus(\n processId: string,\n voteId: string,\n targetStatus: VoteStatus = VoteStatus.Settled,\n timeoutMs: number = 300000,\n pollIntervalMs: number = 5000\n ): Promise<VoteStatusInfo> {\n const startTime = Date.now();\n \n while (Date.now() - startTime < timeoutMs) {\n const statusInfo = await this.getVoteStatus(processId, voteId);\n \n if (statusInfo.status === targetStatus || statusInfo.status === VoteStatus.Error) {\n return statusInfo;\n }\n \n await new Promise(resolve => setTimeout(resolve, pollIntervalMs));\n }\n \n throw new Error(`Vote did not reach status ${targetStatus} within ${timeoutMs}ms`);\n }\n\n /**\n * Get census proof based on census origin type\n */\n private async getCensusProof(\n censusOrigin: number,\n censusRoot: string,\n voterAddress: string,\n processId: string\n ): Promise<CensusProof> {\n if (censusOrigin === CensusOrigin.CensusOriginMerkleTree) {\n // Use custom provider if present, otherwise default API\n if (this.censusProviders.merkle) {\n const proof = await this.censusProviders.merkle({\n censusRoot,\n address: voterAddress,\n });\n assertMerkleCensusProof(proof);\n return proof;\n } else {\n const proof = await this.apiService.census.getCensusProof(censusRoot, voterAddress);\n // In case the API returns a looser type, still verify:\n assertMerkleCensusProof(proof);\n return proof;\n }\n }\n\n if (censusOrigin === CensusOrigin.CensusOriginCSP) {\n if (!this.censusProviders.csp) {\n throw new Error(\n \"CSP voting requires a CSP census proof provider. Pass one via VoteOrchestrationService(..., { csp: yourFn }).\"\n );\n }\n const proof = await this.censusProviders.csp({\n processId,\n address: voterAddress,\n });\n assertCSPCensusProof(proof);\n return proof;\n }\n\n throw new Error(`Unsupported census origin: ${censusOrigin}`);\n }\n\n /**\n * Generate vote proof inputs using DavinciCrypto\n */\n private async generateVoteProofInputs(\n processId: string,\n voterAddress: string,\n encryptionKey: { x: string; y: string },\n ballotMode: BallotMode,\n choices: number[],\n weight: string,\n customRandomness?: string\n ): Promise<{\n voteId: string;\n cryptoOutput: DavinciCryptoOutput;\n circomInputs: Groth16ProofInputs;\n }> {\n const crypto = await this.getCrypto();\n\n // Validate choices based on ballot mode\n this.validateChoices(choices, ballotMode);\n \n // Use choices directly as field values (no conversion for this version)\n const fieldValues = choices.map(choice => choice.toString());\n\n const inputs: DavinciCryptoInputs = {\n address: voterAddress.replace(/^0x/, \"\"),\n processID: processId.replace(/^0x/, \"\"),\n encryptionKey: [encryptionKey.x, encryptionKey.y],\n ballotMode,\n weight,\n fieldValues\n };\n\n // Only include k if customRandomness is provided\n if (customRandomness) {\n // Check if customRandomness already has 0x prefix\n const hexRandomness = customRandomness.startsWith(\"0x\") ? customRandomness : \"0x\" + customRandomness;\n const k = BigInt(hexRandomness).toString();\n inputs.k = k;\n }\n\n const cryptoOutput = await crypto.proofInputs(inputs);\n\n return {\n voteId: cryptoOutput.voteId,\n cryptoOutput,\n circomInputs: cryptoOutput.circomInputs as Groth16ProofInputs\n };\n }\n\n /**\n * Validate user choices based on ballot mode\n */\n private validateChoices(choices: number[], ballotMode: BallotMode): void {\n const maxValue = parseInt(ballotMode.maxValue);\n const minValue = parseInt(ballotMode.minValue);\n\n // Validate each choice is within the allowed range\n for (let i = 0; i < choices.length; i++) {\n const choice = choices[i];\n \n if (choice < minValue || choice > maxValue) {\n throw new Error(`Choice ${choice} is out of range [${minValue}, ${maxValue}]`);\n }\n }\n }\n\n /**\n * Generate zk-SNARK proof using CircomProof\n */\n private async generateZkProof(circomInputs: Groth16ProofInputs): Promise<{\n proof: Groth16Proof;\n publicSignals: string[];\n }> {\n // Get circuit URLs from sequencer info\n const info = await this.apiService.sequencer.getInfo();\n \n const circomProof = new CircomProof({\n wasmUrl: info.circuitUrl,\n zkeyUrl: info.provingKeyUrl,\n vkeyUrl: info.verificationKeyUrl\n });\n\n const { proof, publicSignals } = await circomProof.generate(circomInputs);\n \n // Verify the proof\n const isValid = await circomProof.verify(proof, publicSignals);\n if (!isValid) {\n throw new Error(\"Generated proof is invalid\");\n }\n\n return { proof, publicSignals };\n }\n\n private hexToBytes(hex: string): Uint8Array {\n const clean = hex.replace(/^0x/, \"\");\n if (clean.length % 2) throw new Error(\"Invalid hex length\");\n const out = new Uint8Array(clean.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(clean.substr(i*2, 2), 16);\n return out;\n }\n\n /**\n * Sign the vote using the signer\n */\n private async signVote(voteId: string): Promise<string> {\n return this.signer.signMessage(this.hexToBytes(voteId));\n }\n\n /**\n * Submit the vote request to the sequencer\n */\n private async submitVoteRequest(voteRequest: VoteRequest): Promise<void> {\n // Convert Groth16Proof to VoteProof format\n const ballotProof: VoteProof = {\n pi_a: voteRequest.ballotProof.pi_a,\n pi_b: voteRequest.ballotProof.pi_b,\n pi_c: voteRequest.ballotProof.pi_c,\n protocol: voteRequest.ballotProof.protocol\n };\n\n const request: VoteRequest = {\n ...voteRequest,\n ballotProof\n };\n\n await this.apiService.sequencer.submitVote(request);\n }\n}\n","import {\n OrganizationRegistry__factory,\n type OrganizationRegistry,\n} from \"@vocdoni/davinci-contracts\";\nimport { SmartContractService } from \"./SmartContractService\";\nimport type { ContractRunner } from \"ethers\";\nimport {\n OrganizationCreateError,\n OrganizationUpdateError,\n OrganizationDeleteError,\n OrganizationAdministratorError,\n} from \"./errors\";\nimport type {\n OrganizationCreatedCallback,\n OrganizationUpdatedCallback,\n OrganizationAdministratorAddedCallback,\n OrganizationAdministratorRemovedCallback,\n} from \"./types\";\n\nexport interface OrganizationInfo {\n name: string;\n metadataURI: string;\n}\n\nexport class OrganizationRegistryService extends SmartContractService {\n private contract: OrganizationRegistry;\n\n constructor(contractAddress: string, runner: ContractRunner) {\n super();\n this.contract = OrganizationRegistry__factory.connect(\n contractAddress,\n runner,\n );\n }\n\n // ─── READ OPERATIONS ───────────────────────────────────────────────────────\n\n async getOrganization(id: string): Promise<OrganizationInfo> {\n const { name, metadataURI } = await this.contract.getOrganization(id);\n return { name, metadataURI };\n }\n\n async existsOrganization(id: string): Promise<boolean> {\n return this.contract.exists(id);\n } \n\n async isAdministrator(id: string, address: string): Promise<boolean> {\n return this.contract.isAdministrator(id, address);\n }\n\n async getOrganizationCount(): Promise<number> {\n const count = await this.contract.organizationCount();\n return Number(count);\n }\n\n // ─── WRITE OPERATIONS ──────────────────────────────────────────────────────\n\n createOrganization(\n name: string,\n metadataURI: string,\n administrators: string[],\n ) {\n return this.sendTx(\n this.contract\n .createOrganization(name, metadataURI, administrators)\n .catch((e) => {\n throw new OrganizationCreateError(e.message, 'create');\n }),\n async () => ({ success: true }),\n );\n }\n\n updateOrganization(\n id: string,\n name: string,\n metadataURI: string,\n ) {\n return this.sendTx(\n this.contract\n .updateOrganization(id, name, metadataURI)\n .catch((e) => {\n throw new OrganizationUpdateError(e.message, 'update');\n }),\n async () => ({ success: true }),\n );\n }\n\n addAdministrator(id: string, administrator: string) {\n return this.sendTx(\n this.contract\n .addAdministrator(id, administrator)\n .catch((e) => {\n throw new OrganizationAdministratorError(e.message, 'addAdministrator');\n }),\n async () => ({ success: true }),\n );\n }\n\n removeAdministrator(id: string, administrator: string) {\n return this.sendTx(\n this.contract\n .removeAdministrator(id, administrator)\n .catch((e) => {\n throw new OrganizationAdministratorError(e.message, 'removeAdministrator');\n }),\n async () => ({ success: true }),\n );\n }\n\n deleteOrganization(id: string) {\n return this.sendTx(\n this.contract\n .deleteOrganization(id)\n .catch((e) => {\n throw new OrganizationDeleteError(e.message, 'delete');\n }),\n async () => ({ success: true }),\n );\n }\n\n // ─── EVENT LISTENERS ───────────────────────────────────────────────────────\n\n onOrganizationCreated(cb: OrganizationCreatedCallback): void {\n this.contract.on(\n this.contract.filters.OrganizationCreated(),\n this.normalizeListener<[string]>(cb),\n );\n }\n\n onOrganizationUpdated(cb: OrganizationUpdatedCallback): void {\n this.contract.on(\n this.contract.filters.OrganizationUpdated(),\n this.normalizeListener<[string, string]>(cb),\n );\n }\n\n onAdministratorAdded(cb: OrganizationAdministratorAddedCallback): void {\n this.contract.on(\n this.contract.filters.AdministratorAdded(),\n this.normalizeListener<[string, string]>(cb)\n );\n }\n\n onAdministratorRemoved(cb: OrganizationAdministratorRemovedCallback): void {\n this.contract.on(\n this.contract.filters.AdministratorRemoved(),\n this.normalizeListener<[string, string, string]>(cb)\n );\n }\n\n removeAllListeners(): void {\n this.contract.removeAllListeners();\n }\n}\n","import { BallotMode } from \"../core/types\";\nimport { ProofInputs } from \"./CircomProofService\";\nimport { CensusOrigin } from \"../census/types\";\nimport { sha256 } from \"ethers\";\n\nexport interface DavinciCryptoInputs {\n address: string;\n processID: string;\n encryptionKey: [string, string];\n k?: string;\n weight: string;\n fieldValues: string[];\n ballotMode: BallotMode;\n}\n\nexport interface DavinciCryptoCiphertext {\n c1: [string, string];\n c2: [string, string];\n}\n\nexport interface DavinciCryptoOutput {\n processId: string;\n address: string;\n ballot: {\n curveType: string;\n ciphertexts: DavinciCryptoCiphertext[];\n };\n ballotInputsHash: string;\n voteId: string;\n circomInputs: ProofInputs;\n}\n\nexport interface CSPSignOutput {\n censusOrigin: CensusOrigin;\n root: string;\n address: string;\n processId: string;\n publicKey: string;\n signature: string;\n}\n\n// internal shapes returned by the Go runtime\ninterface RawResult<T = any> { error?: string; data?: T; }\ninterface GoDavinciCryptoWasm {\n proofInputs(inputJson: string): RawResult<DavinciCryptoOutput>;\n cspSign(censusOrigin: number, privKey: string, processId: string, address: string): RawResult<CSPSignOutput>;\n cspVerify(cspProof: string): RawResult<boolean>;\n cspCensusRoot(censusOrigin: number, privKey: string): RawResult<{ root: string }>;\n}\n\ndeclare global {\n var Go: new () => { importObject: Record<string, any>; run(instance: WebAssembly.Instance): Promise<void> };\n var DavinciCrypto: GoDavinciCryptoWasm;\n}\n\nexport interface DavinciCryptoOptions {\n /** URL to wasm_exec.js */\n wasmExecUrl: string;\n /** URL to the compiled davinci_crypto.wasm */\n wasmUrl: string;\n /** How long (ms) to wait for the Go runtime to attach DavinciCrypto */\n initTimeoutMs?: number;\n /** Optional SHA-256 hash to verify wasm_exec.js integrity */\n wasmExecHash?: string;\n /** Optional SHA-256 hash to verify davinci_crypto.wasm integrity */\n wasmHash?: string;\n}\n\nexport class DavinciCrypto {\n private go!: InstanceType<typeof Go>;\n private initialized = false;\n private readonly wasmExecUrl: string;\n private readonly wasmUrl: string;\n private readonly initTimeoutMs: number;\n private readonly wasmExecHash?: string;\n private readonly wasmHash?: string;\n\n // Cache for wasm files\n private static wasmExecCache = new Map<string, string>();\n private static wasmBinaryCache = new Map<string, ArrayBuffer>();\n\n constructor(opts: DavinciCryptoOptions) {\n const { wasmExecUrl, wasmUrl, initTimeoutMs, wasmExecHash, wasmHash } = opts;\n\n if (!wasmExecUrl) throw new Error(\"`wasmExecUrl` is required\");\n if (!wasmUrl) throw new Error(\"`wasmUrl` is required\");\n\n this.wasmExecUrl = wasmExecUrl;\n this.wasmUrl = wasmUrl;\n this.initTimeoutMs = initTimeoutMs ?? 5_000;\n this.wasmExecHash = wasmExecHash;\n this.wasmHash = wasmHash;\n }\n\n /**\n * Computes SHA-256 hash of the given data and compares it with the expected hash.\n * @param data - The data to hash (string or ArrayBuffer)\n * @param expectedHash - The expected SHA-256 hash in hexadecimal format\n * @param filename - The filename for error reporting\n * @throws Error if the computed hash doesn't match the expected hash\n */\n private verifyHash(data: string | ArrayBuffer, expectedHash: string, filename: string): void {\n // Convert data to Uint8Array for hashing\n let bytes: Uint8Array;\n if (typeof data === 'string') {\n bytes = new TextEncoder().encode(data);\n } else {\n bytes = new Uint8Array(data);\n }\n\n // Compute SHA-256 hash using ethers\n const computedHash = sha256(bytes).slice(2); // Remove '0x' prefix\n\n // Compare hashes (case-insensitive)\n if (computedHash.toLowerCase() !== expectedHash.toLowerCase()) {\n throw new Error(\n `Hash verification failed for ${filename}. ` +\n `Expected: ${expectedHash.toLowerCase()}, ` +\n `Computed: ${computedHash.toLowerCase()}`\n );\n }\n }\n\n /**\n * Must be awaited before calling `proofInputs()`.\n * Safe to call multiple times.\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n // 1) Fetch & eval Go runtime shim (with caching and hash verification)\n let shimCode = DavinciCrypto.wasmExecCache.get(this.wasmExecUrl);\n if (!shimCode) {\n const shim = await fetch(this.wasmExecUrl);\n if (!shim.ok) {\n throw new Error(`Failed to fetch wasm_exec.js from ${this.wasmExecUrl}`);\n }\n shimCode = await shim.text();\n \n // Verify hash if provided\n if (this.wasmExecHash) {\n this.verifyHash(shimCode, this.wasmExecHash, 'wasm_exec.js');\n }\n \n DavinciCrypto.wasmExecCache.set(this.wasmExecUrl, shimCode);\n }\n new Function(shimCode)(); // registers globalThis.Go\n\n if (typeof globalThis.Go !== \"function\") {\n throw new Error(\"Global `Go` constructor not found after loading wasm_exec.js\");\n }\n this.go = new globalThis.Go();\n\n // 2) Fetch & instantiate your Go‐compiled WASM (with caching and hash verification)\n let bytes = DavinciCrypto.wasmBinaryCache.get(this.wasmUrl);\n if (!bytes) {\n const resp = await fetch(this.wasmUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch ballotproof.wasm from ${this.wasmUrl}`);\n }\n bytes = await resp.arrayBuffer();\n \n // Verify hash if provided\n if (this.wasmHash) {\n this.verifyHash(bytes, this.wasmHash, 'davinci_crypto.wasm');\n }\n \n DavinciCrypto.wasmBinaryCache.set(this.wasmUrl, bytes);\n }\n const { instance } = await WebAssembly.instantiate(bytes, this.go.importObject);\n\n // 3) Start the Go scheduler (it sets up DavinciCrypto)\n this.go.run(instance).catch(() => { /* swallow the exit exception */ });\n\n // 4) Wait for the global DavinciCrypto helper to appear\n const deadline = Date.now() + this.initTimeoutMs;\n while (Date.now() < deadline && !globalThis.DavinciCrypto) {\n await new Promise((r) => setTimeout(r, 50));\n }\n if (!globalThis.DavinciCrypto) {\n throw new Error(\"`DavinciCrypto` not initialized within timeout\");\n }\n\n this.initialized = true;\n }\n\n /**\n * Convert your inputs into JSON, hand off to Go/WASM, then parse & return.\n * @throws if called before `await init()`, or if Go returns an error\n */\n async proofInputs(inputs: DavinciCryptoInputs): Promise<DavinciCryptoOutput> {\n if (!this.initialized) {\n throw new Error(\"DavinciCrypto not initialized — call `await init()` first\");\n }\n\n const raw = (globalThis.DavinciCrypto as GoDavinciCryptoWasm)\n .proofInputs(JSON.stringify(inputs));\n\n if (raw.error) {\n throw new Error(`Go/WASM proofInputs error: ${raw.error}`);\n }\n if (!raw.data) {\n throw new Error(\"Go/WASM proofInputs returned no data\");\n }\n\n return raw.data;\n }\n\n /**\n * Generate a CSP (Credential Service Provider) signature for census proof.\n * @param censusOrigin - The census origin type (e.g., CensusOrigin.CensusOriginCSP)\n * @param privKey - The private key in hex format\n * @param processId - The process ID in hex format\n * @param address - The address in hex format\n * @returns The CSP proof as a parsed JSON object\n * @throws if called before `await init()`, or if Go returns an error\n */\n async cspSign(censusOrigin: CensusOrigin, privKey: string, processId: string, address: string): Promise<CSPSignOutput> {\n if (!this.initialized) {\n throw new Error(\"DavinciCrypto not initialized — call `await init()` first\");\n }\n\n const raw = (globalThis.DavinciCrypto as GoDavinciCryptoWasm)\n .cspSign(censusOrigin, privKey, processId, address);\n\n if (raw.error) {\n throw new Error(`Go/WASM cspSign error: ${raw.error}`);\n }\n if (!raw.data) {\n throw new Error(\"Go/WASM cspSign returned no data\");\n }\n\n return raw.data;\n }\n\n /**\n * Verify a CSP (Credential Service Provider) proof.\n * @param censusOrigin - The census origin type (e.g., CensusOrigin.CensusOriginCSP)\n * @param root - The census root\n * @param address - The address\n * @param processId - The process ID\n * @param publicKey - The public key\n * @param signature - The signature\n * @returns The verification result\n * @throws if called before `await init()`, or if Go returns an error\n */\n async cspVerify(censusOrigin: CensusOrigin, root: string, address: string, processId: string, publicKey: string, signature: string): Promise<boolean> {\n if (!this.initialized) {\n throw new Error(\"DavinciCrypto not initialized — call `await init()` first\");\n }\n\n // Create the CSP proof object and stringify it for the WASM call\n const cspProof = {\n censusOrigin,\n root,\n address,\n processId,\n publicKey,\n signature\n };\n\n const raw = (globalThis.DavinciCrypto as GoDavinciCryptoWasm)\n .cspVerify(JSON.stringify(cspProof));\n\n if (raw.error) {\n throw new Error(`Go/WASM cspVerify error: ${raw.error}`);\n }\n if (!raw.data) {\n throw new Error(\"Go/WASM cspVerify returned no data\");\n }\n\n return raw.data;\n }\n\n /**\n * Generate a CSP (Credential Service Provider) census root.\n * @param censusOrigin - The census origin type (e.g., CensusOrigin.CensusOriginCSP)\n * @param privKey - The private key in hex format\n * @returns The census root as a hexadecimal string\n * @throws if called before `await init()`, or if Go returns an error\n */\n async cspCensusRoot(censusOrigin: CensusOrigin, privKey: string): Promise<string> {\n if (!this.initialized) {\n throw new Error(\"DavinciCrypto not initialized — call `await init()` first\");\n }\n\n const raw = (globalThis.DavinciCrypto as GoDavinciCryptoWasm)\n .cspCensusRoot(censusOrigin, privKey);\n\n if (raw.error) {\n throw new Error(`Go/WASM cspCensusRoot error: ${raw.error}`);\n }\n if (!raw.data) {\n throw new Error(\"Go/WASM cspCensusRoot returned no data\");\n }\n\n return raw.data.root;\n }\n}\n","import { Signer } from \"ethers\";\nimport { VocdoniApiService } from \"./core/api/ApiService\";\nimport { ProcessRegistryService } from \"./contracts/ProcessRegistryService\";\nimport { OrganizationRegistryService } from \"./contracts/OrganizationRegistry\";\nimport { DavinciCrypto } from \"./sequencer/DavinciCryptoService\";\nimport { deployedAddresses } from \"./contracts/SmartContractService\";\nimport { Environment, EnvironmentOptions, resolveConfiguration } from \"./core/config\";\nimport { ProcessOrchestrationService, ProcessConfig, ProcessCreationResult, ProcessInfo } from \"./core/process\";\nimport { VoteOrchestrationService, VoteConfig, VoteResult, VoteStatusInfo } from \"./core/vote\";\nimport { VoteStatus } from \"./sequencer/api/types\";\nimport { CensusProviders } from \"./census/types\";\n\n/**\n * Configuration interface for the DavinciSDK\n */\nexport interface DavinciSDKConfig {\n /** Ethers.js Signer (can be from MetaMask, Wallet, or any other provider) */\n signer: Signer;\n \n /** Environment to use (dev, stg, prod) - used to set default URLs and chain if not explicitly provided */\n environment?: Environment;\n \n /** Sequencer API URL for Vocdoni services (optional, defaults based on environment) */\n sequencerUrl?: string;\n \n /** Census API URL for census management (optional, defaults based on environment) */\n censusUrl?: string;\n \n /** Chain name (optional, defaults based on environment) */\n chain?: 'sepolia' | 'mainnet';\n \n /** Custom contract addresses (optional, uses defaults if not provided) */\n contractAddresses?: {\n processRegistry?: string;\n organizationRegistry?: string;\n stateTransitionVerifier?: string;\n resultsVerifier?: string;\n sequencerRegistry?: string;\n };\n \n /** Whether to force using contract addresses from sequencer info (optional, defaults to false) */\n useSequencerAddresses?: boolean;\n \n /** Custom census proof providers (optional) */\n censusProviders?: CensusProviders;\n}\n\n\n/**\n * Internal configuration interface (without environment)\n */\ninterface InternalDavinciSDKConfig {\n signer: Signer;\n sequencerUrl: string;\n censusUrl: string;\n chain: 'sepolia' | 'mainnet';\n contractAddresses: {\n processRegistry?: string;\n organizationRegistry?: string;\n stateTransitionVerifier?: string;\n resultsVerifier?: string;\n sequencerRegistry?: string;\n };\n useSequencerAddresses: boolean;\n}\n\n/**\n * Simplified SDK class that encapsulates all Vocdoni DaVinci functionality\n */\nexport class DavinciSDK {\n private config: InternalDavinciSDKConfig;\n private apiService: VocdoniApiService;\n private _processRegistry?: ProcessRegistryService;\n private _organizationRegistry?: OrganizationRegistryService;\n private _processOrchestrator?: ProcessOrchestrationService;\n private _voteOrchestrator?: VoteOrchestrationService;\n private davinciCrypto?: DavinciCrypto;\n private initialized = false;\n private censusProviders: CensusProviders;\n\n constructor(config: DavinciSDKConfig) {\n // Resolve configuration based on environment and custom overrides\n const resolvedConfig = resolveConfiguration({\n environment: config.environment,\n customUrls: {\n sequencer: config.sequencerUrl,\n census: config.censusUrl\n },\n customChain: config.chain\n });\n\n // Set defaults for optional parameters\n this.config = {\n signer: config.signer,\n sequencerUrl: config.sequencerUrl ?? resolvedConfig.sequencer,\n censusUrl: config.censusUrl ?? resolvedConfig.census,\n chain: config.chain ?? resolvedConfig.chain,\n contractAddresses: config.contractAddresses || {},\n useSequencerAddresses: config.useSequencerAddresses || false\n };\n\n // Initialize API service\n this.apiService = new VocdoniApiService({\n sequencerURL: this.config.sequencerUrl,\n censusURL: this.config.censusUrl\n });\n\n // Store census providers\n this.censusProviders = config.censusProviders || {};\n\n // Contract services will be initialized lazily when accessed\n }\n\n /**\n * Initialize the SDK and all its components\n * This must be called before using any SDK functionality\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n // If useSequencerAddresses is true, fetch sequencer info and update contract addresses\n if (this.config.useSequencerAddresses) {\n await this.updateContractAddressesFromSequencer();\n }\n\n // Initialize DavinciCrypto if needed (lazy initialization)\n // This will be done when crypto operations are first needed\n\n this.initialized = true;\n }\n\n /**\n * Get the API service for direct access to sequencer and census APIs\n */\n get api(): VocdoniApiService {\n return this.apiService;\n }\n\n /**\n * Get the process registry service for process management\n */\n get processes(): ProcessRegistryService {\n if (!this._processRegistry) {\n const processRegistryAddress = this.resolveContractAddress('processRegistry');\n this._processRegistry = new ProcessRegistryService(processRegistryAddress, this.config.signer);\n }\n return this._processRegistry;\n }\n\n /**\n * Get the organization registry service for organization management\n */\n get organizations(): OrganizationRegistryService {\n if (!this._organizationRegistry) {\n const organizationRegistryAddress = this.resolveContractAddress('organizationRegistry');\n this._organizationRegistry = new OrganizationRegistryService(organizationRegistryAddress, this.config.signer);\n }\n return this._organizationRegistry;\n }\n\n /**\n * Get or initialize the DavinciCrypto service for cryptographic operations\n */\n async getCrypto(): Promise<DavinciCrypto> {\n if (!this.davinciCrypto) {\n // Get WASM URLs from sequencer info\n const info = await this.apiService.sequencer.getInfo();\n \n this.davinciCrypto = new DavinciCrypto({\n wasmExecUrl: info.ballotProofWasmHelperExecJsUrl,\n wasmUrl: info.ballotProofWasmHelperUrl\n });\n\n await this.davinciCrypto.init();\n }\n\n return this.davinciCrypto;\n }\n\n /**\n * Get the process orchestration service for simplified process creation\n */\n get processOrchestrator(): ProcessOrchestrationService {\n if (!this._processOrchestrator) {\n this._processOrchestrator = new ProcessOrchestrationService(\n this.processes,\n this.apiService,\n this.organizations,\n () => this.getCrypto(),\n this.config.signer\n );\n }\n return this._processOrchestrator;\n }\n\n /**\n * Get the vote orchestration service for simplified voting\n */\n get voteOrchestrator(): VoteOrchestrationService {\n if (!this._voteOrchestrator) {\n this._voteOrchestrator = new VoteOrchestrationService(\n this.apiService,\n () => this.getCrypto(),\n this.config.signer,\n this.censusProviders\n );\n }\n return this._voteOrchestrator;\n }\n\n /**\n * Gets user-friendly process information from the blockchain.\n * This method fetches raw contract data and transforms it into a user-friendly format\n * that matches the ProcessConfig interface used for creation, plus additional runtime data.\n * \n * @param processId - The process ID to fetch\n * @returns Promise resolving to user-friendly process information\n * \n * @example\n * ```typescript\n * const processInfo = await sdk.getProcess(\"0x1234567890abcdef...\");\n * \n * // Access the same fields as ProcessConfig\n * console.log(\"Title:\", processInfo.title);\n * console.log(\"Description:\", processInfo.description);\n * console.log(\"Questions:\", processInfo.questions);\n * console.log(\"Census size:\", processInfo.census.size);\n * console.log(\"Ballot config:\", processInfo.ballot);\n * \n * // Plus additional runtime information\n * console.log(\"Status:\", processInfo.status);\n * console.log(\"Creator:\", processInfo.creator);\n * console.log(\"Start date:\", processInfo.startDate);\n * console.log(\"End date:\", processInfo.endDate);\n * console.log(\"Duration:\", processInfo.duration, \"seconds\");\n * console.log(\"Time remaining:\", processInfo.timeRemaining, \"seconds\");\n * \n * // Access raw contract data if needed\n * console.log(\"Raw data:\", processInfo.raw);\n * ```\n */\n async getProcess(processId: string): Promise<ProcessInfo> {\n if (!this.initialized) {\n throw new Error(\"SDK must be initialized before getting processes. Call sdk.init() first.\");\n }\n \n return this.processOrchestrator.getProcess(processId);\n }\n\n /**\n * Creates a complete voting process with minimal configuration.\n * This is the ultra-easy method for end users that handles all the complex orchestration internally.\n * \n * The method automatically:\n * - Gets encryption keys and initial state root from the sequencer\n * - Handles process creation signatures\n * - Coordinates between sequencer API and on-chain contract calls\n * - Creates and pushes metadata\n * - Submits the on-chain transaction\n * \n * @param config - Simplified process configuration\n * @returns Promise resolving to the process creation result\n * \n * @example\n * ```typescript\n * // Option 1: Using duration (traditional approach)\n * const result1 = await sdk.createProcess({\n * title: \"My Election\",\n * description: \"A simple election\",\n * census: {\n * type: CensusOrigin.CensusOriginMerkleTree,\n * root: \"0x1234...\",\n * size: 100,\n * uri: \"ipfs://your-census-uri\"\n * },\n * ballot: {\n * numFields: 2,\n * maxValue: \"3\",\n * minValue: \"0\",\n * uniqueValues: false,\n * costFromWeight: false,\n * costExponent: 10000,\n * maxValueSum: \"6\",\n * minValueSum: \"0\"\n * },\n * timing: {\n * startDate: new Date(\"2024-12-01T10:00:00Z\"),\n * duration: 3600 * 24\n * },\n * questions: [\n * {\n * title: \"What is your favorite color?\",\n * choices: [\n * { title: \"Red\", value: 0 },\n * { title: \"Blue\", value: 1 }\n * ]\n * }\n * ]\n * });\n * \n * // Option 2: Using start and end dates\n * const result2 = await sdk.createProcess({\n * title: \"Weekend Vote\",\n * timing: {\n * startDate: \"2024-12-07T09:00:00Z\",\n * endDate: \"2024-12-08T18:00:00Z\"\n * }\n * });\n * ```\n */\n async createProcess(config: ProcessConfig): Promise<ProcessCreationResult> {\n if (!this.initialized) {\n throw new Error(\"SDK must be initialized before creating processes. Call sdk.init() first.\");\n }\n \n return this.processOrchestrator.createProcess(config);\n }\n\n /**\n * Submit a vote with simplified configuration.\n * This is the ultra-easy method for end users that handles all the complex voting workflow internally.\n * \n * The method automatically:\n * - Fetches process information and validates voting is allowed\n * - Gets census proof (Merkle tree based)\n * - Generates cryptographic proofs and encrypts the vote\n * - Signs and submits the vote to the sequencer\n * \n * @param config - Simplified vote configuration\n * @returns Promise resolving to vote submission result\n * \n * @example\n * ```typescript\n * // Submit a vote with voter's private key\n * const voteResult = await sdk.submitVote({\n * processId: \"0x1234567890abcdef...\",\n * choices: [1, 0], // Vote for option 1 in question 1, option 0 in question 2\n * voterKey: \"0x1234567890abcdef...\" // Voter's private key\n * });\n * \n * console.log(\"Vote ID:\", voteResult.voteId);\n * console.log(\"Status:\", voteResult.status);\n * \n * // Submit a vote with a Wallet instance\n * import { Wallet } from \"ethers\";\n * const voterWallet = new Wallet(\"0x...\");\n * \n * const voteResult2 = await sdk.submitVote({\n * processId: \"0x1234567890abcdef...\",\n * choices: [2], // Single question vote\n * voterKey: voterWallet\n * });\n * ```\n */\n async submitVote(config: VoteConfig): Promise<VoteResult> {\n if (!this.initialized) {\n throw new Error(\"SDK must be initialized before submitting votes. Call sdk.init() first.\");\n }\n \n return this.voteOrchestrator.submitVote(config);\n }\n\n /**\n * Get the status of a submitted vote.\n * \n * @param processId - The process ID\n * @param voteId - The vote ID returned from submitVote()\n * @returns Promise resolving to vote status information\n * \n * @example\n * ```typescript\n * const statusInfo = await sdk.getVoteStatus(processId, voteId);\n * console.log(\"Vote status:\", statusInfo.status);\n * // Possible statuses: \"pending\", \"verified\", \"aggregated\", \"processed\", \"settled\", \"error\"\n * ```\n */\n async getVoteStatus(processId: string, voteId: string): Promise<VoteStatusInfo> {\n if (!this.initialized) {\n throw new Error(\"SDK must be initialized before getting vote status. Call sdk.init() first.\");\n }\n \n return this.voteOrchestrator.getVoteStatus(processId, voteId);\n }\n\n /**\n * Check if an address has voted in a process.\n * \n * @param processId - The process ID\n * @param address - The voter's address\n * @returns Promise resolving to boolean indicating if the address has voted\n * \n * @example\n * ```typescript\n * const hasVoted = await sdk.hasAddressVoted(processId, \"0x1234567890abcdef...\");\n * if (hasVoted) {\n * console.log(\"This address has already voted\");\n * }\n * ```\n */\n async hasAddressVoted(processId: string, address: string): Promise<boolean> {\n if (!this.initialized) {\n throw new Error(\"SDK must be initialized before checking vote status. Call sdk.init() first.\");\n }\n \n return this.voteOrchestrator.hasAddressVoted(processId, address);\n }\n\n /**\n * Wait for a vote to reach a specific status.\n * Useful for waiting for vote confirmation and processing.\n * \n * @param processId - The process ID\n * @param voteId - The vote ID\n * @param targetStatus - The target status to wait for (default: \"settled\")\n * @param timeoutMs - Maximum time to wait in milliseconds (default: 300000 = 5 minutes)\n * @param pollIntervalMs - Polling interval in milliseconds (default: 5000 = 5 seconds)\n * @returns Promise resolving to final vote status\n * \n * @example\n * ```typescript\n * // Submit vote and wait for it to be settled\n * const voteResult = await sdk.submitVote({\n * processId: \"0x1234567890abcdef...\",\n * choices: [1],\n * voterKey: \"0x...\"\n * });\n * \n * // Wait for the vote to be fully processed\n * const finalStatus = await sdk.waitForVoteStatus(\n * voteResult.processId,\n * voteResult.voteId,\n * \"settled\", // Wait until vote is settled\n * 300000, // 5 minute timeout\n * 5000 // Check every 5 seconds\n * );\n * \n * console.log(\"Vote final status:\", finalStatus.status);\n * ```\n */\n async waitForVoteStatus(\n processId: string,\n voteId: string,\n targetStatus: VoteStatus = VoteStatus.Settled,\n timeoutMs: number = 300000,\n pollIntervalMs: number = 5000\n ): Promise<VoteStatusInfo> {\n if (!this.initialized) {\n throw new Error(\"SDK must be initialized before waiting for vote status. Call sdk.init() first.\");\n }\n \n return this.voteOrchestrator.waitForVoteStatus(processId, voteId, targetStatus, timeoutMs, pollIntervalMs);\n }\n\n /**\n * Resolve contract address based on configuration priority:\n * 1. If useSequencerAddresses is true: addresses from sequencer (highest priority)\n * 2. Custom addresses from config (if provided by user)\n * 3. Default deployed addresses from npm package\n */\n private resolveContractAddress(contractName: keyof NonNullable<DavinciSDKConfig['contractAddresses']>): string {\n // 1. If useSequencerAddresses is true, we'll get addresses from sequencer during init()\n // For now, return default addresses - they will be updated in updateContractAddressesFromSequencer()\n if (this.config.useSequencerAddresses) {\n // Return default for now, will be updated during init()\n return this.getDefaultContractAddress(contractName);\n }\n\n // 2. Check if custom address is provided by user\n const customAddress = this.config.contractAddresses[contractName];\n if (customAddress) {\n return customAddress;\n }\n\n // 3. Use default deployed addresses from npm package\n return this.getDefaultContractAddress(contractName);\n }\n\n /**\n * Get default contract address from deployed addresses\n */\n private getDefaultContractAddress(contractName: keyof NonNullable<DavinciSDKConfig['contractAddresses']>): string {\n const chain = this.config.chain;\n switch (contractName) {\n case 'processRegistry':\n return deployedAddresses.processRegistry[chain];\n case 'organizationRegistry':\n return deployedAddresses.organizationRegistry[chain];\n case 'stateTransitionVerifier':\n return deployedAddresses.stateTransitionVerifierGroth16[chain];\n case 'resultsVerifier':\n return deployedAddresses.resultsVerifierGroth16[chain];\n case 'sequencerRegistry':\n return deployedAddresses.sequencerRegistry[chain];\n default:\n throw new Error(`Unknown contract: ${contractName}`);\n }\n }\n\n /**\n * Update contract addresses from sequencer info if useSequencerAddresses is enabled\n * Sequencer addresses have priority over user-provided addresses\n */\n private async updateContractAddressesFromSequencer(): Promise<void> {\n try {\n const info = await this.apiService.sequencer.getInfo();\n const contracts = info.contracts;\n\n // Update process registry with sequencer address (overrides user address)\n if (contracts.process) {\n this._processRegistry = new ProcessRegistryService(contracts.process, this.config.signer);\n this.config.contractAddresses.processRegistry = contracts.process;\n }\n\n // Update organization registry with sequencer address (overrides user address)\n if (contracts.organization) {\n this._organizationRegistry = new OrganizationRegistryService(contracts.organization, this.config.signer);\n this.config.contractAddresses.organizationRegistry = contracts.organization;\n }\n\n // Update other contract addresses from sequencer (overrides user addresses)\n if (contracts.stateTransitionVerifier) {\n this.config.contractAddresses.stateTransitionVerifier = contracts.stateTransitionVerifier;\n }\n\n if (contracts.resultsVerifier) {\n this.config.contractAddresses.resultsVerifier = contracts.resultsVerifier;\n }\n\n // Note: sequencerRegistry is not provided by the sequencer info endpoint\n } catch (error) {\n console.warn('Failed to fetch contract addresses from sequencer, using defaults:', error);\n }\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): Readonly<InternalDavinciSDKConfig> {\n return { ...this.config };\n }\n\n /**\n * Check if the SDK has been initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n"],"names":["ElectionResultsTypeNames","CensusOrigin","TxStatus","ProcessStatus","ProcessRegistry__factory","sha256","groth16","VoteStatus","OrganizationRegistry__factory"],"mappings":"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"}
|