Is this the right way to change pool params?

Hi all - I registered my pool and when I did, I made a mistake and set the margin wrong. I also have added more relays since then, and so want those registered also. SO:

I created a transaction that was:

  • a payment both from and to my payment address (payment and recipient address were the same), and
  • I updated my meta data, and created a new pool cert with updated margin and also the new relays, and
  • I created a new delegation cert, and
  • I made sure my pool and delegation cert were included in the TX, and
  • I set the amount to send to my entire amount minus the fee.

This resulted in a transaction that worked fine. But is this the right way to have done it? The relays haven’t shown up yet, and I’m not sure if that is because it will take two epochs, or if it is because I did this incorrectly.

Here is the actual raw tx, as I constructed it:

cardano-cli transaction build-raw \
        ${tx_in} \
        --tx-out $(cat payment.addr)+0 \ (the from address)
        --tx-out ${cat payment.addr}+0 \ (the to address, same as the from address)
        --invalid-hereafter $(( ${currentSlot} + 10000)) \
        --fee 0 \
        --certificate-file pool.cert \
        --certificate-file deleg.cert \
        --allegra-era \
        --out-file tx.tmp

TxOut 1 was the entire balance, Tx out 2 (recipient) was entire balance minus fee. So, essentially, I sent my entire balance to myself, minus the fee… and included the pool cert and deleg cert in the transaction.

Will this work? Is it the proper way to have done it? I really can’t find any guide on how to update a pool outside of the coinCashew one… and as I’ve said multiple times over the last week… it doesn’t work.


Please see chapter 12

U will need to do it like u did first time when u registered the pool, but without paying again 500 ADA


That’s what I tried before this - I followed the coinCashew steps exactly, but not deducting the pool registration fee. But it doesn’t work - I always get an error:

Shelley command failed: transaction submit Error: Error while submitting tx: ApplyTxError [LedgerFailure (UtxowFailure (UtxoFailure (ValueNotConservedUTxO (DeltaCoin 2677506040) (DeltaCoin 3177506040))))]

My exact steps are as follows. These completely follow the coinCashew guide for registering a pool, except they don’t deduct the pool registration fee. But they break every time.

  • create and upload my poolMetaData.json

  • wget the poolMetaData so that the local variant will match

  • hash the poolMetaData:

cardano-cli stake-pool metadata-hash --pool-metadata-file poolMetaData.json > poolMetaDataHash.txt

  • Get the minimum pool cost:
minPoolCost=$(cat $NODE_HOME/params.json | jq -r .minPoolCost)
echo minPoolCost: ${minPoolCost}
  • Create the pool.cert:
cardano-cli stake-pool registration-certificate \
    --cold-verification-key-file $HOME/cold-keys/node.vkey \
    --vrf-verification-key-file vrf.vkey \
    --pool-pledge 100000000 \
    --pool-cost 340000000 \
    --pool-margin 0.015 \
    --pool-reward-account-verification-key-file stake.vkey \
    --pool-owner-stake-verification-key-file stake.vkey \
    --mainnet \
    --pool-relay-port 6000 \
    --pool-relay-ipv4 <my first relay node public IP address> \
    --pool-relay-port 6000 \
    --pool-relay-ipv4 <my second relay node public IP address> \
    --pool-relay-port 6000 \
    --pool-relay-ipv4 <my third relay node public IP address> \
    --metadata-url <url where I uploaded poolMetaData.json> \
    --metadata-hash $(cat poolMetaDataHash.txt) \
    --out-file pool.cert
  • Create the deleg.cert:
cardano-cli stake-address delegation-certificate \
    --stake-verification-key-file stake.vkey \
    --cold-verification-key-file $HOME/cold-keys/node.vkey \
    --out-file deleg.cert
  • Get the current slot:
currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slotNo')
echo Current Slot: $currentSlot
  • Get balance and UtXo’s:
