|
| 1 | +from ravenrpc import Ravencoin # pip install ravenrpc |
| 2 | +import sys |
| 3 | +import os |
| 4 | +import time |
| 5 | + |
| 6 | +# Requires ravenrpc==0.2.4 |
| 7 | +# |
| 8 | +# usage: |
| 9 | +# ``` |
| 10 | +# python vanity_address_gen.py ( rpcuser ) ( rpcpass ) ( prefix ) ( ignore_case=True ) |
| 11 | +# ``` |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +def valid_base58(s): |
| 16 | + for c in ('0', 'O', 'l', '1'): |
| 17 | + if c in s: |
| 18 | + print(f'Cannot use charachter "{c}" in prefix!!') |
| 19 | + exit() |
| 20 | + |
| 21 | +def success_odds(prefix, ignore_case): |
| 22 | + odds = 1 |
| 23 | + for letter in prefix[1:]: |
| 24 | + if letter in ('o', 'l') or not ignore_case: |
| 25 | + odds *= 58 |
| 26 | + else: |
| 27 | + odds *= 29 |
| 28 | + return odds |
| 29 | + |
| 30 | +def create_rvn_inst(): |
| 31 | + try: |
| 32 | + rvn = Ravencoin(sys.argv[1], sys.argv[2]) |
| 33 | + except IndexError: |
| 34 | + print('You must provide a valid rpc username and rpc password!') |
| 35 | + exit() |
| 36 | + return rvn |
| 37 | + |
| 38 | +def get_args(): |
| 39 | + try: |
| 40 | + prefix = sys.argv[3] |
| 41 | + except IndexError: |
| 42 | + print('Missing options!\n' |
| 43 | + 'Usage: `python gen.py <rpcuser> <rpcpass> <prefix> <ignore case (default True)>`') |
| 44 | + exit() |
| 45 | + ignore_case = sys.argv[4] if len(sys.argv) > 4 else True |
| 46 | + if prefix[0] != 'R': |
| 47 | + print('Please start your prefix with an "R"\n' |
| 48 | + 'Usage: `python gen.py <rpcuser> <rpcpass> <prefix> <ignore case (default True)>`') |
| 49 | + exit() |
| 50 | + return prefix, ignore_case, create_rvn_inst() |
| 51 | + |
| 52 | +def validate_rvn(rvn): |
| 53 | + if rvn.getinfo() == '': |
| 54 | + print('Run ravend') |
| 55 | + exit() |
| 56 | + |
| 57 | +def display_stats(count, start, addr, prefix, odds): |
| 58 | + addr_sec = count/(time.time() - start) |
| 59 | + os.system('cls' if os.name == 'nt' else 'clear') |
| 60 | + print(f'Tried {count} addresses\n' |
| 61 | + f'Seconds Spent: {time.time() - start}\n' |
| 62 | + f'Ave. Addresses/sec: {addr_sec}\n' |
| 63 | + f'Lastest Address: {addr}\n' |
| 64 | + f'Prefix: {prefix}\n' |
| 65 | + f'You have a 1 in {odds} chance per address!\n' |
| 66 | + f'At this rate, you will find your address in ~{odds/addr_sec/60} minutes!\n' |
| 67 | + 'To stop, press Ctrl-C', flush=True, end='') |
| 68 | + |
| 69 | + |
| 70 | +def main(): |
| 71 | + prefix, ignore_case, rvn = get_args() |
| 72 | + validate_rvn(rvn) |
| 73 | + valid_base58(prefix) |
| 74 | + start = time.time() |
| 75 | + odds = success_odds(prefix, ignore_case) |
| 76 | + count = 0 |
| 77 | + address = rvn.getnewaddress()['result'] |
| 78 | + try: |
| 79 | + while not address.lower().startswith(prefix.lower()) if ignore_case else address.startswith(prefix): |
| 80 | + address = rvn.getnewaddress()['result'] |
| 81 | + count += 1 |
| 82 | + if count % 100 == 1: |
| 83 | + display_stats(count, start, address, prefix, odds) |
| 84 | + except KeyboardInterrupt: |
| 85 | + exit() |
| 86 | + print(f'\nFound an address that starts with {prefix}!\n It is saved to your wallet. Use it freely!\n{address}') |
| 87 | + |
| 88 | +if __name__ == '__main__': |
| 89 | + main() |
0 commit comments