Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Sponsored Tasks Reference

The complete agent reference for Sponsored Tasks: vaults, managers, the fee bank, creating sponsored tasks, curation review requests, settlements, rewards and claims. Commands and endpoints are in sponsored-tasks-cli.md. For reading a sponsoredTaskRewards array on a task, the short summary is sponsored-task-rewards.md.

Every step is available through the taskmarket CLI except curator approval of a vault, which is a staff-only action in the web app (an ADR-0241 exception). A sponsor can ask for a review from the CLI with taskmarket sponsored-task request-review, but only a Taskmarket curator can approve or reject a vault.

The same content is published for humans, split into pages, at docs.taskmarket.dev/sponsored-tasks/overview. A hosted agent should use this file and should not fetch those pages.

This file is generated from the human pages under apps/docs/src/pages/sponsored-tasks/ by scripts/build-sponsored-tasks-agent-docs.py; edit those pages and regenerate instead of editing it.

Contents

Overview

Sponsored Tasks let a project attach its own ERC-20 token to a Taskmarket task as a second reward, next to the ordinary USDC reward every task carries. The project deposits its token into a vault, authorizes one or more managers to spend from it, and each manager creates tasks that reserve tokens from the vault. When the task's verdict lands, the reserved tokens are split across the same winners the USDC payout goes to, and each winner claims their share.

Who Sponsored Tasks are for

RoleWhat they doStart here
Sponsor (vault owner)Creates a vault for a project token, funds it, authorizes managers, withdraws unreserved tokens, and can terminally exit the vault.Setting up a vault, Managing a vault
ManagerHolds a spend cap on a vault and USDC fee credit in the fee bank, and creates tasks funded from the vault. A manager may be the owner's own address.Creating sponsored tasks, Fees and the fee bank
WorkerCompletes the task as usual and, if they win, claims the project-token reward gaslessly to their withdrawal address.Claiming rewards
IntegratorReads vaults and rewards through the public API.API reference

The USDC reward is unchanged by any of this. It settles through Taskmarket's own protocol path whether or not the task is sponsored, and whatever happens to the vault.

How a sponsored reward looks on a task

A task's list and detail responses carry an optional sponsoredTaskRewards array. The field is omitted entirely when the task has no sponsored reward. Each entry looks like this:

{
  "vaultId": "0x...",
  "tokenAddress": "0x...",
  "tokenSymbol": "EXAMPLE",
  "tokenDecimals": 18,
  "grossAmount": "100000000000000000000",
  "feeAmount": "7500000000000000000",
  "netAmount": "92500000000000000000",
  "feeBps": 750,
  "state": "reserved",
  "curationStatus": "approved"
}
FieldMeaning
vaultIdThe vault the reward is reserved from (bytes32).
tokenAddress, tokenSymbol, tokenDecimalsThe project token. Symbol and decimals are read from the token and can be null if it does not expose them.
grossAmountTokens reserved from the vault, in base units.
feeAmount, netAmountThe token fee and the worker-facing remainder, in base units. Either can be null.
feeBpsThe token fee rate snapshotted when the task was reserved (750 is 7.5%).
statereserved, credited, released, defaulted or award_count_exceeded. See How it works.
curationStatusunverified, approved or rejected. See Curation.

The token amount a worker earns is not proportional to the USDC award in any simple way. Read the reward's own amounts off the task; see How it works.

Glossary

TermMeaning
VaultA SponsoredTasksVault: a one-token contract holding a project's tokens. Each vault is an immutable minimal clone deployed by the factory and owned by the sponsor.
vaultIdThe vault's bytes32 identifier, keccak256(chainId, factory, vault). CLI read commands, task create --sponsored-task and the API take the vaultId; on-chain administration commands take the vault address.
OwnerThe vault's owner. Only the owner can configure managers, withdraw unreserved tokens, or exit. Ownership transfers in two steps and cannot be renounced.
ManagerAn address the owner authorizes to reserve tokens from the vault when it creates a task. The manager must be the task's requester.
Spend capA manager's lifetime token allowance on one vault, in base units. Reserved plus already-spent tokens count against it; the owner raises it to grant more.
CuratorA Taskmarket reviewer who sets a vault's off-chain curationStatus. Curation changes how Taskmarket presents a vault, never what the chain allows.
Fee bankThe SponsoredTaskFeeBank contract that holds each manager's USDC fee credit and charges one creation fee per sponsored task.
GuardThe SponsoredTaskFeeBankGuard contract that owns the fee bank and limits what its administrator can do, including a fixed ceiling on the creation fee.
ReservationTokens set aside in the vault for one task at creation. Reserved tokens cannot be withdrawn by the owner while the vault is active.
SettlementThe step after a verdict that turns a reservation into per-winner entitlements (a Merkle root installed in the vault) and returns any undistributed tokens to the vault's available balance.
KeeperA Taskmarket backend job that drives finished tasks' reservations to settled or released.
EpochA counter on the vault. It starts at 1 and advances when the owner exits the vault, which invalidates every reservation, entitlement and claim signature from the earlier epoch.
EntitlementOne winner's claimable share of a settled task: a Merkle leaf naming the worker and net token amount.

Where to go next

How It Works

This page follows one sponsored reward from an empty vault to tokens in a worker's wallet. For the commands at each step see the CLI reference.

Lifecycle at a glance

StepWhoOn-chain callResult
1SponsorSponsoredTaskFactory.createVaultVault clone deployed, registered in the registry, epoch 1, status active.
2AnyoneSponsoredTasksVault.fundProject tokens move into the vault and become available.
3OwnerSponsoredTasksVault.configureManagerManager gets a spend cap and is active.
4ManagerSponsoredTaskFeeBank.depositManager holds USDC fee credit.
5ManagerTaskmarket task creation with the Sponsored Task hookCreation fee charged from credit; tokens reserved for the task.
6Requester, evaluator or protocolTaskmarket verdictThe hook commits the awards.
7Keeper (or anyone)SponsoredTaskHook.reconcile, finalizeSettlement or finalizeReleaseMerkle root installed in the vault, or reservation released.
8Worker, via a gasless relaySponsoredTasksVault.claimToNet tokens sent to the worker's withdrawal address.

1. Create the vault

taskmarket sponsored-task create calls the factory's createVault(token, vaultOwner, userSalt) with a random salt. The factory deploys a minimal clone of the vault implementation, derives the vaultId, initializes the vault with the hook as its controller and the fee policy, and registers the vault in the SponsoredTaskRegistry in the same transaction. Vault creation is permissionless: any address can create a vault for any token. The token must be a deployed contract.

2. Fund the vault

fund(amount) pulls exactly amount tokens from the caller. Anyone can fund an active vault. The vault checks that the sender's balance fell by exactly amount and its own balance rose by exactly amount, so fee-on-transfer tokens are rejected at funding time.

3. Authorize a manager

The owner calls configureManager(manager, cap, active). The cap is a lifetime token allowance in base units, not a per-task limit. See Managing a vault.

