44import pendulum
55from mongoengine import (
66 Document , ReferenceField ,
7- FloatField , DateTimeField , StringField )
7+ FloatField , DateTimeField , StringField ,
8+ BooleanField , IntField )
89
910from bot .messages import TX_ID_ERROR
1011from db .observer import Observer
@@ -103,12 +104,15 @@ class Ticket(Document):
103104 tx_id = StringField (max_length = 64 , required = True )
104105 _status = ReferenceField (Status )
105106 vote_id = StringField (max_length = 64 )
107+ vote_block = IntField ()
108+ spendable = BooleanField (default = False )
106109
107110 def __str__ (self ):
108111 message = f"tx { self .tx_id } \n " \
109112 f"status: { self .status } "
110113 if self .vote_id :
111114 message += f"\n vote: { self .vote_id } "
115+ message += f"\n spendable: { self .spendable } "
112116 return message
113117
114118 @property
@@ -117,6 +121,7 @@ def html(self):
117121 f"<b>status</b>: { self .status } "
118122 if self .vote_id :
119123 message += f"\n <b>vote</b>: { self .vote_link } "
124+ message += f"\n <b>spendable</b>: { self .spendable } "
120125 return message
121126
122127 def is_same_status (self , new_status_name ):
@@ -162,7 +167,24 @@ def fetch(self):
162167 self .status = status
163168 if self .status == Status .voted ():
164169 self .vote_id = data .get ('vote' )
170+ logger .debug (f"fetching vote { self } " )
171+ data = request_dcr_data (f"tx/{ self .vote_id } /vinfo" )
172+ self .vote_block = data .get ('block_validation' ).get ('height' )
165173
166174 self .save ()
167175 self .notify ()
168176 return True
177+
178+ def change_spendable (self , new_block ):
179+ if (new_block - self .vote_block ) >= 256 :
180+ self .spendable = True
181+ self .save ()
182+ self .notify ()
183+
184+ @classmethod
185+ def voted (cls ):
186+ return cls .objects .filter (_status = Status .voted ())
187+
188+ @classmethod
189+ def voted_and_spendable (cls ):
190+ return cls .voted ().filter (spendable = True )
0 commit comments