Overview
The V1 contracts implement an intent-based reward settlement flow. A merchant deposits USDC, the platform creates a reward intent, a solver locks and fulfills it, and the recipient receives funds minus a small solver fee. V1 contracts are non-upgradeable and single-tenant. They remain deployed for backward compatibility, but new deployments use the V2 Task Pool system.Settlement Flow
IntentRegistry
Central observability ledger tracking all reward intents across the system.Functions
| Function | Access | Description |
|---|---|---|
setOriginSettler(address) | Owner | Set the authorized origin settler |
registerIntent(intentId, merchant, recipient, amount) | Origin settler only | Register a new intent |
markFulfilled(intentId, solver) | Origin settler only | Mark as fulfilled |
getIntent(intentId) | View | Get intent details |
getMerchantIntents(merchant) | View | All intents by merchant |
getRecipientIntents(recipient) | View | All intents by recipient |
getSolverIntents(solver) | View | All intents fulfilled by solver |
getTotalIntents() | View | Total intent count |
getAllIntents(offset, limit) | View | Paginated intent listing |
IntentRecord Struct
Events
PodiumOriginSettler
Manages merchant deposits, intent creation, fund locking, and the origin side of settlement.Intent Lifecycle
| Status | Description |
|---|---|
Pending | Created, waiting for solver to lock |
Locked | Solver committed, funds debited from merchant balance |
Fulfilled | Settlement complete, solver has been paid |
Expired | Deadline passed without fulfillment |
Cancelled | Merchant or platform cancelled |
Duration Constraints
- Minimum: 5 minutes
- Maximum: 24 hours
Functions
| Function | Access | Description |
|---|---|---|
depositFunds(token, amount) | Any merchant | Transfer ERC-20 in, credit balance |
withdrawFunds(token, amount) | Merchant | Withdraw from balance |
createIntent(merchant, recipient, token, amount, duration, campaignId) | Owner | Create intent with deterministic ID |
lockIntent(intentId) | Any solver | Lock intent, debit merchant balance |
markFulfilled(intentId, solver, txHash) | Destination settler | Mark as fulfilled |
cancelIntent(intentId) | Merchant or owner | Cancel and refund |
setDestinationSettler(address) | Owner | Set destination settler address |
setRegistry(address) | Owner | Set registry address |
getIntent(intentId) | View | Get intent details |
getMerchantBalance(merchant) | View | Check merchant’s deposited balance |
RewardIntent Struct
Intent ID Generation
Intent IDs are deterministic — the same inputs always produce the same ID:Events
Cancel Flow
Cancellation is available for intents that haven’t been locked by a solver:- Only
Pendingintents can be cancelled - The merchant (or contract owner) calls
cancelIntent(intentId) - Status is set to
Cancelled - The escrowed amount is returned to the merchant’s balance
IntentCancelledevent is emitted
PodiumDestinationSettler
Handles the destination side: solver fulfills the intent by transferring funds to the recipient and collecting proof.Fee Structure
- Solver fee: 0.1% (10 basis points) —
SOLVER_FEE_BPS = 10 - Recipient receives:
amount - (amount × 10 / 10000) - Solver keeps the fee as payment for fulfillment
Functions
| Function | Access | Description |
|---|---|---|
fulfillIntent(intentId, token, recipient, amount) | Any solver | Transfer to recipient, keep fee, create proof |
verifyProof(intentId) | Owner | Post-hoc proof attestation |
claimRewards(token) | Solver | Withdraw accumulated fees |
setOriginSettler(address) | Owner | Update origin settler reference |
getProof(intentId) | View | Get fulfillment proof |
getSolverRewards(solver) | View | Check solver’s accumulated rewards |
FulfillmentProof Struct
Events
Fulfillment Flow
- Solver calls
fulfillIntent(intentId, token, recipient, amount) - Contract transfers
amount - feeto recipient viaIERC20.transferFrom - Fee (0.1%) is retained in the contract, credited to solver
FulfillmentProofis created and stored- Contract calls
OriginSettler.markFulfilled()to update origin status IntentFulfilledevent emitted with full details- Solver can later call
claimRewards(token)to withdraw accumulated fees
Deployed Networks
| Network | Chain ID | Deployment |
|---|---|---|
| Base Mainnet | 8453 | Production — uses canonical USDC |
| Base Sepolia | 84532 | Testnet — uses MockUSDC |
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) and a deployed MockUSDC on testnets.
V1 vs V2 Comparison
| Feature | V1 (Intent Settlers) | V2 (Task Pool) |
|---|---|---|
| Upgradeability | None | UUPS + Beacon proxy |
| Multi-tenancy | Single-tenant | Multi-tenant via factory |
| Verification | Solver self-reports | Consensus / Oracle / AI |
| Fee model | Fixed 0.1% solver fee | Configurable protocol + solver fees |
| Cancel flow | Merchant-initiated | Merchant or admin |
| Task metadata | Campaign ID only | Acceptance criteria, submission hash |