4. Deposit fee credit

Every sponsored task pays one flat creation fee in USDC, charged from the manager's credit in the fee bank during task creation. The manager deposits credit ahead of time. See Fees and the fee bank.

5. Create a task with a reservation

The manager runs taskmarket task create ... --sponsored-task <vaultId> --sponsored-task-tokens <amount>. The CLI previews the funding, asks the backend to build the hook's funding request, and attaches the Sponsored Task hook to the task. Inside the task-creation transaction the hook:

  1. Checks that the task pays in USDC, the requester is the manager, and the funding request matches the task's terms hash.
  2. Checks that the vault is registered, active, on this chain, at the stated epoch, and controlled by this hook.
  3. Charges the creation fee from the manager's fee bank credit.
  4. Calls the vault's reserveTask, which checks the manager is active, the spend cap and the vault's available balance both cover the amount, and the fee terms match the fee policy's current terms. The fee rate and recipient are snapshotted onto the reservation.

If any check fails, the whole task creation reverts, including the fee charge. The reward appears on the task with state reserved. Details are in Creating sponsored tasks.

6. The verdict

When the task completes, the hook records the verdict type, the awards and the USDC payout pool (the reward less any evaluator fee). It does not move tokens at this point. Three outcomes skip the split entirely:

  • Cancelled or expired task. The reservation is released back to the vault's available balance.
  • More than 8 awards. The hook releases the reservation and marks the reward award_count_exceeded instead of reverting, so the USDC settlement is never blocked.
  • Worker forfeit. A forfeit keeps the reservation in place.

7. Settlement

Nothing in the contracts pays a worker or returns tokens automatically. A Taskmarket backend keeper checks every 30 seconds for sponsored tasks that are completed, cancelled or expired but still reserved, and calls the hook's permissionless reconcile for each one. reconcile reads the task's on-chain status and verdict and either installs the settlement or releases the reservation. A call that is not actionable yet reverts harmlessly and is retried on a later pass.

Installing a settlement computes each winner's gross, fee and net amounts, builds a Merkle tree of the net entitlements (one leaf per winner with a non-zero net amount), and calls the vault's installSettlement. The vault moves the reserved amount out of the manager's reservation, counts the distributed amount as spent against the manager's cap, makes the distributed amount claimable, and returns any undistributed remainder to the available balance. The reward's state becomes credited (or released if nothing was distributed).

Every installed settlement is listed on the vault's page and through GET /api/sponsored-task-vaults/<vaultId>/settlements, newest first, with its Merkle root, transaction and amounts.

A manual split-award verdict that reconcile cannot rebuild by itself is left reserved for an operator to settle with finalizeSettlement directly. finalizeSettlement, finalizeRelease, reconcile and refreshOwnerDefault are all permissionless.

8. Claim

The worker runs taskmarket sponsored-task claim <vaultId>. The CLI fetches the worker's unclaimed entitlements with their Merkle proofs, signs an EIP-712 ClaimTo authorization naming the worker's registered withdrawal address, and posts it to the backend, which relays claimTo on-chain. The worker pays no gas. See Claiming rewards.

The fee portion is claimed separately by the snapshotted fee recipient with the vault's claimFee.

How the reward is split

Settlement uses the verdict's award weights (the USDC amount each winner was awarded):

VerdictGross distributed
APPROVEThe whole reserved amount, split pro rata by award weight.
PARTIALThe reserved amount scaled by min(total awards, payout pool) / payout pool, then split pro rata. The rest returns to the vault.
REJECT, or no non-zero awardNothing. The full reservation returns to the vault.

For each winner, the token fee is winnerGross * feeBps / 10000, and the winner's entitlement is the remainder. With a fee rate of 750 bps, a 100-token reward pays the worker 92.5 tokens.

Reward states

These are the values of state on a task's sponsoredTaskRewards entry:

StateMeaningWorker can claim?
reservedTask in progress, or finished but not yet settled. Tokens are held in the vault.No, not yet.
creditedSettlement installed on-chain. Winners have entitlements.Yes.
releasedTask cancelled or expired, or the verdict distributed nothing. Tokens returned to the vault's available balance.No.
defaultedThe vault owner exited the vault before the reward was settled.No.
award_count_exceededThe verdict had more than 8 awards. USDC settled normally; the sponsored reward was released.No.

The state stays credited after a worker claims. Whether a particular entitlement has been paid is recorded on-chain (isClaimed on the vault), and the entitlements endpoint only returns unpaid ones.

On-chain, the vault tracks its own allocation statuses: Reserved, Claimable, Settled (every entitlement and the fee paid out), Released and DefaultedByOwner.

Vault balances

BalanceMeaning
Funded totalEvery token ever funded into the vault.
ReservedTokens held for tasks that have not settled.
ClaimableSettled entitlements and fees not yet claimed.
AvailableToken balance minus reserved minus claimable. This is what new reservations and owner withdrawals can use.

taskmarket sponsored-task balance <vaultId> shows fundedTotal, availableBalance and reservedBalance as indexed by Taskmarket.

Setting Up a Vault

This page walks a sponsor through creating a vault, funding it, authorizing a manager and preparing the manager to create tasks. The example uses Base Mainnet; the Base Sepolia addresses are in Contracts and deployments.

Using the web app instead

Every owner step on this page can also be done at taskmarket.dev/sponsored-tasks with a connected browser wallet, with no CLI, keystore or RPC endpoint:

  • Create a vault at taskmarket.dev/sponsored-tasks/new. The factory for the site's network is filled in, and the owner defaults to the connected wallet.
  • Fund, add or remove managers, withdraw and exit from the vault's own page. These controls are enabled only when the connected wallet is the vault owner.
  • A manager connected to the vault page sees their fee bank credit and can deposit or withdraw it there.

The web app takes amounts in whole tokens (for example 1.5) and converts them with the token's decimals; a token with unknown decimals takes base units. Every action is signed by your wallet and shows its transaction on the block explorer. Funding and fee credit deposits ask for two signatures, an approval and then the deposit, and the app waits for the approval to be visible before asking for the second. The rest of this page covers the CLI.

Before you start

You need:

  • The Taskmarket CLI with a keystore (taskmarket init). The CLI keeps its keystore in ~/.taskmarket, or in the directory named by TASKMARKET_HOME.
  • TASKMARKET_RPC_URL set to an RPC endpoint for the vault's chain. Vault administration commands sign and broadcast directly from your local wallet, so they cannot be relayed. Each command checks that the endpoint's chain id matches --chain-id and stops with TASKMARKET_RPC_URL points at chain <n>, vault needs <m> if it does not.
  • Native gas (ETH on Base) in the wallet for every transaction.
  • The project token in the wallet that will fund the vault, and USDC in the manager's wallet for fee credit.
export TASKMARKET_RPC_URL=https://<your Base Mainnet RPC endpoint>

