Skip to content

Instantly share code, notes, and snippets.

@rcmorano
Created December 13, 2020 14:28
Show Gist options
  • Save rcmorano/5cb8a8f322a568e2c0b9792ab1e6c3e1 to your computer and use it in GitHub Desktop.
Save rcmorano/5cb8a8f322a568e2c0b9792ab1e6c3e1 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -e
# set -x
# This script creates, signs, and submits a transaction that creates some new tokens.
# It uses the output of the transaction from update-4.sh.
NETWORK_MAGIC=3
SOURCE_ADDRESS=$(cat ../base.addr)
DESTINATION_ADDRESS=${SOURCE_ADDRESS}
PAYMENT_SKEY=../payment.skey
TOKEN_NAME=SPAM$$token
TOKEN_AMOUNT=666
mkdir -p ${TOKEN_NAME}
POLICY_SCRIPT=${TOKEN_NAME}/policy.script
POLICY_VKEY=${TOKEN_NAME}/policy.vkey
POLICY_SKEY=${TOKEN_NAME}/policy.skey
cardano-cli address key-gen \
--verification-key-file ${POLICY_VKEY} \
--signing-key-file ${POLICY_SKEY}
KEYHASH=$(cardano-cli address key-hash --payment-verification-key-file ${POLICY_VKEY})
cat > ${POLICY_SCRIPT} <<EOF
{
"keyHash": "${KEYHASH}",
"type": "sig"
}
EOF
POLICY_ID=$(cardano-cli transaction policyid --script-file ${POLICY_SCRIPT})
cardano-cli query protocol-parameters \
--testnet-magic ${NETWORK_MAGIC} \
--mary-era \
--out-file /tmp/protparams.json
IN_UTXO=$(cardano-cli query utxo \
--mary-era \
--testnet-magic ${NETWORK_MAGIC} \
--address ${SOURCE_ADDRESS} | grep -v "^ \|^-" | awk '{print "--tx-in "$1"#"$2}' | xargs)
UTXO_COUNT=$(cardano-cli query utxo \
--mary-era \
--testnet-magic ${NETWORK_MAGIC} \
--address ${SOURCE_ADDRESS} | grep -v "^ \|^-" | wc -l)
# calc balances
rm -f /tmp/balance*
cardano-cli query utxo \
--mary-era \
--testnet-magic ${NETWORK_MAGIC} \
--address ${SOURCE_ADDRESS} | grep -v "^ \|^-" | sed 's| + |\n|g' | sed 's|.* \([0-9].*lovelace\)|\1|g' > /tmp/balances
awk '{print $2}' /tmp/balances | uniq | while read token; do grep ${token} /tmp/balances | awk '{s+=$1} END {print s}' > /tmp/balance.${token}; done
OTHER_COINS=$(for balance_file in $(ls -1 /tmp/balance.* | grep -v lovelace); do BALANCE=$(cat ${balance_file}); TOKEN=$(echo $balance_file | sed 's|/tmp/balance.||g'); echo +${BALANCE} ${TOKEN}; done | xargs)
cardano-cli transaction build-raw \
--mary-era \
--fee 0 \
${IN_UTXO} \
--tx-out="${DESTINATION_ADDRESS}+$(cat /tmp/balance.lovelace) lovelace${OTHER_COINS}+${TOKEN_AMOUNT} ${POLICY_ID}.${TOKEN_NAME}" \
--mint="${TOKEN_AMOUNT} ${POLICY_ID}.${TOKEN_NAME}" \
--out-file ${TOKEN_NAME}.txbody
ACTUAL_MIN_FEE=$(cardano-cli transaction calculate-min-fee \
--tx-body-file ${TOKEN_NAME}.txbody \
--tx-in-count ${UTXO_COUNT} \
--tx-out-count 1 \
--witness-count 1 \
--byron-witness-count 0 \
--protocol-params-file /tmp/protparams.json | awk '{print $1}')
cardano-cli transaction build-raw \
--mary-era \
--fee ${ACTUAL_MIN_FEE} \
${IN_UTXO} \
--tx-out="${DESTINATION_ADDRESS}+$(( $(cat /tmp/balance.lovelace) - ${ACTUAL_MIN_FEE} )) lovelace${OTHER_COINS}+${TOKEN_AMOUNT} ${POLICY_ID}.${TOKEN_NAME}" \
--mint="${TOKEN_AMOUNT} ${POLICY_ID}.${TOKEN_NAME}" \
--out-file ${TOKEN_NAME}.txbody-ok-fee
cardano-cli transaction sign \
--testnet-magic ${NETWORK_MAGIC} \
--signing-key-file ${PAYMENT_SKEY} \
--signing-key-file ${POLICY_SKEY} \
--script-file ${POLICY_SCRIPT} \
--tx-body-file ${TOKEN_NAME}.txbody-ok-fee \
--out-file ${TOKEN_NAME}.tx.signed
cardano-cli transaction submit --tx-file ${TOKEN_NAME}.tx.signed --testnet-magic ${NETWORK_MAGIC}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment