Skip to main content

Overview

The Task Pool V2 system enables on-chain bounty management: merchants deposit USDC, create tasks with acceptance criteria, solvers claim and complete tasks, verification happens through a pluggable engine, and rewards are distributed with a transparent fee structure. Every Podium organization gets its own TaskPool + RewardPool contract pair, deployed as Beacon Proxies through the TaskPoolFactory. Global singletons (SolverRegistry, VerificationEngine, IntentRegistryV2) are shared across all tenants.

Settlement Flow

Task Lifecycle

Duration Constraints

  • Minimum: 5 minutes
  • Maximum: 7 days

Task ID Generation

Task IDs are deterministically computed from the creation parameters:

TaskPoolFactory

The factory deploys per-tenant TaskPool + RewardPool pairs using CREATE2 for deterministic addressing.

Creating Tenant Pools

This deploys two Beacon Proxies:
  1. TaskPool — initialized with references to USDC, VerificationEngine, SolverRegistry, IntentRegistry, and the RewardPool
  2. RewardPool — initialized with references to USDC, SolverRegistry, IntentRegistry, the TaskPool, and fee configuration

Deterministic Addresses

Pre-compute pool addresses before deployment:
Salt derivation:

Atomic Upgrades

Upgrading the beacon atomically upgrades all tenant pools:

TaskPoolImplementation

Per-tenant escrow and task lifecycle contract.

Key Functions

Merchant Balances

Merchants deposit USDC before creating tasks. Task creation debits the merchant’s balance (escrow). Cancellation credits the balance back. This prevents tasks from being created without sufficient funds.

RewardPoolImplementation

Per-tenant reward distribution with a three-way fee split.

Fee Structure

Combined fee cap: 10% maximum (enforced on setFees).

Payout Flow

When TaskPool.settleTask() is called:
  1. USDC is transferred from TaskPool to RewardPool
  2. queuePayout(taskId, solver, grossAmount) computes the fee split
  3. Protocol fee is credited to the fee recipient’s pending balance
  4. Solver fee is sent to SolverRegistry via accrueReward() (updates reputation)
  5. Net payout is credited to the solver’s pending balance
Solvers and fee recipients call claimRewards() to withdraw their accumulated payouts.

Key Functions

SolverRegistry

Global singleton tracking solver identity, eligibility, and reputation.

Solver Profile

Reputation System

  • Starts at 5000 on registration
  • +10 per completed task (via accrueReward)
  • Capped at 9900 (cannot reach 10000)
  • No decay mechanism currently — reputation only increases

Key Functions

VerificationEngine

Global singleton routing task completion verification through pluggable strategies.

Verification Methods

All three methods resolve through the same resolveVerification(taskId, approved) callback. The method enum is recorded for provenance but doesn’t change the on-chain resolution flow — the intelligence is off-chain in the Podium API backend.

Flow

  1. TaskPool calls requestVerification(taskId, solver, submissionHash, criteria, method)
  2. Off-chain oracle (the Podium API) evaluates the submission
  3. Oracle calls resolveVerification(taskId, approved)
  4. If approved, VerificationEngine calls TaskPool.settleTask(taskId, solver)
  5. If rejected, the task remains claimable or can be cancelled

Key Functions

IntentRegistryV2

Global singleton tracking all intents across tenants for observability and analytics.

Key Differences from V1

  • UUPS upgradeable (V1 was non-upgradeable)
  • Multiple authorized callers instead of single originSettler
  • Custom errors instead of require strings
  • EIP-7201 namespaced storage

Functions