Module cardano.wt.cardano_cli

Expand source code
import json
import os
import subprocess

from deprecated import deprecated

from cardano.wt.utxo import Utxo

"""
cardano-cli *nix script representation in Python
"""
class CardanoCli(object):

    TXN_DIR = 'txn'

    def __init__(self, protocol_params=None):
        self.protocol_params = protocol_params

    def __run_script(self, cardano_args):
        cmd = f'cardano-cli {cardano_args}'
        print(cmd)
        cli_cmd = subprocess.Popen(cmd,  shell=True, text=True, stdout=subprocess.PIPE)
        (out, err) = cli_cmd.communicate()
        print(f'[STDOUT] {out}')
        print(f'[STDERR] {err}')
        return out

    def named_asset_str(nft_policy, nft_names):
        return '+'.join(['.'.join([f"1 {nft_policy}", nft_name]) for nft_name in nft_names])

    def build_raw_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, addl_args, era='--alonzo-era'):
        raw_build_file = os.path.join(output_dir, CardanoCli.TXN_DIR, f"txn_{txn_id}.raw.build")
        metadata_file_args = f"--metadata-json-file {metadata_json_file}" if metadata_json_file else ''
        self.__run_script(
            f'transaction build-raw --fee {fee} {era} {" ".join(tx_out_args)} {" ".join(tx_in_args)} \
                {metadata_file_args} --out-file {raw_build_file} {" ".join(addl_args)}'
        )
        return raw_build_file

    def build_raw_mint_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, mint, nft_names):
        named_asset_str = CardanoCli.named_asset_str(mint.policy, nft_names)
        mint_args = [f"--mint='{named_asset_str}'", f"--minting-script-file {mint.script}"] if nft_names else []
        if mint.initial_slot:
            mint_args.append(f"--invalid-before {mint.initial_slot}")
        if mint.expiration_slot:
            mint_args.append(f"--invalid-hereafter {mint.expiration_slot}")
        return self.build_raw_txn(output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, mint_args)

    def calculate_min_fee(self, raw_build_file, tx_in_count, tx_out_count, witness_count):
        lovelace_fee_str = self.__run_script(
            f'transaction calculate-min-fee --tx-body-file {raw_build_file} --tx-in-count {tx_in_count} \
              --tx-out-count {tx_out_count} --witness-count {witness_count} --protocol-params-file {self.protocol_params}'
        )
        return int(lovelace_fee_str.split(' ')[0])

    def sign_txn(self, signing_files, build_file):
        signed_file = f"{build_file}.signed"
        signing_key_args = ' '.join([f"--signing-key-file {signing_file}" for signing_file in signing_files])
        self.__run_script(
            f'transaction sign {signing_key_args} --tx-body-file {build_file} --out-file {signed_file}'
        )
        return signed_file

Classes

