History – Execution

Back
v4.5.1 · currentRun #535: CHECKPOINT_CAP is 44,640 in the core of the 6 Oct 2026 Stokenet redeploy (2eaff79 is an ancestor of 1827a72); the 11,520 figure was the 25 Sep core.–
1 block modified
  • Modified – Text at Block 2

    Execution is what turns a pass…ite: CHECKPOINT_CAP entries – 11,520, eight44,640, 31 days of traded minutes, in th… core deployed on Stokenet on 25 Septem6 October 2026, and 44,640, 31 days, in the source the mainnet core will be published from; the core of 25 September held 11,520, eight days – since a minute with no trad… a phase it could never leave.

v4.5.0Proposal fee moved to creation: max(500 XRD, 1% of the largest option); trigger free; ballot fee question removed–
3 blocks modified
  • Modified – Text at Block 2

    Execution is what turns a pass…is what opens that window: it takes no payment, asserts the legislative pass, collects the execution fee the ballot's second question assigned, locks the caper's trailing t… a phase it could never leave.

  • Modified – Text at Block 4

    Who pays to settle Whoever mak… was somebody else's fee. The creation fee kept the shape the allowance gave it. It isallowance was sized to the flat – 500 XRD banked when the proposal is raised, kept whether it passes or fails – and thcreation fee that ran from 29 August to 6 October 2026; over that stretch a separate 10% execution chargfee on the winning action is a separate, later leg that rides the trigger. It is not a floor under a percentage: an earlier deployment didrode the trigger. From 6 October 2026 the proposer pays one fee at creation instead – 1% of the largest option’s XRD value, at least 500 XRD – and the trigger is free. A deployment before 29 August sized the creation fee as the great… 500 XRD and 10% of the action, and m. Material describing it that waythat quotes a 10% proposal fee at either moment, including some of Caper's own, is describing thea retired shape.

  • Modified – Text at Block 7

    Hand-rolling an executor manif…ich of up to five options wins and whether the treasury or the proposer pays to execute it; the market then vetoes, or d…tle-path gas subsidy outright. Until 6 October 2026 a ballot also decided whether the treasury or the proposer paid a 10% fee to execute the winner; the redeploy of that day moved the whole proposal fee to creation and made the trigger free, which took the question off the ballot. The escrow is the piece that …ot era and is kept as written.

v4.4.0Sweep #500: UPGRADE's activate leg now lapses one execution window (7 days) after the registry's timelock lets the candidate in (execute_proposal_upgrade_activate in contracts/logic/src/lib.rs, PENTEST H-4 fixed, Stokenet logic upgrade 1 Oct 2026); before it, the activate leg had no deadline. CHECKPOINT_CAP stated as 11,520 on the 25 Sep Stokenet core and 44,640 (31 traded days) in the source for mainnet (contracts/common/src/lib.rs, 2eaff79).–
3 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr…of its resolution or it lapses; UPGRADE’s activate leg within 7 days of the end of the registry’s timelock Replay guards Four once-only… (/wiki/markets/raising-funds)

  • Modified – Text at Block 2

    Execution is what turns a pass…finite: CHECKPOINT_CAP entries – 11,520, eight days of traded minutes, in the core deployed on Stokenet on 25 September 2026, and 44,640, 31 days, in the source the mainnet core will be published from – since a minute with no trade …lapses instead of lying armed. UPGRADE’s second leg reads the action back without that prologue, so it carries a deadline of its own: since the logic upgrade of 1 October 2026, execute_proposal_upgrade_activate refuses once one execution window, seven days, has passed since the registry’s timelock let the candidate in. The deadline arrived with the… a phase it could never leave.

  • Modified – Text at Block 5

    The executive actions - PAYOUT…egistry's timelock has elapsed, and no later than seven days after that. On a zero-delay deployment b…nd a treasury is not a member.

