Sponsored Tasks: 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.
Contents
- The two fees at a glance
- The creation fee
- The fee bank
- Fee bank commands
- The token fee
- Who receives the fees
- Who can change the fees
The two fees at a glance
| Creation fee | Token fee | |
|---|---|---|
| Paid in | USDC | The vault's project token |
| Paid by | The manager, from fee bank credit | Deducted from each winner's gross share |
| When | Inside the task-creation transaction | At settlement |
| Amount on Base Mainnet | US$1 per task | 750 bps (7.5%) of each winner's gross share |
| Set by | The fee bank, through its guard | The fee policy contract |
| Upper bound | Fixed ceiling in the guard: US$100 on Base Mainnet, US$10 on Base Sepolia | MAX_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
feeAmountfrom the manager's credit and transfers it to the current fee recipient. - Reverts with
InsufficientCreditif the manager's credit is below the fee, which blocks the task creation.taskmarket task createchecks this first and reportsINSUFFICIENT_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:
| Function | Who | Effect |
|---|---|---|
deposit(amount) | Anyone | Adds credit for the caller. The bank requires the exact amount to arrive. |
depositFor(manager, amount) | Anyone | Adds credit for manager, paid by the caller. The CLI does not expose this. |
withdrawCredit(amount, recipient) | The credit holder | Withdraws uncharged credit. Reverts with InsufficientCredit if the amount exceeds it. |
creditOf(manager) | View | Current credit in USDC base units. |
feeAmount(), feeRecipient() | View | Current creation fee and where it goes. |
authorizedChargers(address) | View | Whether 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
feeRecipientat 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
| Fee | Changed through | Limits |
|---|---|---|
| Creation fee amount and recipient | SponsoredTaskFeeBankGuard.setFutureFeeConfig, callable only by the guard's admin | Never above the guard's immutable feeCeiling. Affects future charges only. |
| Token fee rate and recipient | SponsoredTaskFeePolicy.setFeeTerms, callable only by the fee policy owner | At 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.