Delegating to a Stake Pool
✅ Prerequisites
Both a payment and a stake key pair. Payment key should contain some ADA.
👩💻 Registering Your Stake Address
Create a certificate, stake.cert, using the stake.vkey
cardano-cli conway stake-address registration-certificate \
--stake-verification-key-file stake.vkey \
--key-reg-deposit-amt 2000000 \
--out-file stake.certYou need to find the slot tip of the blockchain.
currentSlot=$(cardano-cli conway query tip --mainnet | jq -r '.slot')
echo Current Slot: $currentSlotRetrieve the UTXOs available for your payment address and calculate the balance.
# Retrieve the list of UTXOs available for your payment address
utxo_json=$(cardano-cli conway query utxo --address $(cat payment.addr) --mainnet)
# Initialize variables
tx_in=""
total_balance=0
txcnt=0
# Loop through the list of UTXOs
while read -r utxo; do
# Retrieve the values for the current UTXO
values=$(jq -r --arg k "${utxo}" '.[$k]' <<< "${utxo_json}")
# Retrieve datum associated with the UTXO
datum=$(jq -r '.datum' <<< "${values}")
# Retrieve the reference script associated with the UTXO
script=$(jq -r '.referenceScript' <<< "${values}")
# If limits on spending the UTXO may exist, then skip the UTXO
if [[ ${datum} == 'null' && ${script} == 'null' ]]
then
hash=${utxo%%#*}
idx=${utxo#*#}
utxo_balance=$(jq -r '.value.lovelace' <<< "${values}")
total_balance=$((${total_balance}+${utxo_balance}))
echo "TxHash: ${hash}#${idx}"
echo "ADA: ${utxo_balance}"
tx_in="${tx_in} --tx-in ${hash}#${idx}"
txcnt=$((txcnt + 1))
fi
done <<< "$(jq -r 'keys[]' <<< "${utxo_json}")"
echo
echo "Total available ADA balance: ${total_balance}"
echo "Number of UTXOs: ${txcnt}"
echo "Final --tx-in string:${tx_in}"Find the stakeAddressDeposit value.
stakeAddressDeposit=$(cat $NODE_HOME/params.json | jq -r '.stakeAddressDeposit')
echo stakeAddressDeposit : $stakeAddressDepositRun the build-raw transaction command
cardano-cli conway transaction build-raw \
${tx_in} \
--tx-out $(cat payment.addr)+$(( ${total_balance} - ${stakeAddressDeposit} )) \
--invalid-hereafter $(( ${currentSlot} + 10000 )) \
--fee 200000 \
--out-file tx.tmp \
--certificate stake.certCalculate the current minimum fee:
fee=$(cardano-cli conway transaction calculate-min-fee \
--tx-body-file tx.tmp \
--tx-in-count ${txcnt} \
--tx-out-count 1 \
--mainnet \
--witness-count 2 \
--byron-witness-count 0 \
--protocol-params-file params.json | jq -r '.fee')
echo fee: $feeCalculate your change output.
txOut=$((${total_balance}-${stakeAddressDeposit}-${fee}))
echo Change Output: ${txOut}Build your transaction which will register your stake address.
cardano-cli conway transaction build-raw \
${tx_in} \
--tx-out $(cat payment.addr)+${txOut} \
--invalid-hereafter $(( ${currentSlot} + 10000 )) \
--fee ${fee} \
--certificate-file stake.cert \
--out-file tx.rawSign the transaction with both the payment and stake secret keys.
cardano-cli conway transaction sign \
--tx-body-file tx.raw \
--signing-key-file payment.skey \
--signing-key-file stake.skey \
--mainnet \
--out-file tx.signedSend the signed transaction.
cardano-cli conway transaction submit \
--tx-file tx.signed \
--mainnet📄 Creating a Delegation Certificate
Given its stake pool verification key file node.vkey , from your stakepool should have generated (and published) a stake pool ID:
cardano-cli conway stake-pool id \
--cold-verification-key-file node.vkey \
--output-format 'hex'Given the stake pool ID from your stakepool, run the following:
cardano-cli conway stake-address stake-delegation-certificate \
--stake-verification-key-file stake.vkey \
--stake-pool-id <stake pool ID> \
--out-file deleg.certYou need to find the tip of the blockchain to set the ttl parameter properly.
currentSlot=$(cardano-cli conway query tip --mainnet | jq -r '.slot')
echo Current Slot: $currentSlotRetrieve the UTXOs available for your payment address and calculate the balance.
# Retrieve the list of UTXOs available for your payment address
utxo_json=$(cardano-cli conway query utxo --address $(cat payment.addr) --mainnet)
# Initialize variables
tx_in=""
total_balance=0
txcnt=0
# Loop through the list of UTXOs
while read -r utxo; do
# Retrieve the values for the current UTXO
values=$(jq -r --arg k "${utxo}" '.[$k]' <<< "${utxo_json}")
# Retrieve datum associated with the UTXO
datum=$(jq -r '.datum' <<< "${values}")
# Retrieve the reference script associated with the UTXO
script=$(jq -r '.referenceScript' <<< "${values}")
# If limits on spending the UTXO may exist, then skip the UTXO
if [[ ${datum} == 'null' && ${script} == 'null' ]]
then
hash=${utxo%%#*}
idx=${utxo#*#}
utxo_balance=$(jq -r '.value.lovelace' <<< "${values}")
total_balance=$((${total_balance}+${utxo_balance}))
echo "TxHash: ${hash}#${idx}"
echo "ADA: ${utxo_balance}"
tx_in="${tx_in} --tx-in ${hash}#${idx}"
txcnt=$((txcnt + 1))
fi
done <<< "$(jq -r 'keys[]' <<< "${utxo_json}")"
echo
echo "Total available ADA balance: ${total_balance}"
echo "Number of UTXOs: ${txcnt}"
echo "Final --tx-in string:${tx_in}"Run the build-raw transaction command.
cardano-cli conway transaction build-raw \
${tx_in} \
--tx-out $(cat payment.addr)+${total_balance} \
--invalid-hereafter $(( ${currentSlot} + 10000 )) \
--fee 200000 \
--certificate-file deleg.cert \
--out-file tx.tmpCalculate the minimum fee:
fee=$(cardano-cli conway transaction calculate-min-fee \
--tx-body-file tx.tmp \
--tx-in-count ${txcnt} \
--tx-out-count 1 \
--mainnet \
--witness-count 2 \
--byron-witness-count 0 \
--protocol-params-file params.json | jq -r '.fee')
echo fee: $feeCalculate your change output.
txOut=$((${total_balance}-${fee}))
echo txOut: ${txOut}Build the transaction.
cardano-cli conway transaction build-raw \
${tx_in} \
--tx-out $(cat payment.addr)+${txOut} \
--invalid-hereafter $(( ${currentSlot} + 10000 )) \
--fee ${fee} \
--certificate-file deleg.cert \
--out-file tx.rawSign the transaction.
cardano-cli conway transaction sign \
--tx-body-file tx.raw \
--signing-key-file payment.skey \
--signing-key-file stake.skey \
--mainnet \
--out-file tx.signedSend the transaction.
cardano-cli conway transaction submit \
--tx-file tx.signed \
--mainnetCongratulations! Your ADA is now successfully delegated to your chosen stakepool.
Last updated