Evolution SDK
Governance

Proposals

Submit governance proposals on Cardano

Proposals

Governance proposals submit actions for the community to vote on. The deposit is automatically fetched from protocol parameters and refunded to your reward account when the proposal is finalized.

Submitting a Proposal

import { , , , ,  } from "@evolution-sdk/evolution"

const  = .()
  .({
    : "https://cardano-preprod.blockfrost.io/api/v0",
    : ..!
  })
  .({ : ..!, : 0 })

// Governance action — e.g. new GovernanceAction.InfoAction() for informational proposals.
// Other types: ParameterChangeAction, HardForkInitiationAction,
// TreasuryWithdrawalsAction, NoConfidenceAction, UpdateCommitteeAction, NewConstitutionAction
declare const : .
declare const : . // your stake reward account — deposit refunded here
declare const : . // metadata URL + content hash describing the proposal

const  = await 
  .()
  .({
    ,
    ,
    
  })
  .()

const  = await .()
await .()

The govActionDeposit is deducted automatically during transaction balancing.

Governance Action Types

ActionDescription
Protocol Parameter UpdateModify network parameters
Hard Fork InitiationInitiate a hard fork
Treasury WithdrawalWithdraw from the treasury
No ConfidenceExpress no confidence in the committee
New ConstitutionPropose a new constitution
Update CommitteeChange committee membership
Info ActionInformational proposal (no on-chain effect)

Multiple Proposals

Submit multiple proposals in a single transaction by chaining .propose():

import { , , , ,  } from "@evolution-sdk/evolution"

const  = .()
  .({
    : "https://cardano-preprod.blockfrost.io/api/v0",
    : ..!
  })
  .({ : ..!, : 0 })

declare const : .
declare const : .
declare const : .
declare const : .
declare const : .

const  = await 
  .()
  .({ : , , :  })
  .({ : , , :  })
  .()

const  = await .()
await .()

Guardrail Script

When the constitution defines a guardrail script (as on mainnet), ParameterChangeAction and TreasuryWithdrawalsAction must reference it in policyHash and run it under the propose purpose. For a Plutus guardrail, pass a redeemer to .propose() and provide the script with .attachScript(), a reference input via .readFrom(), or a spent input that carries it:

import { , , , , , , ,  } from "@evolution-sdk/evolution"

const  = .()
  .({
    : "https://cardano-preprod.blockfrost.io/api/v0",
    : ..!
  })
  .({ : ..!, : 0 })

declare const : . // the constitution's guardrail script
declare const : .
declare const : .

const  = new .({
  : new ([[, 1_000_000_000n]]),
  : .()
})

const  = await 
  .()
  .({ , , , : .(0n, []) })
  .({ :  })
  .()

const  = await .()
await .()

The redeemer is placed at the proposal's index in the transaction, so guardrail-checked proposals can be combined with other proposals in one transaction. Its data must be what the guardrail script expects. The mainnet guardrail does not inspect it. Static and batch redeemers are supported. Self redeemers are not, since a proposal spends no input. A native-script guardrail needs no redeemer, and one passed for it is dropped. The build fails if a proposal with a Plutus policyHash has no redeemer, or if its guardrail script is neither attached nor carried by a reference or spent input.

Next Steps

On this page