class CardanoCli (protocol_params=None)
Expand source code
class CardanoCli(object):

    TXN_DIR = 'txn'

    def __init__(self, protocol_params=None):
        self.protocol_params = protocol_params

    def __run_script(self, cardano_args):
        cmd = f'cardano-cli {cardano_args}'
        print(cmd)
        cli_cmd = subprocess.Popen(cmd,  shell=True, text=True, stdout=subprocess.PIPE)
        (out, err) = cli_cmd.communicate()
        print(f'[STDOUT] {out}')
        print(f'[STDERR] {err}')
        return out

    def named_asset_str(nft_policy, nft_names):
        return '+'.join(['.'.join([f"1 {nft_policy}", nft_name]) for nft_name in nft_names])

    def build_raw_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, addl_args, era='--alonzo-era'):
        raw_build_file = os.path.join(output_dir, CardanoCli.TXN_DIR, f"txn_{txn_id}.raw.build")
        metadata_file_args = f"--metadata-json-file {metadata_json_file}" if metadata_json_file else ''
        self.__run_script(
            f'transaction build-raw --fee {fee} {era} {" ".join(tx_out_args)} {" ".join(tx_in_args)} \
                {metadata_file_args} --out-file {raw_build_file} {" ".join(addl_args)}'
        )
        return raw_build_file

    def build_raw_mint_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, mint, nft_names):
        named_asset_str = CardanoCli.named_asset_str(mint.policy, nft_names)
        mint_args = [f"--mint='{named_asset_str}'", f"--minting-script-file {mint.script}"] if nft_names else []
        if mint.initial_slot:
            mint_args.append(f"--invalid-before {mint.initial_slot}")
        if mint.expiration_slot:
            mint_args.append(f"--invalid-hereafter {mint.expiration_slot}")
        return self.build_raw_txn(output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, mint_args)

    def calculate_min_fee(self, raw_build_file, tx_in_count, tx_out_count, witness_count):
        lovelace_fee_str = self.__run_script(
            f'transaction calculate-min-fee --tx-body-file {raw_build_file} --tx-in-count {tx_in_count} \
              --tx-out-count {tx_out_count} --witness-count {witness_count} --protocol-params-file {self.protocol_params}'
        )
        return int(lovelace_fee_str.split(' ')[0])

    def sign_txn(self, signing_files, build_file):
        signed_file = f"{build_file}.signed"
        signing_key_args = ' '.join([f"--signing-key-file {signing_file}" for signing_file in signing_files])
        self.__run_script(
            f'transaction sign {signing_key_args} --tx-body-file {build_file} --out-file {signed_file}'
        )
        return signed_file

Class variables

var TXN_DIR

Methods

def build_raw_mint_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, mint, nft_names)
Expand source code
def build_raw_mint_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, mint, nft_names):
    named_asset_str = CardanoCli.named_asset_str(mint.policy, nft_names)
    mint_args = [f"--mint='{named_asset_str}'", f"--minting-script-file {mint.script}"] if nft_names else []
    if mint.initial_slot:
        mint_args.append(f"--invalid-before {mint.initial_slot}")
    if mint.expiration_slot:
        mint_args.append(f"--invalid-hereafter {mint.expiration_slot}")
    return self.build_raw_txn(output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, mint_args)
def build_raw_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, addl_args, era='--alonzo-era')
Expand source code
def build_raw_txn(self, output_dir, txn_id, tx_in_args, tx_out_args, fee, metadata_json_file, addl_args, era='--alonzo-era'):
    raw_build_file = os.path.join(output_dir, CardanoCli.TXN_DIR, f"txn_{txn_id}.raw.build")
    metadata_file_args = f"--metadata-json-file {metadata_json_file}" if metadata_json_file else ''
    self.__run_script(
        f'transaction build-raw --fee {fee} {era} {" ".join(tx_out_args)} {" ".join(tx_in_args)} \
            {metadata_file_args} --out-file {raw_build_file} {" ".join(addl_args)}'
    )
    return raw_build_file
def calculate_min_fee(self, raw_build_file, tx_in_count, tx_out_count, witness_count)
Expand source code
def calculate_min_fee(self, raw_build_file, tx_in_count, tx_out_count, witness_count):
    lovelace_fee_str = self.__run_script(
        f'transaction calculate-min-fee --tx-body-file {raw_build_file} --tx-in-count {tx_in_count} \
          --tx-out-count {tx_out_count} --witness-count {witness_count} --protocol-params-file {self.protocol_params}'
    )
    return int(lovelace_fee_str.split(' ')[0])
def named_asset_str(nft_policy, nft_names)
Expand source code
def named_asset_str(nft_policy, nft_names):
    return '+'.join(['.'.join([f"1 {nft_policy}", nft_name]) for nft_name in nft_names])
def sign_txn(self, signing_files, build_file)
Expand source code
def sign_txn(self, signing_files, build_file):
    signed_file = f"{build_file}.signed"
    signing_key_args = ' '.join([f"--signing-key-file {signing_file}" for signing_file in signing_files])
    self.__run_script(
        f'transaction sign {signing_key_args} --tx-body-file {build_file} --out-file {signed_file}'
    )
    return signed_file