def test_produce_registry_events_from_blockchain(self, mock_get_current_block_no, mock_last_block_number,
                                                     mock_get_contract_instance):
        registry_event_producer = RegistryEventProducer(infura_endpoint, Repository(NETWORKS))

        org_created_event_object = Mock()
        event_repository = EventRepository(Repository(NETWORKS))
        org_created_event_object.createFilter = Mock(
            return_value=Mock(get_all_entries=Mock(return_value=[AttributeDict({'args': AttributeDict({
                'orgId': b'snet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'}),
                'event': 'OrganizationCreated', 'logIndex': 1, 'transactionIndex': 15,
                'transactionHash': HexBytes(
                    '0x7934a42442792f6d5a171df218b66161021c885085187719c991ec58d7459821'),
                'address': '0x663422c6999Ff94933DBCb388623952CF2407F6f',
                'blockHash': HexBytes('0x1da77d63b7d57e0a667ffb9f6d23be92f3ffb5f4b27b39b86c5d75bb167d6779'),
                'blockNumber': 6243627})])))

        mock_get_contract_instance.return_value = Mock(
            events=Mock(organizationCreated=org_created_event_object,
                        abi=[{"type": "event", "name": "organizationCreated"}]))

        mock_last_block_number.return_value = 50
        mock_get_current_block_no.return_value = 50

        blockchain_events = registry_event_producer.produce_event(3)
        assert blockchain_events == [AttributeDict({'args': AttributeDict({
            'orgId': b'snet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'}),
            'event': 'OrganizationCreated', 'logIndex': 1,
            'transactionIndex': 15, 'transactionHash': HexBytes(
                '0x7934a42442792f6d5a171df218b66161021c885085187719c991ec58d7459821'),
            'address': '0x663422c6999Ff94933DBCb388623952CF2407F6f',
            'blockHash': HexBytes(
                '0x1da77d63b7d57e0a667ffb9f6d23be92f3ffb5f4b27b39b86c5d75bb167d6779'),
            'blockNumber': 6243627})]
    def test_produce_mpe_events_from_blockchain(self, mock_get_current_block_no, mock_last_block_number,
                                                mock_get_contract_instance):
        mpe_event_producer = MPEEventProducer(infura_endpoint, Repository(NETWORKS))
        event_repository = EventRepository(Repository(NETWORKS))

        deposit_fund_Event_object = Mock()
        deposit_fund_Event_object.createFilter = Mock(
            return_value=Mock(get_all_entries=Mock(return_value=[AttributeDict(
                {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
                 'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
                 'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
                 'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
                 'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
                 'blockNumber': 6286405})])))
        mock_last_block_number.return_value = 50
        mock_get_current_block_no.return_value = 50

        # Testing contract events
        mock_get_contract_instance.return_value = Mock(
            events=Mock(DepositFunds=deposit_fund_Event_object,
                        abi=[{"type": "event", "name": "DepositFunds"}]))
        blockchain_events = mpe_event_producer.produce_event(3)
        assert blockchain_events == [AttributeDict(
            {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
             'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
             'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
             'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
             'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
             'blockNumber': 6286405})]

        # Testing Airdrop events
        airdrop_event_producer = AirdropEventProducer(infura_endpoint, Repository(NETWORKS))
        blockchain_events = airdrop_event_producer.produce_event(3)
        assert blockchain_events == [AttributeDict(
            {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
             'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
             'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
             'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
             'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
             'blockNumber': 6286405})]

        # Testing Occam Airdrop events
        occam_airdrop_event_producer = OccamAirdropEventProducer(infura_endpoint, Repository(NETWORKS))
        blockchain_events = occam_airdrop_event_producer.produce_event(3)
        assert blockchain_events == [AttributeDict(
            {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
             'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
             'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
             'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
             'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
             'blockNumber': 6286405})]
