Plume Plume
$PLM

© 2026 Plume. All rights reserved.

Esc

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.