110 lines
3.5 KiB
Python
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()
|