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 = [n.issuers_addrs for n in new_tokens] issuers_addrs = list(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 tx_files = clusterlib.TxFiles( signing_key_files=[*issuers_skey_files, *token_mint_addr_skey_files]) # build and sign a transaction ttl = cluster_obj.calculate_tx_ttl() fee = cluster_obj.calculate_tx_fee( src_address=src_address, tx_name=temp_template, tx_files=tx_files, ttl=ttl, # TODO: workaround for https://github.com/input-output-hk/cardano-node/issues/1892 witness_count_add=len(issuers_skey_files) * 2, ) tx_raw_output = cluster_obj.build_raw_tx( src_address=src_address, tx_name=temp_template, tx_files=tx_files, fee=fee, ttl=ttl, mint=[ clusterlib.TxOut(address=n.token_mint_addr.address, amount=n.amount, coin=n.token) for n in new_tokens ], ) 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, script_files=[n.script for n in new_tokens], ) # submit signed transaction cluster_obj.submit_tx(out_file_signed) cluster_obj.wait_for_new_block(new_blocks=2) return tx_raw_output
def multisig_tx( cluster_obj: clusterlib.ClusterLib, temp_template: str, src_address: str, dst_address: str, amount: int, multisig_script: Path, payment_skey_files: List[Path], invalid_hereafter: Optional[int] = None, invalid_before: Optional[int] = None, script_is_src=False, ): """Build and submit multisig transaction.""" # record initial balances src_init_balance = cluster_obj.get_address_balance(src_address) dst_init_balance = cluster_obj.get_address_balance(dst_address) # create TX body destinations = [clusterlib.TxOut(address=dst_address, amount=amount)] witness_count_add = len(payment_skey_files) if script_is_src: # TODO: workaround for https://github.com/input-output-hk/cardano-node/issues/1892 witness_count_add += 5 ttl = cluster_obj.calculate_tx_ttl() fee = cluster_obj.calculate_tx_fee( src_address=src_address, tx_name=temp_template, txouts=destinations, ttl=ttl, witness_count_add=witness_count_add, ) tx_raw_output = cluster_obj.build_raw_tx( src_address=src_address, tx_name=temp_template, txouts=destinations, fee=fee, ttl=ttl, invalid_hereafter=invalid_hereafter, invalid_before=invalid_before, ) # create witness file for each 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(payment_skey_files) ] if script_is_src: witness_files.append( cluster_obj.witness_tx( tx_body_file=tx_raw_output.out_file, witness_name=f"{temp_template}_script", script_file=multisig_script, )) # 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_witnessed_file) cluster_obj.wait_for_new_block(new_blocks=2) # check final balances assert (cluster_obj.get_address_balance(src_address) == src_init_balance - tx_raw_output.fee - amount), f"Incorrect balance for source address `{src_address}`" assert (cluster_obj.get_address_balance(dst_address) == dst_init_balance + amount), f"Incorrect balance for script address `{dst_address}`"