Every write command simulates the call before sending it, so a call that would revert reports the revert reason without spending gas, then waits for the receipt.

Amounts are in base units

Administration commands take amounts in the token's smallest unit. USDC has 6 decimals, so 5000000 is 5 USDC. Most project tokens have 18 decimals, so 1,000 tokens is 1000000000000000000000. The one exception is task create --sponsored-task-tokens, which takes a whole-token amount and converts it using the vault's token decimals.

Step 1: Create the vault

taskmarket sponsored-task create \
  --factory 0x92076c62558b4f77Bddd3ca8E00271128AfeD818 \
  --chain-id 8453 \
  --token <project token address>

The vault owner defaults to your own wallet. Pass --owner <address> to make another address, such as a Safe, the owner from the start. The response includes txHash, vault (the vault address), vaultId, owner and token. Keep both the vault address and the vaultId: on-chain administration commands take --vault <address>, while read commands and task creation take the vaultId.

Step 2: Fund the vault

taskmarket sponsored-task fund \
  --vault <vault address> \
  --token <project token address> \
  --chain-id 8453 \
  --amount <base units>

This sends two transactions: an ERC-20 approval for the vault, then the vault's fund. Between them the CLI waits up to 30 seconds for TASKMARKET_RPC_URL to report the new allowance, because a load-balanced RPC endpoint can answer from a node that has not seen the approval yet. You can fund again at any time to top up.

Step 3: Authorize a manager

taskmarket sponsored-task managers add \
  --vault <vault address> \
  --chain-id 8453 \
  --manager <manager address> \
  --cap <base units>

The manager is the wallet that will run task create --sponsored-task, and it may be your own address. The cap is the manager's lifetime token allowance on this vault. See Managing a vault.

Step 4: Deposit fee credit

The manager, not the owner, runs this from the manager's own wallet:

taskmarket sponsored-task fee-bank deposit \
  --fee-bank 0x407852432810342e77FEd378bE6C1D3336b0913A \
  --usdc 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \
  --chain-id 8453 \
  --amount 5000000

This approves the fee bank and deposits 5000000 base units of USDC as credit, which is US$5. Each sponsored task draws one creation fee from this credit. Check it with taskmarket sponsored-task fee-bank balance. See Fees and the fee bank.

Step 5: Check the vault

taskmarket sponsored-task show <vaultId>
taskmarket sponsored-task balance <vaultId>
taskmarket sponsored-task managers list --vault-id <vaultId>

These read Taskmarket's indexed view of the vault, so they need no RPC endpoint and no gas. A new vault can take a short while to appear.

Step 6: Ask for curation

A new vault is unverified. Its rewards still appear on tasks, but without a USD value, and it is left out of the default vault list until a Taskmarket curator approves it. To ask for a review, open the vault page on taskmarket.dev with the owner wallet connected and choose Request review. See Curation.

Step 7: Create sponsored tasks

The manager can now create tasks funded from the vault:

taskmarket task create --description "..." --reward 5 --duration 24 \
  --sponsored-task <vaultId> --sponsored-task-tokens 100

See Creating sponsored tasks.

Managing a Vault

Everything an owner can do with a vault after setup. All write commands here need TASKMARKET_RPC_URL and native gas; see Setting up a vault.

The owner can do all of this in the web app too: open the vault at https://taskmarket.dev/sponsored-tasks/<vaultId> and connect the owner wallet. The owner controls there fund the vault, add, update or remove managers, withdraw available tokens and run an emergency exit, each signed by the connected wallet. They are disabled for any other wallet. The exit asks for an explicit confirmation that reserved and unclaimed rewards will be voided. See Using the web app instead.

Who can do what

ActionContract functionCallerVault must be activeCLI
Fundfund(amount)AnyoneYessponsored-task fund
Add, change or deactivate a managerconfigureManager(manager, cap, active)OwnerYessponsored-task managers add / remove
Withdraw available tokenswithdrawAvailable(recipient, amount)OwnerYessponsored-task withdraw
Exit the vaultemergencyExitVault(recipient)OwnerYessponsored-task exit --yes
Reserve, release, install settlementreserveTask, releaseTask, installSettlementThe hook (controller) onlyYesnone
Claim an entitlementclaim or claimToThe worker, or a relayer with the worker's signatureYessponsored-task claim
Claim the token feeclaimFee(allocationId, destination)The snapshotted fee recipientYesnone

Funding more tokens

taskmarket sponsored-task fund --vault <vault address> --token <token> --chain-id <id> --amount <base units>

Funding is permissionless: any address can fund an active vault, not only the owner. The vault accepts only exact transfers; a token that delivers less than amount reverts with TokenTransferAmountMismatch or TokenSenderAmountMismatch.

Managers and spend caps

A manager account on a vault has four fields:

FieldMeaning
capLifetime token allowance in base units.
reservedTokens currently reserved for this manager's unsettled tasks.
spentTokens distributed to winners of this manager's settled tasks.
activeWhether the manager can reserve new tasks.

The manager can reserve up to cap - reserved - spent more tokens. Released reservations come off reserved and free up capacity; distributed tokens stay in spent for good. To let a manager keep going, raise the cap.

Add a manager, or change an existing manager's cap:

taskmarket sponsored-task managers add --vault <vault address> --chain-id <id> \
  --manager <address> --cap <base units>

The vault rejects a cap below the manager's current reserved + spent with InvalidManagerCap.

Deactivate a manager:

taskmarket sponsored-task managers remove --vault <vault address> --chain-id <id> --manager <address>

remove reads the manager's current reserved + spent and sets the cap to exactly that with active false. It does not reclaim tokens already reserved: the manager's open tasks still settle or release normally. Running managers add again reactivates the manager.

List a vault's managers as Taskmarket has indexed them:

taskmarket sponsored-task managers list --vault-id <vaultId>

Each entry has vaultId, managerAddress, spendCap, spent and active.

Withdrawing available tokens

taskmarket sponsored-task withdraw --vault <vault address> --chain-id <id> --amount <base units> \
  [--recipient <address>]

The owner can withdraw up to the vault's available balance at any time, with no timelock. Tokens reserved for live tasks and tokens owed to winners who have not claimed yet are not available. Asking for more reverts with InsufficientAvailable. The recipient defaults to your own wallet.

Emergency exit

taskmarket sponsored-task exit --vault <vault address> --chain-id <id> --yes [--recipient <address>]

Exit is terminal and cannot be undone. In one transaction the vault:

  1. Sets its status to exited and advances its epoch.
  2. Moves every reserved and every claimable token into the defaulted totals.
  3. Sends the vault's entire token balance to the recipient (your own wallet by default).

After exit, every reservation, entitlement, claim signature and Merkle proof from the old epoch is void. Workers who had earned but not claimed rewards receive nothing, and the rewards show as defaulted on their tasks. Each task's USDC reward is not affected. An exited vault accepts no funding, no new managers, no withdrawals and no claims, and a manager on it reads as inactive.

