Voting on Compelle uses a chain feature called Conviction. It tracks two numbers, which we call lockup and tenure. This article explains both, why we picked this design over burning, and why a permanent lockup ends up looking exactly like a burn anyway.
Voting needs capital at risk. The question is whether the capital has to be destroyed, or only set aside. Compelle sets it aside. Here is what that means, and why it works.
On May 1, 2026, the Bittensor protocol merged a new feature called Conviction. It lets any wallet lock alpha tokens in support of a hotkey on a chosen subnet. The lock is not a transfer; it is a tag on alpha you already hold. A lock can be pinned in place so it holds indefinitely, or left to wind down on its own; either way, getting the alpha back out is a slow thaw, never an instant withdrawal. Compelle uses this feature as the engine of patron voting on subnet 82.
The chain keeps two numbers about each patron:
That is the whole of the patron state: those two numbers. What differs is the lock's mode. Pinned (the chain's word is perpetual), your lockup stays put until you release it. Left unpinned, your lockup winds down on its own at a steady rate, returning the alpha to you. There is no separate cooldown account to track; the thaw is simply your lockup number declining.
A patron with a big lockup and zero tenure is fresh. A patron with both high is loyal: they have held a real position for months. The two only come apart during a wind-down, and only for a while. Because tenure eases down about three times slower than an unpinned lockup decays (two different chain constants, covered next), a patron who lets most of their position wind down will, for a stretch, show more tenure than current lockup. That is a fading tail, not a stable badge: the tenure is on its way down to meet the smaller lockup, just lagging behind it.
The chain code calls this second number conviction. We do not. The reason is the direction the word points. Conviction is forward-looking: what you believe, what you stand for, what you intend to do next. The number on chain has nothing to do with intent. It records only the past, accumulated through months of doing nothing but holding. Tenure is the right word for that. It is what you have earned by sitting still. We use Compelle's word, tenure, in the article body, and only mention the chain's word when we have to.
// pallets/subtensor/src/staking/lock.rs (for the curious) pub struct LockState { pub locked_mass: AlphaBalance, // "lockup" in this article pub conviction: U64F64, // "tenure" in this article pub last_update: u64, // last block we ran the math }
Tenure climbs toward your lockup at a steady rate set by the chain. The rate is exponential: the gap between tenure and lockup halves every 62 days, or shrinks by a factor of e (about 63%) every 90 days. The chain stores this 90-day constant under the name maturity rate.
Here is what the trajectory looks like for a patron who locks 1,000 alpha at day zero and keeps it pinned, so the lockup holds at 1,000:
| Time | Lockup | Tenure | Tenure / Lockup |
|---|---|---|---|
| Day 0 | 1000 | 0 | 0% |
| Day 30 | 1000 | 283 | 28.3% |
| Day 62 (gap half-life) | 1000 | 500 | 50.0% |
| Day 90 (maturity rate) | 1000 | 632 | 63.2% |
| Day 180 | 1000 | 865 | 86.5% |
| Day 270 | 1000 | 950 | 95.0% |
| Day 414 | 1000 | 990 | 99.0% |
| Day 1000 | 1000 | 999.99 | 99.999% |
After about a year the patron's tenure is essentially the same as their lockup. After three years the difference is too small to register on chain. The two curves never quite meet, but in any practical sense they merge.
An unpinned lockup winds down the same exponential way, but about three times faster than tenure matures: roughly half is released every 21 days, and about 99% within 150 days. So releasing a lock is not instant, but it's not punishing either.
For readers who want the formal version of these laws: see the Formal Statements section near the end. The rest of this article uses words.
When a patron casts a vote on Compelle, the weight of that vote is their lockup, not their tenure. If you have 1,000 alpha locked, your vote counts as 1,000 alpha, whether you locked yesterday or a year ago. Capital that arrives today gets a voice today.
Tenure is shown next to your name on your patron profile. It is a separate signal: how long you have been committed at the level you are committed at. A patron with 1,000 lockup and 950 tenure is observably more loyal than a patron with the same 1,000 lockup and 50 tenure, even though their votes count the same. The two numbers serve two different roles.
Across all the topics you vote on, your votes can sum to at most your lockup. You allocate it. Voting 100% on one topic is fine; voting 30% on three different ones is also fine, as long as the total does not exceed 1.
Locked alpha is not stranded against its coldkey. Transferring staked-and-locked alpha to another coldkey carries the lock (and a proportional slice of the accumulated tenure) along with it, internally via the chain's transfer_lock path rather than any standalone call, leaving the destination as a fresh holder of both. The constraint is one-coldkey-one-hotkey: the destination must lock against the same hotkey as the source, or have no existing lock at all. So a patron can hand a position to a successor, an investor, or another wallet they control without disturbing the subnet's aggregated tenure on the validator hotkey. The protocol has chosen mobility over fungibility-of-tenure: a patron's tenure can move with their alpha, but it cannot be detached from it.
Burning works. It is the cleanest way to make capital cost a vote. But it has three real costs:
Lockup fixes all three. You can release at any time: leave a lock unpinned and it winds down to you on its own, or un-pin a perpetual lock to start the same thaw. You keep beneficial ownership of the alpha and continue earning staking dividends on it (locking is a tag on existing stake, not a transfer; the same alpha can be staked and locked at the same time). And the chain runs a free tenure clock for you, which observers can read.
"A lockup is reversible only in name when it is never reversed. The patron pays no information-theoretic price for keeping an option they never use."
The most useful objection to lockup-based voting is: "Isn't a permanent lockup just a burn with extra steps?" Almost. That is the point.
If you pin a lock perpetual and never release it, three things hold for as long as you keep it pinned:
The only thing burning has that a perpetual lockup does not is the absence of a release option. A pinned lock holds until you un-pin it; that option is worth exactly zero if you never use it. If you do use it, you pay a cost (the thaw, about 30 days for half your alpha to come back, 150 days for almost all of it). The option is worth something only if your circumstances change and you actually need the alpha back.
So permanent lockup is burning, plus a free option to change your mind. The option is worth nothing if you never use it. If you do use it, you paid a real cost to get out. Either way, you cannot be worse off than if you had burned. There is no scenario in which a patron prefers burning over a permanent lockup of the same size, because lockup is burning's strict generalization.
"Permanent lockup is burning plus a free option to change your mind. The option is worth nothing if you never use it. So you cannot be worse off than if you had burned."
This is the mechanism's central design property: it gives you the credibility of burn when you want it, and the flexibility of a hold when you need it, from the same primitive. You do not have to choose at the moment of locking which kind of patron you are; the chain figures it out from your behavior.
Voting is one use of lockup. Paying for things is another. Compelle plans to price several services (sponsoring a tournament, naming a debate room, commissioning a private contest) in alpha. The natural ways to pay are: burn, transfer, or lock.
Burning is the simplest. The patron destroys some alpha, the chain notes it, the service is delivered. Done. But burning is also the most expensive, because the patron loses the alpha forever and the seller does not directly receive it.
The asymptotic-burn property from the previous section opens up a continuum. If burning a fixed amount is the same as locking that amount forever, then locking a larger amount for a shorter period sits somewhere in between. The cost of a lockup is the value the patron loses by not being able to spend the alpha during the lockup window. Long-and-small or short-and-large can come out to the same cost, and a thousand intermediate combinations sit between them.
An example. Suppose a patron discounts locked alpha at roughly 10% per year: that is, they reckon they could earn about that much putting it to work elsewhere. (The exact rate is the patron's own; it moves the numbers but not the shape of the argument.) The economic cost of locking 100 alpha for various durations works out to:
| How you pay | Lockup | Duration | Cost to patron |
|---|---|---|---|
| Burn | n/a | permanent | 100 alpha (gone forever) |
| Pin perpetual, never release | 100 | permanent | ~100 alpha (same as burn) |
| Lock for 1 year | 1,050 | 365 days | ~100 alpha (foregone return) |
| Lock for 90 days | 4,100 | 90 days | ~100 alpha |
| Lock for 30 days | 12,200 | 30 days | ~100 alpha |
All five rows cost the patron about the same in present-value terms, given a 10% discount rate. They differ in how much alpha the patron has to set aside at any given moment (the lockup column) and for how long (the duration column). A patron with a lot of free alpha and a short horizon can pay quickly with a big lockup. A patron with a long horizon can pay slowly with a small one.
Burning is the corner of this table where duration is infinite. The patron commits the smallest possible amount but loses it forever. Every other row offers the patron a way to pay the same economic cost while keeping their alpha eventually.
From the seller's side (Compelle, in this case), the two payment styles produce different effects. A burn destroys alpha and produces a small deflationary tailwind that benefits everyone holding alpha. A lockup parks alpha against a particular hotkey, where it accumulates tenure and helps defend that hotkey's standing on the subnet. Compelle's validator hotkey is the one being locked against, so every patron lockup directly reinforces Compelle's right to operate the subnet. The alpha eventually returns to the patron, but in the meantime the tenure is real.
For Compelle, accepting either payment is fine, but lockup is preferred. Lockup pays for the service and defends the network at the same time. Burn only pays. Patrons get the service either way, and they choose the form that fits their balance sheet.
The Conviction primitive is therefore an unusually flexible payment rail. The seller publishes a price once, in burn-equivalent terms, and the patron picks the duration that suits them. Long-horizon patrons lock small and long; short-horizon patrons lock big and short; the cost is the same and the seller is happy with either.
One useful side effect of pricing in lockup terms: the price of an activity does not have to be guessed. It comes out of two numbers the system already has, the subnet's capacity for activity and the patrons' capital available to lock. Burning forces the seller to set a price by reference to outside markets. Lockup lets the price emerge from the inside.
A subnet has a finite capacity for activity. Compelle's validator runs a fixed number of debates per epoch, can mark a fixed number of sponsored topics per day, can name a fixed number of arenas per week. Call this $K$ slots per period. A sponsored tournament uses one slot. A named arena uses one. A premium subscription uses, in effect, a fraction of one over time. The total slots used cannot exceed $K$.
The patron base also has a capital pool willing to be locked. Not every alpha holder will choose to lock, but some fraction $\beta$ of total subnet alpha $N$ will. So the steady-state locked pool is roughly $\beta N$ alpha. Patrons rotate in and out of locks, but the average pool stays roughly constant.
If the locked pool is $\beta N$, then over a period of length $\Delta$ patrons collectively pay (in burn-equivalent terms) the time-value of all the locked capital during that window:
where $r$ is a typical patron's discount rate, the return they could otherwise earn on the alpha. Dividing by the number of activity slots in the period gives the implied price per slot:
The price clears the equation. Enough patrons lock to cover the slots they want to buy, and the slots cost what the lockup pool can afford to pay. No outside reference is needed.
Suppose at some point in subnet 82's life the relevant numbers look like this:
| Quantity | Value |
|---|---|
| Total alpha issued (N) | 100,000 |
| Lockup share (β) | 30% |
| Locked pool (βN) | 30,000 alpha |
| Patron discount rate (r) | 10% / year |
| Period (Δ) | 30 days |
| Slots per period (K) | 100 sponsored slots |
| Implied price per slot | ~2.5 alpha (burn-equivalent) |
About two and a half alpha of burn-equivalent value per sponsored slot. A patron can pay that by locking 25 alpha for a year, or 100 alpha for three months, or 1,000 alpha for ten days. Whatever fits.
If the subnet grows ($N$ doubles), the same lockup share funds twice the activity at the same price, or supports more capacity at lower per-slot prices. If patron interest in voice is strong ($\beta$ rises), prices fall further, until either the seller raises capacity to match demand or expensive activities migrate to higher-value subnets. If interest collapses ($\beta$ falls), prices rise, signaling that something is off and inviting course correction. The pricing is reflexive, and it talks back.
A burn-priced service has to be denominated against something outside the system, usually a token's market price in dollars or its ratio to TAO. That introduces an exchange-rate dependency: when alpha rallies, the burn price (in alpha) should drop; when alpha drops, the price should rise; the seller has to keep adjusting. Sellers usually do not. They pick a number and stick with it, and the system clears badly.
Lockup pricing is internal. Capacity is internal. Capital is internal. The discount rate is internal too: it is the patron's own valuation of their alpha, which already reflects whatever exchange rates and yields they care about. The price clears in the units the system already speaks. Everything is denominated in alpha-time, and the answer comes out in burn-equivalent alpha.
This means Compelle can publish prices in alpha-burn-equivalent terms and let patrons translate to whatever (lockup, duration) combination they like. The seller never has to track a dollar exchange rate. The patron never has to trust the seller's exchange rate. The math stays inside the alpha economy.
A few natural ceilings constrain the system.
One more property matters for Compelle specifically, and it is worth stating precisely, because the chain ships it switched off. The protocol tracks the sum of tenure across all patrons who have locked against the same hotkey, and from that it can name a "subnet king": the hotkey with the highest aggregated tenure on the subnet. The code also contains a routine that would hand subnet ownership to that king. As of this writing, that routine does not run. The per-epoch coinbase that would call it leaves the call commented out, annotated in the source as "currently inactive by design." So the subnet king is a number the chain maintains, not a lever anyone can presently pull. The design intent still shapes where the feature points: Compelle's validator hotkey is the one patrons lock against, so every patron lockup feeds that hotkey's aggregated tenure, and were the ownership routine ever switched on, the same tenure that buys patrons their voice would also tend to settle who leads the subnet, in Compelle's favor. Today it buys only the voice, and nothing in this article depends on the ownership tie-in.
The same inactive feature set has a complement on the owner's side. The intended behavior, as written: at each epoch the owner's emission cut would not arrive as free alpha but be locked to the owner's lock-hotkey (or, if none exists yet, to the SubnetOwnerHotkey), so the owner's tenure would grow with subnet age without any action. That path is not live today either. The coinbase currently drains the owner cut and distributes it as ordinary alpha, and the routine that would lock it has no active caller. We describe it because it is built and could be enabled, not because it runs now.
If it were enabled, it would be the structural counterpart to a permanent voluntary lockup: patrons may choose to lock; the owner would be locked by the chain, both feeding the same hotkey's tenure and making the subnet's leadership progressively harder to dislodge. For now that symmetry is a design on paper. What is live and load-bearing for Compelle is only the patron side: a voluntary lockup, reversible by a thaw, converted into voice.
How much demand for lockup will there actually be from patrons? Roughly speaking: any patron who values the voice they get from locking at more than the cost of having that alpha temporarily illiquid will lock. With a 30-day thaw period, the illiquidity cost is small, especially for patrons holding alpha for a year or more. As a rough anchor, a patron who values voice at about 8% of locked alpha per year will find the math worthwhile. Most patrons whose interest in Compelle is meaningful at all will clear that bar.
Three families of capital-weighted voting have come before:
Bittensor Conviction does something different. Vote weight is the principal alone, decoupled from duration. Tenure is tracked separately, in a second number that grows over time. The principal is locked but not burned, so the lock is reversible with a thaw. As far as we are aware, this is the first chain-native mechanism that maintains principal and tenure as two independent on-chain numbers and lets applications above the chain address either one.
The closest cousin is Curve veCRV, which produces a single derived score from stake and remaining lock time. veCRV mixes principal and tenure into one number; Bittensor Conviction keeps them apart. That separation is what lets a single primitive serve two purposes at once. Compelle uses lockup for voting, where immediate participation matters. The chain reserves aggregated tenure for subnet ownership, where accumulated commitment would matter; as the previous section noted, that door is built but currently closed. One primitive, two doors, one of them not yet open.
Three properties recommend lockup over burn for Compelle's patron flow.
Reversibility lowers the bar to participate. A new patron with 100,000 alpha can lock the full balance, vote at full weight from the first block, and release it later if needed. The same patron facing a burn requirement would lock far less, or nothing.
Tenure is a free, continuous signal. Tenure climbs over months and is visible alongside lockup on every patron profile. The gap between the two numbers is itself information about how recently the patron arrived. Burn cannot offer this; a burn from a year ago looks identical to one from today.
The asymptote recovers burn. A patron who really wants the irreversibility of burning can simply pin a perpetual lock and never release it. By the asymptotic equivalence, the resulting state is observationally identical to having burned. Lockup is therefore a generalization of burn, not a substitute. Patrons who want burn semantics get burn semantics. Patrons who want flexibility get flexibility. The same chain primitive serves both.
The mechanism inherits the credibility of burn, the participation friendliness of staking, and the time-evolution properties of vesting, all from a single piece of chain state.
Compelle does not keep its own copy of any patron's lockup or tenure. At the moment of any patron action, the validator reads the relevant state from the chain, snapshots the values, and writes a single row in the contributions database. There is no continuous reconciliation, no off-chain ledger, no slashing logic. If the patron later releases the lock or lets it wind down, the snapshot recorded at the moment of voting stands.
This makes Compelle an interpreter of the chain primitive, not a custodian of it. The patron's relationship is with the chain. Compelle observes the chain and translates lockup into voice.
For readers who want the mechanism in math notation. Throughout, $L$ denotes lockup (the chain's locked_mass) and $\theta$ denotes tenure (the chain calls it conviction). The chain time constants are $\tau_\theta \approx 90$ days for tenure maturation and $\tau_U \approx 30$ days for the decay of an unpinned lockup. We use $j$ as a topic index, $D$ for a lockup duration, and $t$ for time.
Tenure always matures toward the current lockup; the lockup itself either holds (when pinned perpetual) or decays at rate $\tau_U$ (when not). These are the closed-form solutions to $\dot\theta = (L - \theta)/\tau_\theta$ and, for an unpinned lock, $\dot L = -L/\tau_U$. The chain implements the maturation and decay in pallets/subtensor/src/staking/lock.rs (roll_forward and exp_decay).
For a perpetual (pinned) lock of size $L$ at block $0$, held and never released, define the observable signature $\Sigma(t) = (v(t), F(t), \theta(t))$ where $v$ is vote weight, $F$ is alpha removed from the trading float, and $\theta$ is on-chain tenure. Then $v(t) = L$, $F(t) = L$, and $\theta(t) = L(1 - e^{-t/\tau_\theta})$. Define the burn-credit signature as $\Sigma_{\mathrm{burn}} = (L, L, L)$. Then $\Sigma(t) \to \Sigma_{\mathrm{burn}}$ componentwise, with $\Vert \Sigma_{\mathrm{burn}} - \Sigma(t) \Vert_\infty = L \cdot e^{-t/\tau_\theta}$.
$v$ is enforced by the chain at $L$ while the lock stays pinned. $F = L$ because a pinned lock does not decay and locked alpha cannot be transferred away or unstaked (the lock invariant). $\theta(t)$ is the closed-form solution with $\theta(0) = 0$. The componentwise difference is $(0, 0, L \cdot e^{-t/\tau_\theta})$, which vanishes as $t \to \infty$.∎
The convergence rate is explicit: to be within $\epsilon L$ of the burn signature, wait $t \ge \tau_\theta \ln(1/\epsilon)$. For $\epsilon = 0.01$, that is about 414 days; for $\epsilon = 10^{-6}$, about 1,245 days.
A perpetual lockup weakly dominates burn for the patron. Under burn, the patron has no claim on the destroyed alpha. Under a perpetual lockup, the patron retains a release option (un-pinning, then the thaw) whose value is zero conditional on never being exercised, and strictly positive otherwise. The dominance is strict whenever the patron faces nonzero probability of changed circumstances over the life of the position.
Among time-translation-invariant evolution laws on $(L, \theta)$ that produce immediate participation, continuous tenure, asymptotic burn equivalence, and reversibility, the law above is the unique form (given an arbitrary fixed $\tau_\theta$) for which the gap $L - \theta$ decays linearly without inflation. Any chain object meeting all four desiderata must therefore carry at least two pieces of state per patron.
For any patron $P$ at any block $t$, with allocations $\alpha_{P,j} \in [0, 1]$ summing to at most 1 across topics $j$:
For any topic $j$: $V(j, t) \;:=\; \sum_P v_P(j, t) \;\le\; M(t) \;:=\; \sum_P L_P(t).$
For subnet $s$ with total alpha issuance $N_s(t)$: $M_s(t) \le N_s(t).$
The chain stores HotkeyLock[(s, h)] as the sum of Lock[(c, s, h)] over all coldkeys $c$, evolved by the same maturation law. The aggregated tenure associated with hotkey $h$ on subnet $s$ at block $t$ is
and the runtime API get_most_convicted_hotkey_on_subnet(s) returns $h^* \in \arg\max_h \theta_h^{(s)}(t)$.
Suppose a patron earns voice utility at rate $\phi$ per unit lockup per unit time, faces Poisson liquidity-shock arrivals at rate $\lambda$, and incurs an expected utility loss of $\rho \cdot \tau_U$ per unit lockup per shock during the thaw that follows a release. The patron locks if and only if
For a patron with discount rate $r$, the present-value cost of locking $L$ for duration $D$ (assuming the alpha is otherwise productive at rate $r$) is
For small $rD$ this is approximately $L \cdot r \cdot D$, the linear approximation. As $D \to \infty$, the cost approaches $L$, recovering the burn cost. To pay an effective burn-equivalent of $p$ alpha by lockup, the patron picks any $(L, D)$ such that $L \cdot (1 - e^{-rD}) = p$.
Let a subnet have capacity $K$ activity slots per period of length $\Delta$, total alpha issuance $N$, and a steady-state lockup share $\beta \in [0, 1]$. If patrons hold a typical discount rate $r$, the implied burn-equivalent price per slot in equilibrium satisfies
by equating the burn-equivalent flow generated by the locked pool, $\beta N r \Delta$, with the total payment for slots in the period, $p K$.
The approximation uses $\mathrm{Cost}(L, D) \approx L r D$ at first order in $rD$, valid when individual locks are short relative to the patron horizon. For long-tail permanent locks, the approximation undercounts the burn-equivalent contribution; the bound on $p$ is then a lower bound, not an equality.
The Conviction primitive was specified in Subtensor PR #2599, merged 2026-05-01, with follow-ups in PR #2632 (merged 2026-05-05) adding owner auto-lock, coldkey-swap lock migration, and locked initial distribution at subnet registration. Lock state struct, maturity arithmetic, unlock decay, transfer_lock, and do_move_lock are implemented in pallets/subtensor/src/staking/lock.rs; the auto-lock hook sits in pallets/subtensor/src/coinbase/run_coinbase.rs after each epoch's owner-cut distribution but is currently left disabled there (commented out, annotated "inactive by design"), as is the conviction-based ownership reassignment it accompanies. The default chain constants $\mathrm{MaturityRate} = 7200 \times 90$ and $\mathrm{UnlockRate} = 7200 \times 30$ are defined in pallets/subtensor/src/lib.rs. The runtime API get_most_convicted_hotkey_on_subnet(netuid) exposes subnet_king selection.
Egorov, M. (2020). Curve DAO. Curve Finance technical documentation, voting-escrow specification.
Emmett, J. (2020). Conviction Voting: A Novel Continuous Decision Making Alternative to Governance. Commons Stack / Giveth.
Goldin, M. (2017). Token-Curated Registries 1.0. Medium, September 2017.
Lalley, S. P., and Weyl, E. G. (2018). Quadratic Voting: How Mechanism Design Can Radicalize Democracy. AEA Papers and Proceedings, 108, 33-37.
Peterson, J., Krug, J., et al. (2015, rev. 2019). Augur: a Decentralized Oracle and Prediction Market Platform. arXiv:1501.01042.
Zargham, M. (2018). Social Sensor Fusion: A Framework for Continuous Collective Preference Estimation. BlockScience research proposal; theoretical foundation for conviction-voting implementations later realized by Commons Stack and 1Hive.