currentSlot=$(cardano-cli query 

cardano-cli query utxo \
    --address $(cat payment.addr) \
    --allegra-era \
    --mainnet > fullUtxo.out

tail -n +3 fullUtxo.out | sort -k3 -nr > balance.out

cat balance.out

while read -r utxo; do
    in_addr=$(awk '{ print $1 }' <<< "${utxo}")
    idx=$(awk '{ print $2 }' <<< "${utxo}")
    utxo_balance=$(awk '{ print $3 }' <<< "${utxo}")
    echo TxHash: ${in_addr}#${idx}
    echo ADA: ${utxo_balance}
    tx_in="${tx_in} --tx-in ${in_addr}#${idx}"
done < balance.out
txcnt=$(cat balance.out | wc -l)
echo Total ADA balance: ${total_balance}
echo Number of UTXOs: ${txcnt}
  • Set the pool deposit to 0:
echo poolDeposit: $poolDeposit
  • Build a temp transaction:
cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+$(( ${total_balance} - ${poolDeposit}))  \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee 0 \
    --certificate-file pool.cert \
    --certificate-file deleg.cert \
    --allegra-era \
    --out-file tx.tmp
  • Calculate the min fee:
fee=$(cardano-cli transaction calculate-min-fee \
    --tx-body-file tx.tmp \
    --tx-in-count ${txcnt} \
    --tx-out-count 1 \
    --mainnet \
    --witness-count 3 \
    --byron-witness-count 0 \
    --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee
  • Determine change output:
echo txOut: ${txOut}
  • Create the raw transaction:
cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+${txOut} \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee ${fee} \
    --certificate-file pool.cert \
    --certificate-file deleg.cert \
    --allegra-era \
    --out-file tx.raw
  • Sign the transaction:
cardano-cli transaction sign \
    --tx-body-file tx.raw \
    --signing-key-file payment.skey \
    --signing-key-file $HOME/cold-keys/node.skey \
    --signing-key-file stake.skey \
    --mainnet \
    --out-file tx.signed
  • Send it:
cardano-cli transaction submit \
    --tx-file tx.signed \

I’m really at my whit’s end here - I’m about to give up and just retire my pool. Because this doesn’t work, and neither does the guid in Cardano’s docs. And those are the only two guides I can find.

what is the output of this command?

My output is this:

                           TxHash                                 TxIx        Amount
c5c4ffb2dc36968bb9b7449508342520ee369be5d83ddb5f298a837aab2829dc     0        2667506040 lovelace
c5c4ffb2dc36968bb9b7449508342520ee369be5d83ddb5f298a837aab2829dc     1        10000000 lovelace

I would try to use only 1 tx_in - so choose the fist one with 2667506040 lovelace

cardano-cli transaction build-raw \
--tx-in c5c4ffb2dc36968bb9b7449508342520ee369be5d83ddb5f298a837aab2829dc#0 \
--tx-out $(cat payment.addr)+${txOut} \
--invalid-hereafter $(( ${currentSlot} + 10000)) \
--fee ${fee} \
--certificate-file pool.cert \
--certificate-file deleg.cert \
--allegra-era \
--out-file tx.raw

where tx_out is 2667506040-fee

It just does the same thing. It makes no sense; it is behaving as if it always expects the pool registration fee. That second deltaCoin value is exactly 500 ADA more than my txOut. And it’s not a value coming from my side; that’s getting manufactured by somebody downstream.

This is killing me.

it seems that the transaction would register a new pool instead of reregister an existing one… i went through the history of Telegram channel (Telegram: Contact @CardanoStakePoolWorkgroup) and this error came when people missed the 500 ADA registration fee… are u using the correct cold key? I dont know…

Yes, I am using the correct key. I can send other transactions, I just can’t send a pool registration transaction, because it always wants the 500 ADA pool fee. I wonder, really, if this is a bug in 1.25.1.

Out of desperation, I sent a registration last night that did include the 500 ADA fee, and it succeeded. That tells me that it’s not the instructions that are wrong, it’s maybe in the ledger itself. And I can confirm that it did in fact register a new pool. So, basically I’m just all messed up.

I sent a pool retirement out last night; I hope that I’ll get both 500 ADA pool fees back, but I’m not holding my breath. Once the retirement is done, I’m going to start over, and this time I’m not going to make a mistake with my pool registration… because I feel like this behavior is either a bug, or was intentionally changed.

Anyway - If you or anyone knows of someone I can reach out to at IOHK, I would appreciate it. I filed a bug but to my knowledge they’ve not even looked at it.

Thank you for that. I sent a request to this over a week ago and they haven’t responded, unfortunately.

on this same subject… if you were to change something in metadata.json or switch out relay node, would you half to get a new pool.cert?

You are supposed to reissue the pool cert and send the transaction again, without paying the 500 ADA deposit, as described here. But my issue is that i could not get this to work at all.

Do not pay the 500 ADA a second time or it will register a new pool and things will be very messed up.

1 Like

If I were to added some relays or changed some info in the metadata.json file but did not reissue the pool cert do you get any kind of warning or will things just quit working?

No warning but the new metadata infos will not be updated;


I registered with this forum just to communicate a fix I found. I read so many of these threads without a resolution. Not great facing a crippled bare metal pool I’d worked on for the last few days!
Go to your stake pool folder location in ubuntu, find and open params.json file and edit the pool registration fee amount to “0”. You can then follow coincashew’s instructions to build the transaction. The terminal commands will pull through “0” for pool registration fee and you’ll only have to pay the transaction fee. Everything will update nicely.

interesting… but the params.json file only used when you calculating the fees and it does not rely on poolDeposit field- and it is known that for re-registration of the pool the 500 ADA is not needed. So how the fee changed in your case when you modified the params.json?

The coincashew instructions use the below command which pulls the info of the 500000000 ada deposit from the params.json file.

poolDeposit=$(cat $NODE_HOME/params.json | jq -r ‘.poolDeposit’)
echo poolDeposit: $poolDeposit

Allowing it to pull “0” makes the entire instruction work and metadata updates with just the minor transaction cost.
If there was another way to do it, I sure didn’t find it after pulling my hair out over these threads.

however in the re-registration section this poolDeposit does not mentioned when calculating the txOut

Calculate your change output.
echo txOut: ${txOut}

so maybe you used the registration section instead of the re-registration one

Farout, I never saw that. I guess there’s now two ways to changing metadata, assuming his works without hiccup.