##############################################################################
#
# Crossbar.io Database
# Copyright (c) Crossbar.io Technologies GmbH. Licensed under MIT.
#
##############################################################################
import pprint
import uuid
import flatbuffers
import numpy as np
from cfxdb import unpack_uint256, pack_uint256
from cfxdb.gen.xbr import Actor as ActorGen
from zlmdb import table, MapUuidBytes20Uint8FlatBuffers
class _ActorGen(ActorGen.Actor):
"""
Expand methods on the class code generated by flatc.
FIXME: come up with a PR for flatc to generated this stuff automatically.
"""
@classmethod
def GetRootAsActor(cls, buf, offset):
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
x = _ActorGen()
x.Init(buf, n + offset)
return x
def ActorAsBytes(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
_off = self._tab.Vector(o)
_len = self._tab.VectorLen(o)
return memoryview(self._tab.Bytes)[_off:_off + _len]
return None
def MarketAsBytes(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
if o != 0:
_off = self._tab.Vector(o)
_len = self._tab.VectorLen(o)
return memoryview(self._tab.Bytes)[_off:_off + _len]
return None
def JoinedAsBytes(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
if o != 0:
_off = self._tab.Vector(o)
_len = self._tab.VectorLen(o)
return memoryview(self._tab.Bytes)[_off:_off + _len]
return None
def SecurityAsBytes(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))
if o != 0:
_off = self._tab.Vector(o)
_len = self._tab.VectorLen(o)
return memoryview(self._tab.Bytes)[_off:_off + _len]
return None
def TidAsBytes(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18))
if o != 0:
_off = self._tab.Vector(o)
_len = self._tab.VectorLen(o)
return memoryview(self._tab.Bytes)[_off:_off + _len]
return None
def SignatureAsBytes(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))
if o != 0:
_off = self._tab.Vector(o)
_len = self._tab.VectorLen(o)
return memoryview(self._tab.Bytes)[_off:_off + _len]
return None
[docs]class Actor(object):
"""
XBR Market Actors.
"""
def __init__(self, from_fbs=None):
self._from_fbs = from_fbs
# [uint8] (address)
self._actor = None
# uint8 (ActorType)
self._actor_type = None
# [uint8] (uuid)
self._market = None
# uint64 (timestamp)
self._timestamp = None
# [uint8] (uint256)
self._joined = None
# [uint8] (uint256)
self._security = None
# string (multihash)
self._meta = None
# [uint8] (ethhash)
self._tid = None
# [uint8] (ethsig)
self._signature = None
def marshal(self):
obj = {
'timestamp': int(self.timestamp) if self.timestamp else None,
'market': self.market.bytes if self.market else None,
'actor': bytes(self.actor) if self.actor else None,
'actor_type': self.actor_type,
'joined': pack_uint256(self.joined) if self.joined else None,
'security': pack_uint256(self.security) if self.security else None,
'meta': bytes(self.meta) if self.meta else None,
'tid': bytes(self.tid) if self.tid else None,
'signature': bytes(self.signature) if self.signature else None,
}
return obj
def __str__(self):
return '\n{}\n'.format(pprint.pformat(self.marshal()))
@property
def timestamp(self) -> np.datetime64:
"""
Database transaction time (epoch time in ns) of insert or last update.
"""
if self._timestamp is None and self._from_fbs:
self._timestamp = np.datetime64(self._from_fbs.Timestamp(), 'ns')
return self._timestamp
@timestamp.setter
def timestamp(self, value: np.datetime64):
assert value is None or isinstance(value, np.datetime64)
self._timestamp = value
@property
def market(self) -> uuid.UUID:
"""
ID of the market this actor is associated with.
"""
if self._market is None and self._from_fbs:
if self._from_fbs.MarketLength():
_market = self._from_fbs.MarketAsBytes()
self._market = uuid.UUID(bytes=bytes(_market))
return self._market
@market.setter
def market(self, value: uuid.UUID):
assert value is None or isinstance(value, uuid.UUID)
self._market = value
@property
def actor(self) -> bytes:
"""
Ethereum address of the member.
"""
if self._actor is None and self._from_fbs:
if self._from_fbs.ActorLength():
self._actor = self._from_fbs.ActorAsBytes()
return self._actor
@actor.setter
def actor(self, value: bytes):
assert value is None or (type(value) == bytes and len(value) == 20)
self._actor = value
@property
def actor_type(self) -> int:
"""
Type of the market actor.
"""
if self._actor_type is None and self._from_fbs:
self._actor_type = self._from_fbs.ActorType()
return self._actor_type
@actor_type.setter
def actor_type(self, value: int):
assert value is None or type(value) == int
self._actor_type = value
@property
def joined(self) -> int:
"""
Block number (on the blockchain) when the actor (originally) joined the market.
"""
if self._joined is None and self._from_fbs:
if self._from_fbs.JoinedLength():
_joined = self._from_fbs.JoinedAsBytes()
self._joined = unpack_uint256(bytes(_joined))
else:
self._joined = 0
return self._joined
@joined.setter
def joined(self, value: int):
assert value is None or type(value) == int
self._joined = value
@property
def security(self) -> int:
"""
Security (XBR tokens) deposited by the actor in the market.
"""
if self._security is None and self._from_fbs:
if self._from_fbs.SecurityLength():
security = self._from_fbs.SecurityAsBytes()
self._security = unpack_uint256(bytes(security))
else:
self._security = 0
return self._security
@security.setter
def security(self, value: int):
assert value is None or type(value) == int, 'security must be int, was: {}'.format(value)
self._security = value
@property
def meta(self) -> str:
"""
The XBR market metadata published by the market owner. IPFS Multihash pointing to a RDF/Turtle file with market metadata.
"""
if self._meta is None and self._from_fbs:
meta = self._from_fbs.Meta()
if meta:
self._meta = meta.decode('utf8')
return self._meta
@meta.setter
def meta(self, value: str):
assert value is None or type(value) == str
self._meta = value
@property
def tid(self) -> bytes:
"""
Transaction hash of the transaction this change was committed to the blockchain under.
"""
if self._tid is None and self._from_fbs:
if self._from_fbs.TidLength():
self._tid = self._from_fbs.TidAsBytes()
return self._tid
@tid.setter
def tid(self, value: bytes):
assert value is None or (type(value) == bytes and len(value) == 32)
self._tid = value
@property
def signature(self) -> bytes:
"""
When signed off-chain and submitted via ``XBRMarket.joinMarketFor``.
"""
if self._signature is None and self._from_fbs:
if self._from_fbs.SignatureLength():
self._signature = self._from_fbs.SignatureAsBytes()
return self._signature
@signature.setter
def signature(self, value: bytes):
assert value is None or (type(value) == bytes and len(value) == 65)
self._signature = value
@staticmethod
def cast(buf):
return Actor(_ActorGen.GetRootAsActor(buf, 0))
def build(self, builder):
market = self.market.bytes if self.market else None
if market:
market = builder.CreateString(market)
actor = self.actor
if actor:
actor = builder.CreateString(actor)
joined = self.joined
if joined:
joined = builder.CreateString(pack_uint256(joined))
security = self.security
if security:
security = builder.CreateString(pack_uint256(security))
meta = self.meta
if meta:
meta = builder.CreateString(meta)
tid = self.tid
if tid:
tid = builder.CreateString(tid)
signature = self.signature
if signature:
signature = builder.CreateString(signature)
ActorGen.ActorStart(builder)
if self.timestamp:
ActorGen.ActorAddTimestamp(builder, int(self.timestamp))
if market:
ActorGen.ActorAddMarket(builder, market)
if actor:
ActorGen.ActorAddActor(builder, actor)
if self.actor_type:
ActorGen.ActorAddActorType(builder, self.actor_type)
if joined:
ActorGen.ActorAddJoined(builder, joined)
if security:
ActorGen.ActorAddSecurity(builder, security)
if meta:
ActorGen.ActorAddMeta(builder, meta)
if tid:
ActorGen.ActorAddTid(builder, tid)
if signature:
ActorGen.ActorAddSignature(builder, signature)
final = ActorGen.ActorEnd(builder)
return final
[docs]@table('1863eb64-322a-42dd-9fce-a59c99d5b40e', build=Actor.build, cast=Actor.cast)
class Actors(MapUuidBytes20Uint8FlatBuffers):
"""
Market actors table, mapping from ``(market_id|UUID, actor_adr|bytes[20], actor_type|int)`` to :class:`cfxdb.xbr.Actor`.
"""