Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- Control-Eth Android v0.1.0
- Author: Skrypt
- Email: J0k3rsk0d3@Gmail.com
- '''
- ############## App Import Section ################
- # (binascii) For Ethereum Address Function
- try:
- print('Attempting To Import [binascii] Module.')
- import binascii
- except Exception as E:
- print('Error Importing [binascii] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install binascii\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- # (pickle) For Binary Datasets
- try:
- print('Attempting To Import [pickle] Module.')
- import pickle
- except Exception as E:
- print('Error Importing [pickle] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install pickle\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- # (hashlib) For hashlib.sha256() algorithm
- try:
- print('Attempting To Import [hashlib] Module.')
- import hashlib
- except Exception as E:
- print('Error Importing [hashlib] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install hashlib\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- # (time) For localtime
- try:
- print('Attempting To Import [time] Module.')
- import time
- except Exception as E:
- print('Error Importing [time] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install time\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- # (sha3) For Ethereum Address Conversion
- try:
- print('Attempting To Import [sha3] Module.')
- import sha3
- except Exception as E:
- print('Error Importing [sha3] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install sha3\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- # (web3) For Ethereum API Integration
- try:
- print('Attempting To Import [web3] Module.')
- from web3 import Web3
- except Exception as E:
- print('Error Importing [web3] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install web3\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- # (SigningKey, SECP256k1) From (ecdsa) for keccak algorithm
- try:
- print('Attempting To Import [SigningKey, SECP256k1] From [ecdsa] Module.')
- from ecdsa import SigningKey, SECP256k1
- except Exception as E:
- print('Error Importing [SigningKey, SECP256k1] From [ecdsa] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install ecdsa\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- # (HTTPProvider) From (web3.providers.rpc) for web3.eth API integration and Application HTTP Connection Protocol
- try:
- print('Attempting To Import [HTTPProvider] From [web3.providers.rpc] Module.')
- from web3.providers.rpc import HTTPProvider
- except Exception as E:
- print('Error Importing [HTTPProvider] From [web3.providers.rpc] Module. Instructing Program To Exit.')
- print('Please Consider [\'pip install web3\']')
- print('Error: [{}]'.format(str(E)))
- exit()
- ############### Global Declairation #################
- global Data
- global _WEB3
- global Syntax
- ############### App Constants #######################
- _VERSION = 'v0.1.0'
- _TITLE = 'Control-Eth Android {}'.format(_VERSION)
- _AUTHOR = 'Skrypt'
- _TESTNODE = 'https://kovan.infura.io/'
- _TESTAPI = 'M4QNeQhVp2x0Lm0OxNvW'
- _WEB3 = Web3(HTTPProvider(_TESTNODE+_TESTAPI))
- ################ Default Datasets ###################
- Data = dict()
- Syntax = dict()
- Syntax['Sudo Create'] = ['-c','-cr','-cre','-crea','-creat','-create']
- Syntax['Wallet'] = ['w','wa','wal','wall','walle','wallet','a','ad','add','addr','addre',
- 'addres','address','ac','acc','acco','accou','accoun','account']
- ############## Class Objects #########################
- class BaseUser():
- def __init__(self,name,password,wallet,transactions,nodes):
- self.name = name
- self.password = password
- self.wallet = wallet
- self.transactions = transactions
- self.nodes = nodes
- class StackUser(BaseUser):
- def __init__(self):
- super().__init__(title='',passhash='',wallet=list(),transactions=dict(),nodes=dict())
- ######## Ethereum / Hash Functions ##################
- # Ethereum Balance Query. Returns bool success
- def get_eth_balance(a):
- return _WEB3.eth.getBalance(a)
- # Ethereum Transaction Count Query. Returns bool success
- def get_eth_transactionCount(a):
- return _WEB3.eth.getTransactions(a)
- # Ethereum Privatekey To Wallet Function.
- def eth_center(k):
- global Data
- private_key = binascii.unhexlify(k)
- keccak = sha3.keccak_256()
- keccak.update(SigningKey.from_string(private_key, curve=SECP256k1).get_verifying_key().to_string())
- address = "0x{0}".format(keccak.hexdigest()[24:])
- check_groups_for_wallet(address,k)
- # Hashlib.sha256() Function For Data.
- def hash_lab(data):
- a = hashlib.sha256(data.encode()).hexdigest()
- print('Used Data: [{}] For SHA256 Hash: [{}]'.format(data,a))
- eth_center(a)
- ######## Internal Helper Functions ##################
- # Extracts Local Time For User Creation Stamp
- def _time():
- timed = time.localtime()
- return str(timed[1])+'/'+str(timed[2])+'/'+str(timed[0])+' '+str(timed[3])+':'+str(timed[4])+':'+str(timed[5])
- # Yes / No Internal Query
- def yes_no(question):
- yes_list = ['yes','ye','y']
- no_list = ['no','n']
- print('[{}?] [Yes/No]'.format(question))
- Req = input('|[INPUT]|>>: ')
- if Req.lower() in yes_list:
- return True
- elif Req.lower() in no_list:
- return False
- else:
- print('Please Use [Yes/No]')
- yes_no()
- # Checks If Pickle File Exists. Returns bool success
- def pickle_check(where):
- try:
- check = pickle.load(open(where,'rb'))
- del check
- return True
- except Exception as E:
- return False
- # Pulls And Returns Binary Pickle Data If Able. Exception Will Exit()
- def extract_data(file):
- try:
- data = pickle.load(open(file,'rb'))
- return data
- except Exception as E:
- print('Failure To Pull Data File [{}] *(extract_data(file))'.format(file))
- print('Please Contact Skrypt With Error: [{}]'.format(E))
- print('Calling Exit() Function')
- exit()
- ############### Internal App Functions ############################
- # Main App Start Function
- def app_start(title=True):
- global Data
- if title:
- print('Welcome To [{}] By [{}]! Please Log In Below!'.format(Data['APPLICATION']['TITLE'],Data['APPLICATION']['AUTHOR']))
- if not Data['USER']['LOGGED']:
- Data['USER']['USERNAME'] = collect_username()
- Data['USER']['PASSWORD'] = collect_password(Data['USER']['USERNAME'])
- pc = pickle_check('{}.user'.format(Data['USER']['USERNAME']))
- if pc:
- data = extract_data('{}.user'.format(Data['USER']['USERNAME']))
- if Data['USER']['PASSWORD'] == data['USER']['PASSWORD']:
- load_user('{}.user'.format(Data['USER']['USERNAME']))
- app_start(title=False)
- else:
- print('Incorrect Password For User: [{}]'.format(Data['USER']['USERNAME']))
- print('Please Try Again')
- app_start(title=True)
- else:
- create_user(Data['USER']['USERNAME'], Data['USER']['PASSWORD'])
- else:
- # Application Options
- print('Welcome [{}] To [{}] By [{}]!'.format(Data['USER']['USERNAME'],Data['APPLICATION']['TITLE'],Data['APPLICATION']['AUTHOR']))
- options_selector()
- # User Syntax Options Selection Function.
- def options_selector():
- print('Please Choose A Action Or Use Help/Options')
- Require = input('|[INPUT]|>>: ')
- Digest = Require.split(' ')
- if len(Digest) > 1:
- if Digest[0].lower() in Syntax['Sudo Create'] and Digest[1].lower() in Syntax['Wallet']:
- add_wallet()
- else:
- print('Unknown Command')
- options_selector()
- else:
- print('Unknown Command')
- options_selector()
- # Default HELP Function
- def HELP(topic):
- if topic.lower() == 'add_wallet/data':
- print('''
- |[HELP]|>>: Selecting Data While Creating A Wallet Utilizes Human Input => SHA256 => KECCAK To Generate A Ethereum Keypair''')
- add_wallet()
- if topic.lower() == 'add_wallet/privatekey':
- print('''
- |[HELP]|>>: Selecting Private Key While Creating A Wallet Accepts A 64 Character (32 byte) 0-9, a-f Private Key To Generate A Ethereum Keypair''')
- add_wallet()
- ############# Group Functions ##############################
- # Creates A New Group For User
- def create_new_group(pak):
- global Data
- if pak[0]:
- Req = yes_no('Create New Group')
- if Req:
- label = label_group(pak)
- Data['ETHEREUM']['WALLET']['GROUPS']['LIST'].append(label)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][label] = dict()
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][label]['TOTAL WALLETS'] = 0
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][label]['LIST'] = list()
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][label]['STACK'] = dict()
- if pak[0]:
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][label]['TOTAL WALLETS'] += 1
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][label]['LIST'].append(pak[1])
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][label][pak[1]] = dict()
- Req = yes_no('Would You Like To Name This Address')
- if Req:
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['LABEL'] = label_address(pak[1])
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['KEY'] = pak[2]
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['BALANCE'] = get_eth_balance(pak[1])
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTION COUNT'] = get_eth_transactionCount(pak[1])
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTIONS'] = store_address_transactions(address,Syn[0])
- else:
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['LABEL'] = str(pak[1])
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['KEY'] = pak[2]
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['BALANCE'] = get_eth_balance(pak[1])
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTION COUNT'] = get_eth_transactionCount(pak[1])
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTIONS'] = dict()
- # Labels A Group. Returns Group label
- def label_group(_):
- print('Please Submit A Name For A New Group.')
- label = input('>>: ')
- if label.lower() == '':
- print('You Must Enter At Least A Single Character')
- if label.lower() in Data['ETHEREUM']['WALLET']['GROUPS']['LIST']:
- Req = yes_no('You Already Own This Group. Would You Like To Make A New Group?')
- if Req:
- label_group(_)
- else:
- option_selector()
- else:
- Req = yes_no('New Group Will Be Created As: [{}] Is This Ok'.format(label))
- if Req:
- return label
- else:
- label_group(_)
- # Scans Available Groups For Address
- def check_groups_for_wallet(w,k):
- global Data
- if Data['ETHEREUM']['WALLET']['TOTAL GROUPS'] > 0 and Data['ETHEREUM']['WALLET']['GROUPS']['LIST'] != []:
- for i in Data['ETHEREUM']['WALLET']['GROUPS']['LIST']:
- if w in Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][i]['LIST']:
- print('Wallet [{}] Already Owned In Group: [{}]'.format(w,i))
- Req = yes_no('Would You Like To Group Anyways')
- if Req:
- group_wallet(w,k,[True,i])
- else:
- app_start()
- elif Data['ETHEREUM']['WALLET']['TOTAL GROUPS'] == 0 and Data['ETHEREUM']['WALLET']['GROUPS']['LIST'] == []:
- Req = yes_no('You Do Not Own Any Groups At This Time Would You Like To Create A New Group')
- if Req:
- create_new_group([True,w,k])
- else:
- Req = yes_no('Return To App Start')
- if Req:
- app_start()
- else:
- check_groups_for_wallet(w,k)
- ############# Wallet Functions Below #######################
- # Adds A Wallet To A Group
- def group_wallet(address,private,options):
- global Data
- if Data['ETHEREUM']['WALLET']['TOTAL GROUPS'] > 0 and Data['ETHEREUM']['WALLET']['GROUPS']['LIST'] != []:
- if options[0] == True:
- mock = Data['ETHEREUM']['WALLET']['GROUPS']['LIST']
- mock.remove(options[1])
- subOptions = '%s' % ' '.join(mock)
- print('Please Choose A Group For Address Or -create')
- print('Options: [{}]'.format(subOptions))
- Inp = input('>>: ')
- Syn = Inp.split(' ')
- if len(Syn) == 1:
- if Syn[0].lower() in Syntax['Sudo Create']:
- create_new_group([True,address,private])
- elif Syn[0] in mock:
- if Syn[0] in Data['ETHEREUM']['WALLET']['GROUPS']['STACK']:
- if address not in Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]]['LIST']:
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]]['LIST'].append(address)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]]['TOTAL WALLETS'] += 1
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address] = dict()
- Req = yes_no('Would You Like To Name This Address')
- if Req:
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['LABEL'] = label_address(address)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['KEY'] = private
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['BALANCE'] = get_eth_balance(address)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTION COUNT'] = get_eth_transactionCount(address)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTIONS'] = store_address_transactions(address,Syn[0])
- else:
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['LABEL'] = str(address)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['KEY'] = private
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['BALANCE'] = get_eth_balance(address)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTION COUNT'] = get_eth_transactionCount(address)
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'][Syn[0]][address]['TRANSACTIONS'] = dict()
- elif Syn[0] not in mock:
- print('[{}] Is Not In [{}] Please Try Again'.format(Syn[0],subOptions))
- group_wallet(address,private,options)
- # Labels A Address. Returns Group label
- def label_address(address):
- print('Please Submit A Name For This Address Or Use None.')
- label = input('>>: ')
- if label.lower() == 'none' or label.lower() == '' or label.lower() == address:
- Req = yes_no('Address [{0}] Will Be Labeled As [{0}] Is This Ok'.format(address))
- if Req:
- return str(address)
- else:
- label_address(address)
- else:
- Req = yes_no(yes_no('Address [{0}] Will Be Labeled As [{1}] Is This Ok'.format(address,label)))
- if Req:
- return label
- else:
- label_address(address)
- # Wallet Addition Utility
- def add_wallet():
- print('|[NOTICE]|>>: Use -back To Return To Action Menu Or Use -help(data) or -help(privatekey) For More Information')
- print('Would You Like To Create A Wallet Via Data Or Private Key? [SYNTAX]: -data/-privatekey')
- Req = input('|[INPUT]|>>: ')
- Digest = Req.split(' ')
- if len(Digest) > 0:
- if Digest[0].lower() == '-help(data)':
- HELP('add_wallet/data')
- if Digest[0].lower() == '-help(privatekey)':
- HELP('add_wallet/privatekey')
- if Digest[0].lower() == '-back':
- app_start(title=False)
- if Digest[0].lower() == '-data':
- Digest.remove(Digest[0])
- D = '%s' % ' '.join(Digest)
- hash_lab(D)
- ############# User Functions Below ##########################
- # Clears User Loading Template
- def blank_data():
- global Data
- ######### Application Data #################
- Data['APPLICATION'] = dict()
- Data['APPLICATION']['VERSION'] = _VERSION
- Data['APPLICATION']['TITLE'] = _TITLE
- Data['APPLICATION']['AUTHOR'] = _AUTHOR
- ############################################
- ######### User Data ########################
- Data['USER'] = dict()
- Data['USER']['LOGGED'] = False
- Data['USER']['USERNAME'] = ''
- Data['USER']['PASSWORD'] = ''
- Data['USER']['CREATION TIME'] = _time()
- ###########################################
- ######### Network Data ####################
- Data['NETWORK'] = dict()
- Data['NETWORK']['NODES'] = dict()
- Data['NETWORK']['NODES']['TOTAL'] = 2
- Data['NETWORK']['NODES']['INFURA'] = dict()
- Data['NETWORK']['NODES']['INFURA']['KOVAN'] = dict()
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['SET'] = True
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['RPC'] = _TESTNODE
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['APIKEY'] = _TESTAPI
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['TOTAL CALLS'] = 0
- Data['NETWORK']['NODES']['INFURA']['MAINNET'] = dict()
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['SET'] = False
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['RPC'] = ''
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['APIKEY'] = ''
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['TOTAL CALLS'] = 0
- Data['NETWORK']['NODES']['LOCAL'] = dict()
- Data['NETWORK']['NODES']['LOCAL']['RPC'] = ''
- Data['NETWORK']['NODES']['LOCAL']['TOTAL CALLS'] = 0
- ############################################
- ######## Ethereum Data #####################
- Data['ETHEREUM'] = dict()
- Data['ETHEREUM']['WALLET'] = dict()
- Data['ETHEREUM']['WALLET']['TOTAL WALLETS'] = 0
- Data['ETHEREUM']['WALLET']['TOTAL GROUPS'] = 0
- Data['ETHEREUM']['WALLET']['GROUPS'] = dict()
- Data['ETHEREUM']['WALLET']['GROUPS']['LIST'] = list()
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'] = dict()
- Data['ETHEREUM']['TRANSACTIONS'] = dict()
- Data['ETHEREUM']['TRANSACTIONS']['TOTAL'] = 0
- Data['ETHEREUM']['TRANSACTIONS']['STACK'] = dict()
- # Loads User Pickle Template For Object Stamp
- def load_user(where):
- global Data
- what = pickle.load(open(where,'rb'))
- Data.update(what)
- Data['USER']['LOGGED'] = True
- # Collects A Username For Client
- def collect_username():
- print('Please Provide A Username')
- Req = input('|[INPUT]|>>: ')
- return Req
- # Collects A Sha256 Hash Of Users Password
- def collect_password(user):
- print('Please Provide The Password For Username [{}]'.format(user))
- Req = input('|[INPUT]|>>: ')
- return hashlib.sha256(Req.encode()).hexdigest()
- # Create User Function Requires: Username + Password
- def create_user(username,passhash):
- global Data
- Req = yes_no('Would You Like To Create User: [{}]'.format(Data['USER']['USERNAME']))
- if Req:
- ######### Application Data #################
- Data['APPLICATION'] = dict()
- Data['APPLICATION']['VERSION'] = _VERSION
- Data['APPLICATION']['TITLE'] = _TITLE
- Data['APPLICATION']['AUTHOR'] = _AUTHOR
- ############################################
- ######### User Data ########################
- Data['USER'] = dict()
- Data['USER']['LOGGED'] = False
- Data['USER']['USERNAME'] = username
- Data['USER']['PASSWORD'] = passhash
- Data['USER']['CREATION TIME'] = _time()
- ###########################################
- ######### Network Data ####################
- Data['NETWORK'] = dict()
- Data['NETWORK']['NODES'] = dict()
- Data['NETWORK']['NODES']['TOTAL'] = 2
- Data['NETWORK']['NODES']['INFURA'] = dict()
- Data['NETWORK']['NODES']['INFURA']['KOVAN'] = dict()
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['SET'] = True
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['RPC'] = _TESTNODE
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['APIKEY'] = _TESTAPI
- Data['NETWORK']['NODES']['INFURA']['KOVAN']['TOTAL CALLS'] = 0
- Data['NETWORK']['NODES']['INFURA']['MAINNET'] = dict()
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['SET'] = False
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['RPC'] = ''
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['APIKEY'] = ''
- Data['NETWORK']['NODES']['INFURA']['MAINNET']['TOTAL CALLS'] = 0
- Data['NETWORK']['NODES']['LOCAL'] = dict()
- Data['NETWORK']['NODES']['LOCAL']['RPC'] = ''
- Data['NETWORK']['NODES']['LOCAL']['TOTAL CALLS'] = 0
- ############################################
- ######## Ethereum Data #####################
- Data['ETHEREUM'] = dict()
- Data['ETHEREUM']['WALLET'] = dict()
- Data['ETHEREUM']['WALLET']['TOTAL WALLETS'] = 0
- Data['ETHEREUM']['WALLET']['TOTAL GROUPS'] = 0
- Data['ETHEREUM']['WALLET']['GROUPS'] = dict()
- Data['ETHEREUM']['WALLET']['GROUPS']['LIST'] = list()
- Data['ETHEREUM']['WALLET']['GROUPS']['STACK'] = dict()
- Data['ETHEREUM']['TRANSACTIONS'] = dict()
- Data['ETHEREUM']['TRANSACTIONS']['TOTAL'] = 0
- Data['ETHEREUM']['TRANSACTIONS']['STACK'] = dict()
- print('User: [{}] Created!'.format(Data['USER']['USERNAME']))
- pickle.dump(Data,open('{}.user'.format(Data['USER']['USERNAME']),'wb'))
- app_start(title=True)
- else:
- app_start()
- if __name__ == '__main__':
- blank_data()
- app_start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement