From 25a420234cacec7a06f858dcb0ecdfb3b1328edd Mon Sep 17 00:00:00 2001 From: transatoshi Date: Tue, 10 Jun 2025 16:47:33 -0700 Subject: [PATCH] initial commit --- grin-cancel.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 grin-cancel.py diff --git a/grin-cancel.py b/grin-cancel.py new file mode 100644 index 0000000..805f1c5 --- /dev/null +++ b/grin-cancel.py @@ -0,0 +1,65 @@ +import subprocess +import re +import os +import pwd +import grp + +def run_command(command): + """Run a shell command and return the output.""" + result = subprocess.run(command, shell=True, capture_output=True, text=True) + return result.stdout + +def set_file_ownership(file_path, user, group): + """Set the ownership of the file to the specified user and group.""" + uid = pwd.getpwnam(user).pw_uid + gid = grp.getgrnam(group).gr_gid + os.chown(file_path, uid, gid) + +def cancel_transactions(password): + # Step 1: Get the transactions + command = f"echo '{password}' | grin-wallet txs" + output = run_command(command) + + # Step 2: Write the output to a file + file_path = 'transactions.txt' + with open(file_path, 'w') as file: + file.write(output) + + # Step 3: Set the ownership of the file to user 'grin' and group 'grin' + set_file_ownership(file_path, 'grin', 'grin') + + # Step 4: Read the file and process transactions + with open(file_path, 'r') as file: + lines = file.readlines() + + canceled_count = 0 + skipped_count = 0 + + # Step 5: Find unconfirmed transactions that are not canceled + for line in lines: + # Match the transaction line with regex, accounting for varying spaces + match = re.match(r'^\s*(\d+)\s+\w+\s+\w+\s+(\S+)\s+.*?\s+(false)\s+.*?\s+(\S+)\s*$', line) + if match: + transaction_id = match.group(2) + confirmed = match.group(3) + canceled = '-Cancelled' in line + + if confirmed == 'false' and not canceled: + # Step 6: Cancel the transaction + cancel_command = f"echo '{password}' | grin-wallet cancel -t {transaction_id}" + print(f"Cancelling transaction {transaction_id}...") + cancel_output = run_command(cancel_command) + print(cancel_output) + canceled_count += 1 + else: + skipped_count += 1 + + # Step 7: Output the summary + print(f"\nSummary:") + print(f"Total transactions canceled: {canceled_count}") + print(f"Total transactions skipped: {skipped_count}") + +if __name__ == "__main__": + # Replace '' with your actual password + password = 'Pw%HK3PHfaUlti' + cancel_transactions(password)