def AddNamedAddress(self, script_hash, title): script_hash_bytes = bytes(script_hash.ToArray()) alias, created = NamedAddress.get_or_create( ScriptHash=script_hash_bytes, Title=title) self.LoadNamedAddresses()
def ToJson(self, verbose=False): assets = self.GetCoinAssets() tokens = list(self._tokens.values()) assets = assets + tokens if Blockchain.Default().Height == 0: percent_synced = 0 else: percent_synced = int(100 * self._current_height / Blockchain.Default().Height) jsn = {} jsn['path'] = self._path addresses = [] has_watch_addr = False for addr in Address.select(): logger.info("Script hash %s %s" % (addr.ScriptHash, type(addr.ScriptHash))) addr_str = Crypto.ToAddress(UInt160(data=addr.ScriptHash)) acct = Blockchain.Default().GetAccountState(addr_str) token_balances = self.TokenBalancesForAddress(addr_str) if acct: json = acct.ToJson() json['is_watch_only'] = addr.IsWatchOnly addresses.append(json) if token_balances: json['tokens'] = token_balances if addr.IsWatchOnly: has_watch_addr = True else: script_hash = binascii.hexlify(addr.ScriptHash) json = {'address': addr_str, 'script_hash': script_hash.decode('utf8'), 'tokens': token_balances} addresses.append(json) balances = [] watch_balances = [] for asset in assets: if type(asset) is UInt256: bc_asset = Blockchain.Default().GetAssetState(asset.ToBytes()) total = self.GetBalance(asset).value / Fixed8.D watch_total = self.GetBalance(asset, CoinState.WatchOnly).value / Fixed8.D balances.append("[%s]: %s " % (bc_asset.GetName(), total)) watch_balances.append("[%s]: %s " % (bc_asset.GetName(), watch_total)) elif type(asset) is WalletNEP5Token: balances.append("[%s]: %s " % (asset.symbol, self.GetBalance(asset))) watch_balances.append("[%s]: %s " % (asset.symbol, self.GetBalance(asset, True))) tokens = [] for t in self._tokens.values(): tokens.append(t.ToJson()) jsn['addresses'] = addresses jsn['height'] = self._current_height jsn['percent_synced'] = percent_synced jsn['synced_balances'] = balances if has_watch_addr: jsn['synced_watch_only_balances'] = watch_balances jsn['public_keys'] = self.PubKeys() jsn['tokens'] = tokens jsn['claims'] = { 'available': self.GetAvailableClaimTotal().ToString(), 'unavailable': self.GetUnavailableBonus().ToString() } alia = NamedAddress.select() if len(alia): na = {} for n in alia: na[n.Title] = n.ToString() jsn['named_addr'] = na if verbose: jsn['coins'] = [coin.ToJson() for coin in self.FindUnspentCoins()] jsn['transactions'] = [tx.ToJson() for tx in self.GetTransactions()] return jsn
def LoadNamedAddresses(self): self._aliases = NamedAddress.select()
def pretty_print(self, verbose=False): if Blockchain.Default().Height == 0: percent_synced = 0 else: percent_synced = int(100 * self._current_height / Blockchain.Default().Height) print(f"Path : {self._path}") print(f"Height : {self._current_height}") print(f"Sync status: {percent_synced}%") print(" ") # collect available public keys pubkeys = dict() for k in self.LoadKeyPairs().values(): pub = k.PublicKey.encode_point(True) for ct in self._contracts.values(): if ct.PublicKeyHash == k.PublicKeyHash: pubkeys.update({ct.Address: pub.decode('utf-8')}) # build data objects addresses = dict() for addr in Address.select(): addr_str = addr.ToString() addresses.update({ addr_str: { 'public_key': pubkeys.get(addr_str, "N/A"), 'script_hash': addr.ScriptHash, 'watchonly': addr.IsWatchOnly, 'assets': self._get_asset_balances(addr_str, addr.IsWatchOnly), 'tokens': self._get_token_balances(addr_str) } }) aliases = dict() alia = NamedAddress.select() for n in alia: aliases[n.Title] = n.ToString() # pretty print for address, data in addresses.items(): for title, addr in aliases.items(): if address == addr: print(f"Alias : {title}") addr_str = address + " (watch only)" if data[ 'watchonly'] else address print(f"Address : {addr_str}") if verbose: scripthash_le = binascii.hexlify(data['script_hash']).decode() scripthash_be = UInt160(data=data['script_hash']).To0xString() print(f"Public key : {data['public_key']}") print(f"Script hash: {data['script_hash']}") print(f" little endian: {scripthash_le}") print(f" big endian: {scripthash_be}") has_balances = False for asset_name, value in data['assets'].items(): if value > 0: symbol = f"[{asset_name}]" print(f"{symbol:<11}: {value}") has_balances = True for token_name, value in data['tokens'].items(): if value > 0: symbol = f"[{token_name}]" print(f"{symbol:<11}: {value}") has_balances = True if not has_balances: print(f"{'Balances':<11}: only zero") print(" ") print("Claims:") print(f" unlocked: {self.GetAvailableClaimTotal().ToString()}") print(f" locked : {self.GetUnavailableBonus().ToString()}")
def AddNamedAddress(self, script_hash, title): script_hash_bytes = bytes(script_hash.ToArray()) alias, created = NamedAddress.get_or_create(ScriptHash=script_hash_bytes, Title=title) self.LoadNamedAddresses()