def setUpTestData(cls): super().setUpTestData() GasStationProvider.del_singleton() SafeCreationServiceProvider.del_singleton() TransactionServiceProvider.del_singleton() FundingServiceProvider.del_singleton() cls.gas_station = GasStationProvider() cls.funding_service = FundingServiceProvider() cls.safe_creation_service = SafeCreationServiceProvider() cls.transaction_service = TransactionServiceProvider()
def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = FundingService(EthereumClientProvider(), GasStationProvider(), RedisRepository().redis, settings.SAFE_FUNDER_PRIVATE_KEY, settings.SAFE_FUNDER_MAX_ETH) return cls.instance
def __new__(cls): if not hasattr(cls, 'instance'): from django.conf import settings cls.instance = TransactionService(GasStationProvider(), EthereumClientProvider(), RedisRepository().redis, settings.SAFE_VALID_CONTRACT_ADDRESSES, settings.SAFE_PROXY_FACTORY_ADDRESS, settings.SAFE_TX_SENDER_PRIVATE_KEY) return cls.instance
def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = SafeCreationService( GasStationProvider(), EthereumClientProvider(), RedisRepository().redis, settings.SAFE_V1_0_0_CONTRACT_ADDRESS, settings.SAFE_PROXY_FACTORY_V1_0_0_ADDRESS, settings.SAFE_DEFAULT_CALLBACK_HANDLER, settings.SAFE_FUNDER_PRIVATE_KEY, settings.SAFE_FIXED_CREATION_COST) return cls.instance
def handle(self, *args, **options): gas_price = options['gas_price'] or GasStationProvider( ).get_gas_prices().fast safe_tx_hash = options['safe_tx_hash'] if safe_tx_hash: multisig_tx = SafeMultisigTx.objects.get(safe_tx_hash=safe_tx_hash) self.resend(gas_price, multisig_tx) else: for multisig_tx in SafeMultisigTx.objects.pending(older_than=60): self.resend(gas_price, multisig_tx)
def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = SafeCreationService( GasStationProvider(), EthereumClientProvider(), RedisRepository().redis, settings.SAFE_CONTRACT_ADDRESS, settings.SAFE_OLD_CONTRACT_ADDRESS, settings.SAFE_PROXY_FACTORY_ADDRESS, settings.SAFE_FUNDER_PRIVATE_KEY, settings.SAFE_FIXED_CREATION_COST, settings.SAFE_AUTO_FUND, settings.SAFE_AUTO_APPROVE_TOKEN) return cls.instance
def handle(self, *args, **options): gas_price = options['gas_price'] or GasStationProvider( ).get_gas_prices().fast safe_tx_hash = options['safe_tx_hash'] for multisig_tx in self.tx_service.get_pending_multisig_transactions( older_than=60): if safe_tx_hash: if multisig_tx.safe_tx_hash == safe_tx_hash: self.resend(gas_price, multisig_tx) else: self.resend(gas_price, multisig_tx)
def handle(self, *args, **options): gas_price = options["gas_price"] or GasStationProvider().get_gas_prices().fast safe_tx_hash = options["safe_tx_hash"] older = options["older"] if safe_tx_hash: multisig_tx = SafeMultisigTx.objects.get(safe_tx_hash=safe_tx_hash) self.tx_service.resend(gas_price, multisig_tx) else: for multisig_tx in SafeMultisigTx.objects.pending( older_than=older ).select_related("ethereum_tx"): self.tx_service.resend(gas_price, multisig_tx)
def check_pending_transactions() -> int: """ Find txs that have not been mined after a while and resend again :return: Number of pending transactions """ number_txs = 0 try: redis = RedisRepository().redis with redis.lock("tasks:check_pending_transactions", blocking_timeout=1, timeout=60): tx_not_mined_alert = settings.SAFE_TX_NOT_MINED_ALERT_MINUTES multisig_txs = SafeMultisigTx.objects.pending( older_than=tx_not_mined_alert * 60).select_related("ethereum_tx") for multisig_tx in multisig_txs: gas_price = GasStationProvider().get_gas_prices().fast old_fee = multisig_tx.ethereum_tx.fee ethereum_tx = TransactionServiceProvider().resend( gas_price, multisig_tx) if ethereum_tx: logger.error( "Safe=%s - Tx with tx-hash=%s and safe-tx-hash=%s has not been mined after " "a while, created=%s. Sent again with tx-hash=%s. Old fee=%d and new fee=%d", multisig_tx.safe_id, multisig_tx.ethereum_tx_id, multisig_tx.safe_tx_hash, multisig_tx.created, ethereum_tx.tx_hash, old_fee, ethereum_tx.fee, ) else: logger.error( "Safe=%s - Tx with tx-hash=%s and safe-tx-hash=%s has not been mined after " "a while, created=%s", multisig_tx.safe_id, multisig_tx.ethereum_tx_id, multisig_tx.safe_tx_hash, multisig_tx.created, ) number_txs += 1 except LockError: pass return number_txs
def __new__(cls): if not hasattr(cls, "instance"): cls.instance = StatsService(EthereumClientProvider(), GasStationProvider()) return cls.instance