Documentation
Deep Dives
Governance

Governance and Conway Era

Conway era introduces significant on-chain governance features to the Cardano blockchain, as outlined in CIP-1694 (opens in a new tab). These features enable ADA holders to participate in on-chain decisions through a system of delegation and direct voting.

💡

For all operations, you'll need a registered stake address. Learn more about stake address registration here.

ADA Holders

As an ADA holder, you can participate in on-chain governance by delegating your voting power to a DRep or becoming a DRep yourself.

Delegate Voting Power

You can delegate your voting power to a trusted Delegated Representative (DRep). If you have a DRep ID (starts with drep1...), convert it to a Credential:

import { drepIDToCredential } from "@lucid-evolution/lucid";
 
// Convert DRep ID to Credential
const drepId = "drep1...";
const drepCredential = drepIDToCredential(drepId);
 
// Use in transaction
await lucid
  .newTx()
  .delegate.VoteToDRep(rewardAddress, drepCredential)
  .complete();

Convenience functions for common governance operations:

Register stake address & Delegate to DRep:

await lucid
  .newTx()
  .registerAndDelegate.ToDrep(rewardAddress, drepCredential)
  .complete();

Register stake address & Delegate to stake pool & DRep:

await lucid
  .newTx()
  .registerAndDelegate.ToPoolAndDRep(rewardAddress, poolId, drepCredential)
  .complete();

Delegate to stake pool & DRep:

await lucid
  .newTx()
  .delegate.VoteToPoolAndDrep(rewardAddress, poolId, drepCredential)
  .complete();

Putting it all together

Here's a complete example of delegating to a DRep:

import { Lucid, Blockfrost, drepIDToCredential } from "@lucid-evolution/lucid";
 
// Initialize Lucid
const lucid = await Lucid(
  new Blockfrost(
    "https://cardano-mainnet.blockfrost.io/api/v0",
    "<blockfrost-api-key>"
  ),
  "Mainnet"
);
 
// Select wallet
lucid.selectWallet.fromPrivateKey(privateKey);
 
// Get your reward address
const rewardAddress = await lucid.wallet().rewardAddress();
 
// Convert DRep ID to credential
const drepId = "drep1...";
const drepCredential = drepIDToCredential(drepId);
 
// Build, sign and submit transaction
const tx = await lucid
  .newTx()
  .delegate.VoteToDRep(rewardAddress, drepCredential) // or use a predefined strategy
  .complete();
 
const signedTx = await tx.sign.withWallet().complete();
const txHash = await signedTx.submit();

Understanding Delegation Certificates

When you delegate your voting power, Evolution library creates a certificate that's included in your transaction. Behind the scenes, this is handled by the Certificate.new_vote_deleg_cert method in CML. The certificate contains:

  • Stake credential derived from your reward address
  • DRep you're delegating to
  • Voting strategy (whether a specific DRep, Always Abstain, or Always No Confidence)