Source code for graphenecommon.asset
# -*- coding: utf-8 -*-
from .blockchainobject import BlockchainObject
from .exceptions import AssetDoesNotExistsException
from .instance import AbstractBlockchainInstanceProvider
class Asset(BlockchainObject, AbstractBlockchainInstanceProvider):
""" Deals with Assets of the network.
:param str Asset: Symbol name or object id of an asset
:param bool lazy: Lazy loading
:param bool full: Also obtain bitasset-data and dynamic asset data
:param instance blockchain_instance: instance to use when accesing a RPC
:returns: All data of an asset
:rtype: dict
.. note:: This class comes with its own caching function to reduce the
load on the API server. Instances of this class can be
refreshed with ``Asset.refresh()``.
"""
def __init__(self, *args, **kwargs):
self.define_classes()
assert self.type_id
self.full = kwargs.pop("full", False)
BlockchainObject.__init__(self, *args, **kwargs)
[docs] def refresh(self):
""" Refresh the data from the API server
"""
asset = self.blockchain.rpc.get_asset(self.identifier)
if not asset:
raise AssetDoesNotExistsException(self.identifier)
super(Asset, self).__init__(asset, blockchain_instance=self.blockchain)
if self.full:
if "bitasset_data_id" in asset:
self["bitasset_data"] = self.blockchain.rpc.get_object(
asset["bitasset_data_id"]
)
self["dynamic_asset_data"] = self.blockchain.rpc.get_object(
asset["dynamic_asset_data_id"]
)
self.store(asset, asset["symbol"])
self.store(asset, asset["id"])
@property
def is_fully_loaded(self):
""" Is this instance fully loaded / e.g. all data available?
"""
return self.full and "bitasset_data_id" in self and "bitasset_data" in self
@property
def symbol(self):
return self["symbol"]
@property
def precision(self):
return self["precision"]
@property
def is_bitasset(self):
""" Is the asset a market pegged asset?
"""
return "bitasset_data_id" in self
@property
def permissions(self):
""" List the permissions for this asset that the issuer can obtain
"""
return self["permissions"]
@property
def flags(self):
""" List the permissions that are currently used (flags)
"""
return self["flags"]
[docs] def ensure_full(self):
if not self.is_fully_loaded:
self.full = True
self.refresh()
[docs] def update_cer(self, cer, account=None, **kwargs):
""" Update the Core Exchange Rate (CER) of an asset
"""
assert callable(self.blockchain.update_cer)
return self.blockchain.update_cer(
self["symbol"], cer, account=account, **kwargs
)