@@ -81,7 +81,7 @@ processCommand
81
81
#if GtkGui
82
82
processCommand st O. StartGUI opts = processStartGUI st opts
83
83
#endif
84
- processCommand st command _ = processCommandNoOpts st command
84
+ processCommand st command _ = processCommandNoOpts st command
85
85
86
86
-- | Processes command line user command
87
87
processCommandNoOpts
@@ -173,26 +173,27 @@ processFormTransaction
173
173
-> [(Int64 , Int )]
174
174
-> (Maybe U. UserCache )
175
175
-> m ()
176
- processFormTransaction st inputs outputAddrStr outputCoins cache =
177
- eWrap $
178
- do let outputAddr = C. Address <$> C. constructPublicKey outputAddrStr
179
- inputs' = map (foldr1 (\ (a,b) (_,d) -> (a, b ++ d))) $
180
- groupBy ((==) `on` snd ) $
181
- map (\ (idx,o,c) -> (idx - 1 , [C. Coin (C. Color c) (C. CoinAmount $ toRational o)]))
182
- inputs
183
- outputs' = map (uncurry (flip C. Coin ) . bimap (C. CoinAmount . toRational ) C. Color )
184
- outputCoins
185
- td = TransactionData
186
- { tdInputs = inputs'
187
- , tdOutputAddress = fromJust outputAddr
188
- , tdOutputCoins = outputs'
189
- }
190
- unless (isJust outputAddr) $
191
- U. commitError $ " Provided key can't be exported: " <> outputAddrStr
192
- tx <- submitTransactionRetry 2 st cache td
193
- C. logInfo $
194
- sformat (" Successfully submitted transaction with hash: " % build) $
195
- C. hash tx
176
+ processFormTransaction st inputs outputAddrStr outputCoins cache = eWrap $ do
177
+ let outputAddr = C. Address <$> C. constructPublicKey outputAddrStr
178
+ inputs' =
179
+ map (foldr1 (\ (a,b) (_,d) -> (a, b ++ d))) $
180
+ groupBy ((==) `on` snd ) $
181
+ map (\ (idx,o,c) -> (idx - 1 , [C. Coin (C. Color c) (C. CoinAmount $ toRational o)]))
182
+ inputs
183
+ outputs' =
184
+ map (uncurry (flip C. Coin ) . bimap (C. CoinAmount . toRational ) C. Color )
185
+ outputCoins
186
+ td = TransactionData
187
+ { tdInputs = inputs'
188
+ , tdOutputAddress = fromJust outputAddr
189
+ , tdOutputCoins = outputs'
190
+ }
191
+ unless (isJust outputAddr) $
192
+ U. commitError $ " Provided key can't be exported: " <> outputAddrStr
193
+ tx <- submitTransactionRetry 2 st cache td
194
+ C. logInfo $
195
+ sformat (" Successfully submitted transaction with hash: " % build) $
196
+ C. hash tx
196
197
197
198
processMultisigAddress
198
199
:: (MonadIO m , WorkMode m )
@@ -203,59 +204,58 @@ processMultisigAddress
203
204
-> T. Text
204
205
-> T. Text
205
206
-> m ()
206
- processMultisigAddress
207
- st
208
- m
209
- textUAddrs
210
- textTAddrs
211
- masterPkText
212
- masterSlaveSigText
213
- = do
207
+ processMultisigAddress st m textUAddrs textTAddrs masterPkText masterSlaveSigText = do
214
208
when (null textUAddrs && null textTAddrs) $
215
209
U. commitError " Can't create multisig with empty addrs list"
216
-
217
- userAddrs <- map C. UserAlloc <$> parseTextAddresses textUAddrs
210
+ userAddrs <- map C. UserAlloc <$> parseTextAddresses textUAddrs
218
211
trustAddrs <- map C. TrustAlloc <$> parseTextAddresses textTAddrs
219
212
let partiesAddrs = userAddrs ++ trustAddrs
220
213
when (m > length partiesAddrs) $
221
214
U. commitError " Parameter m should be less than length of list"
222
-
223
215
msPublicKey <- snd <$> liftIO C. keyGen
224
- (userAddress, userSk) <- head <$> query' st U. GetUserAddresses
225
- let msAddr = C. Address msPublicKey
216
+ (userAddress,userSk) <- head <$> query' st U. GetUserAddresses
217
+ let msAddr = C. Address msPublicKey
226
218
let partyAddr = C. UserParty userAddress
227
- let msStrat = C. AllocationStrategy m $ HS. fromList partiesAddrs
228
- let userSignature = C. sign userSk (msAddr, msStrat)
219
+ let msStrat = C. AllocationStrategy m $ HS. fromList partiesAddrs
220
+ let userSignature = C. sign userSk (msAddr, msStrat)
229
221
-- @TODO: replace with Either and liftA2
230
- let ! masterPk = fromMaybe
231
- (error " Master pk is not parseable!" )
232
- (C. constructPublicKey masterPkText)
233
- let ! masterSlaveSig = fromMaybe
234
- (error " Master slave signature is not parseable!" )
235
- (C. constructSignature masterSlaveSigText)
236
-
222
+ let ! masterPk =
223
+ fromMaybe
224
+ (error " Master pk is not parseable!" )
225
+ (C. constructPublicKey masterPkText)
226
+ let ! masterSlaveSig =
227
+ fromMaybe
228
+ (error " Master slave signature is not parseable!" )
229
+ (C. constructSignature masterSlaveSigText)
237
230
C. allocateMultisignatureAddress
238
231
msAddr
239
232
partyAddr
240
233
msStrat
241
234
userSignature
242
235
(masterPk, masterSlaveSig)
243
236
C. logInfo $
244
- sformat (" Your new address will be added in the next block: " % build) msPublicKey
237
+ sformat
238
+ (" Your new address will be added in the next block: " % build)
239
+ msPublicKey
245
240
where
246
- parseTextAddresses :: WorkMode m => [T. Text ] -> m [C. Address ]
241
+ parseTextAddresses
242
+ :: WorkMode m
243
+ => [T. Text ] -> m [C. Address ]
247
244
parseTextAddresses textAddrs = do
248
- let partiesAddrs = mapMaybe (fmap C. Address . C. constructPublicKey) textAddrs
249
- when (length partiesAddrs /= length textAddrs) $ do
250
- let parsed = T. unlines (map show' partiesAddrs)
251
- U. commitError $
252
- sformat (" Some addresses were not parsed, parsed only those: " % stext) parsed
245
+ let partiesAddrs =
246
+ mapMaybe (fmap C. Address . C. constructPublicKey) textAddrs
247
+ when (length partiesAddrs /= length textAddrs) $
248
+ do let parsed = T. unlines (map show' partiesAddrs)
249
+ U. commitError $
250
+ sformat
251
+ (" Some addresses were not parsed, parsed only those: " %
252
+ stext)
253
+ parsed
253
254
return partiesAddrs
254
255
255
256
processUpdateBlockchain
256
257
:: (MonadIO m , WorkMode m )
257
- => U. RSCoinUserState
258
- -> m ()
258
+ => U. RSCoinUserState -> m ()
259
259
processUpdateBlockchain st =
260
260
eWrap $
261
261
do res <- updateBlockchain st True
@@ -266,69 +266,72 @@ processUpdateBlockchain st =
266
266
267
267
processConfirmAllocation
268
268
:: (MonadIO m , WorkMode m )
269
- => U. RSCoinUserState
270
- -> Int
271
- -> Maybe String
272
- -> T. Text
273
- -> T. Text
274
- -> m ()
275
- processConfirmAllocation
276
- st
277
- i
278
- mHot
279
- masterPkText
280
- masterSlaveSigText
281
- = eWrap $ do
282
- when (i <= 0 ) $ U. commitError $
283
- sformat (" Index i should be greater than 0 but given: " % int) i
284
-
285
- (msAddr, C. AllocationInfo {.. }) <- query' st $ U. GetAllocationByIndex (i - 1 )
286
- (slaveSk, partyAddr) <- case mHot of
287
- Just (read -> (hotSkPath, partyPkStr)) -> do
288
- hotSk <- liftIO $ C. readSecretKey hotSkPath
289
- let party = C. Address $ fromMaybe
290
- (error " Not valid hot partyPk!" )
291
- (C. constructPublicKey $ T. pack partyPkStr)
292
- let partyAddr = C. TrustParty { partyAddress = party
293
- , hotTrustKey = C. derivePublicKey hotSk }
294
- return (hotSk, partyAddr)
295
- Nothing -> do
296
- (userAddress, userSk) <- head <$> query' st U. GetUserAddresses
297
- return (userSk, C. UserParty userAddress)
298
-
299
- let partySignature = C. sign slaveSk (msAddr, _allocationStrategy)
300
- let ! masterPk = fromMaybe
301
- (error " Master pk is not parseable!" )
302
- (C. constructPublicKey masterPkText)
303
- let ! masterSlaveSig = fromMaybe
304
- (error " Master slave signature is not parseable!" )
305
- (C. constructSignature masterSlaveSigText)
306
-
307
- C. allocateMultisignatureAddress
308
- msAddr
309
- partyAddr
310
- _allocationStrategy
311
- partySignature
312
- (masterPk, masterSlaveSig)
313
- C. logInfo " Address allocation successfully confirmed!"
269
+ => U. RSCoinUserState -> Int -> Maybe String -> T. Text -> T. Text -> m ()
270
+ processConfirmAllocation st i mHot masterPkText masterSlaveSigText =
271
+ eWrap $
272
+ do when (i <= 0 ) $
273
+ U. commitError $
274
+ sformat (" Index i should be greater than 0 but given: " % int) i
275
+ (msAddr,C. AllocationInfo {.. }) <-
276
+ query' st $ U. GetAllocationByIndex (i - 1 )
277
+ (slaveSk,partyAddr) <-
278
+ case mHot of
279
+ Just (read -> (hotSkPath,partyPkStr)) -> do
280
+ hotSk <- liftIO $ C. readSecretKey hotSkPath
281
+ let party =
282
+ C. Address $
283
+ fromMaybe
284
+ (error " Not valid hot partyPk!" )
285
+ (C. constructPublicKey $ T. pack partyPkStr)
286
+ let partyAddr =
287
+ C. TrustParty
288
+ { partyAddress = party
289
+ , hotTrustKey = C. derivePublicKey hotSk
290
+ }
291
+ return (hotSk, partyAddr)
292
+ Nothing -> do
293
+ (userAddress,userSk) <-
294
+ head <$> query' st U. GetUserAddresses
295
+ return (userSk, C. UserParty userAddress)
296
+ let partySignature = C. sign slaveSk (msAddr, _allocationStrategy)
297
+ let ! masterPk =
298
+ fromMaybe
299
+ (error " Master pk is not parseable!" )
300
+ (C. constructPublicKey masterPkText)
301
+ let ! masterSlaveSig =
302
+ fromMaybe
303
+ (error " Master slave signature is not parseable!" )
304
+ (C. constructSignature masterSlaveSigText)
305
+ C. allocateMultisignatureAddress
306
+ msAddr
307
+ partyAddr
308
+ _allocationStrategy
309
+ partySignature
310
+ (masterPk, masterSlaveSig)
311
+ C. logInfo " Address allocation successfully confirmed!"
314
312
315
313
processListAllocation
316
314
:: (MonadIO m , WorkMode m )
317
- => U. RSCoinUserState
318
- -> m ()
319
- processListAllocation st = eWrap $ do
320
- -- update local cache
321
- U. retrieveAllocationsList st
322
- msAddrsList <- query' st U. GetAllocationStrategies
323
- liftIO $ TIO. putStrLn $ T. pack $ show msAddrsList
324
- msigAddrsList <- (`zip` [(1 :: Int ).. ]) . M. assocs <$> query' st U. GetAllocationStrategies
325
- when (null msigAddrsList) $
326
- liftIO $ putStrLn " Allocation address list is empty"
327
- forM_ msigAddrsList $ \ ((addr,allocStrat), i) -> do
328
- let numLength = length $ show i
329
- let padding = foldr1 (%) (replicate numLength " " )
330
- let form = int % " . " % build % " \n " % build % padding
331
- liftIO $ TIO. putStrLn $ sformat form i addr allocStrat
315
+ => U. RSCoinUserState -> m ()
316
+ processListAllocation st =
317
+ eWrap $
318
+ do
319
+ -- update local cache
320
+ U. retrieveAllocationsList
321
+ st
322
+ msAddrsList <- query' st U. GetAllocationStrategies
323
+ liftIO $ TIO. putStrLn $ T. pack $ show msAddrsList
324
+ msigAddrsList <-
325
+ (`zip` [(1 :: Int ) .. ]) . M. assocs <$>
326
+ query' st U. GetAllocationStrategies
327
+ when (null msigAddrsList) $
328
+ liftIO $ putStrLn " Allocation address list is empty"
329
+ forM_ msigAddrsList $
330
+ \ ((addr,allocStrat),i) -> do
331
+ let numLength = length $ show i
332
+ let padding = foldr1 (%) (replicate numLength " " )
333
+ let form = int % " . " % build % " \n " % build % padding
334
+ liftIO $ TIO. putStrLn $ sformat form i addr allocStrat
332
335
333
336
processImportAddress
334
337
:: (MonadIO m , WorkMode m )
@@ -365,39 +368,47 @@ processExportAddress st addrId filepath = do
365
368
addrN
366
369
addrId
367
370
addrN
368
- let addr = allAddresses !! (addrId - 1 )
371
+ let addr = allAddresses !! (addrId - 1 )
369
372
strategy <- fromJust <$> query' st (U. GetAddressStrategy addr)
370
373
case strategy of
371
374
C. DefaultStrategy -> do
372
375
C. logInfo
373
376
" The strategy of your address is default, dumping it to the file"
374
- (addr'@ (C. getAddress-> pk),sk) <-
377
+ (addr'@ (C. getAddress -> pk),sk) <-
375
378
second fromJust <$> query' st (U. FindUserAddress addr)
376
379
unless (addr' == addr) $
377
380
C. logError $
378
381
" Internal error, address found is not the same " <>
379
382
" as requested one for default strategy"
380
383
liftIO $ C. writeSecretKey filepath sk
381
384
liftIO $ C. writePublicKey (filepath <> " .pub" ) pk
382
- C. logInfo $ sformat
383
- (" Dumped secret key into " % shown % " , public into " %
384
- shown % " .pub" ) filepath filepath
385
+ C. logInfo $
386
+ sformat
387
+ (" Dumped secret key into " % shown % " , public into " %
388
+ shown %
389
+ " .pub" )
390
+ filepath
391
+ filepath
385
392
C. MOfNStrategy m parties ->
386
393
U. commitError $
387
- sformat (" This address is " % int % " /" % int %
388
- " strategy address, export correspondent key instead. " %
389
- " Correspondent m/n key are autoexported " %
390
- " when you import their party." ) m (S. size parties)
394
+ sformat
395
+ (" This address is " % int % " /" % int %
396
+ " strategy address, export correspondent key instead. " %
397
+ " Correspondent m/n key are autoexported " %
398
+ " when you import their party." )
399
+ m
400
+ (S. size parties)
391
401
392
402
processDeleteAddress
393
403
:: (MonadIO m , WorkMode m )
394
404
=> U. RSCoinUserState
395
405
-> Int
396
406
-> m ()
397
- processDeleteAddress st ix = eWrap $ do
398
- C. logInfo $ sformat (" Deleting address #" % int) ix
399
- deleteUserAddress st ix
400
- C. logInfo " Address was successfully deleted"
407
+ processDeleteAddress st ix =
408
+ eWrap $
409
+ do C. logInfo $ sformat (" Deleting address #" % int) ix
410
+ deleteUserAddress st $ ix - 1
411
+ C. logInfo " Address was successfully deleted"
401
412
402
413
processSignSeed
403
414
:: MonadIO m
@@ -424,25 +435,27 @@ processStartGUI
424
435
-> U. RSCoinUserState
425
436
-> O. UserOptions
426
437
-> m ()
427
- processStartGUI st opts@ O. UserOptions {.. }= do
438
+ processStartGUI st opts@ O. UserOptions {.. } = do
428
439
initialized <- U. isInitialized st
429
440
unless initialized $ liftIO G. initGUI >> initLoop
430
- liftIO $ bracket
431
- (ACID. openLocalStateFrom guidbPath emptyGUIAcid)
432
- (\ cs -> do ACID. createCheckpoint cs
433
- ACID. closeAcidState cs)
434
- (\ cs -> startGUI (Just configPath) st cs)
441
+ liftIO $
442
+ bracket
443
+ (ACID. openLocalStateFrom guidbPath emptyGUIAcid)
444
+ (\ cs -> do
445
+ ACID. createCheckpoint cs
446
+ ACID. closeAcidState cs)
447
+ (\ cs ->
448
+ startGUI (Just configPath) st cs)
435
449
where
436
450
initLoop =
437
451
initializeStorage st opts `catch`
438
- (\ (e :: SomeException ) ->
439
- do liftIO $
440
- reportSimpleErrorNoWindow $
441
- " Couldn't initialize rscoin. Check connection, close this " ++
442
- " dialog and we'll try again. Error: "
443
- ++ show e
444
- wait $ for 500 ms
445
- initLoop)
452
+ (\ (e :: SomeException ) -> do
453
+ liftIO $
454
+ reportSimpleErrorNoWindow $
455
+ " Couldn't initialize rscoin. Check connection, close this " ++
456
+ " dialog and we'll try again. Error: " ++ show e
457
+ wait $ for 500 ms
458
+ initLoop)
446
459
#endif
447
460
448
461
dumpCommand
0 commit comments