Platform contracts API
Registry, factories, splitter, guardian, distributor — the curator platform's contract surface.
The curator platform is live on mainnet; every address is on the addresses page. This page is the API-level map of what each contract does and what, exactly, is privileged. The through-line: after deployment, the only privileged lever on the whole platform is the Safe raising a supply cap (and the Safe-gated brake on the V2 registries). Everything else is permissionless or immutable.
CuratorRegistry
Licenses. Two burn functions, two hard constants, no admin at all:
| Function | What it does |
|---|---|
burnForLicense() | Burns LICENSE_BURN_V1 (10,000 $WOOD) from the caller; grants a permanent V1 (frozen) license |
burnForLicenseV2() | Burns LICENSE_BURN_V2 (25,000 $WOOD); grants a permanent V2 (agentic) license, which includes V1 |
isLicensed(address) / isLicensedV2(address) | The factories' gate |
Legacy 25,000 $WOOD burns from the original pricing are grandfathered into V2. There is no function to revoke, reprice, or refund a license.
BasketFactory (frozen) and BasketFactory2 (agentic)
Permissionless createBasket(...), gated only by the caller's license.
Both wire every deployment identically:
guardian→ the shared CuratorGuardian (below);feeRecipient→ the factory's immutable FeeSplitter;- starter supply cap ≤ 1,000 tokens (
STARTER_CAP), ceiling 1M (maxSupplyCap, immutable).
BasketFactory2 additionally deploys the basket's BasketDistributor
in the same transaction, wires the oracle layer
(AssetRegistry, MakerRegistry, USDG feed) into the token, and validates
the agent policy against the contract ceilings.
Both factories expose allBaskets() / basketCount() / curatorOf (and
factory2 distributorOf) — the shelf is enumerable on-chain. Neither
factory retains any power over a basket after deployment.
FeeSplitter
The feeRecipient of every factory-created basket. Mint fees arrive as
basket tokens; distribute(basket) is permissionless and pushes
CURATOR_SHARE_BPS = 6000 (60%, a constant) to the curator and the rest
to the protocol treasury. No admin can change the split, the treasury, or
a basket's registered curator.
CuratorGuardian
The guardian of every curated basket. Its complete external surface is
raiseCap(basket, newCap), Safe-gated, upward-only, bounded by the
immutable per-basket ceiling. setMintPaused and setFeeRecipient do not
exist on it — a curated basket's minting can never be paused and its fee
stream can never be redirected, by anyone.
BasketToken2 (agentic baskets)
The frozen BasketToken core (in-kind mint/redeem, full backing, ungated
redemption, fee ≤ 0.50%) plus exactly one new power: the agent's
rebalance, bounded by the policy. New views:
constituents(), units(), nav18(), isFullyBacked(), holder
enumeration for the distributor, and the immutable policy getters
(rebalanceCooldown(), maxTurnoverBps(), maxSlippageBps()). The
curator's only function is setAgent.
BasketDistributor
One per agentic basket, deployed by the factory. Immutable interval
(1–90 days); once per interval anyone may run the paginated
snapshot-and-pay cycle that pushes the USDG pot pro-rata to holders. No
owner; the protocol Safe holds only the payout-side exclusion list (infra
addresses whose share stays in the pot). Mechanics:
USDG payouts.
AssetRegistry / MakerRegistry / PoolMaker / PoolTwapObserver
The V2 oracle and settlement layer, shared by all agentic baskets and Safe-gated as the global brake — covered in Oracles & pricing.