@@ -31,6 +31,7 @@ def __init__(self, type, pgp_fingerprint, message=''):
3131 self .pgp_fingerprint = pgp_fingerprint
3232 self .message = message
3333 self .type = type
34+ self .error = None
3435
3536 def __call__ (self ):
3637 try :
@@ -66,6 +67,8 @@ def __call__(self):
6667 tx = tx .replace ("\n " , "\r \n " )
6768 txs = settings ['gpg' ].sign (tx , detach = True )
6869
70+ if self .error : return False
71+
6972 return self .process (tx , txs )
7073
7174 def get_context_data (self ):
@@ -74,11 +77,14 @@ def get_context_data(self):
7477 def get_message (self , context_data , tx = '' ):
7578 return tx
7679
80+ def get_error (self ):
81+ return self .error
82+
7783 def process (self , tx , txs ):
7884 try :
7985 hdc .transactions .Process ().post (transaction = tx , signature = txs )
8086 except ValueError as e :
81- print (e )
87+ self . error = str (e )
8288 else :
8389 return True
8490
@@ -108,12 +114,7 @@ def get_message(self, context_data, tx=''):
108114
109115 return tx
110116
111- class Issue (Transaction ):
112- def __init__ (self , pgp_fingerprint , amendment , coins , message = '' ):
113- super ().__init__ ('ISSUANCE' , pgp_fingerprint , message )
114- self .amendment = amendment
115- self .coins = coins
116-
117+ class MonoTransaction (Transaction ):
117118 def get_next_coin_number (self , coins ):
118119 number = 0
119120 for c in coins :
@@ -122,8 +123,6 @@ def get_next_coin_number(self, coins):
122123 return number + 1
123124
124125 def get_message (self , context_data , tx = '' ):
125- context_data ['amendment' ] = self .amendment
126-
127126 tx += """\
128127 Recipient: %(fingerprint)s
129128Type: %(type)s
@@ -135,15 +134,66 @@ def get_message(self, context_data, tx=''):
135134 except ValueError :
136135 last_issuance = None
137136
138- previous_idx = 0 if not last_issuance else self .get_next_coin_number (last_issuance ['transaction' ]['coins' ])
137+ context_data ['previous_idx' ] = 0 if not last_issuance else self .get_next_coin_number (last_issuance ['transaction' ]['coins' ])
138+
139+ tx += self .get_mono_message (context_data )
140+
141+ return tx
142+
143+ def get_mono_message (self , context_data , tx = '' ):
144+ return tx
145+
146+ class Issue (MonoTransaction ):
147+ def __init__ (self , pgp_fingerprint , amendment , coins , message = '' ):
148+ super ().__init__ ('ISSUANCE' , pgp_fingerprint , message )
149+ self .amendment = amendment
150+ self .coins = coins
151+
152+ def get_mono_message (self , context_data , tx = '' ):
153+ context_data ['amendment' ] = self .amendment
139154
140155 for idx , coin in enumerate (self .coins ):
141- context_data ['idx' ] = idx + previous_idx
156+ context_data ['idx' ] = idx + context_data [ ' previous_idx' ]
142157 context_data ['base' ], context_data ['power' ] = [int (x ) for x in coin .split (',' )]
143158 tx += '%(fingerprint)s-%(idx)d-%(base)d-%(power)d-A-%(amendment)d\n ' % context_data
144159
145160 return tx
146161
162+ class Fusion (MonoTransaction ):
163+ def __init__ (self , pgp_fingerprint , coins , message = '' ):
164+ super ().__init__ ('FUSION' , pgp_fingerprint , message )
165+ self .coins = coins
166+
167+ def get_mono_message (self , context_data , tx = '' ):
168+ context_data ['coins' ] = self .coins
169+
170+ coins = []
171+ for coin in context_data ['coins' ].split (',' ):
172+ data = coin .split (':' )
173+ issuer , numbers = data [0 ], data [1 :]
174+ for number in numbers :
175+ coins .append (ucoin .hdc .coins .View (issuer , int (number )).get ())
176+
177+ __sum = 0
178+ for coin in coins :
179+ base , power = coin ['id' ].split ('-' )[2 :4 ]
180+ __sum += int (base ) * 10 ** int (power )
181+
182+ m = re .match (r'^(\d)(0*)$' , str (__sum ))
183+
184+ if not m :
185+ self .error = 'bad sum value %d' % __sum
186+ return tx
187+
188+ context_data ['base' ], context_data ['power' ] = int (m .groups ()[0 ]), len (m .groups ()[1 ])
189+ tx += '%(fingerprint)s-%(previous_idx)d-%(base)d-%(power)d-F-%(number)d\n ' % context_data
190+
191+ for coin in coins :
192+ context_data .update (coin )
193+ tx += '%(id)s, %(transaction)s\n ' % context_data
194+
195+ return tx
196+
147197class CoinsWrapper (Wrapper ):
148198 def __init__ (self , pgp_fingerprint ):
149199 self .pgp_fingerprint = pgp_fingerprint
@@ -160,12 +210,13 @@ def __call__(self):
160210 for id in c ['ids' ]:
161211 n ,b ,p ,t ,i = id .split ('-' )
162212 amount = int (b ) * 10 ** int (p )
163- coins [amount ] = {'issuer' : c ['issuer' ], 'number' : int (n ), 'base' : int (b ), 'power' : int (p ), 'type' : t , 'type_number' : int (i ), 'amount' : amount }
213+ if amount not in coins : coins [amount ] = []
214+ coins [amount ].append ({'issuer' : c ['issuer' ], 'number' : int (n ), 'base' : int (b ), 'power' : int (p ), 'type' : t , 'type_number' : int (i ), 'amount' : amount })
164215
165216 issuers = {}
166217 for v in self .values :
167- if v in coins :
168- c = coins [v ]
218+ if v in coins and coins [ v ] :
219+ c = coins [v ]. pop ()
169220 issuers [c ['issuer' ]] = issuers .get (c ['issuer' ]) or []
170221 issuers [c ['issuer' ]].append (c )
171222 else :
@@ -181,15 +232,23 @@ def __call__(self):
181232 return res
182233
183234class CoinsList (CoinsWrapper ):
235+ def __init__ (self , pgp_fingerprint , limit = None ):
236+ super ().__init__ (pgp_fingerprint )
237+ self .limit = limit
238+
184239 def __call__ (self ):
185240 __list = hdc .coins .List (self .pgp_fingerprint ).get ()
186241 coins = []
187242 __sum = 0
243+
188244 for c in __list ['coins' ]:
189245 for id in c ['ids' ]:
190246 n ,b ,p ,t ,i = id .split ('-' )
191247 amount = int (b ) * 10 ** int (p )
192248 __dict = {'issuer' : c ['issuer' ], 'number' : int (n ), 'base' : int (b ), 'power' : int (p ), 'type' : t , 'type_number' : int (i ), 'amount' : amount }
193- coins .append (__dict )
194- __sum += amount
249+
250+ if not self .limit or self .limit >= amount :
251+ coins .append (__dict )
252+ __sum += amount
253+
195254 return __sum , coins
0 commit comments