From 34462b154d6026fba8ddc8a8097d6970737dc66c Mon Sep 17 00:00:00 2001 From: jsonsivar Date: Sun, 16 Dec 2018 18:21:52 -0500 Subject: [PATCH 1/6] Updated settings to come form env and added network setting to session --- ether_sql/session.py | 3 +++ ether_sql/settings.py | 34 ++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/ether_sql/session.py b/ether_sql/session.py index 6731f51..991fec0 100644 --- a/ether_sql/session.py +++ b/ether_sql/session.py @@ -33,6 +33,9 @@ def __init__(self, setting_name=None): setup_logging(settings=self.settings) logger.debug(self.settings.LOG_LEVEL) + logger.info('CONNNECTING TO NETWORK {}'.format(self.settings.ETH_NETWORK)) + self.network = self.settings.ETH_NETWORK + self.db_engine, self.url = setup_db_engine(settings=self.settings) self.w3 = setup_node_session(settings=self.settings) diff --git a/ether_sql/settings.py b/ether_sql/settings.py index 48fb5b3..635757f 100644 --- a/ether_sql/settings.py +++ b/ether_sql/settings.py @@ -14,11 +14,10 @@ class DefaultSettings(): # SQLALCHEMY settings - SQLALCHEMY_USER = os.environ.get("USER") - # password that is set when creating psql user - SQLALCHEMY_PASSWORD = 'develop' - SQLALCHEMY_DB = 'ether_sql' - SQLALCHEMY_HOST = 'localhost' + SQLALCHEMY_USER = os.environ.get("DB_USERNAME") + SQLALCHEMY_PASSWORD = os.environ.get("DB_PASSWORD") + SQLALCHEMY_DB = os.environ.get("DB_NAME") + SQLALCHEMY_HOST = os.environ.get("DB_HOST") SQLALCHEMY_PORT = 5432 # Logging settings @@ -39,11 +38,24 @@ class DefaultSettings(): BLOCK_LAG = 100 FILTER_TIME = 30 + ETH_NETWORK = os.environ.get("ETH_NETWORK") + + ETH_NETWORK_POSSIBLE_VALUES = [ + "ethereum_main", + "ethereum_ropsten", + "ethereum_kovan", + "ethereum_rinkeby", + ] + + if(ETH_NETWORK not in ETH_NETWORK_POSSIBLE_VALUES): + raise ValueError("ETH_NETWORK invalid") + + class PersonalInfuraSettings(DefaultSettings): NODE_TYPE = "Infura" - NODE_API_TOKEN = "" # your infura api_token + NODE_API_TOKEN = os.environ.get("INFURA_ID") # your infura api_token NODE_URL = 'https://mainnet.infura.io/{}'.format(NODE_API_TOKEN) - + # TODO @jsonsivar: should add infura secret as well class PersonalParitySettings(DefaultSettings): NODE_TYPE = "Parity" @@ -58,8 +70,7 @@ class PersonalGethSettings(DefaultSettings): class TestSettings(DefaultSettings): # SQLALCHEMY settings - SQLALCHEMY_PASSWORD = 'develop' - SQLALCHEMY_DB = 'ether_sql_tests' + SQLALCHEMY_DB = 'ethereum_test' NEW_BLOCKS = False # Logging settings LOG_LEVEL = "DEBUG" @@ -67,7 +78,6 @@ class TestSettings(DefaultSettings): class ParityTestSettings(TestSettings): - # Node settings # Available options 'Geth', 'Parity', 'Infura' NODE_TYPE = "Parity" @@ -87,3 +97,7 @@ def get_setting_names(): if inspect.isclass(obj): setting_names.append(name) return setting_names + +# TODO @jsonsivar: for all settings, should validate ETH_NETWORK value +# against actual network ID on the node/infura + From bdccade77b945d40810a2c91cee256d26f4fda2e Mon Sep 17 00:00:00 2001 From: jsonsivar Date: Sun, 16 Dec 2018 18:22:58 -0500 Subject: [PATCH 2/6] Added common network field in db and migration --- ...5a966e7671a_added_common_network_column.py | 50 +++++++++++++++++++ ether_sql/models/__init__.py | 8 ++- 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 ether_sql/migrations/versions/65a966e7671a_added_common_network_column.py diff --git a/ether_sql/migrations/versions/65a966e7671a_added_common_network_column.py b/ether_sql/migrations/versions/65a966e7671a_added_common_network_column.py new file mode 100644 index 0000000..ef0d291 --- /dev/null +++ b/ether_sql/migrations/versions/65a966e7671a_added_common_network_column.py @@ -0,0 +1,50 @@ +"""Added common network column + +Revision ID: 65a966e7671a +Revises: 75bd00cd3edc +Create Date: 2018-12-15 22:18:52.038771 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '65a966e7671a' +down_revision = '75bd00cd3edc' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('block_task_meta', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('blocks', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('logs', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('meta_info', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('receipts', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('state', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('state_diff', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('storage', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('storage_diff', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('traces', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('transactions', sa.Column('network', sa.String(length=32), nullable=False)) + op.add_column('uncles', sa.Column('network', sa.String(length=32), nullable=False)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('uncles', 'network') + op.drop_column('transactions', 'network') + op.drop_column('traces', 'network') + op.drop_column('storage_diff', 'network') + op.drop_column('storage', 'network') + op.drop_column('state_diff', 'network') + op.drop_column('state', 'network') + op.drop_column('receipts', 'network') + op.drop_column('meta_info', 'network') + op.drop_column('logs', 'network') + op.drop_column('blocks', 'network') + op.drop_column('block_task_meta', 'network') + # ### end Alembic commands ### diff --git a/ether_sql/models/__init__.py b/ether_sql/models/__init__.py index 2c5bceb..d8414b2 100644 --- a/ether_sql/models/__init__.py +++ b/ether_sql/models/__init__.py @@ -1,5 +1,5 @@ from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import MetaData +from sqlalchemy import Column, String, MetaData convention = { "ix": 'ix_%(column_0_label)s', @@ -11,7 +11,11 @@ metadata = MetaData(naming_convention=convention) -base = declarative_base(metadata=metadata) +# Add a network column to be used for all tables +class Base(object): + network = Column(String(32), nullable=False) + +base = declarative_base(metadata=metadata, cls=Base) # Initializing these classes here to remove sqlalchemy.exc.InvalidRequestError # More here: https://stackoverflow.com/a/45613994/3420738 From 90a12b7a015d417acf14bfc2f3316337de720583 Mon Sep 17 00:00:00 2001 From: jsonsivar Date: Sun, 16 Dec 2018 18:23:35 -0500 Subject: [PATCH 3/6] Reflect network in all the models --- ether_sql/models/block_task_meta.py | 19 +++++++++++++------ ether_sql/models/blocks.py | 12 +++++++----- ether_sql/models/logs.py | 9 ++++++--- ether_sql/models/meta_info.py | 21 ++++++++++++++------- ether_sql/models/receipts.py | 10 +++++++--- ether_sql/models/state.py | 19 +++++++++++++------ ether_sql/models/state_diff.py | 8 +++++++- ether_sql/models/storage.py | 9 ++++++--- ether_sql/models/storage_diff.py | 1 + ether_sql/models/traces.py | 9 ++++++--- ether_sql/models/transactions.py | 10 ++++++++-- ether_sql/models/uncles.py | 8 ++++++-- 12 files changed, 94 insertions(+), 41 deletions(-) diff --git a/ether_sql/models/block_task_meta.py b/ether_sql/models/block_task_meta.py index 837f6dd..2e160d5 100644 --- a/ether_sql/models/block_task_meta.py +++ b/ether_sql/models/block_task_meta.py @@ -29,6 +29,7 @@ def to_dict(self): 'state': self.state, 'block_number': self.block_number, 'block_hash': self.block_hash, + 'network': self.network } @classmethod @@ -38,7 +39,8 @@ def add_block_task_meta(cls, block_number, task_name, state, task_id=None, block state=state, block_number=block_number, block_hash=block_hash, - task_id=task_id) + task_id=task_id, + network=current_session.network) with current_session.db_session_scope(): current_session.db_session.add(block_task_meta) @@ -46,7 +48,8 @@ def add_block_task_meta(cls, block_number, task_name, state, task_id=None, block def update_block_task_meta_from_block_number(cls, current_session, block_number, **kwargs): block_task_meta = current_session.db_session.query(cls).\ - filter_by(block_number=block_number) + filter_by(block_number=block_number).\ + filter_by(network=current_session.network) logger.debug('Updating task meta of block {0}'.format(block_number)) for i_block_task_meta in block_task_meta: for key, value in kwargs.items(): @@ -57,17 +60,20 @@ def update_block_task_meta_from_block_number(cls, current_session, @classmethod def get_block_task_meta_from_task_id(cls, current_session, task_id): return current_session.db_session.query(cls).\ - filter_by(task_id=task_id) + filter_by(task_id=task_id).\ + filter_by(network=current_session.network) @classmethod def get_block_task_meta_from_block_number(cls, current_session, block_number): return current_session.db_session.query(cls).\ - filter_by(block_number=block_number) + filter_by(block_number=block_number).\ + filter_by(network=current_session.network) @classmethod def get_block_task_meta_from_block_hash(cls, current_session, block_hash): return current_session.db_session.query(cls).\ - filter_by(block_hash=block_hash) + filter_by(block_hash=block_hash).\ + filter_by(network=current_session.network) @classmethod def get_blocks_to_be_pushed_in_queue(cls, current_session): @@ -76,5 +82,6 @@ def get_blocks_to_be_pushed_in_queue(cls, current_session): block_lag = current_session.settings.BLOCK_LAG query = current_session.db_session.query(cls.block_number).filter( and_(cls.state=='WAITING', - cls.block_number < current_eth_blocknumber-block_lag)) + cls.block_number < current_eth_blocknumber-block_lag,\ + cls.network==current_session.network)) return query.from_self().distinct() diff --git a/ether_sql/models/blocks.py b/ether_sql/models/blocks.py index af29047..6ae9e99 100644 --- a/ether_sql/models/blocks.py +++ b/ether_sql/models/blocks.py @@ -59,7 +59,8 @@ def to_dict(self): 'extra_data': self.extra_data, 'gas_limit': self.gas_limit, 'uncle_count': self.uncle_count, - 'transaction_count': self.transaction_count + 'transaction_count': self.transaction_count, + 'network': self.network } def __repr__(self): @@ -74,6 +75,7 @@ def add_block(cls, block_data, iso_timestamp): :param dict block_data: data received from the JSON RPC call :param datetime iso_timestamp: timestamp when the block was mined """ + current_session = get_current_session() block = cls(block_hash=to_hex(block_data['hash']), parent_hash=to_hex(block_data['parentHash']), difficulty=to_int(block_data['difficulty']), @@ -85,7 +87,8 @@ def add_block(cls, block_data, iso_timestamp): extra_data=to_hex(block_data['extraData']), gas_limit=to_int(block_data['gasLimit']), transaction_count=len(block_data['transactions']), - uncle_count=len(block_data['uncles'])) + uncle_count=len(block_data['uncles']), + network=current_session.network) return block @@ -93,9 +96,8 @@ def add_block(cls, block_data, iso_timestamp): def get_max_block_number(cls): current_session = get_current_session() with current_session.db_session_scope(): - max_block_number = current_session.db_session.query( - func.max(cls.block_number)).scalar() + func.max(cls.block_number)).filter(cls.network == current_session.network).scalar() return max_block_number @classmethod @@ -112,7 +114,7 @@ def missing_blocks(cls, max_block_number=None): with current_session.db_session_scope(): stmt = current_session.db_session.query( func.generate_series(0, max_block_number).label('i')).subquery() - joined = stmt.outerjoin(cls, cls.block_number == stmt.c.i) + joined = stmt.outerjoin(cls, cls.block_number == stmt.c.i and cls.network == current_session.network) missing_blocks = current_session.db_session.query(stmt.c.i.label('block_number')).\ select_from(joined).filter(cls.block_number == None).all() return missing_blocks diff --git a/ether_sql/models/logs.py b/ether_sql/models/logs.py index f27ae23..6452f56 100644 --- a/ether_sql/models/logs.py +++ b/ether_sql/models/logs.py @@ -4,6 +4,7 @@ from eth_utils import to_checksum_address from web3.utils.encoding import to_int, to_hex from ether_sql.models import base +from ether_sql.globals import get_current_session logger = logging.getLogger(__name__) @@ -56,7 +57,8 @@ def to_dict(self): 'topic_1': self.topic_1, 'topic_2': self.topic_2, 'topic_3': self.topic_3, - 'topic_4': self.topic_4 + 'topic_4': self.topic_4, + 'network': self.network } @classmethod @@ -71,7 +73,7 @@ def add_log(cls, log_data, block_number, iso_timestamp): """ topics_count = len(log_data['topics']) - + current_session = get_current_session() log = cls(transaction_hash=to_hex(log_data['transactionHash']), transaction_index=to_int(log_data['transactionIndex']), topics_count=topics_count, @@ -83,7 +85,8 @@ def add_log(cls, log_data, block_number, iso_timestamp): topic_1='', topic_2='', topic_3='', - topic_4='') + topic_4='', + network=current_session.network) if topics_count == 0: logger.warn('No topics present') diff --git a/ether_sql/models/meta_info.py b/ether_sql/models/meta_info.py index d8da41a..ce65b9c 100644 --- a/ether_sql/models/meta_info.py +++ b/ether_sql/models/meta_info.py @@ -25,34 +25,41 @@ def to_dict(self): return { 'last_pushed_block': self.last_pushed_block, 'current_state_block': self.current_state_block, + 'network': self.network, } @classmethod def get_last_pushed_block(cls): current_session = get_current_session() with current_session.db_session_scope(): - return current_session.db_session.query(cls).first().\ - last_pushed_block + return current_session.db_session.query(cls).\ + filter(cls.network == current_session.network).last_pushed_block.\ + first() @classmethod def get_current_state_block(cls): current_session = get_current_session() with current_session.db_session_scope(): - return current_session.db_session.query(cls).first().\ - current_state_block + return current_session.db_session.query(cls).\ + current_state_block.filter(cls.network == current_session.network).\ + first() @classmethod def set_last_pushed_block(cls, current_session, block_number): - meta_info = current_session.db_session.query(cls).filter(cls.id == 1).first() + meta_info = current_session.db_session.query(cls).filter(cls.id == 1).\ + filter(cls.network == current_session.network).\ + first() if meta_info is None: - meta_info = cls(last_pushed_block=block_number) + meta_info = cls(last_pushed_block=block_number, network=current_session.network) else: meta_info.last_pushed_block = block_number current_session.db_session.add(meta_info) @classmethod def set_current_state_block(cls, current_session, block_number): - meta_info = current_session.db_session.query(cls).filter(cls.id == 1).first() + meta_info = current_session.db_session.query(cls).filter(cls.id == 1).\ + filter(cls.network == current_session.network).\ + first() if meta_info is None: meta_info = cls(current_state_block=block_number) else: diff --git a/ether_sql/models/receipts.py b/ether_sql/models/receipts.py index 67cb8bc..75db708 100644 --- a/ether_sql/models/receipts.py +++ b/ether_sql/models/receipts.py @@ -3,7 +3,7 @@ from eth_utils import to_checksum_address from ether_sql.models import base from ether_sql.constants import mainnet - +from ether_sql.globals import get_current_session class Receipts(base): """ @@ -40,7 +40,8 @@ def to_dict(self): 'contract_address': self.contract_address, 'block_number': self.block_number, 'timestamp': self.timestamp, - 'transaction_index': self.transaction_index + 'transaction_index': self.transaction_index, + 'network': self.network } def __repr__(self): @@ -65,6 +66,8 @@ def add_receipt(cls, receipt_data, block_number, timestamp): except TypeError: contract_address = None + currrent_session = get_current_session() + receipt = cls(transaction_hash=to_hex(receipt_data['transactionHash']), status=status, gas_used=to_int(receipt_data['gasUsed']), @@ -72,6 +75,7 @@ def add_receipt(cls, receipt_data, block_number, timestamp): contract_address=contract_address, block_number=block_number, timestamp=timestamp, - transaction_index=to_int(receipt_data['transactionIndex'])) + transaction_index=to_int(receipt_data['transactionIndex']), + network=currrent_session.network) return receipt diff --git a/ether_sql/models/state.py b/ether_sql/models/state.py index 22e37a3..7d09335 100644 --- a/ether_sql/models/state.py +++ b/ether_sql/models/state.py @@ -43,7 +43,8 @@ def to_dict(self): 'address': self.address, 'balance': self.balance, 'nonce': self.balance, - 'code': self.code + 'code': self.code, + 'network': self.network } @classmethod @@ -52,11 +53,13 @@ def add_state(cls, address, balance, nonce, code): _nonce = 0 else: _nonce = nonce + current_session = get_current_session() state = cls( address=to_checksum_address(address), balance=balance, nonce=_nonce, - code=code) + code=code, + network=current_session.network) return state @classmethod @@ -86,14 +89,16 @@ def get_state_at_block(cls, block_number=None): current_session = get_current_session() with current_session.db_session_scope(): - current_session.db_session.query(Storage).delete() - current_session.db_session.query(cls).delete() + current_session.db_session.query(Storage).\ + filter(Storage.network == current_session.network).delete() + current_session.db_session.query(cls).\ + filter(cls.network == current_session.network).delete() # query to get the balance query_balance = current_session.db_session.query( StateDiff.address, func.sum(StateDiff.balance_diff).label('balance'), func.sum(StateDiff.nonce_diff).label('nonce')).\ - filter(StateDiff.block_number <= block_number).\ + filter(StateDiff.block_number <= block_number, StateDiff.network == current_session.network).\ group_by(StateDiff.address) subquery_balance = query_balance.subquery() # query to get the code @@ -104,7 +109,8 @@ def get_state_at_block(cls, block_number=None): .label('row_number') query_code = current_session.db_session.query( StateDiff.address.label('address'), - StateDiff.code_to.label('code')) + StateDiff.code_to.label('code')).\ + filter(StateDiff.network == current_session.network) query_code = query_code.add_column(row_number_column) query_code = query_code.filter( or_(StateDiff.code_from != None, StateDiff.code_to != None)) @@ -118,6 +124,7 @@ def get_state_at_block(cls, block_number=None): subquery_balance.c.balance, subquery_balance.c.nonce, subquery_code.c.code) + # TODO @jsonsivar: test if this needs to factor in network query_state = query_state.outerjoin(subquery_code, subquery_balance.c.address == subquery_code.c.address) # updating the state table with query results diff --git a/ether_sql/models/state_diff.py b/ether_sql/models/state_diff.py index 8eeb658..3501819 100644 --- a/ether_sql/models/state_diff.py +++ b/ether_sql/models/state_diff.py @@ -22,6 +22,7 @@ POST_BYZANTINIUM_REWARD, ) from eth_utils import to_checksum_address +from ether_sql.globals import get_current_session logger = logging.getLogger(__name__) @@ -70,6 +71,7 @@ def to_dict(self): 'code_from': self.code_from, 'code_to': self.code_to, 'state_diff_type': self.state_diff_type, + 'network': self.network } def _parseStateDiff(account_state, type): @@ -121,6 +123,8 @@ def add_state_diff(cls, balance_diff, nonce_diff, code_from, code_to, if address == miner and balance_diff == fees: state_diff_type = 'fees' + current_session = get_current_session() + state_diff = cls(block_number=block_number, timestamp=timestamp, transaction_hash=transaction_hash, @@ -130,7 +134,8 @@ def add_state_diff(cls, balance_diff, nonce_diff, code_from, code_to, nonce_diff=nonce_diff, code_from=code_from, code_to=code_to, - state_diff_type=state_diff_type) + state_diff_type=state_diff_type, + network=current_session.network) return state_diff @classmethod @@ -218,6 +223,7 @@ def add_mining_rewards(cls, current_session, block, uncle_list): @classmethod def parse_genesis_rewards(cls, current_session, block): + # TODO @jsonsivar: add genesis for other networks with open('ether_sql/constants/genesis_rewards.csv', 'r', encoding='utf-8') as genesis_rewards: reader = csv.reader(genesis_rewards) diff --git a/ether_sql/models/storage.py b/ether_sql/models/storage.py index 80c86dd..62fea03 100644 --- a/ether_sql/models/storage.py +++ b/ether_sql/models/storage.py @@ -34,11 +34,13 @@ def to_dict(self): return { 'address': self.address, 'position': self.position, - 'storage': self.storage} + 'storage': self.storage, + 'network': self.network} @classmethod def add_storage(cls, address, position, storage): - storage = cls(address=address, position=position, storage=storage) + current_session = get_current_session() + storage = cls(address=address, position=position, storage=storage, network=current_session.network) return storage @classmethod @@ -54,7 +56,8 @@ def get_storage_at_block(cls, current_session, block_number): order_by=[StorageDiff.block_number.desc(), StorageDiff.transaction_index.desc()])\ .label('row_number') - query = current_session.db_session.query(StorageDiff.address, StorageDiff.position, StorageDiff.storage_to.label('storage')) + query = current_session.db_session.query(StorageDiff.address, StorageDiff.position, StorageDiff.storage_to.label('storage')).\ + filter(StorageDiff.network == current_session.network) query = query.add_column(row_number_column) query = query.filter( and_( diff --git a/ether_sql/models/storage_diff.py b/ether_sql/models/storage_diff.py index 8556f8d..8e1ee5a 100644 --- a/ether_sql/models/storage_diff.py +++ b/ether_sql/models/storage_diff.py @@ -52,6 +52,7 @@ def to_dict(self): 'position': self.position, 'storage_from': self.storage_from, 'storage_to': self.storage_to, + 'network': self.network } @classmethod diff --git a/ether_sql/models/traces.py b/ether_sql/models/traces.py index 8216c0b..77df136 100644 --- a/ether_sql/models/traces.py +++ b/ether_sql/models/traces.py @@ -4,7 +4,7 @@ from web3.utils.formatters import hex_to_integer from eth_utils import to_checksum_address from ether_sql.models import base - +from ether_sql.globals import get_current_session logger = logging.getLogger(__name__) @@ -71,7 +71,8 @@ def to_dict(self): 'gas_used': self.gas_used, 'contract_address': self.contract_address, 'output': self.output, - 'error': self.error + 'error': self.error, + 'network': self.network } @classmethod @@ -87,6 +88,7 @@ def add_trace(cls, dict_trace, transaction_hash, transaction_index, """ logger.debug(dict_trace['action']) + current_session = get_current_session() trace = cls(transaction_hash=transaction_hash, block_number=block_number, trace_address=dict_trace['traceAddress'], @@ -101,7 +103,8 @@ def add_trace(cls, dict_trace, transaction_hash, transaction_index, gas_used=None, output='', contract_address='', - error='') + error='', + network=current_session.network) action = dict_trace['action'] diff --git a/ether_sql/models/transactions.py b/ether_sql/models/transactions.py index 9930869..3ea7053 100644 --- a/ether_sql/models/transactions.py +++ b/ether_sql/models/transactions.py @@ -4,6 +4,7 @@ from web3.utils.encoding import to_int, to_hex from eth_utils import to_checksum_address from ether_sql.models import base +from ether_sql.globals import get_current_session logger = logging.getLogger(__name__) @@ -54,7 +55,8 @@ def to_dict(self): 'data': self.data, 'gas_price': self.gas_price, 'timestamp': self.timestamp, - 'transaction_index': self.transaction_index} + 'transaction_index': self.transaction_index, + 'network': self.network} def __repr__(self): return "".format(self.transaction_hash) @@ -69,11 +71,14 @@ def add_transaction(cls, transaction_data, block_number, iso_timestamp): :param datetime iso_timestamp: timestamp when the block containing the transaction was mined :param int block_number: block number of the block where this transaction was included """ + try: receiver = to_checksum_address(transaction_data['to']) except TypeError: receiver = None + current_session = get_current_session() + transaction = cls(block_number=block_number, nonce=to_int(transaction_data['nonce']), transaction_hash=to_hex(transaction_data['hash']), @@ -84,6 +89,7 @@ def add_transaction(cls, transaction_data, block_number, iso_timestamp): data=transaction_data['input'], gas_price=str(to_int(transaction_data['gasPrice'])), timestamp=iso_timestamp, - transaction_index=to_int(transaction_data['transactionIndex'])) + transaction_index=to_int(transaction_data['transactionIndex']), + network=current_session.network) return transaction diff --git a/ether_sql/models/uncles.py b/ether_sql/models/uncles.py index b2ff832..36011bd 100644 --- a/ether_sql/models/uncles.py +++ b/ether_sql/models/uncles.py @@ -5,6 +5,7 @@ import logging from eth_utils import to_checksum_address from ether_sql.models import base +from ether_sql.globals import get_current_session logger = logging.getLogger(__name__) @@ -53,7 +54,8 @@ def to_dict(self): 'timestamp': self.timestamp, 'sha3uncles': self.sha3uncles, 'extra_data': self.extra_data, - 'gas_limit': self.gas_limit + 'gas_limit': self.gas_limit, + 'network': self.network } def __repr__(self): @@ -70,6 +72,7 @@ def add_uncle(cls, uncle_data, block_number, iso_timestamp): :param datetime iso_timestamp: timestamp when the block was mined """ logger.debug('{}'.format(uncle_data['gasUsed'])) + current_session = get_current_session() uncle = cls(uncle_hash=uncle_data['hash'], uncle_blocknumber=hex_to_integer(uncle_data['number']), # 'uncle_blocknumber' parent_hash=uncle_data['parentHash'], # parent_hash @@ -80,6 +83,7 @@ def add_uncle(cls, uncle_data, block_number, iso_timestamp): timestamp=iso_timestamp, sha3uncles=uncle_data['sha3Uncles'], # SHA3uncles extra_data=uncle_data['extraData'], # extra_data - gas_limit=hex_to_integer(uncle_data['gasLimit'])) + gas_limit=hex_to_integer(uncle_data['gasLimit']), + network=current_session.network) return uncle From c632cb36eece6e9d22dbe71bb35525c53c28d074 Mon Sep 17 00:00:00 2001 From: jsonsivar Date: Sun, 16 Dec 2018 18:24:55 -0500 Subject: [PATCH 4/6] Update tests to factor in network --- tests/common_tests/blocks.py | 71 ++++++++++++++++++-------------- tests/common_tests/new_blocks.py | 36 ++++++++++------ tests/common_tests/utils.py | 3 +- 3 files changed, 66 insertions(+), 44 deletions(-) diff --git a/tests/common_tests/blocks.py b/tests/common_tests/blocks.py index 998ccf7..d511e6f 100644 --- a/tests/common_tests/blocks.py +++ b/tests/common_tests/blocks.py @@ -74,36 +74,37 @@ def verify_state_at_block(block_number): def verify_block_range_56160_56170(): session = get_current_session() with session.db_session_scope(): - logger.debug('Total blocks {}'.format(session.db_session.query(Blocks).count())) - assert session.db_session.query(Blocks).count() == 11 - assert session.db_session.query(Transactions).count() == 3 - assert session.db_session.query(Receipts).count() == 3 - assert session.db_session.query(Logs).count() == 1 - assert session.db_session.query(Uncles).count() == 1 + logger.debug('Total blocks {}'.format(session.db_session.query(Blocks).\ + filter(Blocks.network==session.network).count())) + assert session.db_session.query(Blocks).filter(Blocks.network==session.network).count() == 11 + assert session.db_session.query(Transactions).filter(Transactions.network==session.network).count() == 3 + assert session.db_session.query(Receipts).filter(Receipts.network==session.network).count() == 3 + assert session.db_session.query(Logs).filter(Logs.network==session.network).count() == 1 + assert session.db_session.query(Uncles).filter(Uncles.network==session.network).count() == 1 # assert session.db_session.query(MetaInfo).count() == 1 number_of_rows_in_meta_info = session.db_session.\ - query(MetaInfo).count() + query(MetaInfo).filter(MetaInfo.network==session.network).count() meta_info_properties_in_sql = session.db_session.\ - query(MetaInfo).first().to_dict() + query(MetaInfo).filter(MetaInfo.network==session.network).first().to_dict() assert number_of_rows_in_meta_info == 1 print(meta_info_properties_in_sql) assert meta_info_properties_in_sql == EXPECTED_META_INFO if session.settings.PARSE_TRACE: - assert session.db_session.query(Traces).count() == 3 + assert session.db_session.query(Traces).filter(Blocks.network==session.network).count() == 3 if session.settings.PARSE_STATE_DIFF: - assert session.db_session.query(StateDiff).count() == 20 - assert session.db_session.query(StorageDiff).count() == 2 + assert session.db_session.query(StateDiff).filter(StateDiff.network==session.network).count() == 20 + assert session.db_session.query(StorageDiff).filter(StorageDiff.network==session.network).count() == 2 assert session.db_session.query(StateDiff).filter_by( - state_diff_type='miner').count() == 11 + state_diff_type='miner').filter_by(network=session.network).count() == 11 assert session.db_session.query(StateDiff).filter_by( - state_diff_type='fees').count() == 3 + state_diff_type='fees').filter_by(network=session.network).count() == 3 assert session.db_session.query(StateDiff).filter_by( - state_diff_type='sender').count() == 3 + state_diff_type='sender').filter_by(network=session.network).count() == 3 assert session.db_session.query(StateDiff).filter_by( - state_diff_type='uncle').count() == 1 + state_diff_type='uncle').filter_by(network=session.network).count() == 1 def verify_block_56160_contents(): @@ -112,33 +113,39 @@ def verify_block_56160_contents(): with session.db_session_scope(): block_properties_in_sql = session.db_session.\ - query(Blocks).filter_by(block_number=56160).first().to_dict() + query(Blocks).filter_by(block_number=56160).\ + filter_by(network=session.network).first().to_dict() assert block_properties_in_sql == EXPECTED_BLOCK_PROPERTIES # comparing values of uncles uncle_properties_in_sql = session.db_session.\ - query(Uncles).filter_by(current_blocknumber=56160).first().to_dict() + query(Uncles).filter_by(current_blocknumber=56160).\ + filter_by(network=session.network).first().to_dict() assert uncle_properties_in_sql == EXPECTED_UNCLE_PROPERTIES # comparing values of transactions transaction_properties_in_sql = session.db_session.\ - query(Transactions).filter_by(block_number=56160).first().to_dict() + query(Transactions).filter_by(block_number=56160).\ + filter_by(network=session.network).first().to_dict() assert transaction_properties_in_sql == EXPEXTED_TRANSACTION_PROPERTIES # comparing values of receipts receipt_properties_in_sql = session.db_session.\ - query(Receipts).filter_by(block_number=56160).first().to_dict() + query(Receipts).filter_by(block_number=56160).\ + filter_by(network=session.network).first().to_dict() assert receipt_properties_in_sql == EXPECTED_RECEIPT_PROPERTIES # comparing values of logs log_properties_in_sql = session.db_session.\ - query(Logs).filter_by(block_number=56160).first().to_dict() + query(Logs).filter_by(block_number=56160).\ + filter_by(network=session.network).first().to_dict() assert log_properties_in_sql == EXPECTED_LOG_PROPERTIES # comparing values of traces if session.settings.PARSE_TRACE: trace_properties_in_sql = session.\ - db_session.query(Traces).filter_by(block_number=56160).first().\ + db_session.query(Traces).filter_by(block_number=56160).\ + filter_by(network=session.network).first().\ to_dict() assert trace_properties_in_sql == EXPECTED_TRACE_PROPERTIES @@ -146,14 +153,16 @@ def verify_block_56160_contents(): if session.settings.PARSE_STATE_DIFF: # comparing values if state diffs state_diff_property_in_sql = session.\ - db_session.query(StateDiff).filter_by(block_number=56160).all() + db_session.query(StateDiff).filter_by(block_number=56160).\ + filter_by(network=session.network).all() for i in range(0, len(state_diff_property_in_sql)): assert state_diff_property_in_sql[i].to_dict() == \ EXPECTED_STATE_DIFF_PROPERTIES[i] # comparing values of storage_diffs storage_diff_property_in_sql = session.\ - db_session.query(StorageDiff).filter_by(block_number=56160).all() + db_session.query(StorageDiff).filter_by(block_number=56160).\ + filter_by(network=session.network).all() for i in range(0, len(storage_diff_property_in_sql)): assert storage_diff_property_in_sql[i].to_dict() == \ EXPECTED_STORAGE_DIFF_PROPERTIES[i] @@ -164,11 +173,11 @@ def verify_removed_block_range_56160_56170(): remove_block_number(i) session = get_current_session() with session.db_session_scope(): - assert session.db_session.query(Blocks).count() == 0 - assert session.db_session.query(Transactions).count() == 0 - assert session.db_session.query(Receipts).count() == 0 - assert session.db_session.query(Logs).count() == 0 - assert session.db_session.query(Uncles).count() == 0 - assert session.db_session.query(Traces).count() == 0 - assert session.db_session.query(StateDiff).count() == 0 - assert session.db_session.query(StorageDiff).count() == 0 + assert session.db_session.query(Blocks).filter_by(network=session.network).count() == 0 + assert session.db_session.query(Transactions).filter_by(network=session.network).count() == 0 + assert session.db_session.query(Receipts).filter_by(network=session.network).count() == 0 + assert session.db_session.query(Logs).filter_by(network=session.network).count() == 0 + assert session.db_session.query(Uncles).filter_by(network=session.network).count() == 0 + assert session.db_session.query(Traces).filter_by(network=session.network).count() == 0 + assert session.db_session.query(StateDiff).filter_by(network=session.network).count() == 0 + assert session.db_session.query(StorageDiff).filter_by(network=session.network).count() == 0 diff --git a/tests/common_tests/new_blocks.py b/tests/common_tests/new_blocks.py index 64bde01..ef5b49f 100644 --- a/tests/common_tests/new_blocks.py +++ b/tests/common_tests/new_blocks.py @@ -54,7 +54,8 @@ def put_initial_blocks_in_waiting(): block_hash=to_hex(block_hash)) verify_pushed_sql_contents() with current_session.db_session_scope(): - block_task_meta = current_session.db_session.query(BlockTaskMeta).first() + block_task_meta = current_session.db_session.query(BlockTaskMeta).\ + filter_by(network=current_session.network).first() assert block_task_meta.block_number == BASE_BLOCK assert block_task_meta.block_hash == EXPECTED_BLOCK_HASHES[BASE_BLOCK] assert block_task_meta.state == 'WAITING' @@ -64,7 +65,8 @@ def push_initial_blocks_in_queue(): current_session = get_current_session() push_blocks_in_queue() with current_session.db_session_scope(): - block_task_meta = current_session.db_session.query(BlockTaskMeta).first() + block_task_meta = current_session.db_session.query(BlockTaskMeta).\ + filter_by(network=current_session.network).first() assert block_task_meta.block_number == BASE_BLOCK assert block_task_meta.block_hash == EXPECTED_BLOCK_HASHES[BASE_BLOCK] assert block_task_meta.state == 'PENDING' @@ -72,7 +74,8 @@ def push_initial_blocks_in_queue(): def verify_pushed_block_56160_contents(): current_session = get_current_session() with current_session.db_session_scope(): - block_task_meta = current_session.db_session.query(BlockTaskMeta).first() + block_task_meta = current_session.db_session.query(BlockTaskMeta).\ + filter_by(network=current_session.network).first() task_id = block_task_meta.task_id task_completed = AsyncResult(task_id).get() verify_block_56160_contents() @@ -80,18 +83,27 @@ def verify_pushed_block_56160_contents(): def verify_pushed_sql_contents(): current_session = get_current_session() with current_session.db_session_scope(): - assert current_session.db_session.query(Blocks).count() == 0 - assert current_session.db_session.query(Transactions).count() == 0 - assert current_session.db_session.query(Receipts).count() == 0 - assert current_session.db_session.query(Logs).count() == 0 - assert current_session.db_session.query(Uncles).count() == 0 + assert current_session.db_session.query(Blocks).\ + filter_by(network=current_session.network).count() == 0 + assert current_session.db_session.query(Transactions).\ + filter_by(network=current_session.network).count() == 0 + assert current_session.db_session.query(Receipts).\ + filter_by(network=current_session.network).count() == 0 + assert current_session.db_session.query(Logs).\ + filter_by(network=current_session.network).count() == 0 + assert current_session.db_session.query(Uncles).\ + filter_by(network=current_session.network).count() == 0 if current_session.settings.PARSE_TRACE: - assert current_session.db_session.query(Traces).count() == 0 + assert current_session.db_session.query(Traces).\ + filter_by(network=current_session.network).count() == 0 if current_session.settings.PARSE_STATE_DIFF: - assert current_session.db_session.query(StateDiff).count() == 0 - assert current_session.db_session.query(StorageDiff).count() == 0 + assert current_session.db_session.query(StateDiff).\ + filter_by(network=current_session.network).count() == 0 + assert current_session.db_session.query(StorageDiff).\ + filter_by(network=current_session.network).count() == 0 - assert current_session.db_session.query(BlockTaskMeta).count() == \ + assert current_session.db_session.query(BlockTaskMeta).\ + filter_by(network=current_session.network).count() == \ current_session.settings.BLOCK_LAG diff --git a/tests/common_tests/utils.py b/tests/common_tests/utils.py index a0921f7..f93de0a 100644 --- a/tests/common_tests/utils.py +++ b/tests/common_tests/utils.py @@ -23,7 +23,8 @@ def match_state_dump_to_state_table(block_number): with current_session.db_session_scope(): for address in state: state_table_row = current_session.db_session.query(State).\ - filter_by(address=to_checksum_address(address)).first() + filter_by(address=to_checksum_address(address)).\ + filter_by(network=current_session.network).first() assert state_table_row.balance == hex_to_integer(state[address]['balance']) assert state_table_row.nonce == hex_to_integer(state[address]['nonce']) if 'code' in state[address].keys(): From 9de60d39284fd5d234300ea1125554c897298310 Mon Sep 17 00:00:00 2001 From: jsonsivar Date: Sun, 16 Dec 2018 18:25:50 -0500 Subject: [PATCH 5/6] Resolve test failures --- ether_sql/tasks/scrapper.py | 4 +++- tests/fixtures/expected_data.py | 42 ++++++++++++++++++++++----------- tests/setup/setup_psql.sh | 3 +-- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/ether_sql/tasks/scrapper.py b/ether_sql/tasks/scrapper.py index 3b8ff6a..0403264 100644 --- a/ether_sql/tasks/scrapper.py +++ b/ether_sql/tasks/scrapper.py @@ -59,7 +59,8 @@ def scrape_blocks(list_block_numbers, mode): block_task_meta = BlockTaskMeta(task_id=r.id, task_name='add_block_number', state='PENDING', - block_number=block_number) + block_number=block_number, + network=current_session.network) with current_session.db_session_scope(): current_session.db_session.add(block_task_meta) elif mode == 'single': @@ -129,6 +130,7 @@ def add_block_number(block_number): transaction_list = block_data['transactions'] # loop to get the transaction, receipts, logs and traces of the block + for index, transaction_data in enumerate(transaction_list): transaction = Transactions.add_transaction(transaction_data, block_number=block_number, diff --git a/tests/fixtures/expected_data.py b/tests/fixtures/expected_data.py index d54978d..02fd4c4 100644 --- a/tests/fixtures/expected_data.py +++ b/tests/fixtures/expected_data.py @@ -2,7 +2,8 @@ import datetime EXPECTED_META_INFO = {'last_pushed_block': Decimal('56170'), - 'current_state_block': None} + 'current_state_block': None, + 'network': u'ethereum_main'} EXPECTED_BLOCK_PROPERTIES = {'block_number': Decimal('56160'), @@ -16,7 +17,8 @@ 'gas_used': Decimal('50290'), 'parent_hash': u'0x071218ca3c6549337289e5e0e78227f59a82d62a972d6d73e6b8e55dcbaa65eb', 'extra_data': u'0x476574682f76312e302e312f6c696e75782f676f312e342e32', - 'gas_limit': Decimal('3141592')} + 'gas_limit': Decimal('3141592'), + 'network': u'ethereum_main'} EXPECTED_UNCLE_PROPERTIES = {'timestamp': datetime.datetime(2015, 8, 9, 1, 14, 50), 'current_blocknumber': Decimal('56160'), @@ -28,7 +30,8 @@ 'uncle_hash': u'0xc78c35720d930f9ef34b4e6fb9d02ffec936f9b02a8f0fa858456e4afd4d5614', 'parent_hash': u'0xcc30e8a9b15c548d5bf113c834143a8f0e1909fbfea96b2a208dc154293a78cf', 'extra_data': u'0x476574682f686261722f76312e302e312f6c696e75782f676f312e342e32', - 'gas_limit': Decimal('3141592')} + 'gas_limit': Decimal('3141592'), + 'network': u'ethereum_main'} EXPEXTED_TRANSACTION_PROPERTIES = {'nonce': Decimal('6'), 'block_number': Decimal('56160'), @@ -40,7 +43,8 @@ 'sender': u'0x9B2c46642CAF6B936dc0633da521f1E946B7e18F', 'value': Decimal('0'), 'receiver': u'0xDBB576b5B0e7BF0570A981AAb3AD39A0c5F19EB1', - 'start_gas': Decimal('90000')} + 'start_gas': Decimal('90000'), + 'network': u'ethereum_main'} EXPECTED_RECEIPT_PROPERTIES = {'status': None, 'block_number': Decimal('56160'), @@ -49,7 +53,8 @@ 'timestamp': datetime.datetime(2015, 8, 9, 1, 14, 50), 'cumulative_gas_used': Decimal('50290'), 'transaction_hash': u'0x8696c8669e07ae7e4ceef43945fe9c78252ab76f1a3c16658a04a644b8329736', - 'gas_used': Decimal('50290')} + 'gas_used': Decimal('50290'), + 'network': u'ethereum_main'} EXPECTED_LOG_PROPERTIES = {'block_number': Decimal('56160'), 'topics_count': Decimal('1'), @@ -62,7 +67,8 @@ 'topic_1': u'0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146', 'address': u'0xDBB576b5B0e7BF0570A981AAb3AD39A0c5F19EB1', 'transaction_index': Decimal('0'), - 'data': u'0x0000000000000000000000009b2c46642caf6b936dc0633da521f1e946b7e18f0000000000000000000000006463f715d594a1a4ace4bb9c3b288a74decf294d00000000000000000000000000000000000000000000000000000000000003e8'} + 'data': u'0x0000000000000000000000009b2c46642caf6b936dc0633da521f1e946b7e18f0000000000000000000000006463f715d594a1a4ace4bb9c3b288a74decf294d00000000000000000000000000000000000000000000000000000000000003e8', + 'network': u'ethereum_main'} EXPECTED_TRACE_PROPERTIES = {'subtraces': Decimal('0'), 'output': '0x0000000000000000000000000000000000000000000000000000000000000001', @@ -78,7 +84,8 @@ 'input_data': '0x90b98a110000000000000000000000006463f715d594a1a4ace4bb9c3b288a74decf294d00000000000000000000000000000000000000000000000000000000000003e8', 'transaction_index': Decimal('0'), 'transaction_hash': '0x8696c8669e07ae7e4ceef43945fe9c78252ab76f1a3c16658a04a644b8329736', - 'block_number': Decimal('56160')} + 'block_number': Decimal('56160'), + 'network': u'ethereum_main'} EXPECTED_STATE_DIFF_PROPERTIES = [] @@ -92,7 +99,8 @@ 'nonce_diff': None, 'code_from': None, 'code_to': None, - 'state_diff_type': 'fees'} + 'state_diff_type': 'fees', + 'network': 'ethereum_main'} ) EXPECTED_STATE_DIFF_PROPERTIES.append({ 'block_number': Decimal('56160'), @@ -104,7 +112,8 @@ 'nonce_diff': 1, 'code_from': None, 'code_to': None, - 'state_diff_type': 'sender'}) + 'state_diff_type': 'sender', + 'network': 'ethereum_main'}) EXPECTED_STATE_DIFF_PROPERTIES.append({ 'block_number': Decimal('56160'), 'timestamp': datetime.datetime(2015, 8, 9, 1, 14, 50), @@ -115,7 +124,8 @@ 'nonce_diff': None, 'code_from': None, 'code_to': None, - 'state_diff_type': None}) + 'state_diff_type': None, + 'network': 'ethereum_main'}) EXPECTED_STATE_DIFF_PROPERTIES.append({ 'block_number': Decimal('56160'), 'timestamp': datetime.datetime(2015, 8, 9, 1, 14, 50), @@ -126,7 +136,8 @@ 'nonce_diff': None, 'code_from': None, 'code_to': None, - 'state_diff_type': 'miner'}) + 'state_diff_type': 'miner', + 'network': 'ethereum_main'}) EXPECTED_STATE_DIFF_PROPERTIES.append({ 'block_number': Decimal('56160'), 'timestamp': datetime.datetime(2015, 8, 9, 1, 14, 50), @@ -137,7 +148,8 @@ 'nonce_diff': None, 'code_from': None, 'code_to': None, - 'state_diff_type': 'uncle'}) + 'state_diff_type': 'uncle', + 'network': 'ethereum_main'}) EXPECTED_STORAGE_DIFF_PROPERTIES = [] EXPECTED_STORAGE_DIFF_PROPERTIES.append({ @@ -149,7 +161,8 @@ 'address': '0xDBB576b5B0e7BF0570A981AAb3AD39A0c5F19EB1', 'position': '0x176f28426fded76854a5a0a4c618c35554983e8a7e93abf0310b736ef509d29e', 'storage_from': '0x0000000000000000000000000000000000000000000000000000000000000000', - 'storage_to': '0x00000000000000000000000000000000000000000000000000000000000003e8'}) + 'storage_to': '0x00000000000000000000000000000000000000000000000000000000000003e8', + 'network': 'ethereum_main'}) EXPECTED_STORAGE_DIFF_PROPERTIES.append({ 'block_number': Decimal('56160'), 'timestamp': datetime.datetime(2015, 8, 9, 1, 14, 50), @@ -159,7 +172,8 @@ 'address': '0xDBB576b5B0e7BF0570A981AAb3AD39A0c5F19EB1', 'position': '0x8627c64ae2959fac7fcf3b7380ff296fe9a6472ae59b0a5fd22f1e5b88614aea', 'storage_from': '0x0000000000000000000000000000000000000000000000000000000000002710', - 'storage_to': '0x0000000000000000000000000000000000000000000000000000000000002328' + 'storage_to': '0x0000000000000000000000000000000000000000000000000000000000002328', + 'network': 'ethereum_main' }) EXPECTED_BLOCK_HASHES = { diff --git a/tests/setup/setup_psql.sh b/tests/setup/setup_psql.sh index abc5349..207a0e6 100755 --- a/tests/setup/setup_psql.sh +++ b/tests/setup/setup_psql.sh @@ -1,2 +1 @@ -createdb ether_sql_tests -sudo -u postgres psql -U travis -d postgres -c "alter user travis with password 'develop';" +createdb ethereum_test \ No newline at end of file From aacdad9cbeb4d93ef0a08bfb073611c1b673d1d2 Mon Sep 17 00:00:00 2001 From: jsonsivar Date: Sun, 16 Dec 2018 18:26:51 -0500 Subject: [PATCH 6/6] Project settings and some TODOs --- .gitignore | 3 +++ .travis.yml | 1 + ether_sql/migrations/alembic.ini | 1 + setup.py | 8 ++++---- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index a9cff80..f7a7585 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Environment files +.env + # removing library installs src/* diff --git a/.travis.yml b/.travis.yml index f119da4..fdc175b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +# TODO @jsonsivar: convert to cloudbuild sudo: required language: python dist: trusty diff --git a/ether_sql/migrations/alembic.ini b/ether_sql/migrations/alembic.ini index dee5d69..54b05d5 100644 --- a/ether_sql/migrations/alembic.ini +++ b/ether_sql/migrations/alembic.ini @@ -35,6 +35,7 @@ script_location = migrations # are written from script.py.mako # output_encoding = utf-8 +# TODO @jsonsivar: this should come from .env or something sqlalchemy.url = postgresql://ankit:develop@localhost:5432/ether_sql diff --git a/setup.py b/setup.py index 3fe2204..968fbfd 100644 --- a/setup.py +++ b/setup.py @@ -9,11 +9,11 @@ setup( name='ether_sql', version='0.1.3', - description="""A python library to push ethereum blockchain data into an sql database.""", + description="""Terminal's fork of a python library to push ethereum blockchain data into an sql database.""", long_description_markdown_filename='README.md', - author='Ankit Chiplunkar', - author_email='ankit@analyseether.com', - url='https://github.com/analyseether/ether_sql', + author='Janison Sivarajah', + author_email='janison@terminal.co', + url='https://github.com/terminal-systems/ether_sql', include_package_data=True, install_requires=[ "web3==4.4.1",