class EventListener(object):
    _connection = Repository(NETWORKS=NETWORKS)
    _event_repository = EventRepository(_connection)

    def __init__(self, repository=None):
        self.event_consumer_map = EventListener.initiate_event_subscription()

    def subscribe(self, event_names, event_consumer):
        for event in event_names:
            if event.get_name() in self.event_consumer_map:
                self.event_consumer_map[event] = event_consumer
            else:
                self.event_consumer_map[event] = [event_consumer]

        self.persist_event_subscription(event_names, event_consumer)

    @classmethod
    def initiate_event_subscription(cls):
        return EVENT_SUBSCRIPTIONS

    def _tranform_event_to_push(self, event):
        event['row_created'] = str(event['row_created'])
        event['row_updated'] = str(event['row_updated'])
        event['processed'] = 0
        push_event = {"data": event, "name": event["event"]}

        return push_event

    def _get_listener_handler(self, listener):
        if listener["type"] == "webhook":
            return WebHookHandler(listener["url"])
        elif listener["type"] == "lambda_arn":
            return LambdaArnHandler(listener["url"])

    def _publish_events(self, events):

        error_map = {}
        success_list = []

        for event in events:
            listeners = []
            if event['event'] in self.event_consumer_map:
                listeners = self.event_consumer_map[event['event']]
            for listener in listeners:
                push_event = self._tranform_event_to_push(event)
                logger.debug(f"pushing events {push_event} to listener {listener['url']}")
                try:
                    listener_handler = self._get_listener_handler(listener)
                    listener_handler.push_event(push_event)
                except Exception as e:
                    logger.exception(
                        f"Error while processing event with error {str(e)} for event {event} listener {listener['url']}")
                    error_map[event["row_id"]] = {"error_code": 500,
                                                  "error_message": f"for listener {listener['url']} got error {str(e)}"}
            success_list.append(event["row_id"])

        return error_map, success_list
Пример #4
0
import sys

sys.path.append('/opt')
from common.exception_handler import exception_handler
from common.logger import get_logger
from common.utils import handle_exception_with_slack_notification
from event_pubsub.config import NETWORKS, NETWORK_ID, SLACK_HOOK
from event_pubsub.producers.blockchain_event_producer import MPEEventProducer, RFAIEventProducer, RegistryEventProducer, \
    TokenStakeEventProducer, AirdropEventProducer, OccamAirdropEventProducer, ConverterAGIXEventProducer, \
    ConverterNTXEventProducer
from event_pubsub.repository import Repository

registry_event_producer = RegistryEventProducer(NETWORKS["http_provider"],
                                                Repository(NETWORKS))
mpe_event_producer = MPEEventProducer(NETWORKS["http_provider"],
                                      Repository(NETWORKS))
rfai_event_producer = RFAIEventProducer(NETWORKS["http_provider"],
                                        Repository(NETWORKS))
token_stake_event_producer = TokenStakeEventProducer(NETWORKS["http_provider"],
                                                     Repository(NETWORKS))
airdrop_event_producer = AirdropEventProducer(NETWORKS["http_provider"],
                                              Repository(NETWORKS))
occam_airdrop_event_producer = OccamAirdropEventProducer(
    NETWORKS["http_provider"], Repository(NETWORKS))
converter_agix_event_producer = ConverterAGIXEventProducer(
    NETWORKS["http_provider"], Repository(NETWORKS))
converter_ntx_event_producer = ConverterNTXEventProducer(
    NETWORKS["http_provider"], Repository(NETWORKS))

logger = get_logger(__name__)
from common.logger import get_logger
from common.utils import handle_exception_with_slack_notification
from common.exception_handler import exception_handler
from event_pubsub.config import NETWORKS, NETWORK_ID, SLACK_HOOK, WS_PROVIDER
from event_pubsub.producers.blockchain_event_producer import MPEEventProducer, RFAIEventProducer, RegistryEventProducer, \
    TokenStakeEventProducer
from event_pubsub.repository import Repository

registry_event_producer = RegistryEventProducer(WS_PROVIDER,
                                                Repository(NETWORKS))
mpe_event_producer = MPEEventProducer(WS_PROVIDER, Repository(NETWORKS))
rfai_event_producer = RFAIEventProducer(WS_PROVIDER, Repository(NETWORKS))
token_stake_event_producer = TokenStakeEventProducer(WS_PROVIDER,
                                                     Repository(NETWORKS))

logger = get_logger(__name__)


@handle_exception_with_slack_notification(SLACK_HOOK=SLACK_HOOK,
                                          NETWORK_ID=NETWORK_ID,
                                          logger=logger)
def registry_event_producer_handler(event, context):
    try:

        registry_event_producer.produce_event(NETWORK_ID)
    except Exception as e:
        raise e


def mpe_event_producer_handler(event, context):
    try: