frens-lp-and-burn-bot/generate-wallets.py
2024-07-19 17:09:01 -04:00

110 lines
3.5 KiB
Python

import json
import os
import sys
from dotenv import load_dotenv
from web3 import Web3
from web3_multi_provider import FallbackProvider
load_dotenv()
web3 = Web3(FallbackProvider(json.load(open('./data/rpc_servers.json'))))
def generate_wallet(amount):
addresses = []
for i in list(range(0, amount)):
account = Web3().eth.account.create()
keystore = Web3().eth.account.encrypt(account.key.hex(), os.getenv('SECRET'))
folder = "./data/wallets/{}".format(account.address)
os.makedirs("data/wallets", exist_ok=True)
os.makedirs(folder, exist_ok=True)
open("{}/keystore".format(folder), 'w').write(json.dumps(keystore, indent=4))
addresses.append(account)
return addresses
# show help
if 'help' == sys.argv[1].lower():
print("Generates 1 or more number of wallet keystores and optionally displays their private keys.\n")
print("Example Usage:")
command = "python {}".format(sys.argv[0])
examples = ['--create', '--create 1', '--create 1 --show-private-keys', '--show-private-keys 0x1234567891234567891234567891234567891234']
for e in examples:
print("{} {}".format(command, e))
sys.exit()
# make sure you have a unique secrets
secret = os.getenv('SECRET')
if secret == 'changeme' or not secret:
print('Change your secret in .env')
sys.exit()
# display private key arg to add to metamask/rabby
if "--show-private-keys" in sys.argv:
public_key_index = sys.argv.index("--show-private-keys")
show_private_key = True
elif "-s" in sys.argv:
public_key_index = sys.argv.index("-s")
show_private_key = True
else:
public_key_index = None
show_private_key = False
# create specified number of wallets arg
if "--create" in sys.argv or "-c" in sys.argv:
if "--create" in sys.argv:
amount_index = sys.argv.index("--create")
else:
amount_index = sys.argv.index("-c")
try:
amount = sys.argv[amount_index + 1]
except IndexError:
arg = sys.argv[amount_index].split('=')
if len(arg) == 1 or not arg[1].isnumeric():
amount = 1
else:
amount = arg[1]
if not str(amount).isnumeric():
print("Invalid amount")
sys.exit()
else:
amount = int(amount)
else:
amount = 0
# create new wallets
if amount:
# generate X wallets based on sys.argv
wallets = generate_wallet(int(amount))
print("\nGenerated {} wallets\n".format(amount))
# display the generated wallet's keys
for wallet in wallets:
print("Public Key: {}".format(wallet.address))
if show_private_key:
print("Private Key: {}\n".format(wallet.key.hex()))
# show private keys only
elif show_private_key:
wallet_address = None
try:
wallet_address = sys.argv[public_key_index + 1]
except IndexError:
arg = sys.argv[public_key_index].split('=')
if len(arg) > 1:
wallet_address = arg[1]
else:
print("Not enough args")
sys.exit()
try:
wallet_address = web3.to_checksum_address(wallet_address)
except ValueError:
print("Invalid wallet address {}".format(wallet_address))
else:
print("\nPublic Key: {}".format(wallet_address))
secret = os.getenv('SECRET')
private_key = Web3().eth.account.decrypt("\n".join([line.strip() for line in open("./data/wallets/{}/keystore".format(wallet_address), 'r+')]), secret)
wallet = Web3().eth.account.from_key(private_key)
print("Private Key: {}".format(wallet.key.hex()))
print()