def mint_or_burn_sign( cluster_obj: clusterlib.ClusterLib, new_tokens: List[TokenRecord], temp_template: str, ) -> clusterlib.TxRawOutput: """Mint or burn tokens, depending on the `amount` value. Sign using skeys. Positive `amount` value means minting, negative means burning. """ _issuers_addrs = [t.issuers_addrs for t in new_tokens] issuers_addrs = set(itertools.chain.from_iterable(_issuers_addrs)) issuers_skey_files = {p.skey_file for p in issuers_addrs} token_mint_addr_skey_files = { t.token_mint_addr.skey_file for t in new_tokens } src_address = new_tokens[0].token_mint_addr.address # build and sign a transaction tx_files = clusterlib.TxFiles( script_files=clusterlib.ScriptFiles( minting_scripts=[t.script for t in new_tokens]), signing_key_files=[*issuers_skey_files, *token_mint_addr_skey_files], ) mint = [ clusterlib.TxOut(address=t.token_mint_addr.address, amount=t.amount, coin=t.token) for t in new_tokens ] fee = cluster_obj.calculate_tx_fee( src_address=src_address, tx_name=temp_template, tx_files=tx_files, mint=mint, # TODO: workaround for https://github.com/input-output-hk/cardano-node/issues/1892 witness_count_add=len(issuers_skey_files), ) tx_raw_output = cluster_obj.build_raw_tx( src_address=src_address, tx_name=temp_template, tx_files=tx_files, fee=fee, mint=mint, ) out_file_signed = cluster_obj.sign_tx( tx_body_file=tx_raw_output.out_file, signing_key_files=tx_files.signing_key_files, tx_name=temp_template, ) # submit signed transaction cluster_obj.submit_tx(tx_file=out_file_signed, txins=tx_raw_output.txins) return tx_raw_output
def mint_or_burn_witness( cluster_obj: clusterlib.ClusterLib, new_tokens: List[TokenRecord], temp_template: str, invalid_hereafter: Optional[int] = None, invalid_before: Optional[int] = None, ) -> clusterlib.TxRawOutput: """Mint or burn tokens, depending on the `amount` value. Sign using witnesses. Positive `amount` value means minting, negative means burning. """ _issuers_addrs = [t.issuers_addrs for t in new_tokens] issuers_addrs = set(itertools.chain.from_iterable(_issuers_addrs)) issuers_skey_files = {p.skey_file for p in issuers_addrs} src_address = new_tokens[0].token_mint_addr.address # create TX body tx_files = clusterlib.TxFiles( script_files=clusterlib.ScriptFiles(minting_scripts=[t.script for t in new_tokens]), ) mint = [ clusterlib.TxOut(address=t.token_mint_addr.address, amount=t.amount, coin=t.token) for t in new_tokens ] fee = cluster_obj.calculate_tx_fee( src_address=src_address, tx_name=temp_template, tx_files=tx_files, mint=mint, # TODO: workaround for https://github.com/input-output-hk/cardano-node/issues/1892 witness_count_add=len(issuers_skey_files), ) tx_raw_output = cluster_obj.build_raw_tx( src_address=src_address, tx_name=temp_template, tx_files=tx_files, fee=fee, invalid_hereafter=invalid_hereafter, invalid_before=invalid_before, mint=mint, ) # create witness file for each required key witness_files = [ cluster_obj.witness_tx( tx_body_file=tx_raw_output.out_file, witness_name=f"{temp_template}_skey{idx}", signing_key_files=[skey], ) for idx, skey in enumerate(issuers_skey_files) ] # sign TX using witness files tx_witnessed_file = cluster_obj.assemble_tx( tx_body_file=tx_raw_output.out_file, witness_files=witness_files, tx_name=temp_template, ) # submit signed TX cluster_obj.submit_tx(tx_file=tx_witnessed_file, txins=tx_raw_output.txins) return tx_raw_output