Skip to main content

Register a Stake Pool with Metadata

Make sure you have access to:

payment.vkeypayment verification key
payment.skeypayment signing key
stake.vkeystaking verification key
stake.skeystaking signing key
stake.addrregistered stake address
payment.addrfunded address linked to stake
cold.vkeycold verification key
cold.skeycold signing key
cold.counterissue counter
node.certoperational certificate
kes.vkeyKES verification key
kes.skeyKES signing key
vrf.vkeyVRF verification key
vrf.skeyVRF signing key

Registering your stake pool requires:

  • Create JSON file with your metadata and store it in the node and in a url you maintain
  • Get the hash of your JSON file
  • Generate the stake pool registration certificate
  • Create a delegation certificate pledge
  • Submit the certificates to the blockchain

WARNING: Generating the stake pool registration certificate and the delegation certificate requires the cold keys. So, when doing this on mainnet you may want to generate these certificates in your local machine taking the proper security measures to avoid exposing your cold keys to the internet.

Create a JSON file with your pool's metadata

"name": "TestPool",
"description": "The pool that tests all the pools",
"ticker": "TEST",
"homepage": ""

Store the file on your web server. For example You must store your pool metadata on reliable server, in case if metadata files will not be available then your pool might disappear from wallets and potential delegators will not be able to find it.

Get the hash of your metadata file uploaded to server:

These command will return hash value of json file, what we just uploaded to our web server. Keep in mind that you need to put your own address instead

cardano-cli stake-pool metadata-hash --pool-metadata-file <(curl -s -L -k


Generate Stake pool registration certificate

cardano-cli stake-pool registration-certificate \
--cold-verification-key-file cold.vkey \
--vrf-verification-key-file vrf.vkey \
--pool-reward-account-verification-key-file stake.vkey \
--pool-owner-stake-verification-key-file stake.vkey \
--mainnet \
--pool-relay-ipv4 <RELAY NODE PUBLIC IP> \
--pool-relay-port <RELAY NODE PORT> \
--metadata-url \
--metadata-hash <POOL METADATA HASH> \
--out-file pool-registration.cert
cold-verification-key-fileverification cold key
vrf-verification-key-fileverification VRS key
pool-pledgepledge lovelace
pool-costoperational costs per epoch lovelace
pool-marginoperator margin
pool-reward-account-verification-key-fileverification staking key for the rewards
pool-owner-staking-verification-key-fileverification staking keys for the pool owners
pool-relay-ipv4relay node ip address
metadata-urlurl of your json file
metadata-hashthe hash of pools json metadata file
out-fileoutput file to write the certificate to

You can use a different key for the rewards, and can provide more than one owner key if there were multiple owners who share the pledge.

The pool-registration.cert file should look like this:

type: CertificateShelley
description: Stake Pool Registration Certificate

Generate delegation certificate pledge

To honor your pledge, create a delegation certificate:

cardano-cli stake-address delegation-certificate \
--stake-verification-key-file stake.vkey \
--cold-verification-key-file cold.vkey \
--out-file delegation.cert

This creates a delegation certificate which delegates funds from all stake addresses associated with key stake.vkey to the pool belonging to cold key cold.vkey. If there are many staking keys as pool owners in the first step, we need delegation certificates for all of them.

Submit the pool certificate and delegation certificate to the blockchain

To submit the pool registration certificate and the delegation certificates to the blockchain by including them in one or more transactions. We can use one transaction for multiple certificates, the certificates will be applied in order.

Draft the transaction

cardano-cli transaction build-raw \
--tx-in <TxHash>#<TxIx> \
--tx-out $(cat payment.addr)+0 \
--invalid-hereafter 0 \
--fee 0 \
--out-file tx.draft \
--certificate-file pool-registration.cert \
--certificate-file delegation.cert

Calculate the fees

cardano-cli transaction calculate-min-fee \
--tx-body-file tx.draft \
--tx-in-count 1 \
--tx-out-count 1 \
--witness-count 3 \
--byron-witness-count 0 \
--mainnet \
--protocol-params-file protocol.json

For example:

> 184685

Registering a stake pool requires a deposit. This amount is specified in protocol.json. For example, for Shelley Mainnet we have:

"poolDeposit": 500000000

Calculate the change for --tx-out

All amounts in Lovelace

expr <UTxO BALANCE> - <poolDeposit> - <TRANSACTION FEE>

Build the transaction:

cardano-cli transaction build-raw \
--tx-in <TxHash>#<TxIx> \
--tx-out $(cat payment.addr)+<CHANGE IN LOVELACE> \
--invalid-hereafter <TTL> \
--out-file tx.raw \
--certificate-file pool-registration.cert \
--certificate-file delegation.cert

Sign the transaction:

cardano-cli transaction sign \
--tx-body-file tx.raw \
--signing-key-file payment.skey \
--signing-key-file stake.skey \
--signing-key-file cold.skey \
--mainnet \
--out-file tx.signed

Submit the transaction:

cardano-cli transaction submit \
--tx-file tx.signed \

Verify that your stake pool registration was successful.

Get Pool ID

cardano-cli stake-pool id --cold-verification-key-file cold.vkey --output-format "hex"

Check for the presence of your poolID in the network ledger state, with:

cardano-cli query ledger-state --mainnet | grep publicKey | grep <poolId>