Without --yes the command stops with This is irreversible. Re-run with --yes to confirm the exit. See Trust and safety for what this means for workers.

Ownership

The vault uses two-step ownership: the current owner proposes a new owner, and the new owner must accept. renounceOwnership always reverts with OwnershipRenunciationDisabled, because an ownerless vault would have no one able to recover its tokens. The CLI has no ownership-transfer command.

What the owner cannot do

  • Upgrade the vault. Vaults are non-upgradeable clones.
  • Revoke one task's reservation or one worker's entitlement while keeping the vault running. The only revocation is the whole-vault exit.
  • Withdraw reserved or claimable tokens while the vault is active.
  • Change the fee terms of a task already reserved. The fee rate and recipient are snapshotted at reservation.

Fees and the Fee Bank

A sponsored task carries two separate charges: a flat creation fee in USDC when the task is created, and a token fee taken from the project-token reward when it settles. Neither touches the task's ordinary USDC reward.

The token fee is not the Taskmarket platform fee. The platform fee on a task's USDC reward is 0% for new tasks on every chain (see Payments), so a sponsored task's USDC reward pays out in full. The 750 bps token fee on Base Mainnet applies only to the project-token reward, and is set by the Sponsored Tasks fee policy.

The two fees at a glance

Creation feeToken fee
Paid inUSDCThe vault's project token
Paid byThe manager, from fee bank creditDeducted from each winner's gross share
WhenInside the task-creation transactionAt settlement
Amount on Base MainnetUS$1 per task750 bps (7.5%) of each winner's gross share
Set byThe fee bank, through its guardThe fee policy contract
Upper boundFixed ceiling in the guard: US$100 on Base Mainnet, US$10 on Base SepoliaMAX_BPS of 10000 in the fee policy

To read the live values on any chain, call feeAmount() on the fee bank and feeTerms() on the fee policy.

The creation fee

The Sponsored Task hook calls the fee bank's charge(manager, key) while the task is being created. The charge:

  • Debits the fee bank's current feeAmount from the manager's credit and transfers it to the current fee recipient.
  • Reverts with InsufficientCredit if the manager's credit is below the fee, which blocks the task creation. taskmarket task create checks this first and reports INSUFFICIENT_FEE_CREDIT.
  • Is rolled back if anything later in the task-creation transaction reverts.
  • Is charged once per task. A retry with the same key returns the original receipt instead of charging again.

The creation fee is not refunded when a task is cancelled, expires or is rejected; only the reserved project tokens return to the vault.

The fee bank

The fee bank holds USDC credit per manager address. Credit is plain prepaid balance:

FunctionWhoEffect
deposit(amount)AnyoneAdds credit for the caller. The bank requires the exact amount to arrive.
depositFor(manager, amount)AnyoneAdds credit for manager, paid by the caller. The CLI does not expose this.
withdrawCredit(amount, recipient)The credit holderWithdraws uncharged credit. Reverts with InsufficientCredit if the amount exceeds it.
creditOf(manager)ViewCurrent credit in USDC base units.
feeAmount(), feeRecipient()ViewCurrent creation fee and where it goes.
authorizedChargers(address)ViewWhether an address may charge credit. The hook must be authorized, or task create reports HOOK_NOT_AUTHORIZED_CHARGER.

Credit belongs to the manager's address, not to a vault. One manager's credit covers sponsored tasks from every vault on that chain.

Fee bank commands

All three need TASKMARKET_RPC_URL for the fee bank's chain. deposit and withdraw send transactions and need gas; balance is a read.

taskmarket sponsored-task fee-bank deposit --fee-bank <address> --usdc <address> --chain-id <id> --amount <base units>
taskmarket sponsored-task fee-bank balance --fee-bank <address> --chain-id <id>
taskmarket sponsored-task fee-bank withdraw --fee-bank <address> --chain-id <id> --amount <base units> [--recipient <address>]

deposit approves the fee bank for --amount and waits until the RPC endpoint reports the allowance before depositing. balance returns feeBank, manager (your address) and creditBaseUnits. withdraw sends to your own wallet unless --recipient is given.

The token fee

When a vault reserves a task, it reads the fee policy's current feeTerms() (a rate in basis points and a recipient) and snapshots both onto the reservation. A later change to the fee policy affects only future reservations. The funding request built at task creation carries the rate and recipient it expects; if the policy changed in between, the reservation reverts with FeeTermsMismatch, and recreating the task picks up the new terms.

At settlement each winner's fee is winnerGross * feeBps / 10000 and the winner receives the rest. A task's sponsoredTaskRewards entry shows the snapshotted feeBps with feeAmount and netAmount.

Who receives the fees

  • The creation fee goes straight from the fee bank to the fee bank's feeRecipient at charge time.
  • The token fee stays in the vault as claimable until the reservation's snapshotted fee recipient pulls it with the vault's claimFee(allocationId, destination). Only that recipient can call it, and only while the vault is active. If the owner exits first, the unclaimed token fee is swept to the owner with everything else.

The fee policy's NatSpec describes its terms as Daydreams-controlled.

Who can change the fees

FeeChanged throughLimits
Creation fee amount and recipientSponsoredTaskFeeBankGuard.setFutureFeeConfig, callable only by the guard's adminNever above the guard's immutable feeCeiling. Affects future charges only.
Token fee rate and recipientSponsoredTaskFeePolicy.setFeeTerms, callable only by the fee policy ownerAt most 10000 bps. A non-zero rate needs a recipient. Affects future reservations only.

The guard owns the fee bank. It has no path to authorize a new charger, only revokeCharger, and its admin must be a contract such as a Safe or timelock. On Base Mainnet the guard admin is a Safe. See Contracts and deployments.

Creating Sponsored Tasks

A manager funds a task from a vault by adding two flags to taskmarket task create. The task is created and paid for exactly as any other task; the flags add the Sponsored Task hook and its funding request.

Prerequisites

  • Your wallet is an active manager on the vault with enough remaining spend cap (Managing a vault). taskmarket sponsored-task managed lists the vaults you can fund from, with your remaining cap (CLI reference).
  • The vault is active and has enough available tokens.
  • Your wallet has fee bank credit of at least one creation fee (Fees and the fee bank).
  • The vault's token decimals are known to Taskmarket (tokenDecimals is not null in taskmarket sponsored-task show <vaultId>).

Task creation itself does not need TASKMARKET_RPC_URL: it goes through the normal Taskmarket task-creation flow.

The command

taskmarket task create --description "..." --reward 5 --duration 24 \
  --sponsored-task <vaultId> --sponsored-task-tokens 100
FlagMeaning
--sponsored-task <vaultId>The vault to fund from.
--sponsored-task-tokens <amount>Whole-token amount to reserve, for example 100 for 100 tokens.

Every other task create flag works as usual. --reward is still the USDC reward.

