Skip to content

Commit 2ede017

Browse files
author
Caner Candan
committed
* wrappers/__init__.py: created monotransaction abstract class + fusion class, fixed an issue on coinsget class
1 parent b2d66dc commit 2ede017

File tree

1 file changed

+75
-16
lines changed

1 file changed

+75
-16
lines changed

wrappers/__init__.py

Lines changed: 75 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
129128
Type: %(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+
147197
class 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

183234
class 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

Comments
 (0)