3.1.0 • Published 5 months ago
@zeropoll/core v3.1.0
@zeropoll/core
Core implementation of the ZeroPoll private voting system. This package provides the controller engine that manages the interaction between different components of the system.
It can be easily integrated with Node.js or browser-based applications and frameworks like React
Overview
@zeropoll/core implements a state management system that coordinates:
- Chain interactions with the Layer 2
- Wallet connections and transactions
- Poll creation and voting
- Off-chain metadata storage via IPFS
Architecture
The core package is built around a main ZeroPoll
controller that orchestrates several sub-controllers:
Main Controller
ZeroPoll
: The root controller that initializes and coordinates all other components
Sub-controllers
ChainController
: Manages Layer 2 chain interactions and synchronizationWalletController
: Handles wallet connections and transaction signingPollController
: Manages individual poll operations and statePollManagerController
: Coordinates poll creationBaseController
: Provides common controller functionality
TODO: add signers and stores section
State Management
Each controller maintains its own state:
interface ZeroPollState {
initialized: boolean;
wallet: WalletState;
chain: ChainState;
poll: PollState;
pollManager: PollManagerState;
}
Installation
# From your project root
pnpm add @zeropoll/core
# Or within the monorepo
pnpm install
Usage
Basic Setup
import { ZeroPoll } from '@zeropoll/core';
const zeropoll = new ZeroPoll({
protokitGraphqlUrl: 'https://chain.zeropoll.xyz/graphql',
ipfsApiUrl: 'https://ipfs.zeropoll.xyz',
tickInterval: 1000, // Optional: defaults to 1000ms
});
// Initialize the system
await zeropoll.init();
Configuration
interface ZeroPollConfig {
// GraphQL endpoint for the ProtoKit chain
protokitGraphqlUrl: string;
// IPFS API endpoint for metadata storage
ipfsApiUrl: string;
// Optional: Interval for chain state updates (ms)
tickInterval?: number;
}
State Updates
The ZeroPoll controller provides a reactive state system:
// Subscribe to state changes
zeropoll.subscribe((state: ZeroPollState) => {
console.log('New state:', state);
});
// Access current state
const currentState = zeropoll.state;
Controller Access
// Access individual controllers
const { wallet, chain, poll, pollManager } = zeropoll;
// Example: Check wallet connection
const isConnected = wallet.state.connected;
// Example: Create a new poll
await pollManager.createPoll({
// poll configuration
});
// Example: Vote in a poll
await poll.load('pollId');
await poll.vote('optionHash');
IPFS Integration
The system uses IPFS for off-chain metadata storage.
Development
Building
# Build the package
pnpm build
Testing
# Run tests
pnpm test
License
This package is part of the ZeroPoll monorepo and is licensed under the MIT License. See the root LICENSE file for details.