def transfer_batch(self, batch: List[BatchTransfer], gas_price: Optional[int]=None, gas_limit=1, max_workers=200, timeout=None): """Batch Transfer zils to addresses.""" if not self.zil_key or not self.zil_key.encoded_private_key: raise RuntimeError("can not create transaction without private key") # check address format for to_addr, zils in batch: to_addr = zilkey.normalise_address(to_addr) if not to_addr: raise ValueError("invalid to address") if gas_price is None: gas_price = self.get_min_gas_price(refresh=False) resp = self.get_balance_nonce() batch_nonce = resp["nonce"] + 1 txn_params = [] for to_addr, zils in batch: to_addr = zilkey.normalise_address(to_addr) if not to_addr: raise ValueError("invalid to address") if isinstance(zils, Qa): amount = zils else: if not isinstance(zils, Zil): zils = Zil(zils) amount = zils.toQa() params = active_chain.build_transaction_params( self.zil_key, to_addr, amount, batch_nonce, gas_price, gas_limit ) txn_params.append(params) batch_nonce += 1 def create_txn(p): try: txn_info = active_chain.api.CreateTransaction(p) except Exception as e: print("Error in CreateTransaction: {}".format(e)) txn_info = None return txn_info txn_results = [] with ThreadPoolExecutor(max_workers=max_workers) as pool: all_tasks = [pool.submit(create_txn, p) for p in txn_params] for future in futures.as_completed(all_tasks, timeout=timeout): try: txn_results.append(future.result()) except Exception as e: print("Error: {}".format(e)) txn_results.append(None) return txn_results
def transfer(self, to_addr: str, zils: Union[str, float, Zil, Qa], nonce: Optional[int]=None, gas_price: Optional[int]=None, gas_limit=1, code="", data="", priority=False, confirm=False, timeout=300, sleep=20, hit_chain=False): """Transfer zils to another address.""" if not self.zil_key or not self.zil_key.encoded_private_key: raise RuntimeError("can not create transaction without private key") to_addr = zilkey.normalise_address(to_addr) if not to_addr: raise ValueError("invalid to address") if isinstance(zils, Qa): amount = zils else: if not isinstance(zils, Zil): zils = Zil(zils) amount = zils.toQa() if gas_price is None: if hit_chain: gas_price = self.get_min_gas_price(refresh=False) else: gas_price = 100 if nonce is None: resp = self.get_balance_nonce() if amount > Qa(resp["balance"]): raise ValueError("insufficient balance to send") nonce = resp["nonce"] + 1 params = active_chain.build_transaction_params( self.zil_key, to_addr, amount, nonce, gas_price, gas_limit, code, data, priority ) self.last_params = params if not hit_chain: return None else: txn_info = active_chain.api.CreateTransaction(params) self.last_txn_info = txn_info if not confirm: return txn_info if not txn_info: return None txn_details = Account.wait_txn_confirm( txn_info["TranID"], timeout=timeout, sleep=sleep ) self.last_txn_details = txn_details return txn_details
def transfer(self, to_addr: str, zils: Union[str, float, Zil, Qa], nonce: Optional[int]=None, gas_price: Optional[int]=None, gas_limit=1, code="", data="", priority=False): """Transfer zils to another address.""" if not self.zil_key or not self.zil_key.encoded_private_key: raise RuntimeError("can not create transaction without private key") to_addr = zilkey.to_checksum_address(to_addr) if not to_addr: raise ValueError("invalid to address") if isinstance(zils, Qa): amount = zils else: if not isinstance(zils, Zil): zils = Zil(zils) amount = zils.toQa() if gas_price is None: gas_price = self.get_min_gas_price(refresh=False) if nonce is None: resp = self.get_balance_nonce() if amount > Qa(resp["balance"]): raise ValueError("insufficient balance to send") nonce = resp["nonce"] + 1 params = active_chain.build_transaction_params( self.zil_key, to_addr, amount, nonce, gas_price, gas_limit, code, data, priority ) txn_info = active_chain.api.CreateTransaction(params) return txn_info
def transfer_batch(self, batch: BatchTransfer, gas_price: Optional[int]=None, gas_limit=1): """Batch Transfer zils to addresses.""" if not self.zil_key or not self.zil_key.encoded_private_key: raise RuntimeError("can not create transaction without private key") if gas_price is None: gas_price = self.get_min_gas_price(refresh=False) resp = self.get_balance_nonce() batch_nonce = resp["nonce"] + 1 txn_params = [] for to_addr, zils in batch: to_addr = zilkey.to_checksum_address(to_addr) if not to_addr: raise ValueError("invalid to address") if isinstance(zils, Qa): amount = zils else: if not isinstance(zils, Zil): zils = Zil(zils) amount = zils.toQa() params = active_chain.build_transaction_params( self.zil_key, to_addr, amount, batch_nonce, gas_price, gas_limit ) txn_params.append(params) batch_nonce += 1 return [ active_chain.api.CreateTransaction(params) for params in txn_params ]