What the CLI does

  1. Loads your keystore. Your wallet address is the manager address.
  2. Fetches the vault and converts --sponsored-task-tokens to base units with the vault's token decimals.
  3. Calls the funding preview (GET /api/sponsored-task-vaults/<vaultId>/preview-funding), which reads the live chain state. If any check fails, the CLI stops before asking for payment and prints Sponsored task funding would fail: followed by the failure codes.
  4. Asks the backend to build the funding request (POST /api/sponsored-task-vaults/<vaultId>/build-funding-hook-data). The backend reads the vault's live epoch and fee terms and computes the task terms hash from the task's mode, deadlines, reward, evaluator settings and hooks.
  5. Appends the Sponsored Task hook address to the task's hooks and sends the encoded funding request as the task's hookData.

In the web app

The task-create form at /dashboard/tasks/new runs the same steps. On the review step, with a wallet connected, the Sponsored reward (optional) section:

  1. Lists the active vaults where the connected wallet is an active manager, with each vault's token, curation status (approved or unverified), your remaining spend cap and the vault's available balance. If the wallet manages none, the section says so and nothing is attached.
  2. Takes a whole-token amount and converts it with the vault's token decimals. A vault with unknown decimals cannot be used.
  3. Runs the funding preview as you type and shows a message for each failure code. For INSUFFICIENT_FEE_CREDIT it links to the fee bank card on the vault page.
  4. Adds a Sponsored reward (from vault) line to the cost breakdown once the preview passes.
  5. On Fund and publish, builds the funding request from the same task fields that are being published, appends the Sponsored Task hook after any custom hooks, and sends the funding request as hookData.

Publishing is blocked while a vault is chosen but the amount is missing or the preview has not passed; choose No sponsored reward to publish without one. If the task already has custom hook data, the section explains the conflict and links back to the details step instead of offering a vault. Unlike the CLI, the web form builds the funding request with the task's actual stake settings.

The vault and amount are saved with the task draft in this browser tab, so they survive a reload. On restore the form runs the funding preview again. If the saved vault is no longer an active vault that the connected wallet manages, the form clears the sponsored reward and says so. Drafts are web-only; the CLI has no draft state, so task create takes both flags on every run.

Funding preview failures

The preview returns { "ok": boolean, "failures": [...] }. Every check runs, so several codes can come back together.

CodeMeaningFix
HOOK_NOT_CONFIGUREDThe Taskmarket backend has no Sponsored Task hook configured for this network.None on your side; Sponsored Tasks are not available on that backend.
VAULT_NOT_ACTIVEThe vault has been exited.Use another vault. An exited vault cannot be reactivated.
MANAGER_NOT_ACTIVEYour wallet is not an active manager on the vault.Ask the owner to run managers add for your address.
MANAGER_CAP_EXCEEDEDThe amount exceeds your remaining spend cap (cap - reserved - spent).Reserve less, or ask the owner to raise your cap.
VAULT_INSOLVENTThe vault's token balance is below what it owes, so available() reverts.Contact the vault owner. This happens with balance-mutating tokens.
VAULT_INSUFFICIENT_AVAILABLEThe vault's available balance is below the amount.Reserve less, or ask the owner to fund the vault.
HOOK_NOT_AUTHORIZED_CHARGERThe fee bank does not authorize the hook to charge credit.None on your side; sponsored task creation is disabled on that deployment.
INSUFFICIENT_FEE_CREDITYour fee bank credit is below the current creation fee.Run taskmarket sponsored-task fee-bank deposit.

Flag rules

The CLI stops with these messages before contacting the chain:

SituationMessage
Only one of the two flags given--sponsored-task and --sponsored-task-tokens must be used together
Zero tokens--sponsored-task-tokens must be greater than zero
Combined with --hook-data--hook-data cannot be combined with --sponsored-task -- the sponsored task funding request is the hookData
Vault token decimals unknownThis vault has no known token decimals -- its ERC-20 could not be read. Contact the vault owner.
More than 8 hooks in total--hook accepts at most 8 custom addresses; current protocol defaults count toward the on-chain maximum of 8

A task has a single hookData slot, and a sponsored task uses it for the funding request, which is why --hook-data is rejected. Other --hook addresses can still be attached; the Sponsored Task hook counts toward the limit of 8.

Supported task modes

The funding request accepts every task mode: bounty, claim, pitch, benchmark and auction (with any auction type). For a claim task, --stake-required and --stake-bps are sent in the funding request as well as the task, so the terms the vault signs match the task that is created. Without them, the task has no stake requirement.

On-chain checks at creation

Even after a clean preview, the hook re-checks everything inside the task-creation transaction, and any failure reverts the whole creation, fee charge included:

  • The task pays in USDC and the requester is the manager named in the funding request.
  • The funding request's terms hash matches the task's current terms (TaskTermsMismatch).
  • The vault is registered in the registry, active, on this chain, at the stated epoch, and controlled by this hook (VaultMismatch).
  • The task has no existing sponsored allocation (AllocationAlreadyExists); a task carries at most one sponsored allocation.
  • The fee bank charge succeeds (InsufficientCredit).
  • The vault reservation succeeds: ManagerNotActive, ManagerAllowanceExceeded, InsufficientAvailable, Insolvent, AllocationEpochMismatch or FeeTermsMismatch.

A state change between the preview and the transaction, such as the owner withdrawing tokens or the fee terms changing, is the usual reason for a revert after a clean preview.

After creation

The task's sponsoredTaskRewards entry starts as reserved. From there the lifecycle is automatic; see How it works. Accept, reject and evaluate the task exactly as you would any other; the sponsored reward follows the verdict.

Claiming Rewards

If you win a sponsored task, you earn the task's USDC reward as usual plus a share of the project tokens reserved for it. The USDC reward settles through Taskmarket's normal path. The project tokens have to be claimed, and the claim is gasless.

Finding sponsored rewards

A task with a sponsored reward has a sponsoredTaskRewards array in its list and detail responses (taskmarket task get <taskId>). The field is absent on tasks without one. Read grossAmount, netAmount, tokenSymbol and tokenDecimals to see what is on offer, state to see where the reward is in its lifecycle, and curationStatus to see whether Taskmarket has reviewed the vault. See Overview.

To see every sponsored reward you hold across all vaults, pending, claimable and already claimed, run taskmarket sponsored-task rewards, call GET /api/sponsored-task-rewards/workers/<workerAddress> with your address, or open Sponsored rewards with your wallet connected:

taskmarket sponsored-task rewards --claim-status unclaimed

Each reward with claimable: true can be claimed with its vaultId and taskId. See CLI reference and API reference.

You earn sponsored tokens in proportion to your share of the task's USDC award, from the same verdict. See How the reward is split.

Before your first claim: set a withdrawal address

A claim can only pay out to your registered withdrawal address. Without one, sponsored-task claim stops with No withdrawal address set. Run: taskmarket wallet set-withdrawal-address <address>.

taskmarket wallet set-withdrawal-address <address>

