diff --git a/catalyst/constants.py b/catalyst/constants.py index 3369e412..e40680c7 100644 --- a/catalyst/constants.py +++ b/catalyst/constants.py @@ -43,3 +43,6 @@ ENIGMA_CONTRACT = 'https://raw.githubusercontent.com/enigmampc/' \ ENIGMA_CONTRACT_ABI = 'https://raw.githubusercontent.com/enigmampc/' \ 'catalyst/master/catalyst/marketplace/' \ 'contract_enigma_abi.json' + +SUPPORTED_WALLETS = ['metamask', 'ledger', 'trezor', 'bitbox', 'keystore', + 'key'] diff --git a/catalyst/marketplace/marketplace.py b/catalyst/marketplace/marketplace.py index e777461d..a16b0a6c 100644 --- a/catalyst/marketplace/marketplace.py +++ b/catalyst/marketplace/marketplace.py @@ -127,9 +127,10 @@ class Marketplace: else: while True: for i in range(0, len(self.addresses)): - print('{}\t{}\t{}'.format( + print('{}\t{}\t{}\t{}'.format( i, self.addresses[i]['pubAddr'], + self.addresses[i]['wallet'], self.addresses[i]['desc']) ) address_i = int(input('Choose your address associated with ' @@ -146,7 +147,7 @@ class Marketplace: def sign_transaction(self, tx): - url = 'https://www.myetherwallet.com/#offline-transaction' + url = 'https://www.mycrypto.com/#offline-transaction' print('\nVisit {url} and enter the following parameters:\n\n' 'From Address:\t\t{_from}\n' '\n\tClick the "Generate Information" button\n\n' @@ -499,7 +500,8 @@ class Marketplace: key = self.addresses[address_i]['key'] secret = self.addresses[address_i]['secret'] else: - key, secret = get_key_secret(address) + key, secret = get_key_secret(address, + self.addresses[address_i]['wallet']) headers = get_signed_headers(ds_name, key, secret) log.info('Starting download of dataset for ingestion...') @@ -514,12 +516,13 @@ class Marketplace: try: decoder = MultipartDecoder.from_response(r) # with maybe_show_progress( - # iter(decoder.parts), + # iter(decoder.parts), # True, # label='Processing files') as part: - counter = 0 + counter = 0 for part in decoder.parts: - log.info("Processing file {} of {}".format(counter, len(decoder.parts))) + log.info("Processing file {} of {}".format( + counter, len(decoder.parts))) h = part.headers[b'Content-Disposition'].decode('utf-8') # Extracting the filename from the header name = re.search(r'filename="(.*)"', h).group(1) @@ -693,7 +696,8 @@ class Marketplace: key = self.addresses[address_i]['key'] secret = self.addresses[address_i]['secret'] else: - key, secret = get_key_secret(address) + key, secret = get_key_secret(address, + self.addresses[address_i]['wallet']) grains = to_grains(price) @@ -774,7 +778,7 @@ class Marketplace: key = match['key'] secret = match['secret'] else: - key, secret = get_key_secret(provider_info[0]) + key, secret = get_key_secret(provider_info[0], match['wallet']) headers = get_signed_headers(dataset, key, secret) filenames = glob.glob(os.path.join(datadir, '*.csv')) diff --git a/catalyst/marketplace/utils/auth_utils.py b/catalyst/marketplace/utils/auth_utils.py index f4d893a8..5eb0b66a 100644 --- a/catalyst/marketplace/utils/auth_utils.py +++ b/catalyst/marketplace/utils/auth_utils.py @@ -10,10 +10,10 @@ from catalyst.marketplace.marketplace_errors import ( MarketplaceEmptySignature) from catalyst.marketplace.utils.path_utils import ( get_user_pubaddr, save_user_pubaddr) -from catalyst.constants import AUTH_SERVER +from catalyst.constants import AUTH_SERVER, SUPPORTED_WALLETS -def get_key_secret(pubAddr, wallet='mew'): +def get_key_secret(pubAddr, wallet): """ Obtain a new key/secret pair from authentication server @@ -43,21 +43,22 @@ def get_key_secret(pubAddr, wallet='mew'): auth_type, auth_info = header.split(None, 1) d = requests.utils.parse_dict_header(auth_info) - nonce = '0x{}'.format(d['nonce']) + nonce = 'Catalyst nonce: 0x{}'.format(d['nonce']) - if wallet == 'mew': - url = 'https://www.myetherwallet.com/signmsg.html' + if wallet in SUPPORTED_WALLETS: + url = 'https://www.mycrypto.com/signmsg.html' print('\nObtaining a key/secret pair to streamline all future ' 'requests with the authentication server.\n' 'Visit {url} and sign the ' - 'following message:\n{nonce}'.format( + 'following message (copy the entire line, without the ' + 'line break at the end):\n\n{nonce}'.format( url=url, nonce=nonce)) webbrowser.open_new(url) - signature = input('Copy and Paste the "sig" field from ' + signature = input('\nCopy and Paste the "sig" field from ' 'the signature here (without the double quotes, ' 'only the HEX value):\n') else: @@ -91,7 +92,8 @@ def get_key_secret(pubAddr, wallet='mew'): addresses = get_user_pubaddr() match = next((l for l in addresses if - l['pubAddr'] == pubAddr), None) + l['pubAddr'].lower() == pubAddr.lower()), None) + match['key'] = response.json()['key'] match['secret'] = response.json()['secret'] diff --git a/catalyst/marketplace/utils/path_utils.py b/catalyst/marketplace/utils/path_utils.py index fd4ee663..4d230271 100644 --- a/catalyst/marketplace/utils/path_utils.py +++ b/catalyst/marketplace/utils/path_utils.py @@ -2,6 +2,7 @@ import os import json import tarfile +from catalyst.constants import SUPPORTED_WALLETS from catalyst.utils.deprecate import deprecated from catalyst.utils.paths import data_root, ensure_directory from catalyst.marketplace.marketplace_errors import MarketplaceJSONError @@ -131,17 +132,63 @@ def get_user_pubaddr(environ=None): try: d = data[0]['pubAddr'] except Exception as e: - return [data, ] + data = [data, ] + + changed = False + + for idx, d in enumerate(data): + try: + if d['wallet'] not in SUPPORTED_WALLETS: + data[idx]['wallet'] = _choose_wallet( + d['pubAddr'], False) + changed = True + except KeyError: + data[idx]['wallet'] = _choose_wallet( + d['pubAddr'], True) + changed = True + + if changed: + save_user_pubaddr(data) + return data + else: data = [] - data.append(dict(pubAddr='', desc='')) + data.append(dict(pubAddr='', desc='', wallet='')) with open(filename, 'w') as f: json.dump(data, f, sort_keys=False, indent=2, separators=(',', ':')) return data +def _choose_wallet(pubAddr, missing): + while True: + if missing: + print('\nYou need to specify a wallet for address ' + '{}.'.format(pubAddr)) + else: + print('\nThe wallet specified for address {} is not ' + 'supported.'.format(pubAddr)) + + print('Please choose among the following options:') + for idx, wallet in enumerate(SUPPORTED_WALLETS): + print('{}\t{}'.format(idx, wallet)) + + lw = len(SUPPORTED_WALLETS)-1 + w = input('Choose a number between 0 and {}: '.format( + lw)) + try: + w = int(w) + except ValueError: + print('Enter a number between 0 and {}'.format(lw)) + else: + if w not in range(0, lw+1): + print('Enter a number between 0 and ' + '{}'.format(lw)) + else: + return SUPPORTED_WALLETS[w] + + def save_user_pubaddr(data, environ=None): """ Saves the user's public addresses and their related metadata in