v4.3.3Remove the $XRD caper and its reference basket, and say a sell pays no trade fee. Both follow the 18 September 2026 redeploy.–
1 block modified
  • Modified – Text at Block 2

    Execution is what turns a pass…ge is at or above the baseline. The root $XRD caper has no curve, so since the redeploy of 15 September 2026 its trigger locks a baseline on a reference basket of other capers' curve prices and its resolve passes iff the basket's window average is at or below it; Voting mechanisms (/wiki/governance/voting-mechanisms) sets out why the test inverts (trigger_proposal and resolve… a phase it could never leave.

v4.3.2Sweep #438: resolve's pass test inverts on the $XRD caper, which reads a reference basket (15 Sep 2026 redeploy)–
1 block modified
  • Modified – Text at Block 2

    Execution is what turns a pass…e is at or above the baseline. The root $XRD caper has no curve, so since the redeploy of 15 September 2026 its trigger locks a baseline on a reference basket of other capers' curve prices and its resolve passes iff the basket's window average is at or below it; Voting mechanisms (/wiki/governance/voting-mechanisms) sets out why the test inverts (trigger_proposal and resolve_proposal in contracts/logic/src/lib.rs). Integrating rather than sampl… a phase it could never leave.

v4.3.1Sweep #414: the execution deadline and the end of the crank subsidy reached the ledger with the 11 Sep 2026 redeploy (d0e776b); 9 Sep was only the commit (ff56cdd). The page already dated the same change 11 Sep lower down. crystallize_ballots is needed only past 60 outstanding ballots (SINGLE_PASS_MAX_VOTERS).–
3 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr…→ voting → crystallize_ballots (only past 60 ballots) → settle_proposal → trigger_p…ee (no treasury subsidy since 911 September 2026) Deadline A p… (/wiki/markets/raising-funds)

  • Modified – Text at Block 2

    Execution is what turns a pass…g armed. The deadline arrived on 9with the redeploy of 11 September 2026 and answers a … a phase it could never leave.

  • Modified – Text at Block 4

    Who pays to settle Whoever mak…osts a network fee, and since 911 September 2026 the caller car… describing the retired shape.

v4.3.0The 11 Sep genesis redeploy removed settlement gas and stamped a 7-day execution deadline: correct the infobox, the prologue, the who-pays section and the era list against the deployed CaperDao blueprint–
5 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr… are permissionless Who pays The caper's own treasury: 5 XRD a call, against a 500 XRD per-proposal allowanceWhoever makes the call – each crank pays its own network fee (no treasury subsidy since 9 September 2026) Deadline A passed action must execute within 7 days of its resolution or it lapses Replay guards Four once-only… (/wiki/markets/raising-funds)

  • Modified – Text at Block 2

    Execution is what turns a pass…however late the crank lands, which is why reimbursing the settle path from the treasuryso a prompt crank buys convenience rather thanand not correctness – which is much of why the platform stopped paying anybody to be prompt. The settlement written to st…kind before it does anything. Neither stepSettlement has ano deadline. A passed proposal stays executable until somebody executes it, and a failed one; execution does. resolve_proposal stamps an execute_by of seven days from the moment it records the verdict, and the shared execution prologue refuses every entry point past it, so a passed action nobody carries out lapses instead of lying armed. The deadline arrived on 9 September 2026 and answers a specific failure: an action larger than its treasury can cover aborts on the shortfall and stays armed, so before the clock a payout voted through in a window measured in minutes could sit dormant for years and then fire the moment the treasury happened to fill. A failed proposal is simply never executable. S… a phase it could never leave.

  • Modified – Text at Block 3

    Once-only, in one substate wri…cribing precisely, because it is what makes the gas reimbursement below safcarries the whole once-only guarantee. In a single open of the pro…s it has not already executed, asserts the seven-day execution window has not closed, flips executed, and binds the frozen action. Only then does it draw gas. If anyIf any of those four assertions fails, or the action itself a…he transaction, the flag flip and the draw rolls back togetherwith it — there is no state in which a caper has paid for an execuspent its one execution on an action that did not happen.

  • Modified – Text at Block 4

    Who pays to settle Whoever makes the call. Both steps are permissionless work that costs gas, and leaving that bill with whoever happens to click Settle taxes one member for something the whole caper consumes. So the caper's treasury (/wiki/foundations/what-is-a-caper) reimburses it: 5 XRD per call, drawn against a 500 XRD allowance per proposal. The caller still fronts a fee reserve to the network and ends a committeda network fee, and since 9 September 2026 the caller carries it: there is no treasury reimbursement anywhere on the settle path, and the deployed contract has no gas parameter on any crank entry point. There was one until then, and why it went is worth stating, because it is a general lesson about paying for public goods on a ledger rather than a detail of this one. The caper's treasury used to lock up to 5 XRD contingently against each settle-path call, against a 500 XRD allowance per proposal sized to match the flat creation fee, so a proposal funded its own settlement out of what it had banked. The flaw was not the size of the subsidy but its scope. The Radix Engine consumes locked fees in reverse lock order – locked_fees.iter().cloned().rev() (https://github.com/radixdlt/radixdlt-scrypto/blob/main/radix-engine/src/system/system_callback.rs) – so the treasury's lock was always drawn before the caller's, and the subsidy therefore paid the first 5 XRD of the caller's whole. That allowance is exactly the size of the proposal fee, and the equality is deliberate rather than coincidental. The creation fee is flat – 500 XRD banked when the proposal is raised, kept whether it passes or fails – and the 10% execution charge on the winning action is a separate, later leg that rides the trigger. It is not a floor under a percentage: an earlier deployment did size the creation fee as the greater of 500 XRD and 10% of the action, and material describing it that way, including some of Caper's own, is describing the retired shape. What the equality buys is the property that matters here: a proposal can never cost its treasury more to settle and execute than it banked on the way in, which is what stops settlement from being an attack surface: raising a proposal purely to drain a treasury through crank reimbursements costs the attacker more than it yields. The draw takes its XRD before the action spends any. An action sized to a treasury's last few XRD therefore aborts on the shortfall rather than paying short – the same abort a treasury that fell below the proposed amount already gives, and equally retryable once it is topped up transaction rather than the first 5 XRD of the crank. Any manifest carrying one successful settle-path call had its opening cost met by a treasury it did not own, whatever else that manifest did, and crystallize_ballots will accept a chunk of a single ballot. Bounded by the proposer's own fee, so it was fee recycling rather than a drain – but it was somebody else's fee. The creation fee kept the shape the allowance gave it. It is flat – 500 XRD banked when the proposal is raised, kept whether it passes or fails – and the 10% execution charge on the winning action is a separate, later leg that rides the trigger. It is not a floor under a percentage: an earlier deployment did size the creation fee as the greater of 500 XRD and 10% of the action, and material describing it that way, including some of Caper's own, is describing the retired shape.

  • Modified – Text at Block 7

    Hand-rolling an executor manif…s retuned to a shorter window. The redeploy of 11 September 2026 left both phases alone and changed two things on this page instead – it put a seven-day clock on a passed action, and it removed the settle-path gas subsidy outright. The escrow is the piece that …ot era and is kept as written.

v4.2.1Sweep #372: window/baseline/verdict prose settled against the 7 Sep 2026 redeploy – exact price-time integral with minute checkpoints, trailing baseline as a logic constant, market window as drill tuning; no durations in prose–
3 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr…proposal → trigger_proposal → 48-hourmarket window → resolve_proposal → e… (/wiki/markets/raising-funds)

  • Modified – Text at Block 2

    Execution is what turns a pass… do, and the market then gets forty-eight hoursa window to veto it before it happens.…t's second question assigned, freezelocks the caper's trailing seven-day time-weighted average price as…line, and stamps a window end forty-eight hours outone market window out, aligned up to the state tier's minute grid. Once that window closes, resolve_proposal integratereads the price over th-time window itself – anchoredtegral at theat recorded window end, – not at the moment of the crank – and passes iff thate window's average is at or above the ba…r one block; a window average costs price displacement multiplied by durationhas to be displaced and then held for a real share of the window, so an atomic buy → resolve →… same number a prompt one does – but only while the observations that average is built from are still retained, and that bound is worth stating rather than assuming. The window average is only as long as the price history behind it. A caper records one circulation observation per trade into a fixed ring of 200, held as a key-value ring rather than a list so the protocol's hottest path writes one small entry instead of rewriting an array (price_samples, contracts/core/src/caper_dao.rs). The averaging function clips the window's left edge to the oldest observation still retained and divides by that clipped span, silently – the loudest of the three answers to th. The integral is exact, not sampled. The state tier keeps a running price-time accumulator: at the tail of each of the three operations that change circulation – a buy, a sell, a migration – it adds the price in force multiplied by the seconds it held, and it writes one checkpoint of that total at the start of every minute that sees a trade (contracts/core/src/caper_dao.rs). Window ends and baseline starts sit on that minute grid, so the integral at each is read exactly – from state if nothing has traded since, otherwise bound is Uniswap v3's, which reverts instead ( price oracles in governance (/wiki/dao-governance/concepts/voting/price-oracles-in-governance) ): once the ring has turned over past the start of the forty-eight hours, what resolves the proposal is the average over whatever remains, not over the window. The same clipping applies to the seven-day baseline taken at the trigger. Two consequences follow and they point the same way. A heavily traded caper resolves against a shorter and more recent interval than a quiet one, and a crank left late enough resolves against a different number than a prompt one would have. That, rather than politeness, is the sharpest argument for reimbursing the settle path from the treasury: the reimbursement buys promptness, and promptness is what keeps the integral an integralack from the first checkpoint after it – and a burst of trades inside one minute writes one checkpoint rather than one per trade. The checkpoint ring is finite: CHECKPOINT_CAP entries, eight days of traded minutes, since a minute with no trade writes nothing, and the trailing baseline's length is pinned under it when the logic is compiled. Only a resolve cranked more than that many traded minutes after its window end moves the anchor, to the oldest retained checkpoint, and extends the window to it – deterministically, where Uniswap v3 reverts instead ( price oracles in governance (/wiki/dao-governance/concepts/voting/price-oracles-in-governance) ). Inside that bound the verdict is fixed at the window end however late the crank lands, which is why reimbursing the settle path from the treasury buys convenience rather than correctness. The settlement written to st… a phase it could never leave.

  • Modified – Text at Block 7

    Hand-rolling an executor manif…vetoes, or does not, over the forty-eight hoursmarket window that follows. Neither phase can carry an a… and never reaches the second. The redeploy of 7 September 2026 kept both phases and changed the measurement underneath the second: an exact price-time integral read through minute checkpoints replaced a 200-entry ring of per-trade samples, and the trailing baseline was retuned to a shorter window. The escrow is the piece that …ot era and is kept as written.

v4.2.0A DEBATE winner is terminal at the tally: the 'neither phase alone' symmetry has an exception, and a passed proposal now has three end states–
3 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr…DATA · UPGRADE ($CAPER only) Non-executive outcome A DEBATE winner is terminal at the tally – trigger_proposal refuses it, so no window and no execution Who may call Anyone — both ste… (/wiki/markets/raising-funds)

  • Modified – Text at Block 2

    Execution is what turns a pass… to veto it before it happens. Not every passed proposal has that tail: a ballot won by a DEBATE option ends at the tally, and nothing on this page applies to it. Execution proper is the last …ne is simply never executable. Since 5 September 2026 there is a third end state: a proposal whose winning option was a DEBATE position has passed and is never executable, because it never named an action to execute. trigger_proposal asserts the winning option's kind is not 6 and aborts if it is, so such a proposal cannot park in a phase it could never leave.

  • Modified – Text at Block 7

    Hand-rolling an executor manif… Borda tally, checked against athe same 1.5 / N supermajority the live system uses – three-quarters of the 2 / N ceiling a Borda leader can take at any ballot size (/wiki/governance/voting-mechanisms) , then subjected to a market v…low. Neither phase can carry a proposaln action alone: a ballot that passes i…a ballot named a winner first. That symmetry has had one exception since 5 September 2026: a DEBATE option carries no action, so a ballot it wins is carried by the first phase alone and never reaches the second. The escrow is the piece that …ot era and is kept as written.

v4.1.1Cross-link the retention bound to the new price-oracles-in-governance page, which sets the clip against Uniswap v2's absent history and v3's 'OLD' revert.–
1 block modified
  • Modified – Text at Block 2

    Execution is what turns a pass…by that clipped span, silently – the loudest of the three answers to this bound is Uniswap v3's, which reverts instead ( price oracles in governance (/wiki/dao-governance/concepts/voting/price-oracles-in-governance) ): once the ring has turned ove…ne is simply never executable.

v4.1.0Bound the window-TWAP claim by price-sample ring retention; replace the retired proposal-fee floor with the flat fee the contract charges–
2 blocks modified
  • Modified – Text at Block 2

    Execution is what turns a pass… same number a prompt one does.– but only while the observations that average is built from are still retained, and that bound is worth stating rather than assuming. The window average is only as long as the price history behind it. A caper records one circulation observation per trade into a fixed ring of 200, held as a key-value ring rather than a list so the protocol's hottest path writes one small entry instead of rewriting an array (price_samples, contracts/core/src/caper_dao.rs). The averaging function clips the window's left edge to the oldest observation still retained and divides by that clipped span, silently: once the ring has turned over past the start of the forty-eight hours, what resolves the proposal is the average over whatever remains, not over the window. The same clipping applies to the seven-day baseline taken at the trigger. Two consequences follow and they point the same way. A heavily traded caper resolves against a shorter and more recent interval than a quiet one, and a crank left late enough resolves against a different number than a prompt one would have. That, rather than politeness, is the sharpest argument for reimbursing the settle path from the treasury: the reimbursement buys promptness, and promptness is what keeps the integral an integral. The settlement written to stat…ne is simply never executable.

  • Modified – Text at Block 4

    Who pays to settle Both steps …le. That allowance is exactly why the proposal fee has a 500 XRD floor. Athe size of the proposal fee, and the equality is deliberate rather than coincidental. The creation fee is flat – 500 XRD banked when the proposal is raised, kept whether it passes or fails – and the 10% execution charge on the winning action is a separate, later leg that rides the trigger. It is not a floor under a percentage: an earlier deployment did size the creation fee as the greater of 500 XRD and 10% of the action, and material describing it that way, including some of Caper's own, is describing the retired shape. What the equality buys is the property that matters here: a proposal can never cost its t…etryable once it is topped up.

v4.0.0Two-phase correction: resolve integrates the window TWAP against a baseline frozen at trigger, four once-only flags, three dated eras–
4 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed proposal Timeline Creation → voting → crystallize_ballots → settle_proposal → trigger_proposal → 48-hour window → resolve_prop…osal allowance Replay guards TwoFour once-only flags: tallied, triggered, settled, then executed Related Proposals … (/wiki/markets/raising-funds)

  • Modified – Text at Block 2

    Execution is what turns a pass…posals) into a state change. On a caper it iIt is the tail of a two-phase lifecycle: a ranked ballot (/wiki/governance/voting) decides what the caper should do, and the market then gets forty-eight hours two separate permissionless calls,veto it before it happens. Execution proper is the last two permissionless calls of that sequence – resolve, then execute – made by anyone at all, andwith nothing about either dependsing on who makes it. Resolve settles the verdict. After the proposal's 48-hour window closes, resolve_proposal reads the caper's live curve price, compares it with the seven-day TWAP baseline frozen at creation, and records the outcome:market's verdict on a proposal the ballot already passed. trigger_proposal is what opens that window: it asserts the legislative pass, collects the execution fee the ballot's second question assigned, freezes the caper's trailing seven-day time-weighted average price as the baseline, and stamps a window end forty-eight hours out. Once that window closes, resolve_proposal integrates the price over the window itself – anchored at the recorded window end, not at the moment of the crank – and passeds iffspotthat window average is at or above the baseline, failed if below. The settlement it writes carries all three numbers – the baseline, the spot it was measured against,. Integrating rather than sampling is the load-bearing choice. A spot read at the crank could be bought for one block; a window average costs price displacement multiplied by duration, so an atomic buy → resolve → sell round-trip buys no verdict. Anchoring at the stored window end rather than at now also makes a late crank read the same number a prompt one does. The settlement written to state carries the baseline, the window average and the verdict –, so the decision can be audite…ne is simply never executable.

  • Modified – Text at Block 3

    Once-only, in one substate write TwoFour flags guard the whole path, and each flips exactly once. settltallied flips when the verdict is recorded, so a second resolve is refused outright – the priceballot count is frozen, so a proposal cannot be counted twice or voted on afterwards. triggered flips when the optimistic window opens, which is also what fixes the baseline – a second trigger cannot be re-fread latereze it at a more convenient momentprice. settled flips when the market's verdict is recorded, so the window average cannot be re-integrated later. executed flips in the shared…execution that did not happen.

  • Modified – Text at Block 7

    Hand-rolling an executor manif…g instead of a clean summary. What this replaced Until August 2026 this page documented a considerably larger apparatus, and it is worth recording that it existed. A proposal's ballots were released from a per-caper ballot boxThree eras, and what each one changed This path has been rebuilt twice in a month, and the older material still circulating describes one of the two retired shapes, so it is worth dating all three. - To 26 August 2026 — escrowed ballots. Members staked governance tokens into a per-caper ballot box. Ballots were released from it in batches, folded into a Bor…ecute were three guarded steps rather than two, and a thousand-ballot propos…ds of transactions to settle. Optimistic resolution collapsed all of it into one price comparison. The market veto is the piece that survived, in a sense – it is now the whole mechanism rather than a final gate on a tally- 26–28 August 2026 — price only. The ballots were removed outright. A proposal named one action, froze a baseline at creation, and passed forty-eight hours later on a single price comparison. There was no vote to cast and no quorum to reach. - From 29 August 2026 — both, in sequence. The ranked ballot returned in front of the optimistic phase rather than instead of it. A ballot decides which of up to five options wins and whether the treasury or the proposer pays to execute it; the market then vetoes, or does not, over the forty-eight hours that follow. Neither phase can carry a proposal alone: a ballot that passes is only a mandate to open the window, and a window that closes above its baseline executes nothing unless a ballot named a winner first. The escrow is the piece that did not come back. A ballot is now a plain wallet transaction – the contract reads the voter's balance rather than taking custody of it – and what makes moving tokens between casting and counting unprofitable is a clamp at settlement, not a lock-up. Further reading The Binding…ot era and is kept as written.

v3.0.1Repoint the Binding Vote link at /blog/the-binding-vote — blog posts are not under /wiki, and caper carries no redirect table, so the /wiki/blog form 404s.–
1 block modified
  • Modified – Text at Block 7

    Hand-rolling an executor manif…r reading The Binding Vote (/wiki/blog/the-binding-vote) – why …ot era and is kept as written.

v3.0.0Replace the retired ballot-era execution documentation with the optimistic path: permissionless resolve then execute, the once-only settled/executed prologue, the 5 XRD-per-call draw against a 500 XRD per-proposal allowance, and the five action kinds including METADATA. Verified against the live CaperMain component_tdx_2_1cqtt9nz… and contracts/logic/src/lib.rs + contracts/core/src/caper_dao.rs. Drops the outdated banner; keeps the tier split and manifest guidance, and records the retired apparatus as a dated section.–
7 blocks added, 11 blocks removed
  • Removed – Banner at Block 1
  • Removed – Text at Block 2 → Block 1

    Topic Carrying out a passed proposal Timeline Voting closes → execution delay (~10 min, ballots still arriving) → release ballots (3 per transaction) → market-veto tail (6 h) → finalize → execute Executive action kinds PAYOUT · INVEST · DIVEST · VOTE · UPGRADE ($CAPER only) Replay guards Two once-only flags: settled, then executed Market veto Finalize cancels a passed tally if the curve's time-weighted price from voting close to finalize sits >30% below the voting-window mean Settlement gas Treasury-reimbursed, up to 5 XRD per call against a 500 XRD per-proposal allowance Live logic tier CaperMain on Stokenet (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1cr0wpsnnfk3rkxzkn9e39n2su5sgd9nctfcxh4rmt9dtpre2ngalht) , resolved from the registry (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1crd7wmgsa465q4ceqnlcwh9pc8pmsxhdthat86379axx74cse5ml4d) 's current_main; live since 25 August 2026, carrying the ballot-era release/finalize path and the market veto Related Proposals (/wiki/governance/proposals) , Voting (/wiki/governance/voting) , Voting mechanisms (/wiki/governance/voting-mechanisms) , Proposal lifecycle (/wiki/dao-governance/concepts/voting/proposal-lifecycle)

  • Removed – Text at Block 3

    A proposal's voting window closes on a clock, and an execution delay of the same length runs after it: ten minutes each on the live contract (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1cr0wpsnnfk3rkxzkn9e39n2su5sgd9nctfcxh4rmt9dtpre2ngalht) today. Neither is a lever anyone can pull: both are written once when a logic component is instantiated and never assigned again, so moving either takes a whole new logic tier and a move of the registry's current_main. Ballots keep arriving through that delay. A member signs their ballot as a pre-authorization subintent during the voting window, and the settlement assembler packs those signatures into batched transactions submitted afterwards, so the timelock and the ballot-collection phase are the same window. Nothing can execute inside it, which is the role a timelock plays in mainstream DAO governance (/wiki/dao-governance/concepts/voting/proposal-lifecycle) . Once the delay expires, resolution happens in public steps anyone can run. Release hands the ballots to the immortal record a few at a time: each one writes its audit blob, banks the voter's escrowed vote fee, mints their soulbound vote token, and unlocks the stake that backed it. Finalize then freezes the winner from accumulators the ballot box has been summing since the first ballot landed – but not the moment release finishes: the live contract holds it back a further six hours, the objection window in which the caper's own market can cancel a passed tally. Finally, anyone submits the transaction that executes the winning option.

  • Removed – Text at Block 4

    Release, finalize, execute – once-only guards Resolution is guarded at every step: the release cursor only moves forward, each ballot is released exactly once, and a proposal can never be finalized twice or executed twice. Release. Anyone can hand the next batch of ballots from the caper's ballot box to the immortal core. Batch size ships at three ballots per transaction, and that number is measured rather than chosen: profiled in a local ledger simulator on 15 August 2026, the release path costs roughly 34.3M cost units of base plus 12.09M per voter, so three fit inside 80% of the engine's per-transaction ceiling at a fee of about 4.1 XRD, under the 5 XRD the treasury reimburses. A five-ballot crank measures about 5.6 XRD on the same harness and tips past that ceiling, leaving the settler to eat the overflow – which is why the chunk is three rather than five (RELEASE_CHUNK, contracts/logic/src/lib.rs; profile_release_scaling and profile_settlement_gas_is_reimbursed_by_treasury, contracts/logic/tests/profile.rs). Both are simulator measurements rather than observations of the deployed component. Release refuses to start while casting is still open and refuses to run after a proposal has settled, so the audit record is always written before the decision is frozen. A voter whose account refuses deposits gets a single-ballot fallback that lands the record and the fee but parks the token mint for them to claim later, rather than poisoning every ballot batched alongside it. Finalize. Finalizing reads the finished count and freezes the winner. It is O(1) in the electorate: there is no tally pass, because each ballot's Borda contribution was folded into the running accumulators the moment it was cast. The option with the greatest summed weight wins only if its share of the total weight reached the 1.5 / N supermajority – the comparison is >=, so a share landing exactly on the bar passes – and it is not the no-execution option, and the market veto described below did not fire; otherwise the proposal finalizes with no winner. Every cast ballot must have been released first, and the immortal core enforces the same ordering from the other side by refusing new ballots once a settlement is recorded. This step flips a settled flag and can run only once. Execute. With a winner frozen, execution flips a separate executed flag, the guard that stops the same winning action from being replayed. A settled proposal that did not pass has no winner to execute, and a legislative proposal (/wiki/governance/proposals) 's winner carries no on-chain action at all, so only executive winners reach this step.

  • Removed – Text at Block 5

    The market veto Clearing the supermajority is not the last gate. Since 25 August 2026 the live logic tier carries an optimistic market veto: a proposal whose tally passed is cancelled at finalize if the caper's own bonding-curve (/wiki/markets/bonding-curve) price fell far enough while the decision was pending. The tally answers what the electorate that showed up wanted; the veto asks what everyone else did with their money afterwards. Two windows are compared, and both are time-weighted rather than sampled. The baseline runs from voting open to voting close; the objection window runs from voting close to the moment finalize is called. The immortal state tier integrates circulation exactly over each one – a caper's curve price is a step function that moves only at the sites that mint or burn tokens, so one accumulator advance per trade is the whole average, with no sampling and no ring buffer. Each window's mean circulation is then converted into a price, which is sound precisely because the curve's spot price is strictly monotone in circulation, so a threshold set in price space transfers. The veto fires when the objection-window price sits more than 30% below the baseline – veto_drop_threshold, read as 0.3 off the live logic component on 26 August 2026. It is deliberately one-sided, and that is the design rather than an accident of implementation. On a bonding curve, pushing the price down means selling float you actually hold, while holding it up takes only outside XRD that anyone can bring – so objection is expensive and honest, and support is rentable. Counting only the downward move means silence executes: a caper nobody traded during the window, and the $XRD (/wiki/foundations/what-is-a-caper) caper (which has no curve at all, and is excluded by name), both settle exactly as they did before the veto existed. What the veto adds is a way for holders who never voted to stop a decision, at the price of selling into it. The gate carries a clock of its own. finalize_proposal refuses to run until six hours after the execution delay closes – veto_tail_seconds, 21600 on the live contract – and that tail is what guarantees the market time to answer. Casting stays open right through the execution delay, so without it a last-second ballot could flip a tally with no window left to react. Release is not held back: ballots can be released as soon as casting closes, so on a large proposal the release cranks and the objection window run alongside each other. Both parameters are logic-tier policy, rewritten together by update_veto and bounded to [0, 1]; a threshold of 1 disables the veto outright, since a price can never fall below zero. A vetoed proposal is recorded as vetoed rather than quietly dropped. The settlement blob gained a second version carrying a vetoed flag beside the option weights, the ProposalTallied event appends it, and the interface labels that outcome Market Vetoed – distinct from a proposal that simply never reached 1.5 / N. (finalize_proposal, contracts/logic/src/lib.rs; curve_time_averages, contracts/core/src/caper_dao.rs.) What it answers is turnout suppression rather than plutocracy. A caper's bar is 1.5 / N of the weight actually cast, not of supply, and there is no quorum (/wiki/dao-governance/concepts/voting/quorum-and-threshold-design) to fail – so a hostile proposal that thins the electorate, by timing or by noise or by anything that keeps stake unescrowed, faces only a ratio of whoever turned up. The veto puts a second constituency behind the first. Not a larger electorate, but the one thing a low-turnout attacker cannot manufacture: the price the caper's own holders will still accept.

  • Removed – Text at Block 6

    Custody replaced the clamp Until 16 August 2026 this page described a different apparatus, and the difference is worth recording because the old one was a real design that a live upgrade retired. A ballot used to be credited the smaller of what the voter held when they voted and what they held when the tally ran; anyone could permissionlessly re-clamp a counted ballot downward, and a tally that was not taken in a single pass had to sit out a one-hour challenge window before it could settle. Snapshots, caps, clamping and the challenge window are all gone. What replaced them is physical custody. A member stakes governance tokens into the caper's ballot box before voting; a ballot's weight term is that vaulted stake, and casting refcount-locks it. The vault refuses to return a stake while any ballot it backs is still unreleased, so the same tokens can never back two counted ballots and a voter cannot sell what they voted with. Double-vote prevention became a property of where the tokens are rather than a rule about what the tally re-reads, which is why the re-clamp and the challenge window had nothing left to do. The swap itself went through the mechanism this page describes at the bottom. Proposal P-CAPER-7CD71F on the $CAPER (/wiki/foundations/what-is-a-caper) caper carried an UPGRADE option naming the new logic component, and its execution transaction (https://stokenet-dashboard.radixdlt.com/transaction/txid_tdx_2_1gyn66jhux2qcx7qgrfyt4e7m0pkq8yhymauqn6sgh3ghuk7culasxshjz3) called execute_proposal_upgrade and execute_proposal_upgrade_activate back to back on 16 August 2026 at 09:27:54 UTC. That transaction, and the component it activated, belong to a deployment Stokenet has since replaced twice over – and the way that citation ages is worth recording too. The registry it ran against, component_tdx_2_1czd3cm2… (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1czd3cm28fkq6f08c9y52w0tw56p4k6dz5h3uf76jrmpgm8a8ashuey) , still answers, still holds real state, and still names that retired component as its own current_main: the whole citation self-confirms, so nothing about following it looks wrong. The live root is the registry in the infobox above, and resolving current_main there is the only thing that tells the two apart. Both calls fitted in one manifest because the registry carries a zero upgrade delay, then and now; on a network with a non-zero delay the propose and the activate are separated by it.

  • Removed – Text at Block 7

    Who pays to settle Every step after the cast window closes is permissionless, and permissionless work still costs gas. A large proposal's release path is not one transaction but hundreds. At three ballots a transaction, a thousand-ballot proposal is roughly 334 release calls plus one finalize, and none of it is contingent on the proposal passing. Leaving that bill with whoever happens to click Settle taxes one member for a public good the whole caper consumes. That is the default almost everywhere else. In OpenZeppelin's Governor (https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/governance/Governor.sol) and in Compound's Governor Bravo (https://raw.githubusercontent.com/compound-finance/compound-protocol/master/contracts/Governance/GovernorBravoDelegate.sol) , execute is an ordinary payable function with no access control: anyone may call it once the proposal is queued, and the caller pays the gas from their own pocket with nothing coming back. In practice the proposer, a delegate or a bot absorbs it, and the cost appears in none of the governance ledgers surveyed in DAO governance operating costs (/wiki/dao-governance/concepts/analysis/dao-governance-operating-costs) . What that unpriced work costs when a DAO buys it from an automation vendor instead, and why it stays invisible when it does not, is on who pays to execute a passed proposal (/wiki/dao-governance/concepts/analysis/proposal-execution-costs) . A caper reimburses it instead. Each call draws up to 5 XRD from the treasury against a per-proposal allowance of 500 XRD. The two figures match today, but not because the allowance was sized to the fee – the allowance is a contract constant, and it is the fee that is pinned to it. update_fees asserts proposal_fee >= SETTLEMENT_GAS_BUDGET, refusing any schedule that fails "proposal_fee must cover the settlement-gas budget", so the configured fee can be raised above the allowance but never cut below it. That floor, rather than a coincidence of defaults, is what guarantees a proposal funds its own settlement and can never cost the treasury more than it contributed. The allowance is one pool shared by the whole path: the batched cast transactions draw on it too, at up to 8 XRD each. At 5 XRD a release call it covers about a hundred of them, so a proposal past roughly three hundred ballots exhausts it and the remaining callers pay their own way. That degrades rather than bricks, and the vote fees banked at release, 100 XRD a ballot on the live contract, return far more to the treasury than the allowance can ever spend. The draw is a contingent fee lock, and that is load-bearing rather than a detail. A plain lock_fee credits the fee reserve immediately and survives an aborted transaction; a contingent lock never touches that balance (https://raw.githubusercontent.com/radixdlt/radixdlt-scrypto/main/radix-engine/src/system/system_modules/costing/fee_reserve.rs) and is charged only when the transaction commits. Without it, anyone could call a settle-path method, abort the transaction, and drain the treasury while the allowance counter rolled back every time. Because payment and allowance now move together, the worst a spammer gets is an allowance draining at the same rate real work would drain it. The draw rides each call's proposal read, so a release that finds nothing left to release still pays the keeper who ran it: honest work that happens to find nothing is still work. The allowance ledger itself lives in the immortal state tier beside the funds, while the budget and the per-call ceiling are logic-tier policy, so an UPGRADE (/wiki/governance/proposals) can retune what settlement costs without touching the record of what has already been spent.

  • Removed – Text at Block 8

    The executive actions PAYOUT and INVEST each execute in a single call. PAYOUT transfers the chosen currency and amount out of the treasury to the stored, voted-on recipient — by way of an account locker (https://docs.radixdlt.com/docs/locker) rather than a direct deposit, so a recipient whose account rejects the resource cannot abort the execution; the payment simply waits to be claimed. That, and the rest of the treasury's plumbing, is covered under raising funds (/wiki/markets/raising-funds) . INVEST runs its whole withdraw → buy (/wiki/markets/bonding-curve) → deposit inside the contract's own call frame, so the treasury XRD it spends never touches the transaction worktop — a public executor cannot take part of the withdrawal and pocket the rest. The execution step asserts the bucket handed back is the target caper's token, in a positive amount, before it lands in the treasury. VOTE runs in two transactions and several manifest instructions, because it must re-enter a separate component mid-transaction. A preliminary call escrows the treasury's stake in the target caper's ballot box, in its own transaction so the execution itself stays under the engine's cost-unit ceiling, and the execution refuses to burn its once-only guard if that stake is not there: an unstaked treasury ballot would close gracefully to a silent zero. The execution proper then hands the manifest the target token, the XRD vote fee, and the treasury admin badge; the manifest presents that badge as a proof to authorise the treasury's vote into the target caper's proposal, routed through a fresh top-level frame; a final call returns the badge to its vault. Because the whole sequence is one atomic transaction, the admin badge never survives a transaction boundary outside the vault — if any step fails, the entire execution rolls back. DIVEST is INVEST run backwards, and it is the newest of the five. Execution withdraws the voted-on amount of the target caper's token from this treasury, sells it into that caper's curve (/wiki/markets/bonding-curve) , and deposits the XRD — again entirely inside the contract's own call frame, so the tokens never touch the worktop. Two guards ride it. The withdrawal aborts outright if the treasury's holding has fallen below the amount that passed, because executing a smaller trade than the one that was voted on would break the frozen-winner contract; and the sell asserts the bucket handed over is the target caper's own resource, so a stale address aborts rather than selling the wrong thing. The $XRD caper is excluded by name — it has no curve to sell into. Where INVEST fuses its guard and its withdrawal into one state-tier call, DIVEST composes two generic ones the immortal tier already exposes, paying an extra cross-package hop to avoid redeploying that tier; the whole action therefore shipped through the ordinary UPGRADE path with no per-caper migration. Its sell leg emits the same event an ordinary sale does, so it appears on the target caper's trade feed (/wiki/markets/trading) with no divest-specific arithmetic anywhere off-chain. UPGRADE is the one action reserved for the $CAPER (/wiki/foundations/what-is-a-caper) caper itself. Its winning option swaps the platform's live logic tier through the registry, in a two-phase propose-then-activate sequence — this is the mechanism by which the whole system upgrades itself under governance rather than under an admin key.

  • Removed – Text at Block 9

    Where each action runs — state tier vs logic tier A caper (/wiki/foundations/what-is-a-caper) 's contract is split into an immortal state tier that holds the treasury and the durable proposal record, and a swappable logic tier that carries the math and the executive plumbing. Which tier performs a winner depends on what the action touches. PAYOUT executes inside the state tier, because the voted-on recipient is a Global<Account> that only stays invokable as a stable substate reference — it cannot be handed to the logic tier and called there. The state tier therefore performs the transfer to the stored recipient itself, and no executor can redirect it. INVEST, DIVEST, VOTE and UPGRADE carry no account reference, so the logic tier drives them, reading back only the frozen typed option from state. That division is why an upgrade can replace the entire logic tier without ever putting the treasury or the proposal ledger at risk.

  • Removed – Text at Block 10

    Hand-rolling an executor manifest If you ever build an executor manifest by hand, end it with a try_deposit_*_or_abort: the Radix Engine's General transaction classifier only whitelists the _or_abort deposit variants, and the _or_refund forms make the wallet display a "Complex transaction" warning instead of a clean summary.

  • Removed – Text at Block 11

    Further reading The Binding Vote (/blog/the-binding-vote) – why splitting the count from the deed, and leaving no executor to trust, is the thing an advisory vote and a multisig both fail to do.

  • Added – Text at Block 1 → Block 1

    Topic Carrying out a passed proposal Timeline Creation → 48-hour window → resolve_proposal → execute_proposal_* Executive action kinds PAYOUT · INVEST · DIVEST · METADATA · UPGRADE ($CAPER only) Who may call Anyone — both steps are permissionless Who pays The caper's own treasury: 5 XRD a call, against a 500 XRD per-proposal allowance Replay guards Two once-only flags: settled, then executed Related Proposals (/wiki/governance/proposals) , Voting (/wiki/governance/voting) , Raising funds (/wiki/markets/raising-funds)

  • Added – Text at Block 2

    Execution is what turns a passed proposal (/wiki/governance/proposals) into a state change. On a caper it is two separate permissionless calls, made by anyone at all, and nothing about either depends on who makes it. Resolve settles the verdict. After the proposal's 48-hour window closes, resolve_proposal reads the caper's live curve price, compares it with the seven-day TWAP baseline frozen at creation, and records the outcome: passed if spot is at or above the baseline, failed if below. The settlement it writes carries all three numbers – the baseline, the spot it was measured against, and the verdict – so the decision can be audited afterwards without re-deriving anything. Execute performs the action, and only if the settlement says passed. There is one entry point per action kind rather than a general one; the contract will not let you call the wrong one, because each asserts the stored action's kind before it does anything. Neither step has a deadline. A passed proposal stays executable until somebody executes it, and a failed one is simply never executable.

  • Added – Text at Block 3

    Once-only, in one substate write Two flags guard the whole path, and each flips exactly once. settled flips when the verdict is recorded, so a second resolve is refused outright – the price cannot be re-read later at a more convenient moment. executed flips in the shared prologue every execution entry point runs, so a passed proposal performs its action once and never again. The prologue is worth describing precisely, because it is what makes the gas reimbursement below safe. In a single open of the proposal's substate it asserts the proposal is settled, asserts it passed, asserts it has not already executed, flips executed, and binds the frozen action. Only then does it draw gas. If any assertion fails, or the action itself aborts later in the transaction, the flag flip and the draw roll back together — there is no state in which a caper has paid for an execution that did not happen.

  • Added – Text at Block 4

    Who pays to settle Both steps are permissionless work that costs gas, and leaving that bill with whoever happens to click Settle taxes one member for something the whole caper consumes. So the caper's treasury (/wiki/foundations/what-is-a-caper) reimburses it: 5 XRD per call, drawn against a 500 XRD allowance per proposal. The caller still fronts a fee reserve to the network and ends a committed call whole. That allowance is exactly why the proposal fee has a 500 XRD floor. A proposal can never cost its treasury more to settle and execute than it banked on the way in, which is what stops settlement from being an attack surface: raising a proposal purely to drain a treasury through crank reimbursements costs the attacker more than it yields. The draw takes its XRD before the action spends any. An action sized to a treasury's last few XRD therefore aborts on the shortfall rather than paying short – the same abort a treasury that fell below the proposed amount already gives, and equally retryable once it is topped up.

  • Added – Text at Block 5

    The executive actions - PAYOUT transfers the stored currency and amount out of the treasury to the stored recipient, by way of an account locker (/wiki/markets/raising-funds) rather than a direct deposit – a recipient whose account rejects the resource cannot abort the execution; the payment waits to be claimed. The transfer floors the amount to the currency's divisibility and reports what it actually moved, so the event can never overstate the payment. - INVEST runs its whole withdraw → buy → deposit inside the contract's own call frame. The treasury's XRD never reaches the transaction worktop, which closes the partial-withdraw skim a worktop hop would open, and the tokens bought are asserted to be the target caper's own before they are banked. - DIVEST is the same trade reversed: withdraw the stored amount of the target's token, sell it into that caper's curve (/wiki/markets/bonding-curve) , bank the XRD. It aborts if the treasury's holding has fallen below the proposed amount since settlement – executing a smaller trade than the one that passed would break the frozen-action contract. The sell is emitted onto the target caper's ordinary trade feed, so an indexer needs no divest-specific arithmetic. - METADATA rewrites the mutable metadata of the caper's own token. The target was pinned to that exact resource at creation, so the shared metadata badge cannot be aimed at a sibling resource such as the vote token or the founder badge. - UPGRADE is the only two-leg action. The first call nominates the candidate logic component to the registry; the second activates it once the registry's timelock has elapsed. On a zero-delay deployment both legs can ride one transaction. Reserved to $CAPER, because one activation changes the logic every caper on the platform runs. Neither INVEST nor DIVEST mints vote tokens (/wiki/governance/voting) . They are the treasury's trades, not a member's, and a treasury is not a member.

  • Added – Text at Block 6

    Where each action runs — state tier vs logic tier A caper's contract is split into an immortal state tier that holds the treasury and the durable proposal record, and a swappable logic tier that carries the math and the executive plumbing. Which tier performs a winner depends on what the action touches. PAYOUT executes inside the state tier, because the stored recipient is a global account reference that only stays invokable as a stable substate reference – it cannot be handed out to the logic tier and called there. Every other kind binds its frozen action in the state tier and is then driven by the logic tier, which is where the curve math and the registry calls live. The split is why a logic upgrade (/wiki/governance/proposals) can change how an action executes without migrating a single caper's treasury or proposal history.

  • Added – Text at Block 7

    Hand-rolling an executor manifest If you build an executor manifest by hand, end it with a try_deposit_*_or_abort: the Radix Engine's General transaction classifier only whitelists the _or_abort deposit variants, and the _or_refund forms make the wallet display a “Complex transaction” warning instead of a clean summary. What this replaced Until August 2026 this page documented a considerably larger apparatus, and it is worth recording that it existed. A proposal's ballots were released from a per-caper ballot box in batches, folded into a Borda tally, checked against a 1.5 / N supermajority, then subjected to a market veto that cancelled a passed tally if the curve price had fallen far enough while the decision was pending. Release, finalize and execute were three guarded steps rather than two, and a thousand-ballot proposal took hundreds of transactions to settle. Optimistic resolution collapsed all of it into one price comparison. The market veto is the piece that survived, in a sense – it is now the whole mechanism rather than a final gate on a tally. Further reading The Binding Vote (/wiki/blog/the-binding-vote) – why splitting the count from the deed, and leaving no executor to trust, is the thing an advisory vote and a multisig both fail to do. It argues from the ballot era and is kept as written.

v2.3.0Repoint the cited deployment at the 28 Aug 2026 full redeploy: CaperMain component_tdx_2_1cqtt9nz…, CaperRegistry component_tdx_2_1cpqacn3…. The claims are unchanged and still hold — the v-minting core interface change forced a new immortal core, so every prior address moved.–
1 block modified
  • Modified – Banner at Block 1
v2.2.1Banner's on-chain citation repointed: current_main moved to component_tdx_2_1crmlq2f… on 28 Aug 2026 (logic upgrade; registry unchanged). Re-read the new component the same day — still eighteen methods, still no vote, finalize_proposal, release_ballots or veto call.–
1 block modified
  • Modified – Banner at Block 1
v2.2.0Dated 'may be outdated' notice: the ballot stack this page documents is not on the deployed CaperMain (interface read on-chain 28 Aug 2026). Body left intact pending rewrite.–
1 block added, 10 blocks reordered
  • Moved – Text at Block 2 → Block 1
  • Moved – Text at Block 3
  • Moved – Text at Block 4
  • Moved – Text at Block 5
  • Moved – Text at Block 6
  • Moved – Text at Block 7
  • Moved – Text at Block 8
  • Moved – Text at Block 9
  • Moved – Text at Block 10
  • Moved – Text at Block 11
  • Added – Banner at Block 1
v2.1.1The intro still linked the retired main as the live contract, and called the two periods settable when no setter exists–
1 block modified
  • Modified – Text at Block 2

    A proposal's voting window clo…m/component/component_tdx_2_1cpn5xl5esqkj2f72zs3svxav3awqp4yu768zzwd8ye7au06lt7xlcr) today, both settable in the swappable logic tierr0wpsnnfk3rkxzkn9e39n2su5sgd9nctfcxh4rmt9dtpre2ngalht) today. Neither is a lever anyone can pull: both are written once when a logic component is instantiated and never assigned again, so moving either takes a whole new logic tier and a move of the registry's current_main. Ballots keep arriving throug…t executes the winning option.

v2.1.0Document the market veto shipped 25 Aug 2026; repoint the retired Stokenet registry/main citations at the live deployment–
1 block added, 4 blocks modified, 6 blocks reordered
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr… ballots (3 per transaction) → market-veto tail (6 h) → finalize → execute Executive…lags: settled, then executed Market veto Finalize cancels a passed tally if the curve's time-weighted price from voting close to finalize sits >30% below the voting-window mean Settlement gas Treasury-reimbu…m/component/component_tdx_2_1cpn5xl5esqkj2f72zs3svxav3awqp4yu768zzwd8ye7au06lt7xlcr) ,r0wpsnnfk3rkxzkn9e39n2su5sgd9nctfcxh4rmt9dtpre2ngalht) , resolved from the registry (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1crd7wmgsa465q4ceqnlcwh9pc8pmsxhdthat86379axx74cse5ml4d) 's current_main; live since 25 August 2026, carrying the ballot-era release/finalize path, activated 16 August 2026nd the market veto Related Proposals (/wiki/go…pts/voting/proposal-lifecycle)

  • Modified – Text at Block 2

    A proposal's voting window clo… since the first ballot landed – but not the moment release finishes: the live contract holds it back a further six hours, the objection window in which the caper's own market can cancel a passed tally. Finally, anyone submits the …t executes the winning option.

  • Modified – Text at Block 3

    Release, finalize, execute – o…its share of the total weight clearreached the 1.5 / N supermajority and it is not the no-execution option– the comparison is >=, so a share landing exactly on the bar passes – and it is not the no-execution option, and the market veto described below did not fire; otherwise the proposal final…utive winners reach this step.

  • Moved – Text at Block 5
  • Modified – Text at Block 5

    Custody replaced the clamp Unt…ugust 2026 at 09:27:54 UTC. The registry (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1czd3cm28fkq6f08c9y52w0tw56p4k6dz5h3uf76jrmpgm8a8ashuey) has pointed current_main at the new component ever sinceat transaction, and the component it activated, belong to a deployment Stokenet has since replaced twice over – and the way that citation ages is worth recording too. The registry it ran against, component_tdx_2_1czd3cm2… (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1czd3cm28fkq6f08c9y52w0tw56p4k6dz5h3uf76jrmpgm8a8ashuey) , still answers, still holds real state, and still names that retired component as its own current_main: the whole citation self-confirms, so nothing about following it looks wrong. The live root is the registry in the infobox above, and resolving current_main there is the only thing that tells the two apart. Both calls fitted in one manifest because Stokenet'sthe registry carries a zero upgrade delay, then and now; on a network with a non-zero… activate are separated by it.

  • Moved – Text at Block 6
  • Moved – Text at Block 7
  • Moved – Text at Block 8
  • Moved – Text at Block 9
  • Moved – Text at Block 10
  • Added – Text at Block 4

    The market veto Clearing the supermajority is not the last gate. Since 25 August 2026 the live logic tier carries an optimistic market veto: a proposal whose tally passed is cancelled at finalize if the caper's own bonding-curve (/wiki/markets/bonding-curve) price fell far enough while the decision was pending. The tally answers what the electorate that showed up wanted; the veto asks what everyone else did with their money afterwards. Two windows are compared, and both are time-weighted rather than sampled. The baseline runs from voting open to voting close; the objection window runs from voting close to the moment finalize is called. The immortal state tier integrates circulation exactly over each one – a caper's curve price is a step function that moves only at the sites that mint or burn tokens, so one accumulator advance per trade is the whole average, with no sampling and no ring buffer. Each window's mean circulation is then converted into a price, which is sound precisely because the curve's spot price is strictly monotone in circulation, so a threshold set in price space transfers. The veto fires when the objection-window price sits more than 30% below the baseline – veto_drop_threshold, read as 0.3 off the live logic component on 26 August 2026. It is deliberately one-sided, and that is the design rather than an accident of implementation. On a bonding curve, pushing the price down means selling float you actually hold, while holding it up takes only outside XRD that anyone can bring – so objection is expensive and honest, and support is rentable. Counting only the downward move means silence executes: a caper nobody traded during the window, and the $XRD (/wiki/foundations/what-is-a-caper) caper (which has no curve at all, and is excluded by name), both settle exactly as they did before the veto existed. What the veto adds is a way for holders who never voted to stop a decision, at the price of selling into it. The gate carries a clock of its own. finalize_proposal refuses to run until six hours after the execution delay closes – veto_tail_seconds, 21600 on the live contract – and that tail is what guarantees the market time to answer. Casting stays open right through the execution delay, so without it a last-second ballot could flip a tally with no window left to react. Release is not held back: ballots can be released as soon as casting closes, so on a large proposal the release cranks and the objection window run alongside each other. Both parameters are logic-tier policy, rewritten together by update_veto and bounded to [0, 1]; a threshold of 1 disables the veto outright, since a price can never fall below zero. A vetoed proposal is recorded as vetoed rather than quietly dropped. The settlement blob gained a second version carrying a vetoed flag beside the option weights, the ProposalTallied event appends it, and the interface labels that outcome Market Vetoed – distinct from a proposal that simply never reached 1.5 / N. (finalize_proposal, contracts/logic/src/lib.rs; curve_time_averages, contracts/core/src/caper_dao.rs.) What it answers is turnout suppression rather than plutocracy. A caper's bar is 1.5 / N of the weight actually cast, not of supply, and there is no quorum (/wiki/dao-governance/concepts/voting/quorum-and-threshold-design) to fail – so a hostile proposal that thins the electorate, by timing or by noise or by anything that keeps stake unescrowed, faces only a ratio of whoever turned up. The veto puts a second constituency behind the first. Not a larger electorate, but the one thing a low-turnout attacker cannot manufacture: the price the caper's own holders will still accept.

v2.0.2Add the reciprocal link to /blog/the-binding-vote. Measured this run: of the seven essays, the-binding-vote was the only one with zero inbound links from the wiki side, despite linking out to this page. An orphan passes every link check.–
1 block added
  • Added – Text at Block 9

    Further reading The Binding Vote (/blog/the-binding-vote) – why splitting the count from the deed, and leaving no executor to trust, is the thing an advisory vote and a multisig both fail to do.

v2.0.1Run #293: state the settlement-gas floor as the enforced invariant it is (update_fees asserts proposal_fee >= SETTLEMENT_GAS_BUDGET), correct the allowance/fee direction, attribute the release-crank cost figures to the profiler, and re-anchor two rotted source-line citations to their symbols.–
2 blocks modified
  • Modified – Text at Block 3

    Release, finalize, execute – o…s measured rather than chosen: profiled in a local ledger simulator on 15 August 2026, the release path costs roughl… 5 XRD the treasury reimburses (RELEASE_CHUNK, contracts/logic/src/lib.rs). A five-ballot crank measures about 5.6 XRD on the same harness and tips past that ceiling, leaving the settler to eat the overflow – which is why the chunk is three rather than five (RELEASE_CHUNK, contracts/logic/src/lib.rs; profile_release_scaling and profile_settlement_gas_is_reimbursed_by_treasury, contracts/logic/tests/profile.rs). Both are simulator measurements rather than observations of the deployed component. Release refuses to start whi…utive winners reach this step.

  • Modified – Text at Block 5

    Who pays to settle Every step…-proposal allowance of 500 XRD, deliberately the same figure as the default proposal fee that proposal already paid into that same treasury, so. The two figures match today, but not because the allowance was sized to the fee – the allowance is a contract constant, and it is the fee that is pinned to it. update_fees asserts proposal_fee >= SETTLEMENT_GAS_BUDGET, refusing any schedule that fails "proposal_fee must cover the settlement-gas budget", so the configured fee can be raised above the allowance but never cut below it. That floor, rather than a coincidence of defaults, is what guarantees a proposal funds its own sett…f what has already been spent.

v2.0.0Rewrite the settlement path for the ballot-era logic tier live since 2026-08-16: release/finalize replace crystallize/reclamp/settle, escrow custody replaces the min-clamp and the challenge window, corrected chunk size and allowance arithmetic, VOTE's stake-preparation step.–
5 blocks added, 4 blocks removed, 1 block modified, 3 blocks reordered
  • Moved – Text at Block 6
  • Modified – Text at Block 6

    The executive actions PAYOUT a…t lands in the treasury. VOTE is split acrossruns in two transactions and several manifest instructions… component mid-transaction. A first callpreliminary call escrows the treasury's stake in the target caper's ballot box, in its own transaction so the execution itself stays under the engine's cost-unit ceiling, and the execution refuses to burn its once-only guard if that stake is not there: an unstaked treasury ballot would close gracefully to a silent zero. The execution proper then hands the manifest the target…ather than under an admin key.

  • Moved – Text at Block 7
  • Moved – Text at Block 8
  • Removed – Text at Block 1 → Block 1

    Topic Carrying out a passed proposal Timeline Voting closes → crystallize (chunked tally) → execution delay (~10 min) → settle → execute Executive action kinds PAYOUT · INVEST · DIVEST · VOTE · UPGRADE ($CAPER only) Replay guards Two once-only flags — settled, then executed Settlement gas Treasury-reimbursed — up to 5 XRD per call against a 500 XRD per-proposal allowance Related Proposals (/wiki/governance/proposals) , Voting (/wiki/governance/voting) , Voting mechanisms (/wiki/governance/voting-mechanisms) , Proposal lifecycle (/wiki/dao-governance/concepts/voting/proposal-lifecycle)

  • Removed – Text at Block 2

    Once a proposal's voting window closes, resolution happens in public steps anyone can run: crystallize the ballots — fold them into an on-chain running count, in as many chunked transactions as the turnout needs, with no cap on how many members may vote — then, once the execution delay has elapsed (roughly ten minutes by default), settle the proposal to freeze the winner from that count, and finally submit the transaction that executes the winning option. The delay is a deliberate pause between the decision and the act — the same role a timelock plays in mainstream DAO governance (/wiki/dao-governance/concepts/voting/proposal-lifecycle) , giving members a window to react before an executive action lands.

  • Removed – Text at Block 3

    Crystallize, settle, execute — once-only guards Resolution is guarded at every step: the tally cursor only moves forward, each ballot is counted exactly once, and a proposal can never be settled twice or executed twice. Crystallize. Anyone can fold the next chunk of ballots into a persistent on-chain count. Each ballot carries a vote weight (/wiki/governance/voting) , and that weight is spread across the options the ballot ranked: an option placed at rank i receives (N − 1 − i) times the voter's weight, so a first choice counts most and a last choice counts nothing. The weight's holdings term is clamped to the smaller of what the voter held when they voted and what they hold now, and until settlement anyone can re-observe a counted ballot and ratchet its credit further down if that stake has since moved — selling after voting only ever shrinks a vote. Because the count persists across transactions, turnout has no ceiling. Settle. Settling reads the finished count and freezes the winner. The option with the greatest summed weight wins only if its share of the total weight cleared the 1.5 / N supermajority and it is not the no-execution option; otherwise the proposal finalizes with no winner. A count completed in a single pass after the execution delay elapsed settles immediately; any other count must first wait out a one-hour challenge window in which anyone can re-check its ballots. This step flips a settled flag and can run only once. Execute. With a winner frozen, execution flips a separate executed flag — the guard that stops the same winning action from being replayed. A settled proposal that did not pass has no winner to execute, and a legislative proposal (/wiki/governance/proposals) 's winner carries no on-chain action at all — so only executive winners reach this step.

  • Removed – Text at Block 4

    Who pays to settle Every step after voting closes is permissionless, and permissionless work still costs gas. A large proposal's settle path is not one transaction but dozens — a thousand-ballot proposal runs roughly fourteen crystallize chunks, roughly fourteen reclamp sweeps and a settle, at the contract's 75-ballot chunk size — and none of it is contingent on the proposal passing. Leaving that bill with whoever happens to click Settle taxes one member for a public good the whole caper consumes. That is the default almost everywhere else. In OpenZeppelin's Governor (https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/governance/Governor.sol) and in Compound's Governor Bravo (https://raw.githubusercontent.com/compound-finance/compound-protocol/master/contracts/Governance/GovernorBravoDelegate.sol) , execute is an ordinary payable function with no access control: anyone may call it once the proposal is queued, and the caller pays the gas from their own pocket with nothing coming back. In practice the proposer, a delegate or a bot absorbs it, and the cost appears in none of the governance ledgers surveyed in DAO governance operating costs (/wiki/dao-governance/concepts/analysis/dao-governance-operating-costs) . What that unpriced work costs when a DAO buys it from an automation vendor instead, and why it stays invisible when it does not, is on who pays to execute a passed proposal (/wiki/dao-governance/concepts/analysis/proposal-execution-costs) . A caper reimburses it instead. Each settle-path call draws up to 5 XRD from the treasury against a per-proposal allowance of 500 XRD — deliberately the same figure as the default proposal fee that proposal already paid into that same treasury, so a proposal funds its own settlement and can never cost the treasury more than it contributed. The allowance covers the measured thousand-voter path around four times over; past it the draw returns zero and the caller pays, so an unusually large proposal degrades rather than bricks. The per-call figure is a ceiling, not a charge: the engine refunds whatever a lock does not consume. The draw is a contingent fee lock, and that is load-bearing rather than a detail. A plain lock_fee credits the fee reserve immediately and survives an aborted transaction; a contingent lock never touches that balance (https://raw.githubusercontent.com/radixdlt/radixdlt-scrypto/main/radix-engine/src/system/system_modules/costing/fee_reserve.rs) and is charged only when the transaction commits. Without it, anyone could call a settle-path method, abort the transaction, and drain the treasury while the allowance counter rolled back every time. Because payment and allowance now move together, the worst a spammer gets is an allowance draining at the same rate real work would drain it. Where the draw rides differs by entry point, and the difference is deliberate. Settle and reclamp gas their read, so a sweep that finds nothing to ratchet down still pays the keeper who ran it — honest work that happens to find nothing is still work. Crystallize gasses its write, so calling it again once the tally is already complete writes nothing and draws nothing. The allowance ledger itself lives in the immortal state tier beside the funds, while the budget and the per-call ceiling are logic-tier policy: an UPGRADE (/wiki/governance/proposals) can retune what settlement costs without touching the record of what has already been spent.

  • Added – Text at Block 1 → Block 1

    Topic Carrying out a passed proposal Timeline Voting closes → execution delay (~10 min, ballots still arriving) → release ballots (3 per transaction) → finalize → execute Executive action kinds PAYOUT · INVEST · DIVEST · VOTE · UPGRADE ($CAPER only) Replay guards Two once-only flags: settled, then executed Settlement gas Treasury-reimbursed, up to 5 XRD per call against a 500 XRD per-proposal allowance Live logic tier CaperMain on Stokenet (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1cpn5xl5esqkj2f72zs3svxav3awqp4yu768zzwd8ye7au06lt7xlcr) , the ballot-era release/finalize path, activated 16 August 2026 Related Proposals (/wiki/governance/proposals) , Voting (/wiki/governance/voting) , Voting mechanisms (/wiki/governance/voting-mechanisms) , Proposal lifecycle (/wiki/dao-governance/concepts/voting/proposal-lifecycle)

  • Added – Text at Block 2

    A proposal's voting window closes on a clock, and an execution delay of the same length runs after it: ten minutes each on the live contract (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1cpn5xl5esqkj2f72zs3svxav3awqp4yu768zzwd8ye7au06lt7xlcr) today, both settable in the swappable logic tier. Ballots keep arriving through that delay. A member signs their ballot as a pre-authorization subintent during the voting window, and the settlement assembler packs those signatures into batched transactions submitted afterwards, so the timelock and the ballot-collection phase are the same window. Nothing can execute inside it, which is the role a timelock plays in mainstream DAO governance (/wiki/dao-governance/concepts/voting/proposal-lifecycle) . Once the delay expires, resolution happens in public steps anyone can run. Release hands the ballots to the immortal record a few at a time: each one writes its audit blob, banks the voter's escrowed vote fee, mints their soulbound vote token, and unlocks the stake that backed it. Finalize then freezes the winner from accumulators the ballot box has been summing since the first ballot landed. Finally, anyone submits the transaction that executes the winning option.

  • Added – Text at Block 3

    Release, finalize, execute – once-only guards Resolution is guarded at every step: the release cursor only moves forward, each ballot is released exactly once, and a proposal can never be finalized twice or executed twice. Release. Anyone can hand the next batch of ballots from the caper's ballot box to the immortal core. Batch size ships at three ballots per transaction, and that number is measured rather than chosen: the release path costs roughly 34.3M cost units of base plus 12.09M per voter, so three fit inside 80% of the engine's per-transaction ceiling at a fee of about 4.1 XRD, under the 5 XRD the treasury reimburses (RELEASE_CHUNK, contracts/logic/src/lib.rs). Release refuses to start while casting is still open and refuses to run after a proposal has settled, so the audit record is always written before the decision is frozen. A voter whose account refuses deposits gets a single-ballot fallback that lands the record and the fee but parks the token mint for them to claim later, rather than poisoning every ballot batched alongside it. Finalize. Finalizing reads the finished count and freezes the winner. It is O(1) in the electorate: there is no tally pass, because each ballot's Borda contribution was folded into the running accumulators the moment it was cast. The option with the greatest summed weight wins only if its share of the total weight cleared the 1.5 / N supermajority and it is not the no-execution option; otherwise the proposal finalizes with no winner. Every cast ballot must have been released first, and the immortal core enforces the same ordering from the other side by refusing new ballots once a settlement is recorded. This step flips a settled flag and can run only once. Execute. With a winner frozen, execution flips a separate executed flag, the guard that stops the same winning action from being replayed. A settled proposal that did not pass has no winner to execute, and a legislative proposal (/wiki/governance/proposals) 's winner carries no on-chain action at all, so only executive winners reach this step.

  • Added – Text at Block 4

    Custody replaced the clamp Until 16 August 2026 this page described a different apparatus, and the difference is worth recording because the old one was a real design that a live upgrade retired. A ballot used to be credited the smaller of what the voter held when they voted and what they held when the tally ran; anyone could permissionlessly re-clamp a counted ballot downward, and a tally that was not taken in a single pass had to sit out a one-hour challenge window before it could settle. Snapshots, caps, clamping and the challenge window are all gone. What replaced them is physical custody. A member stakes governance tokens into the caper's ballot box before voting; a ballot's weight term is that vaulted stake, and casting refcount-locks it. The vault refuses to return a stake while any ballot it backs is still unreleased, so the same tokens can never back two counted ballots and a voter cannot sell what they voted with. Double-vote prevention became a property of where the tokens are rather than a rule about what the tally re-reads, which is why the re-clamp and the challenge window had nothing left to do. The swap itself went through the mechanism this page describes at the bottom. Proposal P-CAPER-7CD71F on the $CAPER (/wiki/foundations/what-is-a-caper) caper carried an UPGRADE option naming the new logic component, and its execution transaction (https://stokenet-dashboard.radixdlt.com/transaction/txid_tdx_2_1gyn66jhux2qcx7qgrfyt4e7m0pkq8yhymauqn6sgh3ghuk7culasxshjz3) called execute_proposal_upgrade and execute_proposal_upgrade_activate back to back on 16 August 2026 at 09:27:54 UTC. The registry (https://stokenet-dashboard.radixdlt.com/component/component_tdx_2_1czd3cm28fkq6f08c9y52w0tw56p4k6dz5h3uf76jrmpgm8a8ashuey) has pointed current_main at the new component ever since. Both calls fitted in one manifest because Stokenet's registry carries a zero upgrade delay; on a network with a non-zero delay the propose and the activate are separated by it.

  • Added – Text at Block 5

    Who pays to settle Every step after the cast window closes is permissionless, and permissionless work still costs gas. A large proposal's release path is not one transaction but hundreds. At three ballots a transaction, a thousand-ballot proposal is roughly 334 release calls plus one finalize, and none of it is contingent on the proposal passing. Leaving that bill with whoever happens to click Settle taxes one member for a public good the whole caper consumes. That is the default almost everywhere else. In OpenZeppelin's Governor (https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/governance/Governor.sol) and in Compound's Governor Bravo (https://raw.githubusercontent.com/compound-finance/compound-protocol/master/contracts/Governance/GovernorBravoDelegate.sol) , execute is an ordinary payable function with no access control: anyone may call it once the proposal is queued, and the caller pays the gas from their own pocket with nothing coming back. In practice the proposer, a delegate or a bot absorbs it, and the cost appears in none of the governance ledgers surveyed in DAO governance operating costs (/wiki/dao-governance/concepts/analysis/dao-governance-operating-costs) . What that unpriced work costs when a DAO buys it from an automation vendor instead, and why it stays invisible when it does not, is on who pays to execute a passed proposal (/wiki/dao-governance/concepts/analysis/proposal-execution-costs) . A caper reimburses it instead. Each call draws up to 5 XRD from the treasury against a per-proposal allowance of 500 XRD, deliberately the same figure as the default proposal fee that proposal already paid into that same treasury, so a proposal funds its own settlement and can never cost the treasury more than it contributed. The allowance is one pool shared by the whole path: the batched cast transactions draw on it too, at up to 8 XRD each. At 5 XRD a release call it covers about a hundred of them, so a proposal past roughly three hundred ballots exhausts it and the remaining callers pay their own way. That degrades rather than bricks, and the vote fees banked at release, 100 XRD a ballot on the live contract, return far more to the treasury than the allowance can ever spend. The draw is a contingent fee lock, and that is load-bearing rather than a detail. A plain lock_fee credits the fee reserve immediately and survives an aborted transaction; a contingent lock never touches that balance (https://raw.githubusercontent.com/radixdlt/radixdlt-scrypto/main/radix-engine/src/system/system_modules/costing/fee_reserve.rs) and is charged only when the transaction commits. Without it, anyone could call a settle-path method, abort the transaction, and drain the treasury while the allowance counter rolled back every time. Because payment and allowance now move together, the worst a spammer gets is an allowance draining at the same rate real work would drain it. The draw rides each call's proposal read, so a release that finds nothing left to release still pays the keeper who ran it: honest work that happens to find nothing is still work. The allowance ledger itself lives in the immortal state tier beside the funds, while the budget and the per-call ceiling are logic-tier policy, so an UPGRADE (/wiki/governance/proposals) can retune what settlement costs without touching the record of what has already been spent.

v1.3.0DIVEST documented and TEXT removed, both read off contracts at HEAD (76d7bf5). execute_proposal_divest: begin_execution + treasury_withdraw + sell into the target's curve + redeposit, kind-gated to 4, $XRD excluded, aborts if the holding fell below the voted amount, sell asserts the bucket is the target's own resource, emits SellToken. Infobox and the state-tier/logic-tier split updated; the 'TEXT winners are legislative' sentence corrected — legislative is a proposal-level flag, not an option kind.–
4 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr…(~10 min) → settle → execute AExecutive action kinds TEXT (legislative), PAYOUT, · INVEST, · DIVEST · VOTE, · UPGRADE ($CAPER only) Replay guards Two once-only …pts/voting/proposal-lifecycle)

  • Modified – Text at Block 3

    Crystallize, settle, execute —…has no winner to execute, and TEXT winners are legislative — they carry no on-chain action at all (see Pa legislative proposals (/wiki/governance/proposals) )'s winner carries no on-chain action at all — so only executive winners reach this step.

  • Modified – Text at Block 5

    The executive actions PAYOUT a… entire execution rolls back. DIVEST is INVEST run backwards, and it is the newest of the five. Execution withdraws the voted-on amount of the target caper's token from this treasury, sells it into that caper's curve (/wiki/markets/bonding-curve) , and deposits the XRD — again entirely inside the contract's own call frame, so the tokens never touch the worktop. Two guards ride it. The withdrawal aborts outright if the treasury's holding has fallen below the amount that passed, because executing a smaller trade than the one that was voted on would break the frozen-winner contract; and the sell asserts the bucket handed over is the target caper's own resource, so a stale address aborts rather than selling the wrong thing. The $XRD caper is excluded by name — it has no curve to sell into. Where INVEST fuses its guard and its withdrawal into one state-tier call, DIVEST composes two generic ones the immortal tier already exposes, paying an extra cross-package hop to avoid redeploying that tier; the whole action therefore shipped through the ordinary UPGRADE path with no per-caper migration. Its sell leg emits the same event an ordinary sale does, so it appears on the target caper's trade feed (/wiki/markets/trading) with no divest-specific arithmetic anywhere off-chain. UPGRADE is the one action rese…ather than under an admin key.

  • Modified – Text at Block 6

    Where each action runs — state…cutor can redirect it. INVEST, DIVEST, VOTE and UPGRADE carry no acc…r the proposal ledger at risk.

v1.2.0PAYOUT routes through an account locker, not a direct deposit, so a recipient's deposit rules cannot abort execution (contracts/core/src/dao_treasury.rs transfer). Adds the inbound link for the deepened markets/raising-funds.–
1 block added, 1 block removed
  • Removed – Text at Block 5

    The executive actions PAYOUT and INVEST each execute in a single call. PAYOUT transfers the chosen currency and amount out of the treasury to the stored, voted-on recipient. INVEST runs its whole withdraw → buy (/wiki/markets/bonding-curve) → deposit inside the contract's own call frame, so the treasury XRD it spends never touches the transaction worktop — a public executor cannot take part of the withdrawal and pocket the rest. The execution step asserts the bucket handed back is the target caper's token, in a positive amount, before it lands in the treasury. VOTE is split across several manifest instructions, because it must re-enter a separate component mid-transaction. A first call hands the manifest the target token, the XRD vote fee, and the treasury admin badge; the manifest presents that badge as a proof to authorise the treasury's vote into the target caper's proposal, routed through a fresh top-level frame; a final call returns the badge to its vault. Because the whole sequence is one atomic transaction, the admin badge never survives a transaction boundary outside the vault — if any step fails, the entire execution rolls back. UPGRADE is the one action reserved for the $CAPER (/wiki/foundations/what-is-a-caper) caper itself. Its winning option swaps the platform's live logic tier through the registry, in a two-phase propose-then-activate sequence — this is the mechanism by which the whole system upgrades itself under governance rather than under an admin key.

  • Added – Text at Block 5

    The executive actions PAYOUT and INVEST each execute in a single call. PAYOUT transfers the chosen currency and amount out of the treasury to the stored, voted-on recipient — by way of an account locker (https://docs.radixdlt.com/docs/locker) rather than a direct deposit, so a recipient whose account rejects the resource cannot abort the execution; the payment simply waits to be claimed. That, and the rest of the treasury's plumbing, is covered under raising funds (/wiki/markets/raising-funds) . INVEST runs its whole withdraw → buy (/wiki/markets/bonding-curve) → deposit inside the contract's own call frame, so the treasury XRD it spends never touches the transaction worktop — a public executor cannot take part of the withdrawal and pocket the rest. The execution step asserts the bucket handed back is the target caper's token, in a positive amount, before it lands in the treasury. VOTE is split across several manifest instructions, because it must re-enter a separate component mid-transaction. A first call hands the manifest the target token, the XRD vote fee, and the treasury admin badge; the manifest presents that badge as a proof to authorise the treasury's vote into the target caper's proposal, routed through a fresh top-level frame; a final call returns the badge to its vault. Because the whole sequence is one atomic transaction, the admin badge never survives a transaction boundary outside the vault — if any step fails, the entire execution rolls back. UPGRADE is the one action reserved for the $CAPER (/wiki/foundations/what-is-a-caper) caper itself. Its winning option swaps the platform's live logic tier through the registry, in a two-phase propose-then-activate sequence — this is the mechanism by which the whole system upgrades itself under governance rather than under an admin key.

v1.1.1Sweep #207 (governance rotation): repoint the dead internal link /wiki/caper/CAPER — no such page exists and caper carries no redirect table, so it 404s — to /wiki/foundations/what-is-a-caper.–
1 block modified
  • Modified – Text at Block 5

    The executive actions PAYOUT a…served for the $CAPER (/wiki/caper/CAPERfoundations/what-is-a-caper) caper itself. Its winning o…ather than under an admin key.

v1.1.0Inbound: hands the industry-side analysis of caller-paid execution off to the new proposal-execution-costs page, keeping this page on the Caper mechanic.–
1 block modified
  • Modified – Text at Block 4

    Who pays to settle Every step…-governance-operating-costs) . What that unpriced work costs when a DAO buys it from an automation vendor instead, and why it stays invisible when it does not, is on who pays to execute a passed proposal (/wiki/dao-governance/concepts/analysis/proposal-execution-costs) . A caper reimburses it instea…f what has already been spent.

v1.1.0Add 'Who pays to settle' — treasury-funded settlement gas (contingent lock, 5 XRD/call, 500 XRD per-proposal allowance), verified against contracts/logic/src/lib.rs and contracts/core/src/dao_treasury.rs–
1 block added, 1 block modified, 3 blocks reordered
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr…ags — settled, then executed Settlement gas Treasury-reimbursed — up to 5 XRD per call against a 500 XRD per-proposal allowance Related Proposals (/wiki/gove…pts/voting/proposal-lifecycle)

  • Moved – Text at Block 5
  • Moved – Text at Block 6
  • Moved – Text at Block 7
  • Added – Text at Block 4

    Who pays to settle Every step after voting closes is permissionless, and permissionless work still costs gas. A large proposal's settle path is not one transaction but dozens — a thousand-ballot proposal runs roughly fourteen crystallize chunks, roughly fourteen reclamp sweeps and a settle, at the contract's 75-ballot chunk size — and none of it is contingent on the proposal passing. Leaving that bill with whoever happens to click Settle taxes one member for a public good the whole caper consumes. That is the default almost everywhere else. In OpenZeppelin's Governor (https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/governance/Governor.sol) and in Compound's Governor Bravo (https://raw.githubusercontent.com/compound-finance/compound-protocol/master/contracts/Governance/GovernorBravoDelegate.sol) , execute is an ordinary payable function with no access control: anyone may call it once the proposal is queued, and the caller pays the gas from their own pocket with nothing coming back. In practice the proposer, a delegate or a bot absorbs it, and the cost appears in none of the governance ledgers surveyed in DAO governance operating costs (/wiki/dao-governance/concepts/analysis/dao-governance-operating-costs) . A caper reimburses it instead. Each settle-path call draws up to 5 XRD from the treasury against a per-proposal allowance of 500 XRD — deliberately the same figure as the default proposal fee that proposal already paid into that same treasury, so a proposal funds its own settlement and can never cost the treasury more than it contributed. The allowance covers the measured thousand-voter path around four times over; past it the draw returns zero and the caller pays, so an unusually large proposal degrades rather than bricks. The per-call figure is a ceiling, not a charge: the engine refunds whatever a lock does not consume. The draw is a contingent fee lock, and that is load-bearing rather than a detail. A plain lock_fee credits the fee reserve immediately and survives an aborted transaction; a contingent lock never touches that balance (https://raw.githubusercontent.com/radixdlt/radixdlt-scrypto/main/radix-engine/src/system/system_modules/costing/fee_reserve.rs) and is charged only when the transaction commits. Without it, anyone could call a settle-path method, abort the transaction, and drain the treasury while the allowance counter rolled back every time. Because payment and allowance now move together, the worst a spammer gets is an allowance draining at the same rate real work would drain it. Where the draw rides differs by entry point, and the difference is deliberate. Settle and reclamp gas their read, so a sweep that finds nothing to ratchet down still pays the keeper who ran it — honest work that happens to find nothing is still work. Crystallize gasses its write, so calling it again once the tally is already complete writes nothing and draws nothing. The allowance ledger itself lives in the immortal state tier beside the funds, while the budget and the per-call ceiling are logic-tier policy: an UPGRADE (/wiki/governance/proposals) can retune what settlement costs without touching the record of what has already been spent.

v1.0.1Settlement copy → chunked crystallization: no voter cap, min-clamp + reclamp challenge at the tally, O(options) settle; INVEST asserts run at execution, not settling–
4 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr…osal Timeline Voting closes → crystallize (chunked tally) → execution delay (~10 min) → settle (re-tally) → execute Action kinds TEXT …pts/voting/proposal-lifecycle)

  • Modified – Text at Block 2

    Once a proposal's voting window closes and its execution delay has elapsed (roughly ten minutes by default), resolution happens in two public steps: anyone can first settle the proposal — an on-chain re-tally that, resolution happens in public steps anyone can run: crystallize the ballots — fold them into an on-chain running count, in as many chunked transactions as the turnout needs, with no cap on how many members may vote — then, once the execution delay has elapsed (roughly ten minutes by default), settle the proposal to freezes the winner — and thenfrom that count, and finally submit the transaction that executes thate winning option. The delay is …ore an executive action lands.

  • Modified – Text at Block 3

    Settle, thenCrystallize, settle, execute — two once-only guards Resolution is split across two callsguarded at every step: the tally cursor only moves forward, each withballot its own replay guard, socounted exactly once, and a proposal can never be tallisettled twice or executed twice. Settle. Settling re-runs the whole balloCrystallize. Anyone can fold the next chunk of ballots into a persistent on-chain count. Each ballot carries a vote … a last choice counts nothing. The weight's holdings term is clamped to the smaller of what the voter held when they voted and what they hold now, and until settlement anyone can re-observe a counted ballot and ratchet its credit further down if that stake has since moved — selling after voting only ever shrinks a vote. Because the count persists across transactions, turnout has no ceiling. Settle. Settling reads the finished count and freezes the winner. The option with the greatest …osal finalizes with no winner. A count completed in a single pass after the execution delay elapsed settles immediately; any other count must first wait out a one-hour challenge window in which anyone can re-check its ballots. This step flips a settled fla…utive winners reach this step.

  • Modified – Text at Block 4

    The executive actions PAYOUT a…awal and pocket the rest. The settlingexecution step asserts the bucket hande…ather than under an admin key.

v1.0.0Deepen execution: split resolve into the two-phase settle→execute with two once-only guards (settled/executed), add the ranked-tally detail (N−1−rank weighting, 1.5/N + no-execution gate), add the UPGRADE action kind, and add a state-tier vs logic-tier execution-split section. All contract-verified against contracts/logic/src/lib.rs (settle_proposal, execute_proposal_*) + contracts/core/src/caper_dao.rs (record_settlement, mark_executed, execute_payout).–
6 blocks added, 5 blocks removed
  • Removed – Text at Block 1 → Block 1

    Topic Carrying out a passed proposal Timeline Voting closes → execution delay (~10 min) → execution opens Executive actions PAYOUT and INVEST — single call; VOTE — multi-step manifest Related Proposals (/wiki/governance/proposals) , Voting (/wiki/governance/voting) , Proposal lifecycle (/wiki/daos/concepts/voting/proposal-lifecycle)

  • Removed – Text at Block 2

    Once a proposal's voting window closes and its execution delay has elapsed (roughly ten minutes by default), anyone can submit the transaction that carries out the winning option. The delay is a deliberate pause between the decision and the act — the same role a timelock plays in mainstream DAO governance (/wiki/daos/concepts/voting/proposal-lifecycle) , giving members a window to react before an executive action lands.

  • Removed – Text at Block 3

    The resolve gate Execution first re-tallies the ballot on-chain and checks that the leading option cleared the 1.5 / N supermajority. If it did not — or if the no-execution option won — the proposal simply finalizes with no action. A proposal can be resolved only once.

  • Removed – Text at Block 4

    Single call vs multi-step TEXT options are legislative — they carry no on-chain action, so there is nothing to execute. A winning TEXT proposal stands as a recorded signal (see Proposals (/wiki/governance/proposals) ); only executive options reach the treasury. PAYOUT and INVEST each execute in a single call. PAYOUT transfers the chosen currency and amount out of the treasury. INVEST runs its whole withdraw → buy (/wiki/markets/bonding-curve) → deposit inside the contract's own call frame, so the treasury XRD it spends never touches the transaction worktop — a public executor cannot take part of the withdrawal and pocket the rest. The settling step asserts the bucket handed back is the target caper's token, in a positive amount, before it lands in the treasury. VOTE is the one action split across several manifest instructions, because it must re-enter a separate component mid-transaction. A first call hands the manifest the target token, the XRD vote fee, and the treasury admin badge; the manifest presents that badge as a proof to authorise the treasury's vote into the target caper's proposal, routed through a fresh top-level frame; a final call returns the badge to its vault. Because the whole sequence is one atomic transaction, the admin badge never survives a transaction boundary outside the vault — if any step fails, the entire execution rolls back.

  • Removed – Text at Block 5

    Hand-rolling an executor manifest If you ever build an executor manifest by hand, end it with a try_deposit_*_or_abort: the Radix Engine's General transaction classifier only whitelists the _or_abort deposit variants, and the _or_refund forms make the wallet display a "Complex transaction" warning instead of a clean summary.

  • Added – Text at Block 1 → Block 1

    Topic Carrying out a passed proposal Timeline Voting closes → execution delay (~10 min) → settle (re-tally) → execute Action kinds TEXT (legislative), PAYOUT, INVEST, VOTE, UPGRADE Replay guards Two once-only flags — settled, then executed Related Proposals (/wiki/governance/proposals) , Voting (/wiki/governance/voting) , Voting mechanisms (/wiki/governance/voting-mechanisms) , Proposal lifecycle (/wiki/dao-governance/concepts/voting/proposal-lifecycle)

  • Added – Text at Block 2

    Once a proposal's voting window closes and its execution delay has elapsed (roughly ten minutes by default), resolution happens in two public steps: anyone can first settle the proposal — an on-chain re-tally that freezes the winner — and then submit the transaction that executes that winning option. The delay is a deliberate pause between the decision and the act — the same role a timelock plays in mainstream DAO governance (/wiki/dao-governance/concepts/voting/proposal-lifecycle) , giving members a window to react before an executive action lands.

  • Added – Text at Block 3

    Settle, then execute — two once-only guards Resolution is split across two calls, each with its own replay guard, so a proposal can never be tallied twice or executed twice. Settle. Settling re-runs the whole ballot on-chain. Each ballot carries a vote weight (/wiki/governance/voting) , and that weight is spread across the options the ballot ranked: an option placed at rank i receives (N − 1 − i) times the voter's weight, so a first choice counts most and a last choice counts nothing. The option with the greatest summed weight wins only if its share of the total weight cleared the 1.5 / N supermajority and it is not the no-execution option; otherwise the proposal finalizes with no winner. This step flips a settled flag and can run only once. Execute. With a winner frozen, execution flips a separate executed flag — the guard that stops the same winning action from being replayed. A settled proposal that did not pass has no winner to execute, and TEXT winners are legislative — they carry no on-chain action at all (see Proposals (/wiki/governance/proposals) ) — so only executive winners reach this step.

  • Added – Text at Block 4

    The executive actions PAYOUT and INVEST each execute in a single call. PAYOUT transfers the chosen currency and amount out of the treasury to the stored, voted-on recipient. INVEST runs its whole withdraw → buy (/wiki/markets/bonding-curve) → deposit inside the contract's own call frame, so the treasury XRD it spends never touches the transaction worktop — a public executor cannot take part of the withdrawal and pocket the rest. The settling step asserts the bucket handed back is the target caper's token, in a positive amount, before it lands in the treasury. VOTE is split across several manifest instructions, because it must re-enter a separate component mid-transaction. A first call hands the manifest the target token, the XRD vote fee, and the treasury admin badge; the manifest presents that badge as a proof to authorise the treasury's vote into the target caper's proposal, routed through a fresh top-level frame; a final call returns the badge to its vault. Because the whole sequence is one atomic transaction, the admin badge never survives a transaction boundary outside the vault — if any step fails, the entire execution rolls back. UPGRADE is the one action reserved for the $CAPER (/wiki/caper/CAPER) caper itself. Its winning option swaps the platform's live logic tier through the registry, in a two-phase propose-then-activate sequence — this is the mechanism by which the whole system upgrades itself under governance rather than under an admin key.

  • Added – Text at Block 5

    Where each action runs — state tier vs logic tier A caper (/wiki/foundations/what-is-a-caper) 's contract is split into an immortal state tier that holds the treasury and the durable proposal record, and a swappable logic tier that carries the math and the executive plumbing. Which tier performs a winner depends on what the action touches. PAYOUT executes inside the state tier, because the voted-on recipient is a Global<Account> that only stays invokable as a stable substate reference — it cannot be handed to the logic tier and called there. The state tier therefore performs the transfer to the stored recipient itself, and no executor can redirect it. INVEST, VOTE and UPGRADE carry no account reference, so the logic tier drives them, reading back only the frozen typed option from state. That division is why an upgrade can replace the entire logic tier without ever putting the treasury or the proposal ledger at risk.

  • Added – Text at Block 6

    Hand-rolling an executor manifest If you ever build an executor manifest by hand, end it with a try_deposit_*_or_abort: the Radix Engine's General transaction classifier only whitelists the _or_abort deposit variants, and the _or_refund forms make the wallet display a "Complex transaction" warning instead of a clean summary.

v1.0.0Repoint 1 taxonomy-split link(s) to canonical daos/* paths–
2 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr… Proposal lifecycle (/wiki/daos/concepts/voting/proposal-lifecycle)

  • Modified – Text at Block 2

    Once a proposal's voting windo…ream DAO governance (/wiki/daos/concepts/voting/proposal-lifecycle) , giving m…ore an executive action lands.

v1.0.0Correct execution model: INVEST is a single call (H2 worktop-skim fix), only VOTE is multi-step; TEXT is legislative with no execute path. Added skim/atomicity safety notes + markets internal link. Verified vs contract source.–
2 blocks modified
  • Modified – Text at Block 1 → Block 1

    Topic Carrying out a passed pr… (~10 min) → execution opens One transaction TEXT, PAYOUT Two-phase INVEST, VOTEExecutive actions PAYOUT and INVEST — single call; VOTE — multi-step manifest Related Proposals (/wiki/go…o/concepts/proposal-lifecycle)

  • Modified – Text at Block 4

    One transaction vs two-phase For TEXT and PAYOUT,Single call vs multi-step TEXT options are legislative — they carry no on-chain action, so there is nothing to execute. A winning TEXT proposal stands as a recorded signal (see Proposals (/wiki/governance/proposals) ); only executive options reach the treasury. PAYOUT and INVEST each executione isn a single call: the manifest invokes the relevant treasury method and finalizes the proposal. INVEST and VOTE are split across two top-level frames in one manifest. PAYOUT transfers the chosen currency and amount out of the treasury. INVEST runs its whole withdraw → buy (/wiki/markets/bonding-curve) → deposit inside the contract's own call frame, so the treasury XRD it spends never touches the transaction worktop — a public executor cannot take part of the withdrawal and pocket the rest. The settling step asserts the bucket handed back is the target caper's token, in a positive amount, before it lands in the treasury. VOTE is the one action split across several manifest instructions, because eachit must hand assets or a badge to a foreign component mid-transaction: - A phase-1 call returns the buckets and badges required (e.g. XRD from the treasury for INVEST, or the treasury admin badge for VOTE). - A middle step invokes main.buy_token (INVEST) or DaoTre-enter a separate component mid-transaction. A first call hands the manifest the target token, the XRD vote fee, and the treasury admin badge; the manifest presents that badge as a proof to authorise the treasury.'s vote_via_main (VOTE) in a fresh frame. - A into the target caper's proposal, routed through a fresh top-level frame; a finishal call srettles state and emits the executed event. For VOTE, the treasury admin badge is returned to the treasury vault before this step endsurns the badge to its vault. Because the whole sequence is one atomic transaction, the admin badge never survives a transaction boundary outside the vault — if any step fails, the entire execution rolls back.

v1.0.0Deepen: add the execution-delay timeline (~10 min default), the resolve/supermajority gate, and frame the delay as a timelock analogue; keep the two-phase INVEST/VOTE detail + or_abort note.–
5 blocks added
  • Added – Text at Block 1 → Block 1

    Topic Carrying out a passed proposal Timeline Voting closes → execution delay (~10 min) → execution opens One transaction TEXT, PAYOUT Two-phase INVEST, VOTE Related Proposals (/wiki/governance/proposals) , Voting (/wiki/governance/voting) , Proposal lifecycle (/wiki/dao/concepts/proposal-lifecycle)

  • Added – Text at Block 2

    Once a proposal's voting window closes and its execution delay has elapsed (roughly ten minutes by default), anyone can submit the transaction that carries out the winning option. The delay is a deliberate pause between the decision and the act — the same role a timelock plays in mainstream DAO governance (/wiki/dao/concepts/proposal-lifecycle) , giving members a window to react before an executive action lands.

  • Added – Text at Block 3

    The resolve gate Execution first re-tallies the ballot on-chain and checks that the leading option cleared the 1.5 / N supermajority. If it did not — or if the no-execution option won — the proposal simply finalizes with no action. A proposal can be resolved only once.

  • Added – Text at Block 4

    One transaction vs two-phase For TEXT and PAYOUT, execution is a single call: the manifest invokes the relevant treasury method and finalizes the proposal. INVEST and VOTE are split across two top-level frames in one manifest, because each must hand assets or a badge to a foreign component mid-transaction: - A phase-1 call returns the buckets and badges required (e.g. XRD from the treasury for INVEST, or the treasury admin badge for VOTE). - A middle step invokes main.buy_token (INVEST) or DaoTreasury.vote_via_main (VOTE) in a fresh frame. - A finish call settles state and emits the executed event. For VOTE, the treasury admin badge is returned to the treasury vault before this step ends.

  • Added – Text at Block 5

    Hand-rolling an executor manifest If you ever build an executor manifest by hand, end it with a try_deposit_*_or_abort: the Radix Engine's General transaction classifier only whitelists the _or_abort deposit variants, and the _or_refund forms make the wallet display a "Complex transaction" warning instead of a clean summary.