@vocdoni/davinci-sdk 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/dist/contracts.d.ts +3 -4
- package/dist/index.d.ts +84 -30
- package/dist/index.js +74 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +74 -33
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +74 -33
- package/dist/sequencer.d.ts +19 -13
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/core/types/metadata.ts","../src/core/api/BaseService.ts","../src/census/CensusService.ts","../src/census/types.ts","../src/census/classes/Census.ts","../src/census/classes/PlainCensus.ts","../src/census/classes/WeightedCensus.ts","../src/census/classes/CspCensus.ts","../src/census/classes/PublishedCensus.ts","../src/census/CensusOrchestrator.ts","../src/sequencer/api/helpers.ts","../src/sequencer/SequencerService.ts","../src/core/api/ApiService.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 { CensusOrigin, CensusParticipant as ImportedCensusParticipant } from '../types';\n\n/**\n * Census type enumeration\n */\nexport enum CensusType {\n PLAIN = 'plain',\n WEIGHTED = 'weighted',\n CSP = 'csp',\n}\n\n/**\n * Re-export CensusParticipant from types for convenience\n * Extended to make weight required (base type has optional weight)\n */\nexport interface CensusParticipant extends ImportedCensusParticipant {\n weight: string; // Make weight required\n}\n\n/**\n * Abstract base class for all census types\n */\nexport abstract class Census {\n protected _censusId: string | null = null;\n protected _censusRoot: string | null = null;\n protected _censusURI: string | null = null;\n protected _type: CensusType;\n protected _size: number | null = null;\n\n constructor(type: CensusType) {\n this._type = type;\n }\n\n get censusId(): string | null {\n return this._censusId;\n }\n\n get censusRoot(): string | null {\n return this._censusRoot;\n }\n\n get censusURI(): string | null {\n return this._censusURI;\n }\n\n get type(): CensusType {\n return this._type;\n }\n\n get size(): number | null {\n return this._size;\n }\n\n get isPublished(): boolean {\n return this._censusRoot !== null && this._censusURI !== null;\n }\n\n /**\n * Convert CensusType to CensusOrigin enum for API compatibility\n */\n get censusOrigin(): CensusOrigin {\n switch (this._type) {\n case CensusType.PLAIN:\n case CensusType.WEIGHTED:\n return CensusOrigin.CensusOriginMerkleTree;\n case CensusType.CSP:\n return CensusOrigin.CensusOriginCSP;\n default:\n throw new Error(`Unknown census type: ${this._type}`);\n }\n }\n}\n","import { Census, CensusType, CensusParticipant } from './Census';\n\n/**\n * Plain census where all participants have equal voting power (weight=1)\n * Simpler API - just add addresses without specifying weights\n */\nexport class PlainCensus extends Census {\n private _participants: Set<string> = new Set();\n\n constructor() {\n super(CensusType.PLAIN);\n }\n\n /**\n * Add participant(s) with automatic weight=1\n * @param addresses - Single address or array of addresses\n */\n add(addresses: string | string[]): void {\n const toAdd = Array.isArray(addresses) ? addresses : [addresses];\n\n for (const address of toAdd) {\n this.validateAddress(address);\n this._participants.add(address.toLowerCase());\n }\n }\n\n /**\n * Remove participant by address\n */\n remove(address: string): void {\n this._participants.delete(address.toLowerCase());\n }\n\n /**\n * Get all participants as CensusParticipant array (for API)\n * All participants have weight=\"1\"\n */\n get participants(): CensusParticipant[] {\n return Array.from(this._participants).map(key => ({\n key,\n weight: '1', // Everyone has weight=1 in plain census\n }));\n }\n\n /**\n * Get addresses only\n */\n get addresses(): string[] {\n return Array.from(this._participants);\n }\n\n private validateAddress(address: string): void {\n if (!address || typeof address !== 'string') {\n throw new Error('Address is required and must be a string');\n }\n // Basic format check\n if (!/^(0x)?[0-9a-fA-F]{40}$/i.test(address)) {\n throw new Error(`Invalid Ethereum address format: ${address}`);\n }\n }\n\n /**\n * Internal method called after publishing\n * @internal\n */\n _setPublishedData(root: string, uri: string, size: number, censusId?: string): void {\n this._censusRoot = root;\n this._censusURI = uri;\n this._size = size;\n if (censusId) this._censusId = censusId;\n }\n}\n","import { Census, CensusType, CensusParticipant } from './Census';\n\n/**\n * Participant with flexible weight type for WeightedCensus\n * Weight can be string, number, or bigint - will be normalized to string internally\n */\nexport interface WeightedParticipant {\n key: string;\n weight: string | number | bigint;\n}\n\n/**\n * Weighted census where participants can have different voting power\n * Requires specifying weight for each participant\n */\nexport class WeightedCensus extends Census {\n private _participants: Map<string, string> = new Map();\n\n constructor() {\n super(CensusType.WEIGHTED);\n }\n\n /**\n * Add participant(s) with custom weights\n * Weight can be provided as string, number, or bigint - will be converted to string internally\n * @param participant - Single participant or array of participants with custom weights\n */\n add(participant: WeightedParticipant | WeightedParticipant[]): void {\n const toAdd = Array.isArray(participant) ? participant : [participant];\n\n for (const p of toAdd) {\n this.validateParticipant(p);\n const weightString = this.normalizeWeight(p.weight);\n this._participants.set(p.key.toLowerCase(), weightString);\n }\n }\n\n /**\n * Remove participant by address\n */\n remove(address: string): void {\n this._participants.delete(address.toLowerCase());\n }\n\n /**\n * Get all participants as CensusParticipant array\n */\n get participants(): CensusParticipant[] {\n return Array.from(this._participants.entries()).map(([key, weight]) => ({\n key,\n weight,\n }));\n }\n\n /**\n * Get participant addresses\n */\n get addresses(): string[] {\n return Array.from(this._participants.keys());\n }\n\n /**\n * Get weight for specific address\n */\n getWeight(address: string): string | undefined {\n return this._participants.get(address.toLowerCase());\n }\n\n /**\n * Normalizes weight from string, number, or bigint to string\n */\n private normalizeWeight(weight: string | number | bigint): string {\n if (typeof weight === 'string') {\n // Validate it's a positive integer string\n if (!/^\\d+$/.test(weight)) {\n throw new Error(`Invalid weight format: ${weight}. Must be a positive integer.`);\n }\n return weight;\n }\n \n if (typeof weight === 'number') {\n // Validate it's a positive integer\n if (!Number.isInteger(weight) || weight < 0) {\n throw new Error(`Invalid weight: ${weight}. Must be a positive integer.`);\n }\n return weight.toString();\n }\n \n if (typeof weight === 'bigint') {\n // Validate it's positive\n if (weight < 0n) {\n throw new Error(`Invalid weight: ${weight}. Must be a positive integer.`);\n }\n return weight.toString();\n }\n \n throw new Error(`Invalid weight type. Must be string, number, or bigint.`);\n }\n\n private validateParticipant(participant: WeightedParticipant): void {\n if (!participant.key || typeof participant.key !== 'string') {\n throw new Error('Participant key (address) is required');\n }\n // Basic format check\n if (!/^(0x)?[0-9a-fA-F]{40}$/i.test(participant.key)) {\n throw new Error(`Invalid Ethereum address format: ${participant.key}`);\n }\n if (participant.weight === undefined || participant.weight === null) {\n throw new Error('Participant weight is required');\n }\n // Weight validation is done in normalizeWeight\n }\n\n /**\n * Internal method called after publishing\n * @internal\n */\n _setPublishedData(root: string, uri: string, size: number, censusId?: string): void {\n this._censusRoot = root;\n this._censusURI = uri;\n this._size = size;\n if (censusId) this._censusId = censusId;\n }\n}\n","import { Census, CensusType } from './Census';\n\n/**\n * CSP (Certificate Service Provider) census\n * Uses a public key and CSP server URI instead of a participant list\n */\nexport class CspCensus extends Census {\n private _publicKey: string;\n private _cspURI: string;\n\n constructor(publicKey: string, cspURI: string, size: number) {\n super(CensusType.CSP);\n\n // Validate public key\n if (!/^(0x)?[0-9a-fA-F]+$/.test(publicKey)) {\n throw new Error('Public key is missing or invalid');\n }\n\n // Validate CSP URI\n try {\n new URL(cspURI);\n } catch {\n throw new Error('CSP URI is missing or invalid');\n }\n\n this._publicKey = publicKey;\n this._cspURI = cspURI;\n\n // For CSP, these are known immediately\n this._censusRoot = publicKey; // Public key serves as root\n this._censusURI = cspURI;\n this._size = size;\n }\n\n get publicKey(): string {\n return this._publicKey;\n }\n\n get cspURI(): string {\n return this._cspURI;\n }\n}\n","import { Census, CensusType } from './Census';\n\n/**\n * Published census - represents a census that has already been published\n * Use this when you have the census root, URI, and size from a previous publication\n */\nexport class PublishedCensus extends Census {\n constructor(type: CensusType, root: string, uri: string, size: number) {\n super(type);\n this._censusRoot = root;\n this._censusURI = uri;\n this._size = size;\n }\n}\n","import { VocdoniCensusService } from './CensusService';\nimport { Census } from './classes/Census';\nimport { PlainCensus } from './classes/PlainCensus';\nimport { WeightedCensus } from './classes/WeightedCensus';\nimport { CensusOrigin } from './types';\n\n/**\n * Orchestrates census creation and publishing\n */\nexport class CensusOrchestrator {\n constructor(private censusService: VocdoniCensusService) {}\n\n /**\n * Publishes a PlainCensus or WeightedCensus\n * Creates a working census, adds participants, and publishes it\n */\n async publish(census: PlainCensus | WeightedCensus): Promise<void> {\n if (census.isPublished) {\n throw new Error('Census is already published');\n }\n\n if (census.participants.length === 0) {\n throw new Error('Cannot publish empty census');\n }\n\n // 1. Create working census\n const censusId = await this.censusService.createCensus();\n\n // 2. Add participants (both Plain and Weighted have .participants getter)\n await this.censusService.addParticipants(censusId, census.participants);\n\n // 3. Publish\n const publishResponse = await this.censusService.publishCensus(censusId);\n\n // 4. Update census object with published data\n census._setPublishedData(\n publishResponse.root,\n publishResponse.uri,\n publishResponse.participantCount,\n censusId\n );\n }\n\n /**\n * Gets census data for process creation\n * Throws if census is not published\n */\n getCensusData(census: Census): {\n type: CensusOrigin;\n root: string;\n uri: string;\n size: number;\n } {\n if (!census.isPublished) {\n throw new Error('Census must be published before creating a process');\n }\n\n return {\n type: census.censusOrigin,\n root: census.censusRoot!,\n uri: census.censusURI!,\n size: census.size!,\n };\n }\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(\n processId: string,\n signer: Signer | Wallet\n): 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(processId: string, voteId: string): Promise<VoteStatusResponse> {\n return this.request<VoteStatusResponse>({\n method: 'GET',\n url: `/votes/${processId}/voteId/${voteId}`,\n });\n }\n\n async hasAddressVoted(processId: string, address: string): 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(\n `Failed to fetch metadata from URL: ${response.status} ${response.statusText}`\n );\n }\n return await response.json();\n } catch (error) {\n throw new Error(\n `Failed to fetch metadata from URL: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\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 type {\n ContractTransactionResponse,\n BaseContract,\n EventFilter,\n Provider,\n ContractEventName,\n} from 'ethers';\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, event normalization, and\n * event listener management with automatic fallback for RPCs that don't support eth_newFilter.\n */\nexport abstract class SmartContractService {\n /** Active polling intervals for event listeners using fallback mode */\n private pollingIntervals: NodeJS.Timeout[] = [];\n /** Default polling interval in milliseconds for event listener fallback */\n protected eventPollingInterval: number = 5000;\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>(stream: AsyncGenerator<TxStatusEvent<T>>): 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 * Sets up an event listener with automatic fallback for RPCs that don't support eth_newFilter.\n * First attempts to use contract.on() which relies on eth_newFilter. If the RPC doesn't support\n * this method (error code -32601), automatically falls back to polling with queryFilter.\n *\n * @template Args - Tuple type representing the event arguments\n * @param contract - The contract instance to listen to\n * @param eventFilter - The event filter to listen for\n * @param callback - The callback function to invoke when the event occurs\n *\n * @example\n * ```typescript\n * this.setupEventListener(\n * this.contract,\n * this.contract.filters.Transfer(),\n * (from: string, to: string, amount: bigint) => {\n * console.log(`Transfer: ${from} -> ${to}: ${amount}`);\n * }\n * );\n * ```\n */\n protected async setupEventListener<Args extends any[]>(\n contract: BaseContract,\n eventFilter: ContractEventName | EventFilter,\n callback: (...args: Args) => void\n ): Promise<void> {\n const normalizedCallback = this.normalizeListener(callback);\n\n // First, test if eth_newFilter is supported by trying to create a filter\n const provider = contract.runner?.provider as Provider | undefined;\n if (!provider) {\n console.warn('No provider available for event listeners');\n return;\n }\n\n try {\n // Test if the provider supports eth_newFilter\n // We do this by attempting to get logs with a filter\n // If it fails, we'll catch the error and use polling\n const testFilter = {\n address: await contract.getAddress(),\n topics: [],\n };\n\n // Try to create a filter - this will fail if eth_newFilter is not supported\n // We use the provider's internal method if available\n if ('send' in provider && typeof provider.send === 'function') {\n try {\n // Test both creating the filter AND getting changes to ensure full support\n const filterId = await provider.send('eth_newFilter', [testFilter]);\n \n // Try to get filter changes - this will fail if RPC doesn't maintain filters\n await provider.send('eth_getFilterChanges', [filterId]);\n \n // If we get here, both eth_newFilter and eth_getFilterChanges work\n contract.on(eventFilter as ContractEventName, normalizedCallback);\n return;\n } catch (error: any) {\n if (this.isUnsupportedMethodError(error)) {\n // eth_newFilter or eth_getFilterChanges not working, use polling\n console.warn(\n 'RPC does not fully support eth_newFilter/eth_getFilterChanges, falling back to polling for events. ' +\n 'This may result in delayed event notifications.'\n );\n this.setupPollingListener(contract, eventFilter, callback);\n return;\n }\n // Other error, try normal approach\n }\n }\n\n // Default: try to use contract.on()\n // Set up an error handler to catch async errors\n const errorHandler = (error: any) => {\n if (this.isUnsupportedMethodError(error)) {\n // Remove the failing listener\n contract.off(eventFilter as ContractEventName, normalizedCallback);\n contract.off('error', errorHandler);\n\n console.warn(\n 'RPC does not support eth_newFilter, falling back to polling for events. ' +\n 'This may result in delayed event notifications.'\n );\n this.setupPollingListener(contract, eventFilter, callback);\n }\n };\n\n // Listen for errors\n contract.once('error', errorHandler);\n\n // Set up the listener\n contract.on(eventFilter as ContractEventName, normalizedCallback);\n } catch (error: any) {\n // Fallback to polling on any setup error\n console.warn('Error setting up event listener, falling back to polling:', error.message);\n this.setupPollingListener(contract, eventFilter, callback);\n }\n }\n\n /**\n * Checks if an error indicates that the RPC method is unsupported or filter operations are not working.\n * This includes:\n * - Method not found (-32601): RPC doesn't support eth_newFilter\n * - Filter not found (-32000): RPC doesn't properly maintain filters\n *\n * @param error - The error to check\n * @returns true if the error indicates unsupported or broken filter functionality\n */\n private isUnsupportedMethodError(error: any): boolean {\n // Check for error code -32601 (method not found) - RPC doesn't support eth_newFilter\n const isMethodNotFound =\n error?.code === -32601 ||\n error?.error?.code === -32601 ||\n error?.data?.code === -32601 ||\n (typeof error?.message === 'string' && error.message.includes('unsupported method'));\n\n // Check for error code -32000 with \"filter not found\" - RPC supports creating filters but doesn't maintain them\n const isFilterNotFound =\n ((error?.code === -32000 || error?.error?.code === -32000 || (error?.code === 'UNKNOWN_ERROR' && error?.error?.code === -32000)) &&\n (error?.message?.includes('filter not found') || error?.error?.message?.includes('filter not found')));\n\n return isMethodNotFound || isFilterNotFound;\n }\n\n /**\n * Sets up a polling-based event listener as fallback when eth_newFilter is not supported.\n * Periodically queries for new events and invokes the callback for each new event found.\n *\n * @template Args - Tuple type representing the event arguments\n * @param contract - The contract instance to poll\n * @param eventFilter - The event filter to poll for\n * @param callback - The callback function to invoke for each event\n */\n private setupPollingListener<Args extends any[]>(\n contract: BaseContract,\n eventFilter: ContractEventName | EventFilter,\n callback: (...args: Args) => void\n ): void {\n let lastProcessedBlock = 0;\n\n const poll = async () => {\n try {\n const provider = contract.runner?.provider as Provider | undefined;\n if (!provider) {\n console.warn('No provider available for polling events');\n return;\n }\n\n // Get current block number\n const currentBlock = await provider.getBlockNumber();\n\n // Initialize lastProcessedBlock on first poll\n if (lastProcessedBlock === 0) {\n lastProcessedBlock = currentBlock - 1;\n }\n\n // Query for events since last processed block\n if (currentBlock > lastProcessedBlock) {\n const events = await contract.queryFilter(\n eventFilter as ContractEventName,\n lastProcessedBlock + 1,\n currentBlock\n );\n\n // Process each event - filter to only EventLog types that have args\n for (const event of events) {\n if ('args' in event && event.args) {\n callback(...(event.args as any as Args));\n }\n }\n\n lastProcessedBlock = currentBlock;\n }\n } catch (error) {\n console.error('Error polling for events:', error);\n }\n };\n\n // Start polling\n const intervalId = setInterval(poll, this.eventPollingInterval);\n this.pollingIntervals.push(intervalId);\n\n // Do an initial poll\n poll();\n }\n\n /**\n * Clears all active polling intervals.\n * Should be called when removing all listeners or cleaning up the service.\n */\n protected clearPollingIntervals(): void {\n for (const intervalId of this.pollingIntervals) {\n clearInterval(intervalId);\n }\n this.pollingIntervals = [];\n }\n\n /**\n * Sets the polling interval for event listeners using the fallback mechanism.\n *\n * @param intervalMs - Polling interval in milliseconds\n */\n setEventPollingInterval(intervalMs: number): void {\n this.eventPollingInterval = intervalMs;\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(\n message: string,\n public readonly operation: string\n ) {\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, CensusData, 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: CensusData,\n metadata: string,\n encryptionKey: EncryptionKey,\n initStateRoot: bigint\n ) {\n // Convert CensusData 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\n .newProcess(\n status,\n startTime,\n duration,\n ballotMode,\n contractCensus,\n metadata,\n encryptionKey,\n initStateRoot\n )\n .catch(e => {\n throw new ProcessCreateError(e.message, 'create');\n }),\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: CensusData) {\n // Convert CensusData 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(processID: string, proof: string, input: string) {\n return this.sendTx(\n this.contract.submitStateTransition(processID, proof, input).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(processID, proof, input).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.setupEventListener<[string, string]>(\n this.contract,\n this.contract.filters.ProcessCreated(),\n cb\n ).catch(err => console.error('Error setting up ProcessCreated listener:', err));\n }\n\n onProcessStatusChanged(cb: ProcessStatusChangedCallback): void {\n this.setupEventListener<[string, bigint, bigint]>(\n this.contract,\n this.contract.filters.ProcessStatusChanged(),\n cb\n ).catch(err => console.error('Error setting up ProcessStatusChanged listener:', err));\n }\n\n onCensusUpdated(cb: ProcessCensusUpdatedCallback): void {\n this.setupEventListener<[string, string, string, bigint]>(\n this.contract,\n this.contract.filters.CensusUpdated(),\n cb\n ).catch(err => console.error('Error setting up CensusUpdated listener:', err));\n }\n\n onProcessDurationChanged(cb: ProcessDurationChangedCallback): void {\n this.setupEventListener<[string, bigint]>(\n this.contract,\n this.contract.filters.ProcessDurationChanged(),\n cb\n ).catch(err => console.error('Error setting up ProcessDurationChanged listener:', err));\n }\n\n onStateRootUpdated(cb: ProcessStateRootUpdatedCallback): void {\n this.setupEventListener<[string, string, bigint]>(\n this.contract,\n this.contract.filters.ProcessStateRootUpdated(),\n cb\n ).catch(err => console.error('Error setting up StateRootUpdated listener:', err));\n }\n\n onProcessResultsSet(cb: ProcessResultsSetCallback): void {\n this.setupEventListener<[string, string, bigint[]]>(\n this.contract,\n this.contract.filters.ProcessResultsSet(),\n cb\n ).catch(err => console.error('Error setting up ProcessResultsSet listener:', err));\n }\n\n removeAllListeners(): void {\n this.contract.removeAllListeners();\n this.clearPollingIntervals();\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, CensusData, EncryptionKey } from '../types';\nimport { CensusOrigin } from '../../census/types';\nimport { getElectionMetadataTemplate } from '../types/metadata';\nimport { TxStatusEvent, TxStatus } from '../../contracts/SmartContractService';\nimport { Census } from '../../census/classes/Census';\nimport { PlainCensus } from '../../census/classes/PlainCensus';\nimport { WeightedCensus } from '../../census/classes/WeightedCensus';\nimport { CensusOrchestrator } from '../../census/CensusOrchestrator';\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 Omit<BaseProcess, 'census'> {\n /** \n * Census - either a Census object (PlainCensus, WeightedCensus, CspCensus, PublishedCensus)\n * or manual configuration. If a Census object is provided and not published, it will be \n * automatically published.\n */\n census: 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 /** 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 * Internal data needed during process creation\n */\ninterface ProcessCreationData {\n processId: string;\n startTime: number;\n duration: number;\n censusRoot: string;\n ballotMode: BallotMode;\n metadataUri: string;\n sequencerResult: {\n encryptionPubKey: [string, string];\n stateRoot: string;\n };\n census: CensusData;\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 private censusOrchestrator: CensusOrchestrator;\n\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 // Initialize CensusOrchestrator with VocdoniCensusService from apiService\n this.censusOrchestrator = new CensusOrchestrator(apiService.census);\n }\n\n /**\n * Handles census - auto-publishes if needed and returns census config\n * @private\n */\n private async handleCensus(census: ProcessConfig['census']): Promise<{\n type: CensusOrigin;\n root: string;\n size: number;\n uri: string;\n }> {\n // Check if it's a Census object\n if ('isPublished' in census) {\n // It's a Census object\n // Only PlainCensus and WeightedCensus need publishing (CSP and Published are already published)\n if (census instanceof PlainCensus || census instanceof WeightedCensus) {\n // Auto-publish if not published\n if (!census.isPublished) {\n // Check if census service has a valid base URL configured\n const censusBaseURL = this.apiService.census?.['axios']?.defaults?.baseURL;\n if (!censusBaseURL || censusBaseURL === '' || censusBaseURL === 'undefined') {\n throw new Error(\n 'Census API URL is required to publish PlainCensus or WeightedCensus. ' +\n 'Please provide \"censusUrl\" when initializing DavinciSDK, or use a pre-published census.'\n );\n }\n await this.censusOrchestrator.publish(census);\n }\n }\n \n // Extract census data\n const censusData = this.censusOrchestrator.getCensusData(census);\n return {\n type: censusData.type,\n root: censusData.root,\n size: censusData.size,\n uri: censusData.uri,\n };\n }\n \n // It's manual config - return as-is\n return census;\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:\n 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 and returns an async generator that yields transaction status events.\n * This method allows you to monitor the transaction progress in real-time.\n *\n * @param config - Process configuration\n * @returns AsyncGenerator yielding transaction status events with ProcessCreationResult\n *\n * @example\n * ```typescript\n * const stream = sdk.createProcessStream({\n * title: \"My Election\",\n * description: \"A simple election\",\n * census: { ... },\n * ballot: { ... },\n * timing: { ... },\n * questions: [ ... ]\n * });\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process created:\", event.response.processId);\n * console.log(\"Transaction hash:\", event.response.transactionHash);\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *createProcessStream(\n config: ProcessConfig\n ): AsyncGenerator<TxStatusEvent<ProcessCreationResult>> {\n // Prepare all data needed for process creation\n const data = await this.prepareProcessCreation(config);\n\n // Create encryption key object\n const encryptionKey: EncryptionKey = {\n x: data.sequencerResult.encryptionPubKey[0],\n y: data.sequencerResult.encryptionPubKey[1],\n };\n\n // Submit on-chain transaction and yield events\n const txStream = this.processRegistry.newProcess(\n ProcessStatus.READY,\n data.startTime,\n data.duration,\n data.ballotMode,\n data.census,\n data.metadataUri,\n encryptionKey,\n BigInt(data.sequencerResult.stateRoot)\n );\n\n let transactionHash = 'unknown';\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n transactionHash = event.hash;\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: {\n processId: data.processId,\n transactionHash,\n },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\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 * For real-time transaction status updates, use createProcessStream() instead.\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 async createProcess(config: ProcessConfig): Promise<ProcessCreationResult> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.createProcessStream(config)) {\n if (event.status === 'completed') {\n return event.response;\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 throw new Error('Process creation stream ended unexpectedly');\n }\n\n /**\n * Prepares all data needed for process creation\n * @private\n */\n private async prepareProcessCreation(config: ProcessConfig): Promise<ProcessCreationData> {\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. Handle census (auto-publish if needed)\n const censusConfig = await this.handleCensus(config.census);\n const censusRoot = censusConfig.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: censusConfig.type,\n });\n\n // 7. Create census object for on-chain call\n const census: CensusData = {\n censusOrigin: censusConfig.type,\n maxVotes: censusConfig.size.toString(),\n censusRoot,\n censusURI: censusConfig.uri,\n };\n\n return {\n processId,\n startTime,\n duration,\n censusRoot,\n ballotMode,\n metadataUri,\n sequencerResult,\n census,\n };\n }\n\n /**\n * Validates and calculates timing parameters\n */\n private calculateTiming(timing: ProcessConfig['timing']): {\n startTime: number;\n duration: number;\n } {\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\n ? this.dateToUnixTimestamp(startDate)\n : 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 /**\n * Ends a voting process by setting its status to ENDED.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to end\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.endProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process ended successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *endProcessStream(processId: string): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to end the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.ENDED);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Ends a voting process by setting its status to ENDED.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use endProcessStream() instead.\n *\n * @param processId - The process ID to end\n * @returns Promise resolving when the process is ended\n *\n * @example\n * ```typescript\n * await sdk.endProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process ended successfully\");\n * ```\n */\n async endProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.endProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('End process stream ended unexpectedly');\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to pause\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.pauseProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process paused successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *pauseProcessStream(\n processId: string\n ): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to pause the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.PAUSED);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use pauseProcessStream() instead.\n *\n * @param processId - The process ID to pause\n * @returns Promise resolving when the process is paused\n *\n * @example\n * ```typescript\n * await sdk.pauseProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process paused successfully\");\n * ```\n */\n async pauseProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.pauseProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('Pause process stream ended unexpectedly');\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to cancel\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.cancelProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process canceled successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *cancelProcessStream(\n processId: string\n ): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to cancel the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.CANCELED);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use cancelProcessStream() instead.\n *\n * @param processId - The process ID to cancel\n * @returns Promise resolving when the process is canceled\n *\n * @example\n * ```typescript\n * await sdk.cancelProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process canceled successfully\");\n * ```\n */\n async cancelProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.cancelProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('Cancel process stream ended unexpectedly');\n }\n\n /**\n * Resumes a voting process by setting its status to READY.\n * This is typically used to resume a paused process.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to resume\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.resumeProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process resumed successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *resumeProcessStream(\n processId: string\n ): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to resume the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.READY);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Resumes a voting process by setting its status to READY.\n * This is typically used to resume a paused process.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use resumeProcessStream() instead.\n *\n * @param processId - The process ID to resume\n * @returns Promise resolving when the process is resumed\n *\n * @example\n * ```typescript\n * await sdk.resumeProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process resumed successfully\");\n * ```\n */\n async resumeProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.resumeProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('Resume process stream ended unexpectedly');\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(\n data: string | ArrayBuffer | Uint8Array,\n expectedHash: string,\n filename: string\n ): 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(inputs, wasmBin, zkeyBin);\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, CensusData, 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: CensusData;\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\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 {\n DavinciCrypto,\n DavinciCryptoInputs,\n DavinciCryptoOutput,\n} from '../../sequencer/DavinciCryptoService';\nimport {\n CircomProof,\n Groth16Proof,\n ProofInputs as Groth16ProofInputs,\n} from '../../sequencer/CircomProofService';\nimport {\n CensusOrigin,\n CensusProof,\n CensusProviders,\n assertMerkleCensusProof,\n assertCSPCensusProof,\n} 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 * Configuration options for VoteOrchestrationService\n */\nexport interface VoteOrchestrationConfig {\n /** Whether to verify downloaded circuit files match expected hashes (default: true) */\n verifyCircuitFiles?: boolean;\n /** Whether to verify the generated proof is valid before submission (default: true) */\n verifyProof?: boolean;\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 private readonly verifyCircuitFiles: boolean;\n private readonly verifyProof: boolean;\n\n constructor(\n private apiService: VocdoniApiService,\n private getCrypto: () => Promise<DavinciCrypto>,\n private signer: Signer,\n private censusProviders: CensusProviders = {},\n config: VoteOrchestrationConfig = {}\n ) {\n // Default to true - verify circuit files and proof by default for security\n this.verifyCircuitFiles = config.verifyCircuitFiles ?? true;\n this.verifyProof = config.verifyProof ?? true;\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 * Watch vote status changes in real-time using an async generator.\n * Yields each status change as it happens, allowing for reactive UI updates.\n *\n * @param processId - The process ID\n * @param voteId - The vote ID\n * @param options - Optional configuration\n * @returns AsyncGenerator yielding vote status updates\n *\n * @example\n * ```typescript\n * const vote = await sdk.submitVote({ processId, choices: [1] });\n *\n * for await (const statusInfo of sdk.watchVoteStatus(vote.processId, vote.voteId)) {\n * console.log(`Vote status: ${statusInfo.status}`);\n *\n * switch (statusInfo.status) {\n * case VoteStatus.Pending:\n * console.log(\"⏳ Processing...\");\n * break;\n * case VoteStatus.Verified:\n * console.log(\"✓ Verified\");\n * break;\n * case VoteStatus.Settled:\n * console.log(\"✅ Settled\");\n * break;\n * }\n * }\n * ```\n */\n async *watchVoteStatus(\n processId: string,\n voteId: string,\n options?: {\n targetStatus?: VoteStatus;\n timeoutMs?: number;\n pollIntervalMs?: number;\n }\n ): AsyncGenerator<VoteStatusInfo> {\n const targetStatus = options?.targetStatus ?? VoteStatus.Settled;\n const timeoutMs = options?.timeoutMs ?? 300000;\n const pollIntervalMs = options?.pollIntervalMs ?? 5000;\n\n const startTime = Date.now();\n let previousStatus: VoteStatus | null = null;\n\n while (Date.now() - startTime < timeoutMs) {\n const statusInfo = await this.getVoteStatus(processId, voteId);\n\n // Only yield if status has changed\n if (statusInfo.status !== previousStatus) {\n previousStatus = statusInfo.status;\n yield statusInfo;\n\n // Stop if we reached target status or error\n if (statusInfo.status === targetStatus || statusInfo.status === VoteStatus.Error) {\n return;\n }\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 * Wait for a vote to reach a specific status.\n * This is a simpler alternative to watchVoteStatus() that returns only the final 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 // Use watchVoteStatus internally and return final status\n let finalStatus: VoteStatusInfo | null = null;\n\n for await (const statusInfo of this.watchVoteStatus(processId, voteId, {\n targetStatus,\n timeoutMs,\n pollIntervalMs,\n })) {\n finalStatus = statusInfo;\n }\n\n if (!finalStatus) {\n throw new Error(`Vote did not reach status ${targetStatus} within ${timeoutMs}ms`);\n }\n\n return finalStatus;\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')\n ? customRandomness\n : '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,\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 and hashes from sequencer info\n const info = await this.apiService.sequencer.getInfo();\n\n // Create CircomProof instance with optional hash verification\n const circomProof = new CircomProof({\n wasmUrl: info.circuitUrl,\n zkeyUrl: info.provingKeyUrl,\n vkeyUrl: info.verificationKeyUrl,\n // Only pass hashes if verifyCircuitFiles is enabled\n ...(this.verifyCircuitFiles && {\n wasmHash: info.circuitHash,\n zkeyHash: info.provingKeyHash,\n vkeyHash: info.verificationKeyHash,\n }),\n });\n\n const { proof, publicSignals } = await circomProof.generate(circomInputs);\n\n // Optionally verify the generated proof based on configuration\n if (this.verifyProof) {\n const isValid = await circomProof.verify(proof, publicSignals);\n if (!isValid) {\n throw new Error('Generated proof is invalid');\n }\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(contractAddress, runner);\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(name: string, metadataURI: string, administrators: string[]) {\n return this.sendTx(\n this.contract.createOrganization(name, metadataURI, administrators).catch(e => {\n throw new OrganizationCreateError(e.message, 'create');\n }),\n async () => ({ success: true })\n );\n }\n\n updateOrganization(id: string, name: string, metadataURI: string) {\n return this.sendTx(\n this.contract.updateOrganization(id, name, metadataURI).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.addAdministrator(id, administrator).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.removeAdministrator(id, administrator).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.deleteOrganization(id).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.setupEventListener<[string]>(\n this.contract,\n this.contract.filters.OrganizationCreated(),\n cb\n ).catch(err => console.error('Error setting up OrganizationCreated listener:', err));\n }\n\n onOrganizationUpdated(cb: OrganizationUpdatedCallback): void {\n this.setupEventListener<[string, string]>(\n this.contract,\n this.contract.filters.OrganizationUpdated(),\n cb\n ).catch(err => console.error('Error setting up OrganizationUpdated listener:', err));\n }\n\n onAdministratorAdded(cb: OrganizationAdministratorAddedCallback): void {\n this.setupEventListener<[string, string]>(\n this.contract,\n this.contract.filters.AdministratorAdded(),\n cb\n ).catch(err => console.error('Error setting up AdministratorAdded listener:', err));\n }\n\n onAdministratorRemoved(cb: OrganizationAdministratorRemovedCallback): void {\n this.setupEventListener<[string, string, string]>(\n this.contract,\n this.contract.filters.AdministratorRemoved(),\n cb\n ).catch(err => console.error('Error setting up AdministratorRemoved listener:', err));\n }\n\n removeAllListeners(): void {\n this.contract.removeAllListeners();\n this.clearPollingIntervals();\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> {\n error?: string;\n data?: T;\n}\ninterface GoDavinciCryptoWasm {\n proofInputs(inputJson: string): RawResult<DavinciCryptoOutput>;\n cspSign(\n censusOrigin: number,\n privKey: string,\n processId: string,\n address: string\n ): 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 () => {\n importObject: Record<string, any>;\n run(instance: WebAssembly.Instance): Promise<void>;\n };\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(() => {\n /* swallow the exit exception */\n });\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.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(\n censusOrigin: CensusOrigin,\n privKey: string,\n processId: string,\n address: string\n ): Promise<CSPSignOutput> {\n if (!this.initialized) {\n throw new Error('DavinciCrypto not initialized — call `await init()` first');\n }\n\n const raw = globalThis.DavinciCrypto.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(\n censusOrigin: CensusOrigin,\n root: string,\n address: string,\n processId: string,\n publicKey: string,\n signature: string\n ): 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.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.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 {\n ProcessOrchestrationService,\n ProcessConfig,\n ProcessCreationResult,\n ProcessInfo,\n} 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 /**\n * Ethers.js Signer for signing operations.\n * - For voting only: Can be a bare Wallet (no provider needed)\n * - For process/organization operations: Must be connected to a provider\n */\n signer: Signer;\n\n /** Sequencer API URL for Vocdoni services (required) */\n sequencerUrl: string;\n\n /** Census API URL for census management (optional, only needed when creating censuses from scratch) */\n censusUrl?: string;\n\n /** Custom contract addresses (optional, fetched from sequencer if not provided) */\n addresses?: {\n processRegistry?: string;\n organizationRegistry?: string;\n stateTransitionVerifier?: string;\n resultsVerifier?: string;\n sequencerRegistry?: string;\n };\n\n /** Custom census proof providers (optional) */\n censusProviders?: CensusProviders;\n\n /** Whether to verify downloaded circuit files match expected hashes (optional, defaults to true) */\n verifyCircuitFiles?: boolean;\n\n /** Whether to verify the generated proof is valid before submission (optional, defaults to true) */\n verifyProof?: boolean;\n}\n\n/**\n * Internal configuration interface\n */\ninterface InternalDavinciSDKConfig {\n signer: Signer;\n sequencerUrl: string;\n censusUrl?: string;\n customAddresses: {\n processRegistry?: string;\n organizationRegistry?: string;\n stateTransitionVerifier?: string;\n resultsVerifier?: string;\n sequencerRegistry?: string;\n };\n fetchAddressesFromSequencer: boolean;\n verifyCircuitFiles: boolean;\n verifyProof: 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 // Determine if custom addresses are provided\n const hasCustomAddresses = !!config.addresses && Object.keys(config.addresses).length > 0;\n\n // Set configuration\n this.config = {\n signer: config.signer,\n sequencerUrl: config.sequencerUrl,\n censusUrl: config.censusUrl,\n customAddresses: config.addresses || {},\n fetchAddressesFromSequencer: !hasCustomAddresses, // Automatic: fetch if no custom addresses\n verifyCircuitFiles: config.verifyCircuitFiles ?? true, // Default to true for security\n verifyProof: config.verifyProof ?? true, // Default to true for security\n };\n\n // Initialize API service\n this.apiService = new VocdoniApiService({\n sequencerURL: this.config.sequencerUrl,\n censusURL: this.config.censusUrl || '', // Use empty string if not provided\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 // Fetch contract addresses from sequencer if needed\n if (this.config.fetchAddressesFromSequencer) {\n await this.fetchContractAddressesFromSequencer();\n }\n\n // Validate census URL if needed\n if (!this.config.censusUrl) {\n // Census URL is optional, but we'll check if it's needed later when actually used\n }\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 * Requires a signer with a provider for blockchain interactions.\n *\n * @throws Error if signer does not have a provider\n */\n get processes(): ProcessRegistryService {\n this.ensureProvider();\n if (!this._processRegistry) {\n const processRegistryAddress = this.resolveContractAddress('processRegistry');\n this._processRegistry = new ProcessRegistryService(\n processRegistryAddress,\n this.config.signer\n );\n }\n return this._processRegistry;\n }\n\n /**\n * Get the organization registry service for organization management.\n * Requires a signer with a provider for blockchain interactions.\n *\n * @throws Error if signer does not have a provider\n */\n get organizations(): OrganizationRegistryService {\n this.ensureProvider();\n if (!this._organizationRegistry) {\n const organizationRegistryAddress = this.resolveContractAddress('organizationRegistry');\n this._organizationRegistry = new OrganizationRegistryService(\n organizationRegistryAddress,\n this.config.signer\n );\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 * Requires a signer with a provider for blockchain interactions.\n *\n * @throws Error if signer does not have a provider\n */\n get processOrchestrator(): ProcessOrchestrationService {\n this.ensureProvider();\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 verifyCircuitFiles: this.config.verifyCircuitFiles,\n verifyProof: this.config.verifyProof,\n }\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 * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to fetch\n * @returns Promise resolving to user-friendly process information\n * @throws Error if signer does not have a provider\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 this.ensureProvider();\n\n return this.processOrchestrator.getProcess(processId);\n }\n\n /**\n * Creates a complete voting process and returns an async generator that yields transaction status events.\n * This method allows you to monitor the transaction progress in real-time, including pending, completed,\n * failed, and reverted states.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param config - Simplified process configuration\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.createProcessStream({\n * title: \"My Election\",\n * description: \"A simple election\",\n * census: {\n * type: CensusOrigin.CensusOriginMerkleTree,\n * root: \"0x1234...\",\n * size: 100,\n * uri: \"ipfs://...\"\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 * // Monitor transaction progress\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * // Update UI to show pending state\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process created:\", event.response.processId);\n * console.log(\"Transaction hash:\", event.response.transactionHash);\n * // Update UI to show success\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * // Update UI to show error\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * // Update UI to show revert reason\n * break;\n * }\n * }\n * ```\n */\n createProcessStream(config: ProcessConfig) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before creating processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.createProcessStream(config);\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 * For real-time transaction status updates, use createProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\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 * @throws Error if signer does not have a provider\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 this.ensureProvider();\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 * Does NOT require a provider - can be used with a bare Wallet for signing only.\n * IMPORTANT: Requires censusUrl to be configured in the SDK for fetching census proofs (unless using custom census providers).\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 * @throws Error if censusUrl is not configured (unless using custom census providers)\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 // Check if censusUrl is configured (unless using custom census providers)\n if (!this.config.censusUrl && !this.censusProviders.merkle && !this.censusProviders.csp) {\n throw new Error(\n 'Census URL is required for voting. ' +\n 'Provide censusUrl in the SDK constructor config, or use custom census providers.'\n );\n }\n\n return this.voteOrchestrator.submitVote(config);\n }\n\n /**\n * Get the status of a submitted vote.\n *\n * Does NOT require a provider - uses API calls only.\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 * Does NOT require a provider - uses API calls only.\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(\n 'SDK must be initialized before checking vote status. Call sdk.init() first.'\n );\n }\n\n return this.voteOrchestrator.hasAddressVoted(processId, address);\n }\n\n /**\n * Watch vote status changes in real-time using an async generator.\n * This method yields each status change as it happens, perfect for showing\n * progress indicators in UI applications.\n *\n * Does NOT require a provider - uses API calls only.\n *\n * @param processId - The process ID\n * @param voteId - The vote ID\n * @param options - Optional configuration\n * @returns AsyncGenerator yielding vote status updates\n *\n * @example\n * ```typescript\n * // Submit vote\n * const voteResult = await sdk.submitVote({\n * processId: \"0x1234567890abcdef...\",\n * choices: [1]\n * });\n *\n * // Watch status changes in real-time\n * for await (const statusInfo of sdk.watchVoteStatus(voteResult.processId, voteResult.voteId)) {\n * console.log(`Vote status: ${statusInfo.status}`);\n *\n * switch (statusInfo.status) {\n * case VoteStatus.Pending:\n * console.log(\"⏳ Processing...\");\n * break;\n * case VoteStatus.Verified:\n * console.log(\"✓ Vote verified\");\n * break;\n * case VoteStatus.Aggregated:\n * console.log(\"📊 Vote aggregated\");\n * break;\n * case VoteStatus.Settled:\n * console.log(\"✅ Vote settled\");\n * break;\n * }\n * }\n * ```\n */\n watchVoteStatus(\n processId: string,\n voteId: string,\n options?: {\n targetStatus?: VoteStatus;\n timeoutMs?: number;\n pollIntervalMs?: number;\n }\n ) {\n if (!this.initialized) {\n throw new Error(\n 'SDK must be initialized before watching vote status. Call sdk.init() first.'\n );\n }\n\n return this.voteOrchestrator.watchVoteStatus(processId, voteId, options);\n }\n\n /**\n * Wait for a vote to reach a specific status.\n * This is a simpler alternative to watchVoteStatus() that returns only the final status.\n * Useful for waiting for vote confirmation and processing without needing to handle each intermediate status.\n *\n * Does NOT require a provider - uses API calls only.\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 * });\n *\n * // Wait for the vote to be fully processed\n * const finalStatus = await sdk.waitForVoteStatus(\n * voteResult.processId,\n * voteResult.voteId,\n * VoteStatus.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(\n 'SDK must be initialized before waiting for vote status. Call sdk.init() first.'\n );\n }\n\n return this.voteOrchestrator.waitForVoteStatus(\n processId,\n voteId,\n targetStatus,\n timeoutMs,\n pollIntervalMs\n );\n }\n\n /**\n * Ends a voting process by setting its status to ENDED and returns an async generator\n * that yields transaction status events. This method allows you to monitor the\n * transaction progress in real-time.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to end\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.endProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process ended successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n endProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before ending processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.endProcessStream(processId);\n }\n\n /**\n * Ends a voting process by setting its status to ENDED.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use endProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to end\n * @returns Promise resolving when the process is ended\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.endProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process ended successfully\");\n * ```\n */\n async endProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before ending processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.endProcess(processId);\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED and returns an async generator\n * that yields transaction status events. This method allows you to monitor the\n * transaction progress in real-time.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to pause\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.pauseProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process paused successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n pauseProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before pausing processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.pauseProcessStream(processId);\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use pauseProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to pause\n * @returns Promise resolving when the process is paused\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.pauseProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process paused successfully\");\n * ```\n */\n async pauseProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before pausing processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.pauseProcess(processId);\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED and returns an async generator\n * that yields transaction status events. This method allows you to monitor the\n * transaction progress in real-time.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to cancel\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.cancelProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process canceled successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n cancelProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before canceling processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.cancelProcessStream(processId);\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use cancelProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to cancel\n * @returns Promise resolving when the process is canceled\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.cancelProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process canceled successfully\");\n * ```\n */\n async cancelProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before canceling processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.cancelProcess(processId);\n }\n\n /**\n * Resumes a voting process by setting its status to READY and returns an async generator\n * that yields transaction status events. This is typically used to resume a paused process.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to resume\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.resumeProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process resumed successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n resumeProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before resuming processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.resumeProcessStream(processId);\n }\n\n /**\n * Resumes a voting process by setting its status to READY.\n * This is typically used to resume a paused process.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use resumeProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to resume\n * @returns Promise resolving when the process is resumed\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.resumeProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process resumed successfully\");\n * ```\n */\n async resumeProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before resuming processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.resumeProcess(processId);\n }\n\n /**\n * Resolve contract address based on configuration priority:\n * 1. Custom addresses from user config (if provided)\n * 2. Addresses from sequencer (fetched during init if no custom addresses provided)\n */\n private resolveContractAddress(\n contractName: keyof NonNullable<DavinciSDKConfig['addresses']>\n ): string {\n // Check if custom address is provided by user\n const customAddress = this.config.customAddresses[contractName];\n if (customAddress) {\n return customAddress;\n }\n\n // If no custom address and we didn't fetch from sequencer, throw error\n if (!this.config.customAddresses[contractName]) {\n throw new Error(\n `Contract address for '${contractName}' not found. ` +\n `Make sure SDK is initialized with sdk.init() or provide custom addresses in config.`\n );\n }\n\n return this.config.customAddresses[contractName]!;\n }\n\n /**\n * Fetch contract addresses from sequencer info\n * This is called during init() if custom addresses are not provided\n */\n private async fetchContractAddressesFromSequencer(): Promise<void> {\n try {\n const info = await this.apiService.sequencer.getInfo();\n const contracts = info.contracts;\n\n // Store addresses from sequencer\n if (contracts.process) {\n this.config.customAddresses.processRegistry = contracts.process;\n this._processRegistry = new ProcessRegistryService(contracts.process, this.config.signer);\n }\n\n if (contracts.organization) {\n this.config.customAddresses.organizationRegistry = contracts.organization;\n this._organizationRegistry = new OrganizationRegistryService(\n contracts.organization,\n this.config.signer\n );\n }\n\n if (contracts.stateTransitionVerifier) {\n this.config.customAddresses.stateTransitionVerifier = contracts.stateTransitionVerifier;\n }\n\n if (contracts.resultsVerifier) {\n this.config.customAddresses.resultsVerifier = contracts.resultsVerifier;\n }\n\n // Note: sequencerRegistry is not provided by the sequencer info endpoint\n } catch (error) {\n throw new Error(\n `Failed to fetch contract addresses from sequencer: ${error instanceof Error ? error.message : String(error)}. ` +\n `You can provide custom addresses in the SDK config to avoid this error.`\n );\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 /**\n * Ensures that the signer has a provider for blockchain operations.\n * @throws Error if the signer does not have a provider\n * @private\n */\n private ensureProvider(): void {\n if (!this.config.signer.provider) {\n throw new Error(\n 'Provider required for blockchain operations (process/organization management). ' +\n 'The signer must be connected to a provider. ' +\n 'Use wallet.connect(provider) or a browser signer like MetaMask. ' +\n 'Note: Voting operations do not require a provider.'\n );\n }\n }\n}\n"],"names":["ElectionResultsTypeNames","CensusOrigin","CensusType","TxStatus","ProcessStatus","VoteStatus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/core/types/metadata.ts","../src/core/api/BaseService.ts","../src/census/CensusService.ts","../src/census/types.ts","../src/census/classes/Census.ts","../src/census/classes/PlainCensus.ts","../src/census/classes/WeightedCensus.ts","../src/census/classes/CspCensus.ts","../src/census/classes/PublishedCensus.ts","../src/census/CensusOrchestrator.ts","../src/sequencer/api/helpers.ts","../src/sequencer/SequencerService.ts","../src/core/api/ApiService.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\n * @param relativePath - The relative path\n * @returns The constructed URI for the census\n */\n getCensusUri(relativePath: string): string {\n return `${this.axios.defaults.baseURL}${relativePath}`;\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<PublishCensusResponse & { censusUri: string }>({\n method: 'POST',\n url: `/censuses/${censusId}/publish`,\n }).then(apiResponse => {\n // Use censusUri from API response to construct full URI, then remove it\n const { censusUri, ...responseWithoutCensusUri } = apiResponse;\n return {\n ...responseWithoutCensusUri,\n uri: this.getCensusUri(censusUri),\n };\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.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).weight === 'string' &&\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).weight === 'string' &&\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 /** The size of the census. */\n size: number;\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 { CensusOrigin, CensusParticipant as ImportedCensusParticipant } from '../types';\n\n/**\n * Census type enumeration\n */\nexport enum CensusType {\n PLAIN = 'plain',\n WEIGHTED = 'weighted',\n CSP = 'csp',\n}\n\n/**\n * Re-export CensusParticipant from types for convenience\n * Extended to make weight required (base type has optional weight)\n */\nexport interface CensusParticipant extends ImportedCensusParticipant {\n weight: string; // Make weight required\n}\n\n/**\n * Abstract base class for all census types\n */\nexport abstract class Census {\n protected _censusId: string | null = null;\n protected _censusRoot: string | null = null;\n protected _censusURI: string | null = null;\n protected _type: CensusType;\n protected _size: number | null = null;\n\n constructor(type: CensusType) {\n this._type = type;\n }\n\n get censusId(): string | null {\n return this._censusId;\n }\n\n get censusRoot(): string | null {\n return this._censusRoot;\n }\n\n get censusURI(): string | null {\n return this._censusURI;\n }\n\n get type(): CensusType {\n return this._type;\n }\n\n get size(): number | null {\n return this._size;\n }\n\n get isPublished(): boolean {\n return this._censusRoot !== null && this._censusURI !== null;\n }\n\n /**\n * Convert CensusType to CensusOrigin enum for API compatibility\n */\n get censusOrigin(): CensusOrigin {\n switch (this._type) {\n case CensusType.PLAIN:\n case CensusType.WEIGHTED:\n return CensusOrigin.CensusOriginMerkleTree;\n case CensusType.CSP:\n return CensusOrigin.CensusOriginCSP;\n default:\n throw new Error(`Unknown census type: ${this._type}`);\n }\n }\n}\n","import { Census, CensusType, CensusParticipant } from './Census';\n\n/**\n * Plain census where all participants have equal voting power (weight=1)\n * Simpler API - just add addresses without specifying weights\n */\nexport class PlainCensus extends Census {\n private _participants: Set<string> = new Set();\n\n constructor() {\n super(CensusType.PLAIN);\n }\n\n /**\n * Add participant(s) with automatic weight=1\n * @param addresses - Single address or array of addresses\n */\n add(addresses: string | string[]): void {\n const toAdd = Array.isArray(addresses) ? addresses : [addresses];\n\n for (const address of toAdd) {\n this.validateAddress(address);\n this._participants.add(address.toLowerCase());\n }\n }\n\n /**\n * Remove participant by address\n */\n remove(address: string): void {\n this._participants.delete(address.toLowerCase());\n }\n\n /**\n * Get all participants as CensusParticipant array (for API)\n * All participants have weight=\"1\"\n */\n get participants(): CensusParticipant[] {\n return Array.from(this._participants).map(key => ({\n key,\n weight: '1', // Everyone has weight=1 in plain census\n }));\n }\n\n /**\n * Get addresses only\n */\n get addresses(): string[] {\n return Array.from(this._participants);\n }\n\n private validateAddress(address: string): void {\n if (!address || typeof address !== 'string') {\n throw new Error('Address is required and must be a string');\n }\n // Basic format check\n if (!/^(0x)?[0-9a-fA-F]{40}$/i.test(address)) {\n throw new Error(`Invalid Ethereum address format: ${address}`);\n }\n }\n\n /**\n * Internal method called after publishing\n * @internal\n */\n _setPublishedData(root: string, uri: string, size: number, censusId?: string): void {\n this._censusRoot = root;\n this._censusURI = uri;\n this._size = size;\n if (censusId) this._censusId = censusId;\n }\n}\n","import { Census, CensusType, CensusParticipant } from './Census';\n\n/**\n * Participant with flexible weight type for WeightedCensus\n * Weight can be string, number, or bigint - will be normalized to string internally\n */\nexport interface WeightedParticipant {\n key: string;\n weight: string | number | bigint;\n}\n\n/**\n * Weighted census where participants can have different voting power\n * Requires specifying weight for each participant\n */\nexport class WeightedCensus extends Census {\n private _participants: Map<string, string> = new Map();\n\n constructor() {\n super(CensusType.WEIGHTED);\n }\n\n /**\n * Add participant(s) with custom weights\n * Weight can be provided as string, number, or bigint - will be converted to string internally\n * @param participant - Single participant or array of participants with custom weights\n */\n add(participant: WeightedParticipant | WeightedParticipant[]): void {\n const toAdd = Array.isArray(participant) ? participant : [participant];\n\n for (const p of toAdd) {\n this.validateParticipant(p);\n const weightString = this.normalizeWeight(p.weight);\n this._participants.set(p.key.toLowerCase(), weightString);\n }\n }\n\n /**\n * Remove participant by address\n */\n remove(address: string): void {\n this._participants.delete(address.toLowerCase());\n }\n\n /**\n * Get all participants as CensusParticipant array\n */\n get participants(): CensusParticipant[] {\n return Array.from(this._participants.entries()).map(([key, weight]) => ({\n key,\n weight,\n }));\n }\n\n /**\n * Get participant addresses\n */\n get addresses(): string[] {\n return Array.from(this._participants.keys());\n }\n\n /**\n * Get weight for specific address\n */\n getWeight(address: string): string | undefined {\n return this._participants.get(address.toLowerCase());\n }\n\n /**\n * Normalizes weight from string, number, or bigint to string\n */\n private normalizeWeight(weight: string | number | bigint): string {\n if (typeof weight === 'string') {\n // Validate it's a positive integer string\n if (!/^\\d+$/.test(weight)) {\n throw new Error(`Invalid weight format: ${weight}. Must be a positive integer.`);\n }\n return weight;\n }\n \n if (typeof weight === 'number') {\n // Validate it's a positive integer\n if (!Number.isInteger(weight) || weight < 0) {\n throw new Error(`Invalid weight: ${weight}. Must be a positive integer.`);\n }\n return weight.toString();\n }\n \n if (typeof weight === 'bigint') {\n // Validate it's positive\n if (weight < 0n) {\n throw new Error(`Invalid weight: ${weight}. Must be a positive integer.`);\n }\n return weight.toString();\n }\n \n throw new Error(`Invalid weight type. Must be string, number, or bigint.`);\n }\n\n private validateParticipant(participant: WeightedParticipant): void {\n if (!participant.key || typeof participant.key !== 'string') {\n throw new Error('Participant key (address) is required');\n }\n // Basic format check\n if (!/^(0x)?[0-9a-fA-F]{40}$/i.test(participant.key)) {\n throw new Error(`Invalid Ethereum address format: ${participant.key}`);\n }\n if (participant.weight === undefined || participant.weight === null) {\n throw new Error('Participant weight is required');\n }\n // Weight validation is done in normalizeWeight\n }\n\n /**\n * Internal method called after publishing\n * @internal\n */\n _setPublishedData(root: string, uri: string, size: number, censusId?: string): void {\n this._censusRoot = root;\n this._censusURI = uri;\n this._size = size;\n if (censusId) this._censusId = censusId;\n }\n}\n","import { Census, CensusType } from './Census';\n\n/**\n * CSP (Certificate Service Provider) census\n * Uses a public key and CSP server URI instead of a participant list\n */\nexport class CspCensus extends Census {\n private _publicKey: string;\n private _cspURI: string;\n\n constructor(publicKey: string, cspURI: string, size: number) {\n super(CensusType.CSP);\n\n // Validate public key\n if (!/^(0x)?[0-9a-fA-F]+$/.test(publicKey)) {\n throw new Error('Public key is missing or invalid');\n }\n\n // Validate CSP URI\n try {\n new URL(cspURI);\n } catch {\n throw new Error('CSP URI is missing or invalid');\n }\n\n this._publicKey = publicKey;\n this._cspURI = cspURI;\n\n // For CSP, these are known immediately\n this._censusRoot = publicKey; // Public key serves as root\n this._censusURI = cspURI;\n this._size = size;\n }\n\n get publicKey(): string {\n return this._publicKey;\n }\n\n get cspURI(): string {\n return this._cspURI;\n }\n}\n","import { Census, CensusType } from './Census';\n\n/**\n * Published census - represents a census that has already been published\n * Use this when you have the census root, URI, and size from a previous publication\n */\nexport class PublishedCensus extends Census {\n constructor(type: CensusType, root: string, uri: string, size: number) {\n super(type);\n this._censusRoot = root;\n this._censusURI = uri;\n this._size = size;\n }\n}\n","import { VocdoniCensusService } from './CensusService';\nimport { Census } from './classes/Census';\nimport { PlainCensus } from './classes/PlainCensus';\nimport { WeightedCensus } from './classes/WeightedCensus';\nimport { CensusOrigin } from './types';\n\n/**\n * Orchestrates census creation and publishing\n */\nexport class CensusOrchestrator {\n constructor(private censusService: VocdoniCensusService) {}\n\n /**\n * Publishes a PlainCensus or WeightedCensus\n * Creates a working census, adds participants, and publishes it\n */\n async publish(census: PlainCensus | WeightedCensus): Promise<void> {\n if (census.isPublished) {\n throw new Error('Census is already published');\n }\n\n if (census.participants.length === 0) {\n throw new Error('Cannot publish empty census');\n }\n\n // 1. Create working census\n const censusId = await this.censusService.createCensus();\n\n // 2. Add participants (both Plain and Weighted have .participants getter)\n await this.censusService.addParticipants(censusId, census.participants);\n\n // 3. Publish\n const publishResponse = await this.censusService.publishCensus(censusId);\n\n // 4. Update census object with published data\n census._setPublishedData(\n publishResponse.root,\n publishResponse.uri,\n publishResponse.participantCount,\n censusId\n );\n }\n\n /**\n * Gets census data for process creation\n * Throws if census is not published\n */\n getCensusData(census: Census): {\n type: CensusOrigin;\n root: string;\n uri: string;\n size: number;\n } {\n if (!census.isPublished) {\n throw new Error('Census must be published before creating a process');\n }\n\n return {\n type: census.censusOrigin,\n root: census.censusRoot!,\n uri: census.censusURI!,\n size: census.size!,\n };\n }\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(\n processId: string,\n signer: Signer | Wallet\n): 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 ParticipantInfoResponse,\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(processId: string, voteId: string): Promise<VoteStatusResponse> {\n return this.request<VoteStatusResponse>({\n method: 'GET',\n url: `/votes/${processId}/voteId/${voteId}`,\n });\n }\n\n async hasAddressVoted(processId: string, address: string): 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 isAddressAbleToVote(processId: string, address: string): Promise<ParticipantInfoResponse> {\n return this.request<ParticipantInfoResponse>({\n method: 'GET',\n url: `/processes/${processId}/participants/${address}`,\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(\n `Failed to fetch metadata from URL: ${response.status} ${response.statusText}`\n );\n }\n return await response.json();\n } catch (error) {\n throw new Error(\n `Failed to fetch metadata from URL: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\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 type {\n ContractTransactionResponse,\n BaseContract,\n EventFilter,\n Provider,\n ContractEventName,\n} from 'ethers';\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, event normalization, and\n * event listener management with automatic fallback for RPCs that don't support eth_newFilter.\n */\nexport abstract class SmartContractService {\n /** Active polling intervals for event listeners using fallback mode */\n private pollingIntervals: NodeJS.Timeout[] = [];\n /** Default polling interval in milliseconds for event listener fallback */\n protected eventPollingInterval: number = 5000;\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>(stream: AsyncGenerator<TxStatusEvent<T>>): 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 * Sets up an event listener with automatic fallback for RPCs that don't support eth_newFilter.\n * First attempts to use contract.on() which relies on eth_newFilter. If the RPC doesn't support\n * this method (error code -32601), automatically falls back to polling with queryFilter.\n *\n * @template Args - Tuple type representing the event arguments\n * @param contract - The contract instance to listen to\n * @param eventFilter - The event filter to listen for\n * @param callback - The callback function to invoke when the event occurs\n *\n * @example\n * ```typescript\n * this.setupEventListener(\n * this.contract,\n * this.contract.filters.Transfer(),\n * (from: string, to: string, amount: bigint) => {\n * console.log(`Transfer: ${from} -> ${to}: ${amount}`);\n * }\n * );\n * ```\n */\n protected async setupEventListener<Args extends any[]>(\n contract: BaseContract,\n eventFilter: ContractEventName | EventFilter,\n callback: (...args: Args) => void\n ): Promise<void> {\n const normalizedCallback = this.normalizeListener(callback);\n\n // First, test if eth_newFilter is supported by trying to create a filter\n const provider = contract.runner?.provider as Provider | undefined;\n if (!provider) {\n console.warn('No provider available for event listeners');\n return;\n }\n\n try {\n // Test if the provider supports eth_newFilter\n // We do this by attempting to get logs with a filter\n // If it fails, we'll catch the error and use polling\n const testFilter = {\n address: await contract.getAddress(),\n topics: [],\n };\n\n // Try to create a filter - this will fail if eth_newFilter is not supported\n // We use the provider's internal method if available\n if ('send' in provider && typeof provider.send === 'function') {\n try {\n // Test both creating the filter AND getting changes to ensure full support\n const filterId = await provider.send('eth_newFilter', [testFilter]);\n \n // Try to get filter changes - this will fail if RPC doesn't maintain filters\n await provider.send('eth_getFilterChanges', [filterId]);\n \n // If we get here, both eth_newFilter and eth_getFilterChanges work\n contract.on(eventFilter as ContractEventName, normalizedCallback);\n return;\n } catch (error: any) {\n if (this.isUnsupportedMethodError(error)) {\n // eth_newFilter or eth_getFilterChanges not working, use polling\n console.warn(\n 'RPC does not fully support eth_newFilter/eth_getFilterChanges, falling back to polling for events. ' +\n 'This may result in delayed event notifications.'\n );\n this.setupPollingListener(contract, eventFilter, callback);\n return;\n }\n // Other error, try normal approach\n }\n }\n\n // Default: try to use contract.on()\n // Set up an error handler to catch async errors\n const errorHandler = (error: any) => {\n if (this.isUnsupportedMethodError(error)) {\n // Remove the failing listener\n contract.off(eventFilter as ContractEventName, normalizedCallback);\n contract.off('error', errorHandler);\n\n console.warn(\n 'RPC does not support eth_newFilter, falling back to polling for events. ' +\n 'This may result in delayed event notifications.'\n );\n this.setupPollingListener(contract, eventFilter, callback);\n }\n };\n\n // Listen for errors\n contract.once('error', errorHandler);\n\n // Set up the listener\n contract.on(eventFilter as ContractEventName, normalizedCallback);\n } catch (error: any) {\n // Fallback to polling on any setup error\n console.warn('Error setting up event listener, falling back to polling:', error.message);\n this.setupPollingListener(contract, eventFilter, callback);\n }\n }\n\n /**\n * Checks if an error indicates that the RPC method is unsupported or filter operations are not working.\n * This includes:\n * - Method not found (-32601): RPC doesn't support eth_newFilter\n * - Filter not found (-32000): RPC doesn't properly maintain filters\n *\n * @param error - The error to check\n * @returns true if the error indicates unsupported or broken filter functionality\n */\n private isUnsupportedMethodError(error: any): boolean {\n // Check for error code -32601 (method not found) - RPC doesn't support eth_newFilter\n const isMethodNotFound =\n error?.code === -32601 ||\n error?.error?.code === -32601 ||\n error?.data?.code === -32601 ||\n (typeof error?.message === 'string' && error.message.includes('unsupported method'));\n\n // Check for error code -32000 with \"filter not found\" - RPC supports creating filters but doesn't maintain them\n const isFilterNotFound =\n ((error?.code === -32000 || error?.error?.code === -32000 || (error?.code === 'UNKNOWN_ERROR' && error?.error?.code === -32000)) &&\n (error?.message?.includes('filter not found') || error?.error?.message?.includes('filter not found')));\n\n return isMethodNotFound || isFilterNotFound;\n }\n\n /**\n * Sets up a polling-based event listener as fallback when eth_newFilter is not supported.\n * Periodically queries for new events and invokes the callback for each new event found.\n *\n * @template Args - Tuple type representing the event arguments\n * @param contract - The contract instance to poll\n * @param eventFilter - The event filter to poll for\n * @param callback - The callback function to invoke for each event\n */\n private setupPollingListener<Args extends any[]>(\n contract: BaseContract,\n eventFilter: ContractEventName | EventFilter,\n callback: (...args: Args) => void\n ): void {\n let lastProcessedBlock = 0;\n\n const poll = async () => {\n try {\n const provider = contract.runner?.provider as Provider | undefined;\n if (!provider) {\n console.warn('No provider available for polling events');\n return;\n }\n\n // Get current block number\n const currentBlock = await provider.getBlockNumber();\n\n // Initialize lastProcessedBlock on first poll\n if (lastProcessedBlock === 0) {\n lastProcessedBlock = currentBlock - 1;\n }\n\n // Query for events since last processed block\n if (currentBlock > lastProcessedBlock) {\n const events = await contract.queryFilter(\n eventFilter as ContractEventName,\n lastProcessedBlock + 1,\n currentBlock\n );\n\n // Process each event - filter to only EventLog types that have args\n for (const event of events) {\n if ('args' in event && event.args) {\n callback(...(event.args as any as Args));\n }\n }\n\n lastProcessedBlock = currentBlock;\n }\n } catch (error) {\n console.error('Error polling for events:', error);\n }\n };\n\n // Start polling\n const intervalId = setInterval(poll, this.eventPollingInterval);\n this.pollingIntervals.push(intervalId);\n\n // Do an initial poll\n poll();\n }\n\n /**\n * Clears all active polling intervals.\n * Should be called when removing all listeners or cleaning up the service.\n */\n protected clearPollingIntervals(): void {\n for (const intervalId of this.pollingIntervals) {\n clearInterval(intervalId);\n }\n this.pollingIntervals = [];\n }\n\n /**\n * Sets the polling interval for event listeners using the fallback mechanism.\n *\n * @param intervalMs - Polling interval in milliseconds\n */\n setEventPollingInterval(intervalMs: number): void {\n this.eventPollingInterval = intervalMs;\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(\n message: string,\n public readonly operation: string\n ) {\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, CensusData, 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: CensusData,\n metadata: string,\n encryptionKey: EncryptionKey,\n initStateRoot: bigint\n ) {\n // Convert CensusData type from core to contract format\n const contractCensus: IProcessRegistry.CensusStruct = {\n censusOrigin: BigInt(census.censusOrigin),\n censusRoot: census.censusRoot,\n censusURI: census.censusURI,\n };\n\n return this.sendTx(\n this.contract\n .newProcess(\n status,\n startTime,\n duration,\n ballotMode,\n contractCensus,\n metadata,\n encryptionKey,\n initStateRoot\n )\n .catch(e => {\n throw new ProcessCreateError(e.message, 'create');\n }),\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: CensusData) {\n // Convert CensusData type from core to contract format\n const contractCensus: IProcessRegistry.CensusStruct = {\n censusOrigin: BigInt(census.censusOrigin),\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(processID: string, proof: string, input: string) {\n return this.sendTx(\n this.contract.submitStateTransition(processID, proof, input).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(processID, proof, input).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.setupEventListener<[string, string]>(\n this.contract,\n this.contract.filters.ProcessCreated(),\n cb\n ).catch(err => console.error('Error setting up ProcessCreated listener:', err));\n }\n\n onProcessStatusChanged(cb: ProcessStatusChangedCallback): void {\n this.setupEventListener<[string, bigint, bigint]>(\n this.contract,\n this.contract.filters.ProcessStatusChanged(),\n cb\n ).catch(err => console.error('Error setting up ProcessStatusChanged listener:', err));\n }\n\n onCensusUpdated(cb: ProcessCensusUpdatedCallback): void {\n this.setupEventListener<[string, string, string]>(\n this.contract,\n this.contract.filters.CensusUpdated(),\n cb\n ).catch(err => console.error('Error setting up CensusUpdated listener:', err));\n }\n\n onProcessDurationChanged(cb: ProcessDurationChangedCallback): void {\n this.setupEventListener<[string, bigint]>(\n this.contract,\n this.contract.filters.ProcessDurationChanged(),\n cb\n ).catch(err => console.error('Error setting up ProcessDurationChanged listener:', err));\n }\n\n onStateRootUpdated(cb: ProcessStateRootUpdatedCallback): void {\n this.setupEventListener<[string, string, bigint]>(\n this.contract,\n this.contract.filters.ProcessStateRootUpdated(),\n cb\n ).catch(err => console.error('Error setting up StateRootUpdated listener:', err));\n }\n\n onProcessResultsSet(cb: ProcessResultsSetCallback): void {\n this.setupEventListener<[string, string, bigint[]]>(\n this.contract,\n this.contract.filters.ProcessResultsSet(),\n cb\n ).catch(err => console.error('Error setting up ProcessResultsSet listener:', err));\n }\n\n removeAllListeners(): void {\n this.contract.removeAllListeners();\n this.clearPollingIntervals();\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, CensusData, EncryptionKey } from '../types';\nimport { CensusOrigin } from '../../census/types';\nimport { getElectionMetadataTemplate } from '../types/metadata';\nimport { TxStatusEvent, TxStatus } from '../../contracts/SmartContractService';\nimport { Census } from '../../census/classes/Census';\nimport { PlainCensus } from '../../census/classes/PlainCensus';\nimport { WeightedCensus } from '../../census/classes/WeightedCensus';\nimport { CensusOrchestrator } from '../../census/CensusOrchestrator';\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 URI */\n uri: string;\n };\n\n /** Ballot configuration */\n ballot: BallotMode;\n\n /** Election questions and choices (required) */\n questions: Array<ProcessQuestion>;\n}\n\n/**\n * Question structure used in process configuration and metadata\n */\nexport type ProcessQuestion = {\n title: string;\n description?: string;\n choices: Array<{\n title: string;\n value: number;\n }>;\n};\n\n/**\n * Base configuration shared by both process creation variants\n */\ninterface BaseProcessConfig {\n /** \n * Census - either a Census object (PlainCensus, WeightedCensus, CspCensus, PublishedCensus)\n * or manual configuration. If a Census object is provided and not published, it will be \n * automatically published.\n */\n census: 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 /** 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 * Process configuration with metadata fields (title, description, questions)\n * The metadata will be created and uploaded automatically\n */\nexport interface ProcessConfigWithMetadata extends BaseProcessConfig {\n /** Process title */\n title: string;\n\n /** Process description (optional) */\n description?: string;\n\n /** Election questions and choices (at least one required) */\n questions: [ProcessQuestion, ...ProcessQuestion[]];\n}\n\n/**\n * Process configuration with a pre-existing metadata URI\n * No metadata upload will occur - the provided URI will be used directly\n */\nexport interface ProcessConfigWithMetadataUri extends BaseProcessConfig {\n /** Pre-existing metadata URI to use instead of uploading new metadata */\n metadataUri: string;\n}\n\n/**\n * Configuration for creating a process\n * Use either metadata fields (title, questions) or a pre-existing metadataUri\n */\nexport type ProcessConfig = ProcessConfigWithMetadata | ProcessConfigWithMetadataUri;\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 * Internal data needed during process creation\n */\ninterface ProcessCreationData {\n processId: string;\n startTime: number;\n duration: number;\n censusRoot: string;\n ballotMode: BallotMode;\n metadataUri: string;\n sequencerResult: {\n encryptionPubKey: [string, string];\n stateRoot: string;\n };\n census: CensusData;\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 private censusOrchestrator: CensusOrchestrator;\n\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 // Initialize CensusOrchestrator with VocdoniCensusService from apiService\n this.censusOrchestrator = new CensusOrchestrator(apiService.census);\n }\n\n /**\n * Handles census - auto-publishes if needed and returns census config\n * @private\n */\n private async handleCensus(census: ProcessConfig['census']): Promise<{\n type: CensusOrigin;\n root: string;\n size: number;\n uri: string;\n }> {\n // Check if it's a Census object\n if ('isPublished' in census) {\n // It's a Census object\n // Only PlainCensus and WeightedCensus need publishing (CSP and Published are already published)\n if (census instanceof PlainCensus || census instanceof WeightedCensus) {\n // Auto-publish if not published\n if (!census.isPublished) {\n // Check if census service has a valid base URL configured\n const censusBaseURL = this.apiService.census?.['axios']?.defaults?.baseURL;\n if (!censusBaseURL || censusBaseURL === '' || censusBaseURL === 'undefined') {\n throw new Error(\n 'Census API URL is required to publish PlainCensus or WeightedCensus. ' +\n 'Please provide \"censusUrl\" when initializing DavinciSDK, or use a pre-published census.'\n );\n }\n await this.censusOrchestrator.publish(census);\n }\n }\n \n // Extract census data\n const censusData = this.censusOrchestrator.getCensusData(census);\n return {\n type: censusData.type,\n root: censusData.root,\n size: censusData.size,\n uri: censusData.uri,\n };\n }\n \n // It's manual config - return as-is\n return census;\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: Array<ProcessQuestion> = [];\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:\n 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 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: 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 and returns an async generator that yields transaction status events.\n * This method allows you to monitor the transaction progress in real-time.\n *\n * @param config - Process configuration\n * @returns AsyncGenerator yielding transaction status events with ProcessCreationResult\n *\n * @example\n * ```typescript\n * const stream = sdk.createProcessStream({\n * title: \"My Election\",\n * description: \"A simple election\",\n * census: { ... },\n * ballot: { ... },\n * timing: { ... },\n * questions: [ ... ]\n * });\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process created:\", event.response.processId);\n * console.log(\"Transaction hash:\", event.response.transactionHash);\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *createProcessStream(\n config: ProcessConfig\n ): AsyncGenerator<TxStatusEvent<ProcessCreationResult>> {\n // Prepare all data needed for process creation\n const data = await this.prepareProcessCreation(config);\n\n // Create encryption key object\n const encryptionKey: EncryptionKey = {\n x: data.sequencerResult.encryptionPubKey[0],\n y: data.sequencerResult.encryptionPubKey[1],\n };\n\n // Submit on-chain transaction and yield events\n const txStream = this.processRegistry.newProcess(\n ProcessStatus.READY,\n data.startTime,\n data.duration,\n data.ballotMode,\n data.census,\n data.metadataUri,\n encryptionKey,\n BigInt(data.sequencerResult.stateRoot)\n );\n\n let transactionHash = 'unknown';\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n transactionHash = event.hash;\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: {\n processId: data.processId,\n transactionHash,\n },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\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 * For real-time transaction status updates, use createProcessStream() instead.\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 async createProcess(config: ProcessConfig): Promise<ProcessCreationResult> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.createProcessStream(config)) {\n if (event.status === 'completed') {\n return event.response;\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 throw new Error('Process creation stream ended unexpectedly');\n }\n\n /**\n * Prepares all data needed for process creation\n * @private\n */\n private async prepareProcessCreation(config: ProcessConfig): Promise<ProcessCreationData> {\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. Handle census (auto-publish if needed)\n const censusConfig = await this.handleCensus(config.census);\n const censusRoot = censusConfig.root;\n\n // 4. Use ballot mode configuration directly\n const ballotMode = config.ballot;\n\n // 5. Handle metadata - either use provided URI or create and upload new metadata\n let metadataUri: string;\n \n if ('metadataUri' in config) {\n // Use the provided metadata URI directly\n metadataUri = config.metadataUri;\n } else {\n // Create and push metadata\n const metadata = this.createMetadata(config);\n const metadataHash = await this.apiService.sequencer.pushMetadata(metadata);\n metadataUri = this.apiService.sequencer.getMetadataUrl(metadataHash);\n }\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 census: {\n censusOrigin: censusConfig.type,\n censusRoot,\n censusURI: censusConfig.uri,\n },\n ballotMode,\n signature,\n });\n\n // 7. Create census object for on-chain call\n const census: CensusData = {\n censusOrigin: censusConfig.type,\n censusRoot,\n censusURI: censusConfig.uri,\n };\n\n return {\n processId,\n startTime,\n duration,\n censusRoot,\n ballotMode,\n metadataUri,\n sequencerResult,\n census,\n };\n }\n\n /**\n * Validates and calculates timing parameters\n */\n private calculateTiming(timing: ProcessConfig['timing']): {\n startTime: number;\n duration: number;\n } {\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\n ? this.dateToUnixTimestamp(startDate)\n : 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 configuration with metadata fields\n * This method should only be called with ProcessConfigWithMetadata\n */\n private createMetadata(config: ProcessConfigWithMetadata) {\n const metadata = getElectionMetadataTemplate();\n\n metadata.title.default = config.title;\n metadata.description.default = config.description || '';\n\n // TypeScript ensures at least one question exists due to tuple type\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 /**\n * Ends a voting process by setting its status to ENDED.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to end\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.endProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process ended successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *endProcessStream(processId: string): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to end the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.ENDED);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Ends a voting process by setting its status to ENDED.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use endProcessStream() instead.\n *\n * @param processId - The process ID to end\n * @returns Promise resolving when the process is ended\n *\n * @example\n * ```typescript\n * await sdk.endProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process ended successfully\");\n * ```\n */\n async endProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.endProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('End process stream ended unexpectedly');\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to pause\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.pauseProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process paused successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *pauseProcessStream(\n processId: string\n ): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to pause the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.PAUSED);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use pauseProcessStream() instead.\n *\n * @param processId - The process ID to pause\n * @returns Promise resolving when the process is paused\n *\n * @example\n * ```typescript\n * await sdk.pauseProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process paused successfully\");\n * ```\n */\n async pauseProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.pauseProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('Pause process stream ended unexpectedly');\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to cancel\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.cancelProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process canceled successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *cancelProcessStream(\n processId: string\n ): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to cancel the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.CANCELED);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use cancelProcessStream() instead.\n *\n * @param processId - The process ID to cancel\n * @returns Promise resolving when the process is canceled\n *\n * @example\n * ```typescript\n * await sdk.cancelProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process canceled successfully\");\n * ```\n */\n async cancelProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.cancelProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('Cancel process stream ended unexpectedly');\n }\n\n /**\n * Resumes a voting process by setting its status to READY.\n * This is typically used to resume a paused process.\n * Returns an async generator that yields transaction status events.\n *\n * @param processId - The process ID to resume\n * @returns AsyncGenerator yielding transaction status events\n *\n * @example\n * ```typescript\n * const stream = sdk.resumeProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case \"pending\":\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case \"completed\":\n * console.log(\"Process resumed successfully\");\n * break;\n * case \"failed\":\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case \"reverted\":\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n async *resumeProcessStream(\n processId: string\n ): AsyncGenerator<TxStatusEvent<{ success: boolean }>> {\n // Submit on-chain transaction to resume the process\n const txStream = this.processRegistry.setProcessStatus(processId, ProcessStatus.READY);\n\n for await (const event of txStream) {\n if (event.status === TxStatus.Pending) {\n yield { status: TxStatus.Pending, hash: event.hash };\n } else if (event.status === TxStatus.Completed) {\n yield {\n status: TxStatus.Completed,\n response: { success: true },\n };\n break;\n } else if (event.status === TxStatus.Failed) {\n yield { status: TxStatus.Failed, error: event.error };\n break;\n } else if (event.status === TxStatus.Reverted) {\n yield { status: TxStatus.Reverted, reason: event.reason };\n break;\n }\n }\n }\n\n /**\n * Resumes a voting process by setting its status to READY.\n * This is typically used to resume a paused process.\n * This is a simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use resumeProcessStream() instead.\n *\n * @param processId - The process ID to resume\n * @returns Promise resolving when the process is resumed\n *\n * @example\n * ```typescript\n * await sdk.resumeProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process resumed successfully\");\n * ```\n */\n async resumeProcess(processId: string): Promise<void> {\n // Use the stream internally and consume it to get the final result\n for await (const event of this.resumeProcessStream(processId)) {\n if (event.status === 'completed') {\n return;\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 throw new Error('Resume process stream ended unexpectedly');\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(\n data: string | ArrayBuffer | Uint8Array,\n expectedHash: string,\n filename: string\n ): 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(inputs, wasmBin, zkeyBin);\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, CensusData, EncryptionKey } from '../../core/types';\nimport { CensusOrigin, CensusProof } from '../../census/types';\n\nexport interface CreateProcessRequest {\n processId: string;\n census: {\n censusOrigin: CensusOrigin;\n censusRoot: string;\n censusURI: string;\n };\n ballotMode: BallotMode;\n signature: string;\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: CensusData;\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\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 census proof (only required for CSP, not for MerkleTree). */\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\nexport interface ParticipantInfoResponse {\n key: string;\n weight: string;\n}\n","import { Signer } from 'ethers';\nimport { VocdoniApiService } from '../api/ApiService';\nimport {\n DavinciCrypto,\n DavinciCryptoInputs,\n DavinciCryptoOutput,\n} from '../../sequencer/DavinciCryptoService';\nimport {\n CircomProof,\n Groth16Proof,\n ProofInputs as Groth16ProofInputs,\n} from '../../sequencer/CircomProofService';\nimport {\n CensusOrigin,\n CensusProof,\n CensusProviders,\n assertMerkleCensusProof,\n assertCSPCensusProof,\n} 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 * Configuration options for VoteOrchestrationService\n */\nexport interface VoteOrchestrationConfig {\n /** Whether to verify downloaded circuit files match expected hashes (default: true) */\n verifyCircuitFiles?: boolean;\n /** Whether to verify the generated proof is valid before submission (default: true) */\n verifyProof?: boolean;\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 private readonly verifyCircuitFiles: boolean;\n private readonly verifyProof: boolean;\n\n constructor(\n private apiService: VocdoniApiService,\n private getCrypto: () => Promise<DavinciCrypto>,\n private signer: Signer,\n private censusProviders: CensusProviders = {},\n config: VoteOrchestrationConfig = {}\n ) {\n // Default to true - verify circuit files and proof by default for security\n this.verifyCircuitFiles = config.verifyCircuitFiles ?? true;\n this.verifyProof = config.verifyProof ?? true;\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 const voteRequest: VoteRequest = {\n processId: config.processId,\n ballot: cryptoOutput.ballot,\n ballotProof: proof,\n ballotInputsHash: cryptoOutput.ballotInputsHash,\n address: voterAddress,\n signature,\n voteId,\n };\n\n // Only include censusProof for CSP (not for MerkleTree)\n if (process.census.censusOrigin === CensusOrigin.CensusOriginCSP) {\n voteRequest.censusProof = censusProof;\n }\n\n await this.submitVoteRequest(voteRequest);\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 * Watch vote status changes in real-time using an async generator.\n * Yields each status change as it happens, allowing for reactive UI updates.\n *\n * @param processId - The process ID\n * @param voteId - The vote ID\n * @param options - Optional configuration\n * @returns AsyncGenerator yielding vote status updates\n *\n * @example\n * ```typescript\n * const vote = await sdk.submitVote({ processId, choices: [1] });\n *\n * for await (const statusInfo of sdk.watchVoteStatus(vote.processId, vote.voteId)) {\n * console.log(`Vote status: ${statusInfo.status}`);\n *\n * switch (statusInfo.status) {\n * case VoteStatus.Pending:\n * console.log(\"⏳ Processing...\");\n * break;\n * case VoteStatus.Verified:\n * console.log(\"✓ Verified\");\n * break;\n * case VoteStatus.Settled:\n * console.log(\"✅ Settled\");\n * break;\n * }\n * }\n * ```\n */\n async *watchVoteStatus(\n processId: string,\n voteId: string,\n options?: {\n targetStatus?: VoteStatus;\n timeoutMs?: number;\n pollIntervalMs?: number;\n }\n ): AsyncGenerator<VoteStatusInfo> {\n const targetStatus = options?.targetStatus ?? VoteStatus.Settled;\n const timeoutMs = options?.timeoutMs ?? 300000;\n const pollIntervalMs = options?.pollIntervalMs ?? 5000;\n\n const startTime = Date.now();\n let previousStatus: VoteStatus | null = null;\n\n while (Date.now() - startTime < timeoutMs) {\n const statusInfo = await this.getVoteStatus(processId, voteId);\n\n // Only yield if status has changed\n if (statusInfo.status !== previousStatus) {\n previousStatus = statusInfo.status;\n yield statusInfo;\n\n // Stop if we reached target status or error\n if (statusInfo.status === targetStatus || statusInfo.status === VoteStatus.Error) {\n return;\n }\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 * Wait for a vote to reach a specific status.\n * This is a simpler alternative to watchVoteStatus() that returns only the final 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 // Use watchVoteStatus internally and return final status\n let finalStatus: VoteStatusInfo | null = null;\n\n for await (const statusInfo of this.watchVoteStatus(processId, voteId, {\n targetStatus,\n timeoutMs,\n pollIntervalMs,\n })) {\n finalStatus = statusInfo;\n }\n\n if (!finalStatus) {\n throw new Error(`Vote did not reach status ${targetStatus} within ${timeoutMs}ms`);\n }\n\n return finalStatus;\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')\n ? customRandomness\n : '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,\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 and hashes from sequencer info\n const info = await this.apiService.sequencer.getInfo();\n\n // Create CircomProof instance with optional hash verification\n const circomProof = new CircomProof({\n wasmUrl: info.circuitUrl,\n zkeyUrl: info.provingKeyUrl,\n vkeyUrl: info.verificationKeyUrl,\n // Only pass hashes if verifyCircuitFiles is enabled\n ...(this.verifyCircuitFiles && {\n wasmHash: info.circuitHash,\n zkeyHash: info.provingKeyHash,\n vkeyHash: info.verificationKeyHash,\n }),\n });\n\n const { proof, publicSignals } = await circomProof.generate(circomInputs);\n\n // Optionally verify the generated proof based on configuration\n if (this.verifyProof) {\n const isValid = await circomProof.verify(proof, publicSignals);\n if (!isValid) {\n throw new Error('Generated proof is invalid');\n }\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(contractAddress, runner);\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(name: string, metadataURI: string, administrators: string[]) {\n return this.sendTx(\n this.contract.createOrganization(name, metadataURI, administrators).catch(e => {\n throw new OrganizationCreateError(e.message, 'create');\n }),\n async () => ({ success: true })\n );\n }\n\n updateOrganization(id: string, name: string, metadataURI: string) {\n return this.sendTx(\n this.contract.updateOrganization(id, name, metadataURI).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.addAdministrator(id, administrator).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.removeAdministrator(id, administrator).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.deleteOrganization(id).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.setupEventListener<[string]>(\n this.contract,\n this.contract.filters.OrganizationCreated(),\n cb\n ).catch(err => console.error('Error setting up OrganizationCreated listener:', err));\n }\n\n onOrganizationUpdated(cb: OrganizationUpdatedCallback): void {\n this.setupEventListener<[string, string]>(\n this.contract,\n this.contract.filters.OrganizationUpdated(),\n cb\n ).catch(err => console.error('Error setting up OrganizationUpdated listener:', err));\n }\n\n onAdministratorAdded(cb: OrganizationAdministratorAddedCallback): void {\n this.setupEventListener<[string, string]>(\n this.contract,\n this.contract.filters.AdministratorAdded(),\n cb\n ).catch(err => console.error('Error setting up AdministratorAdded listener:', err));\n }\n\n onAdministratorRemoved(cb: OrganizationAdministratorRemovedCallback): void {\n this.setupEventListener<[string, string, string]>(\n this.contract,\n this.contract.filters.AdministratorRemoved(),\n cb\n ).catch(err => console.error('Error setting up AdministratorRemoved listener:', err));\n }\n\n removeAllListeners(): void {\n this.contract.removeAllListeners();\n this.clearPollingIntervals();\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 weight: string;\n processId: string;\n publicKey: string;\n signature: string;\n}\n\n// internal shapes returned by the Go runtime\ninterface RawResult<T = any> {\n error?: string;\n data?: T;\n}\ninterface GoDavinciCryptoWasm {\n proofInputs(inputJson: string): RawResult<DavinciCryptoOutput>;\n cspSign(\n censusOrigin: number,\n privKey: string,\n processId: string,\n address: string,\n weight: string\n ): 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 () => {\n importObject: Record<string, any>;\n run(instance: WebAssembly.Instance): Promise<void>;\n };\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(() => {\n /* swallow the exit exception */\n });\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.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 * @param weight - The vote weight as a decimal string\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(\n censusOrigin: CensusOrigin,\n privKey: string,\n processId: string,\n address: string,\n weight: string\n ): Promise<CSPSignOutput> {\n if (!this.initialized) {\n throw new Error('DavinciCrypto not initialized — call `await init()` first');\n }\n\n const raw = globalThis.DavinciCrypto.cspSign(censusOrigin, privKey, processId, address, weight);\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 weight - The vote weight as a decimal string\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(\n censusOrigin: CensusOrigin,\n root: string,\n address: string,\n weight: string,\n processId: string,\n publicKey: string,\n signature: string\n ): 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 weight,\n processId,\n publicKey,\n signature,\n };\n\n const raw = globalThis.DavinciCrypto.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.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 {\n ProcessOrchestrationService,\n ProcessConfig,\n ProcessCreationResult,\n ProcessInfo,\n} 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 /**\n * Ethers.js Signer for signing operations.\n * - For voting only: Can be a bare Wallet (no provider needed)\n * - For process/organization operations: Must be connected to a provider\n */\n signer: Signer;\n\n /** Sequencer API URL for Vocdoni services (required) */\n sequencerUrl: string;\n\n /** Census API URL for census management (optional, only needed when creating censuses from scratch) */\n censusUrl?: string;\n\n /** Custom contract addresses (optional, fetched from sequencer if not provided) */\n addresses?: {\n processRegistry?: string;\n organizationRegistry?: string;\n stateTransitionVerifier?: string;\n resultsVerifier?: string;\n sequencerRegistry?: string;\n };\n\n /** Custom census proof providers (optional) */\n censusProviders?: CensusProviders;\n\n /** Whether to verify downloaded circuit files match expected hashes (optional, defaults to true) */\n verifyCircuitFiles?: boolean;\n\n /** Whether to verify the generated proof is valid before submission (optional, defaults to true) */\n verifyProof?: boolean;\n}\n\n/**\n * Internal configuration interface\n */\ninterface InternalDavinciSDKConfig {\n signer: Signer;\n sequencerUrl: string;\n censusUrl?: string;\n customAddresses: {\n processRegistry?: string;\n organizationRegistry?: string;\n stateTransitionVerifier?: string;\n resultsVerifier?: string;\n sequencerRegistry?: string;\n };\n fetchAddressesFromSequencer: boolean;\n verifyCircuitFiles: boolean;\n verifyProof: 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 // Determine if custom addresses are provided\n const hasCustomAddresses = !!config.addresses && Object.keys(config.addresses).length > 0;\n\n // Set configuration\n this.config = {\n signer: config.signer,\n sequencerUrl: config.sequencerUrl,\n censusUrl: config.censusUrl,\n customAddresses: config.addresses || {},\n fetchAddressesFromSequencer: !hasCustomAddresses, // Automatic: fetch if no custom addresses\n verifyCircuitFiles: config.verifyCircuitFiles ?? true, // Default to true for security\n verifyProof: config.verifyProof ?? true, // Default to true for security\n };\n\n // Initialize API service\n this.apiService = new VocdoniApiService({\n sequencerURL: this.config.sequencerUrl,\n censusURL: this.config.censusUrl || '', // Use empty string if not provided\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 // Fetch contract addresses from sequencer if needed\n if (this.config.fetchAddressesFromSequencer) {\n await this.fetchContractAddressesFromSequencer();\n }\n\n // Validate census URL if needed\n if (!this.config.censusUrl) {\n // Census URL is optional, but we'll check if it's needed later when actually used\n }\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 * Requires a signer with a provider for blockchain interactions.\n *\n * @throws Error if signer does not have a provider\n */\n get processes(): ProcessRegistryService {\n this.ensureProvider();\n if (!this._processRegistry) {\n const processRegistryAddress = this.resolveContractAddress('processRegistry');\n this._processRegistry = new ProcessRegistryService(\n processRegistryAddress,\n this.config.signer\n );\n }\n return this._processRegistry;\n }\n\n /**\n * Get the organization registry service for organization management.\n * Requires a signer with a provider for blockchain interactions.\n *\n * @throws Error if signer does not have a provider\n */\n get organizations(): OrganizationRegistryService {\n this.ensureProvider();\n if (!this._organizationRegistry) {\n const organizationRegistryAddress = this.resolveContractAddress('organizationRegistry');\n this._organizationRegistry = new OrganizationRegistryService(\n organizationRegistryAddress,\n this.config.signer\n );\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 * Requires a signer with a provider for blockchain interactions.\n *\n * @throws Error if signer does not have a provider\n */\n get processOrchestrator(): ProcessOrchestrationService {\n this.ensureProvider();\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 verifyCircuitFiles: this.config.verifyCircuitFiles,\n verifyProof: this.config.verifyProof,\n }\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 * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to fetch\n * @returns Promise resolving to user-friendly process information\n * @throws Error if signer does not have a provider\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 this.ensureProvider();\n\n return this.processOrchestrator.getProcess(processId);\n }\n\n /**\n * Creates a complete voting process and returns an async generator that yields transaction status events.\n * This method allows you to monitor the transaction progress in real-time, including pending, completed,\n * failed, and reverted states.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param config - Simplified process configuration\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.createProcessStream({\n * title: \"My Election\",\n * description: \"A simple election\",\n * census: {\n * type: CensusOrigin.CensusOriginMerkleTree,\n * root: \"0x1234...\",\n * size: 100,\n * uri: \"ipfs://...\"\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 * // Monitor transaction progress\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * // Update UI to show pending state\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process created:\", event.response.processId);\n * console.log(\"Transaction hash:\", event.response.transactionHash);\n * // Update UI to show success\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * // Update UI to show error\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * // Update UI to show revert reason\n * break;\n * }\n * }\n * ```\n */\n createProcessStream(config: ProcessConfig) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before creating processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.createProcessStream(config);\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 * For real-time transaction status updates, use createProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\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 * @throws Error if signer does not have a provider\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 this.ensureProvider();\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 * Does NOT require a provider - can be used with a bare Wallet for signing only.\n * IMPORTANT: Requires censusUrl to be configured in the SDK for fetching census proofs (unless using custom census providers).\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 * @throws Error if censusUrl is not configured (unless using custom census providers)\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 // Check if censusUrl is configured (unless using custom census providers)\n if (!this.config.censusUrl && !this.censusProviders.merkle && !this.censusProviders.csp) {\n throw new Error(\n 'Census URL is required for voting. ' +\n 'Provide censusUrl in the SDK constructor config, or use custom census providers.'\n );\n }\n\n return this.voteOrchestrator.submitVote(config);\n }\n\n /**\n * Get the status of a submitted vote.\n *\n * Does NOT require a provider - uses API calls only.\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 * Does NOT require a provider - uses API calls only.\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(\n 'SDK must be initialized before checking vote status. Call sdk.init() first.'\n );\n }\n\n return this.voteOrchestrator.hasAddressVoted(processId, address);\n }\n\n /**\n * Check if an address is able to vote in a process and get participant information.\n *\n * Does NOT require a provider - uses API calls only.\n *\n * @param processId - The process ID\n * @param address - The voter's address\n * @returns Promise resolving to participant information (key and weight)\n *\n * @example\n * ```typescript\n * const participantInfo = await sdk.isAddressAbleToVote(processId, \"0x1234567890abcdef...\");\n * console.log(\"Address:\", participantInfo.key);\n * console.log(\"Weight:\", participantInfo.weight);\n * ```\n */\n async isAddressAbleToVote(processId: string, address: string) {\n if (!this.initialized) {\n throw new Error(\n 'SDK must be initialized before checking participant info. Call sdk.init() first.'\n );\n }\n\n return this.apiService.sequencer.isAddressAbleToVote(processId, address);\n }\n\n /**\n * Watch vote status changes in real-time using an async generator.\n * This method yields each status change as it happens, perfect for showing\n * progress indicators in UI applications.\n *\n * Does NOT require a provider - uses API calls only.\n *\n * @param processId - The process ID\n * @param voteId - The vote ID\n * @param options - Optional configuration\n * @returns AsyncGenerator yielding vote status updates\n *\n * @example\n * ```typescript\n * // Submit vote\n * const voteResult = await sdk.submitVote({\n * processId: \"0x1234567890abcdef...\",\n * choices: [1]\n * });\n *\n * // Watch status changes in real-time\n * for await (const statusInfo of sdk.watchVoteStatus(voteResult.processId, voteResult.voteId)) {\n * console.log(`Vote status: ${statusInfo.status}`);\n *\n * switch (statusInfo.status) {\n * case VoteStatus.Pending:\n * console.log(\"⏳ Processing...\");\n * break;\n * case VoteStatus.Verified:\n * console.log(\"✓ Vote verified\");\n * break;\n * case VoteStatus.Aggregated:\n * console.log(\"📊 Vote aggregated\");\n * break;\n * case VoteStatus.Settled:\n * console.log(\"✅ Vote settled\");\n * break;\n * }\n * }\n * ```\n */\n watchVoteStatus(\n processId: string,\n voteId: string,\n options?: {\n targetStatus?: VoteStatus;\n timeoutMs?: number;\n pollIntervalMs?: number;\n }\n ) {\n if (!this.initialized) {\n throw new Error(\n 'SDK must be initialized before watching vote status. Call sdk.init() first.'\n );\n }\n\n return this.voteOrchestrator.watchVoteStatus(processId, voteId, options);\n }\n\n /**\n * Wait for a vote to reach a specific status.\n * This is a simpler alternative to watchVoteStatus() that returns only the final status.\n * Useful for waiting for vote confirmation and processing without needing to handle each intermediate status.\n *\n * Does NOT require a provider - uses API calls only.\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 * });\n *\n * // Wait for the vote to be fully processed\n * const finalStatus = await sdk.waitForVoteStatus(\n * voteResult.processId,\n * voteResult.voteId,\n * VoteStatus.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(\n 'SDK must be initialized before waiting for vote status. Call sdk.init() first.'\n );\n }\n\n return this.voteOrchestrator.waitForVoteStatus(\n processId,\n voteId,\n targetStatus,\n timeoutMs,\n pollIntervalMs\n );\n }\n\n /**\n * Ends a voting process by setting its status to ENDED and returns an async generator\n * that yields transaction status events. This method allows you to monitor the\n * transaction progress in real-time.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to end\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.endProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process ended successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n endProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before ending processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.endProcessStream(processId);\n }\n\n /**\n * Ends a voting process by setting its status to ENDED.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use endProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to end\n * @returns Promise resolving when the process is ended\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.endProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process ended successfully\");\n * ```\n */\n async endProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before ending processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.endProcess(processId);\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED and returns an async generator\n * that yields transaction status events. This method allows you to monitor the\n * transaction progress in real-time.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to pause\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.pauseProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process paused successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n pauseProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before pausing processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.pauseProcessStream(processId);\n }\n\n /**\n * Pauses a voting process by setting its status to PAUSED.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use pauseProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to pause\n * @returns Promise resolving when the process is paused\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.pauseProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process paused successfully\");\n * ```\n */\n async pauseProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before pausing processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.pauseProcess(processId);\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED and returns an async generator\n * that yields transaction status events. This method allows you to monitor the\n * transaction progress in real-time.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to cancel\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.cancelProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process canceled successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n cancelProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before canceling processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.cancelProcessStream(processId);\n }\n\n /**\n * Cancels a voting process by setting its status to CANCELED.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use cancelProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to cancel\n * @returns Promise resolving when the process is canceled\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.cancelProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process canceled successfully\");\n * ```\n */\n async cancelProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before canceling processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.cancelProcess(processId);\n }\n\n /**\n * Resumes a voting process by setting its status to READY and returns an async generator\n * that yields transaction status events. This is typically used to resume a paused process.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to resume\n * @returns AsyncGenerator yielding transaction status events\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * const stream = sdk.resumeProcessStream(\"0x1234567890abcdef...\");\n *\n * for await (const event of stream) {\n * switch (event.status) {\n * case TxStatus.Pending:\n * console.log(\"Transaction pending:\", event.hash);\n * break;\n * case TxStatus.Completed:\n * console.log(\"Process resumed successfully\");\n * break;\n * case TxStatus.Failed:\n * console.error(\"Transaction failed:\", event.error);\n * break;\n * case TxStatus.Reverted:\n * console.error(\"Transaction reverted:\", event.reason);\n * break;\n * }\n * }\n * ```\n */\n resumeProcessStream(processId: string) {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before resuming processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.resumeProcessStream(processId);\n }\n\n /**\n * Resumes a voting process by setting its status to READY.\n * This is typically used to resume a paused process.\n * This is the simplified method that waits for transaction completion.\n *\n * For real-time transaction status updates, use resumeProcessStream() instead.\n *\n * Requires a signer with a provider for blockchain interactions.\n *\n * @param processId - The process ID to resume\n * @returns Promise resolving when the process is resumed\n * @throws Error if signer does not have a provider\n *\n * @example\n * ```typescript\n * await sdk.resumeProcess(\"0x1234567890abcdef...\");\n * console.log(\"Process resumed successfully\");\n * ```\n */\n async resumeProcess(processId: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('SDK must be initialized before resuming processes. Call sdk.init() first.');\n }\n this.ensureProvider();\n\n return this.processOrchestrator.resumeProcess(processId);\n }\n\n /**\n * Resolve contract address based on configuration priority:\n * 1. Custom addresses from user config (if provided)\n * 2. Addresses from sequencer (fetched during init if no custom addresses provided)\n */\n private resolveContractAddress(\n contractName: keyof NonNullable<DavinciSDKConfig['addresses']>\n ): string {\n // Check if custom address is provided by user\n const customAddress = this.config.customAddresses[contractName];\n if (customAddress) {\n return customAddress;\n }\n\n // If no custom address and we didn't fetch from sequencer, throw error\n if (!this.config.customAddresses[contractName]) {\n throw new Error(\n `Contract address for '${contractName}' not found. ` +\n `Make sure SDK is initialized with sdk.init() or provide custom addresses in config.`\n );\n }\n\n return this.config.customAddresses[contractName]!;\n }\n\n /**\n * Fetch contract addresses from sequencer info\n * This is called during init() if custom addresses are not provided\n */\n private async fetchContractAddressesFromSequencer(): Promise<void> {\n try {\n const info = await this.apiService.sequencer.getInfo();\n const contracts = info.contracts;\n\n // Store addresses from sequencer\n if (contracts.process) {\n this.config.customAddresses.processRegistry = contracts.process;\n this._processRegistry = new ProcessRegistryService(contracts.process, this.config.signer);\n }\n\n if (contracts.organization) {\n this.config.customAddresses.organizationRegistry = contracts.organization;\n this._organizationRegistry = new OrganizationRegistryService(\n contracts.organization,\n this.config.signer\n );\n }\n\n if (contracts.stateTransitionVerifier) {\n this.config.customAddresses.stateTransitionVerifier = contracts.stateTransitionVerifier;\n }\n\n if (contracts.resultsVerifier) {\n this.config.customAddresses.resultsVerifier = contracts.resultsVerifier;\n }\n\n // Note: sequencerRegistry is not provided by the sequencer info endpoint\n } catch (error) {\n throw new Error(\n `Failed to fetch contract addresses from sequencer: ${error instanceof Error ? error.message : String(error)}. ` +\n `You can provide custom addresses in the SDK config to avoid this error.`\n );\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 /**\n * Ensures that the signer has a provider for blockchain operations.\n * @throws Error if the signer does not have a provider\n * @private\n */\n private ensureProvider(): void {\n if (!this.config.signer.provider) {\n throw new Error(\n 'Provider required for blockchain operations (process/organization management). ' +\n 'The signer must be connected to a provider. ' +\n 'Use wallet.connect(provider) or a browser signer like MetaMask. ' +\n 'Note: Voting operations do not require a provider.'\n );\n }\n }\n}\n"],"names":["ElectionResultsTypeNames","CensusOrigin","CensusType","TxStatus","ProcessStatus","VoteStatus"],"mappings":"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"}
|