Contract reference
Reference-style, by design — this page trades prose for precision. For the reasoning behind any of it, the rest of this track links back in.
Contracts
PlumeFactory
Deploys new call/put markets for an underlying asset. Permissionless — anyone may call it. Only markets published through Plume's official channels are vetted by Plume.
PlumeCall
One per underlying asset. Handles writing, buying, exercising, closing, and settling call options.
PlumePut
One per underlying asset. Mirrors PlumeCall; collateral and payoffs are in the quote currency instead of the underlying.
PlumeSeriesToken
Minimal ERC-20, lazily clone-deployed per series on first purchase. Mint/burn restricted to its parent market contract.
PlumeFactory
deployMarket(underlying, feed, maxCallCollateral, maxPutCollateral)
Anyone
Deploys a new PlumeCall + PlumePut pair for underlying, priced from feed. Emits MarketDeployed.
markets(uint256)
View
Returns a deployed market's addresses and parameters.
PlumeCall / PlumePut
Shared interface; collateral units differ as noted.
writeAndList(strike, expiry, amount, premiumPerOption)
Writer
Locks collateral (1 underlying token per option for calls; strike value in quote per option for puts) and lists an offer. Reverts CapReached if the collateral cap would be exceeded. Reverts if the underlying has a corporate action scheduled before expiry.
cancelOffer(offerId, amount)
Offer's writer
Un-lists unsold options; returns their collateral.
buy(offerId, amount)
Buyer
Pays premiumPerOption × amount to the writer; mints that many series tokens to the buyer.
exercise(seriesId, amount)
Token holder
Burns amount series tokens; pays the current-price payoff from locked collateral. Reverts if the oracle's latest update is older than the freshness window. Reverts after expiry.
buyToClose(seriesId, amount)
A writer of that series
Burns amount series tokens held by the caller, bounded by their own unassigned outstanding amount; releases the corresponding collateral. Pre-expiry only.
settle(seriesId, roundId)
Anyone
After expiry: verifies roundId is the earliest oracle round with updatedAt >= expiry; records the settlement price. Reverts on an invalid round or a non-positive price.
settleWorthlessFallback(seriesId)
Anyone
After the post-expiry grace period, if settle was never successfully called: resolves the series as worthless. Buyers receive nothing further; writers reclaim full collateral.
redeem(seriesId, amount)
Token holder
After settlement: burns tokens, pays the settled payoff.
reclaim(seriesId)
A writer of that series
After settlement: returns the writer's remaining collateral, net of amounts already paid out via exercise or expiry payout.
Payoff formulas
Call, per option: (S − K) × 1e18 / S [underlying wei] Put, per option: min(strikeInQuote, max(0, strikeInQuote − S)) [quote wei]
S is the settlement or exercise price, K the
strike — both in the feed's native decimals for calls, scaled to quote
decimals for puts. Rounding: every payout calculation
floors; every collateral deduction calculation ceils. Any resulting dust
remains in the contract.
Events
SeriesCreated, Written,
OfferCancelled, Bought, Exercised,
BoughtToClose, Settled,
SettledWorthlessFallback, Redeemed,
Reclaimed, MarketDeployed — each emitted at the
corresponding state change, carrying the series ID, relevant address, and
amount.
Full ABIs for every contract are published alongside the source in the project repository. Deployed, verified addresses for every live market are published through Plume's official channels and verified on the block explorer.