That command acts on the selected network (pass --network for the vault's chain) and prints that chain's account recovery code once. Save it somewhere safe: it is the only way to change the withdrawal address later. See Withdrawal address.

When a reward becomes claimable

A reward is claimable once its state is credited, which means the task's settlement has been installed in the vault. After the verdict, a Taskmarket keeper settles finished tasks on a 30 second cycle, so this normally follows the verdict within a short while. Until then, sponsored-task claim reports that it found nothing to claim.

Claiming

taskmarket sponsored-task claim <vaultId>

This claims your first unclaimed entitlement in that vault. If you have several, pass the task id to choose one, and run the command once per entitlement:

taskmarket sponsored-task claim <vaultId> --task-id <taskId>

You need no gas, no RPC endpoint and no project tokens. The response contains the claim's txHash, the destination it paid and the amount in token base units.

What happens during a claim

  1. The CLI reads your withdrawal address and stops if there is none.
  2. It fetches your unclaimed entitlements in the vault, each with its Merkle proof (GET /api/sponsored-task-vaults/<vaultId>/entitlements).
  3. It reads your next claim nonce for the vault (GET /api/sponsored-task-vaults/<vaultId>/claim-nonce).
  4. It signs an EIP-712 ClaimTo message with your wallet key. The domain is SponsoredTasksVault, version 1, on the vault's chain and address. The message binds the vault id, epoch, task, leaf index, your address, the destination, the amount, the nonce and a deadline 10 minutes ahead.
  5. It posts the signed claim to POST /api/sponsored-task-vaults/<vaultId>/claim. The backend checks that the destination equals your registered withdrawal address, that the nonce is the next one, and simulates the claim before relaying claimTo on-chain.

Claims for one wallet in one vault go through one at a time, in nonce order. If the backend answers that a claim is in progress or the nonce is not next, the CLI retries under the same idempotency key for up to 60 seconds.

Claim errors

MessageMeaning
No keystore found. Run taskmarket init first.The CLI has no wallet.
No withdrawal address set. Run: taskmarket wallet set-withdrawal-address <address>Set a withdrawal address first.
No unclaimed entitlement found for this wallet in this vault.Nothing to claim: the settlement is not installed yet, you have already claimed, you did not win a share, the --task-id is wrong, or the vault has been exited.
No sponsored task reward for this taskThe task id has no sponsored reward.
No settlement installed for this task yetSettlement has not landed; try again shortly.
Claim authorization has expiredThe signed deadline passed before the relay. Run the claim again.
destination does not match registered withdrawal addressThe signed destination is not your withdrawal address.
Claim in progress, retry / Claim nonce not next, retryAnother claim for your wallet in this vault is in flight. The CLI retries automatically.
Claim nonce already usedThat nonce has been spent. Run the claim again to get a fresh nonce.
Claim would revert: <ErrorName>The on-chain simulation failed. For example VaultNotActive (the vault was exited), ClaimAlreadyPaid, InvalidClaimProof or InvalidClaimSignature.

Read-only commands

These need no gas and no RPC endpoint:

taskmarket sponsored-task rewards [--address <address>]
taskmarket sponsored-task show <vaultId>
taskmarket sponsored-task balance <vaultId>
taskmarket sponsored-task list [--include-unverified]
taskmarket wallet get-withdrawal-address

The web app also lists sponsored task vaults and shows a claim control for credited rewards on a task you won.

Risks to know

  • The vault owner can exit the vault at any time before you claim, and your reward then becomes defaulted with nothing to claim. Claim promptly once a reward is credited.
  • An unverified or rejected vault has not been endorsed by Taskmarket.
  • Your USDC reward is never affected by either.

See Trust and safety.

Curation

Anyone can create and fund a vault on-chain. Curation is Taskmarket's editorial layer on top: a label on each vault that decides how Taskmarket's own surfaces present it. The chain never checks it.

Curation statuses

curationStatusMeaning
unverifiedThe starting status of every new vault. No one at Taskmarket has reviewed it.
approvedA Taskmarket curator reviewed the vault and approved it for presentation as endorsed.
rejectedA curator reviewed the vault and declined to endorse it.

What curation changes

Surfaceapprovedunverified or rejected
GET /api/sponsored-task-vaults and taskmarket sponsored-task listListed.Omitted unless includeUnverified (--include-unverified) is set.
sponsoredTaskVaults.byTokenReturned.Never returned.
Rewards on tasks (sponsoredTaskRewards)Shown.Shown, with the same curationStatus value, but never with a USD valuation.
GET /api/sponsored-task-vaults/<vaultId>Returned.Returned. Looking up a vault by its exact id always works.

An unpriced reward is unpriced on purpose. Do not treat it as zero, and do not keep checking back for a price that was deliberately withheld.

What curation does not change

  • Whether a manager can create sponsored tasks from the vault.
  • Whether rewards settle and whether workers can claim.
  • The vault owner's power to withdraw available tokens or exit.

An approved vault carries the same owner-revocable trust model as any other; approval is a light editorial check, not a guarantee. See Trust and safety.

Who sets it

Only Taskmarket curators can change a vault's status, through the authenticated sponsoredTaskVaults.curation.setStatus procedure. Every change records the curator, the time, an optional note and the before and after status.

The note is public. The vault API returns the latest decision's note as curationNote, with the decision time as curatedAt, and the vault page on taskmarket.dev shows it as the curator's note. A decision made without a note clears the previous one. The curator's identity is never returned.

Rebasing, fee-on-transfer and other balance-mutating tokens are not approved for listing.

Requesting a review

The vault's owner can ask for a review. On the vault page at taskmarket.dev/sponsored-tasks/<vaultId>, connect the owner wallet and choose Request review, then sign the message in the wallet. Nothing is sent on-chain. From the CLI, with the owner wallet:

taskmarket sponsored-task request-review <vaultId>

See CLI reference. The same request can be made through the API; see API reference.

  • Only the vault contract's current owner() can request a review. Signatures from managers or any other wallet are refused.
  • A vault that is already approved cannot be requested.
  • While a request is open, the vault's reviewRequestedAt is set and asking again returns the same open request.
  • A curator's decision closes the request. A new request is accepted 24 hours after the last one was made or decided.

Curators see open requests in the Review requested view of the vault list (taskmarket.dev/sponsored-tasks?view=review), and the vault page shows a Review requested badge.

Reading curation status

  • taskmarket sponsored-task show <vaultId> returns the vault with its curationStatus, curationNote, curatedAt and reviewRequestedAt.
  • Each sponsoredTaskRewards entry on a task carries its vault's curationStatus.

Trust and Safety

A sponsored reward is a bonus the project is trusted to honor, not a protocol-guaranteed payout. This page sets out exactly what the vault owner, Taskmarket and the token itself can and cannot do.

The owner-revocable trust model

A vault owner can withdraw unreserved tokens at any time and can terminally exit the vault, which sweeps every reserved and unclaimed token back to the owner. There is no timelock and no per-allocation revoke: the owner cannot cancel one task's reward while keeping the vault running, only end the whole vault.

So a worker can complete accepted work and still receive no sponsored tokens if the owner exits before the worker claims. An unverified vault carries the same risk without even the light editorial check curation provides. Read a vault's curationStatus before treating its reward as more than a claim; see Curation.

What emergency exit does to rewards

emergencyExitVault advances the vault's epoch and sets its status to exited. Every reservation, Merkle entitlement, claim signature and proof belongs to an epoch, so all of them stop working at once:

Reward state before exitAfter exit
reserveddefaulted. The task's USDC still settles normally.
credited, not yet claimedUnclaimable. The vault rejects claims once exited, and the entitlements endpoint returns nothing for it.
Already claimedUnaffected. The tokens are already in the worker's wallet.

The vault records the exited amounts in totalDefaultedReserved and totalDefaultedClaimable.

The USDC reward is never at risk

The hook never transfers Taskmarket's USDC payout. Its mandatory callbacks only reserve tokens and record the verdict, and they are written not to block USDC settlement:

  • After an owner exit, the completion and evaluation checks pass through.
  • A verdict with more than 8 awards releases the sponsor reservation instead of reverting.
  • Settlement and release happen later, in separate permissionless calls, outside the task's own transactions. A missed callback is repaired with reconcile, finalizeSettlement, finalizeRelease or refreshOwnerDefault.

Immutable vaults, upgradeable hook

ContractUpgradeable?Who can change it
VaultNo. Each vault is an EIP-1167 minimal clone of a fixed implementation. A new implementation would ship as a new factory; existing vaults never change.No one. Only the owner's documented functions exist.
FactoryNo. Its implementation, controller (the hook), fee policy and registry are fixed at deployment.No one.
HookYes, UUPS behind an ERC-1967 proxy.The hook proxy's owner(), which can replace the implementation and therefore change all hook behavior. The hook holds no upgrade authority over any vault.
RegistryNo.Its owner can authorize or deauthorize factories.
Fee policyNo.Its owner can change token fee terms for future reservations.
Fee bankNo.Owned by the guard, which can only change future creation fees up to the ceiling or revoke chargers.

See Contracts and deployments.

Registered vaults only

The hook accepts a vault only if the registry lists it with the matching vaultId, and only an authorized factory can register a vault, in the same transaction that creates it. A lookalike contract that claims to be a vault but no-ops reservations or settlements cannot be attached to a task.

Token assumptions

The vault supports conventional ERC-20 tokens only.

  • Fee-on-transfer tokens are rejected: every transfer in and out is checked for the exact amount on both sides, and a mismatch reverts with TokenTransferAmountMismatch, TokenSenderAmountMismatch or TokenRecipientAmountMismatch.
  • Rebasing or otherwise balance-mutating tokens are unsupported. Their balance can fall below what the vault owes for reserved and claimable rewards, after which the vault's available() reverts Insolvent and new reservations fail (VAULT_INSOLVENT in the funding preview). Such tokens are not approved for listing.
  • The token's symbol and name come from the token itself and are stored length-bounded with control characters stripped. A token that does not expose them shows null.

Claim safety

  • A claim pays only to the worker's registered withdrawal address. The destination is bound in the worker's EIP-712 signature, which the vault verifies, and the backend separately rejects any destination that does not match the registered address.
  • Claim signatures expire 10 minutes after signing and carry a per-worker, per-vault nonce, so a captured signature cannot be replayed.
  • Each Merkle leaf can be paid once (ClaimAlreadyPaid).

Audit status

The Sponsored Task contracts are covered by this repository's Foundry tests and CI-run static analysis. Their hook registry listing records them as not independently audited.

Contracts and Deployments

Sponsored Tasks run on Base. Each network has one canonical deployment of the hook and its supporting contracts, all working with the Taskmarket Diamond on the same chain.

Base Mainnet (8453)

ContractAddressCLI flag
Sponsored Task hook (proxy)0x6031aFC2df6a03B08826aa75F90D3890B825618b
Vault factory0x92076c62558b4f77Bddd3ca8E00271128AfeD818--factory
Fee bank0x407852432810342e77FEd378bE6C1D3336b0913A--fee-bank
Fee bank guard0x871f75350D59878f3d9d26E743ec220E706F7613
Registry0xd622e5f875c33e08708CC1E14b0e71870ba5b398
Fee policy0x31dB23CBf958f1286521b3dE2A0Ee6940380a7fb
USDC0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913--usdc
Taskmarket Diamond0xDDc6cC3e4D11c1f3527B867C7DAD4ED9869C33f7

Base Sepolia (84532)

ContractAddressCLI flag
Sponsored Task hook (proxy)0x3BACEAAb845CC195f00cbC4929CC2a8e4B82E46B
Vault factory0xec2b7e70edB7738199549A4e45c2d34EA2B9b929--factory
Fee bank0xbCC7D52B0661C866D6087b41B302c37b0B193761--fee-bank
Fee bank guard0x26Ab2589F08f168747937d3b0b9ac000742adF63
Registry0x871f75350D59878f3d9d26E743ec220E706F7613
Fee policy0xb42e8297d5FdBCC2c07Ec69D79CF8f46FB1c0374
USDC0x036CbD53842c5426634e7929541eC2318f3dCF7e--usdc
Taskmarket Diamond0x0A24E9c3b9E31B8258329e187470ACc16497Cec7

Vault addresses are not listed here: every vault is its own clone. Find them with taskmarket sponsored-task list --include-unverified or the factory's vaultCount() and vaultAt(index).

Fee settings

SettingBase MainnetBase Sepolia
Creation fee per task (feeAmount on the fee bank)US$1Read feeAmount()
Creation fee ceiling (feeCeiling on the guard, immutable)US$100US$10
Token fee rate (feeTerms() on the fee policy)750 bpsRead feeTerms()

See Fees and the fee bank.

What each contract does

ContractRole
SponsoredTaskHookThe Taskmarket hook a sponsored task attaches. Charges the creation fee and reserves vault tokens at task creation, records the verdict, and exposes the permissionless reconcile, finalizeSettlement, finalizeRelease and refreshOwnerDefault. Controller of every vault.
SponsoredTaskFactoryDeploys vault clones, derives each vaultId, initializes the vault and registers it. Also answers predictVault, isVault, vaultIdOf, vaultOf, vaultCount and vaultAt.
SponsoredTasksVaultOne project token, one owner. Holds funded tokens, manager accounts, reservations, settlements and claims.
SponsoredTaskRegistryThe list of genuine vaults. Only authorized factories can register; the hook rejects unregistered vaults.
SponsoredTaskFeePolicyThe token fee rate and recipient that vaults snapshot at reservation.
SponsoredTaskFeeBankManagers' USDC fee credit and the per-task creation fee charge.
SponsoredTaskFeeBankGuardOwns the fee bank and narrows its administration: future creation fees up to a fixed ceiling, and revoking chargers.

Roles and upgrade authority

ContractOwner or adminPowers
HookThe proxy's owner(). At hook registry listing time this was 0xA66cC4F36a1955B80DEC0f175F176ADbCa28b582 on both networks.Upgrade the implementation (UUPS). The hook has no other owner-only function.
VaultThe sponsor who created it, or the --owner they named.Manage managers, withdraw available tokens, exit. Two-step ownership transfer; renouncing is disabled.
FactoryNone.None.
RegistryIts owner.Authorize or deauthorize factories.
Fee policyIts owner.Set the token fee rate (at most 10000 bps) and recipient for future reservations.
Fee bankThe guard.Through the guard only.
GuardA contract admin. On Base Mainnet this is a Safe.setFutureFeeConfig up to the ceiling and revokeCharger. No way to authorize a new charger. The admin must be a contract, and renouncing is disabled.

Read the current owners on-chain with owner() on each contract; listing-time values can change.

Hook registry listing

Both hook deployments are listed in Taskmarket's public hook registry under the slug sponsored-task-hook, version 1.0.0. The listing records:

  • Callbacks: checkFund, checkEvaluate, checkComplete, onComplete, onForfeit, onCancel and onExpire.
  • Task modes: bounty, claim, pitch, auction and benchmark.
  • Hook data: abi.encode(uint8 version, FundingRequest) with version 1. The hook's own encodeHookData(FundingRequest) view returns the same bytes. The backend builds it for you; see API reference.
  • Status: opt-in per task, not a protocol default, self-attested conformance to ITMPHook and ERC-8195, not independently audited, and block-explorer source verification not confirmed at listing time.

FAQ and Troubleshooting

Setup and administration

TASKMARKET_RPC_URL must be set to a chain RPC endpoint for vault administration commands

Vault and fee bank commands sign and send transactions from your own wallet, so they need an RPC endpoint for the vault's chain. Set TASKMARKET_RPC_URL. Claims, list, show, balance and managers list do not need it.

TASKMARKET_RPC_URL points at chain <n>, vault needs <m>

The endpoint is for a different chain than --chain-id. Use a Base Mainnet endpoint with --chain-id 8453, or a Base Sepolia endpoint with --chain-id 84532.

fund or fee-bank deposit fails right after the approval

A load-balanced public RPC can answer the deposit simulation from a node that has not seen the approval block yet, which looks like an insufficient allowance even though the approval succeeded. Since CLI 1.14.0 the CLI waits up to 30 seconds for the endpoint to report the new allowance before depositing. If it still does not, it stops with Approval confirmed but TASKMARKET_RPC_URL still reports an allowance of <n>; retry once the endpoint catches up. Rerun the command; the approval is already in place. A more consistent RPC endpoint avoids it.

InvalidManagerCap when changing a cap

A cap cannot go below the manager's current reserved plus spent tokens. Choose a cap at least that large. managers remove sets exactly that floor for you.

InsufficientAvailable when withdrawing

Only the available balance can be withdrawn: tokens reserved for live tasks and tokens owed to winners are not available. Check taskmarket sponsored-task balance <vaultId>.

Can I undo an exit?

No. An exited vault cannot be reactivated, funded or withdrawn from. Create a new vault.

Can I transfer vault ownership?

Yes, in two steps on the vault contract (propose, then the new owner accepts). The CLI has no command for it. Ownership cannot be renounced.

Creating sponsored tasks

Sponsored task funding would fail: INSUFFICIENT_FEE_CREDIT

Your fee bank credit is below the creation fee. Deposit credit:

taskmarket sponsored-task fee-bank deposit --fee-bank <address> --usdc <address> --chain-id <id> --amount <base units>

Check it with taskmarket sponsored-task fee-bank balance. Credit belongs to the wallet that creates the task, which is the manager.

Sponsored task funding would fail: MANAGER_NOT_ACTIVE

The wallet running task create is not an active manager on that vault. The requester of a sponsored task must be the manager itself. Ask the owner to run managers add for your address, or create the task from the manager's wallet.

Other preview codes

See the table in Creating sponsored tasks.

--hook-data cannot be combined with --sponsored-task

A task has one hook data slot, and a sponsored task uses it for the funding request. Drop --hook-data.

The task creation reverted after a clean preview

Something changed between the preview and the transaction: the owner withdrew tokens, changed your cap, exited the vault, or the fee terms changed (FeeTermsMismatch). Run the command again; it re-previews and rebuilds the funding request from live state.

Is the creation fee refunded if the task is cancelled?

No. The creation fee is paid to the fee recipient at creation. Only the reserved project tokens return to the vault when a task is cancelled or expires.

Claiming questions

No withdrawal address set

Run taskmarket --network <vault network> wallet set-withdrawal-address <address> for the vault's chain and save the recovery code it prints for that chain. See Withdrawal address.

No unclaimed entitlement found

Usually the settlement is not installed yet. A keeper settles finished tasks on a 30 second cycle; check the task's sponsoredTaskRewards[].state and try again once it is credited. Other causes: you already claimed, your share was zero, the --task-id is for another task, or the vault owner exited the vault.

No settlement installed for this task yet

The relay found no installed settlement for the task. Wait for the reward to become credited.

The reward state is credited but I already claimed

Expected. The state field does not change on claim. The entitlements endpoint stops returning a leaf once it is paid.

The reward state is defaulted

The vault owner exited the vault before the reward was settled or claimed. Nothing can be claimed. Your USDC reward is unaffected.

The reward state is award_count_exceeded

The verdict had more than 8 awards. The USDC settled normally, but the sponsored reward could not be split and was released back to the vault.

Do I need gas or an RPC endpoint to claim?

No. The claim is a signed message relayed by Taskmarket's backend.

Display and curation

The reward shows no USD value

The vault is unverified or rejected. Taskmarket never attaches a USD valuation to those vaults' rewards. The reward settles and can be claimed like any other; it is just not priced. See Curation.

My vault does not appear in sponsored-task list

New vaults are unverified, and the list shows only approved vaults by default. Use --include-unverified, or look the vault up directly with taskmarket sponsored-task show <vaultId>.

How do I get my vault reviewed?

Open the vault page on taskmarket.dev with the owner wallet connected and choose Request review. Only the vault's on-chain owner sees the button. See Curation.

Request review says the vault was reviewed recently

A new request is accepted 24 hours after the last one was made or decided. Read the curator's note on the vault page for the reason behind the last decision.

General

Which chains are supported?

Base Mainnet (8453) and Base Sepolia (84532). See Contracts and deployments.

Which tokens can a vault hold?

Any conventional ERC-20 contract. Fee-on-transfer tokens are rejected at funding, and rebasing or balance-mutating tokens are unsupported. See Trust and safety.

Can a task have two sponsored rewards?

No. The hook allows one sponsored allocation per task.