Skip to content

Commit 19a3359

Browse files
committed
[RSC-143] Fix index bug + cosmetics
1 parent 5ac5aee commit 19a3359

File tree

1 file changed

+152
-139
lines changed

1 file changed

+152
-139
lines changed

src/User/Actions.hs

Lines changed: 152 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ processCommand
8181
#if GtkGui
8282
processCommand st O.StartGUI opts = processStartGUI st opts
8383
#endif
84-
processCommand st command _ = processCommandNoOpts st command
84+
processCommand st command _ = processCommandNoOpts st command
8585

8686
-- | Processes command line user command
8787
processCommandNoOpts
@@ -173,26 +173,27 @@ processFormTransaction
173173
-> [(Int64, Int)]
174174
-> (Maybe U.UserCache)
175175
-> 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
196197

197198
processMultisigAddress
198199
:: (MonadIO m, WorkMode m)
@@ -203,59 +204,58 @@ processMultisigAddress
203204
-> T.Text
204205
-> T.Text
205206
-> 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
214208
when (null textUAddrs && null textTAddrs) $
215209
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
218211
trustAddrs <- map C.TrustAlloc <$> parseTextAddresses textTAddrs
219212
let partiesAddrs = userAddrs ++ trustAddrs
220213
when (m > length partiesAddrs) $
221214
U.commitError "Parameter m should be less than length of list"
222-
223215
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
226218
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)
229221
-- @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)
237230
C.allocateMultisignatureAddress
238231
msAddr
239232
partyAddr
240233
msStrat
241234
userSignature
242235
(masterPk, masterSlaveSig)
243236
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
245240
where
246-
parseTextAddresses :: WorkMode m => [T.Text] -> m [C.Address]
241+
parseTextAddresses
242+
:: WorkMode m
243+
=> [T.Text] -> m [C.Address]
247244
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
253254
return partiesAddrs
254255

255256
processUpdateBlockchain
256257
:: (MonadIO m, WorkMode m)
257-
=> U.RSCoinUserState
258-
-> m ()
258+
=> U.RSCoinUserState -> m ()
259259
processUpdateBlockchain st =
260260
eWrap $
261261
do res <- updateBlockchain st True
@@ -266,69 +266,72 @@ processUpdateBlockchain st =
266266

267267
processConfirmAllocation
268268
:: (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!"
314312

315313
processListAllocation
316314
:: (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
332335

333336
processImportAddress
334337
:: (MonadIO m, WorkMode m)
@@ -365,39 +368,47 @@ processExportAddress st addrId filepath = do
365368
addrN
366369
addrId
367370
addrN
368-
let addr = allAddresses !! (addrId -1)
371+
let addr = allAddresses !! (addrId - 1)
369372
strategy <- fromJust <$> query' st (U.GetAddressStrategy addr)
370373
case strategy of
371374
C.DefaultStrategy -> do
372375
C.logInfo
373376
"The strategy of your address is default, dumping it to the file"
374-
(addr'@(C.getAddress->pk),sk) <-
377+
(addr'@(C.getAddress -> pk),sk) <-
375378
second fromJust <$> query' st (U.FindUserAddress addr)
376379
unless (addr' == addr) $
377380
C.logError $
378381
"Internal error, address found is not the same " <>
379382
"as requested one for default strategy"
380383
liftIO $ C.writeSecretKey filepath sk
381384
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
385392
C.MOfNStrategy m parties ->
386393
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)
391401

392402
processDeleteAddress
393403
:: (MonadIO m, WorkMode m)
394404
=> U.RSCoinUserState
395405
-> Int
396406
-> 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"
401412

402413
processSignSeed
403414
:: MonadIO m
@@ -424,25 +435,27 @@ processStartGUI
424435
-> U.RSCoinUserState
425436
-> O.UserOptions
426437
-> m ()
427-
processStartGUI st opts@O.UserOptions{..}= do
438+
processStartGUI st opts@O.UserOptions{..} = do
428439
initialized <- U.isInitialized st
429440
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)
435449
where
436450
initLoop =
437451
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)
446459
#endif
447460

448461
dumpCommand

0 commit comments

Comments
 (0)