1
+ const Promise = require ( 'bluebird' ) ;
2
+ const co = Promise . coroutine ;
1
3
const utxoLib = require ( 'bitgo-utxo-lib' ) ;
2
4
const accountLib = require ( '@bitgo/account-lib' ) ;
3
5
const statics = require ( '@bitgo/statics' ) ;
@@ -175,7 +177,7 @@ const handleSignUtxo = function(recoveryRequest, key, skipConfirm) {
175
177
176
178
// Derive signing key from chain path
177
179
const derivedHDNode = backupKeyNode . derivePath ( input . chainPath ) ;
178
- console . log ( `Signing input ${ i + 1 } of ${ recoveryRequest . inputs . length }
180
+ console . log ( `Signing input ${ i + 1 } of ${ recoveryRequest . inputs . length } \
179
181
with ${ derivedHDNode . neutered ( ) . toBase58 ( ) } (${ input . chainPath } )` ) ;
180
182
181
183
// Handle BCH
@@ -214,9 +216,9 @@ const handleSignUtxo = function(recoveryRequest, key, skipConfirm) {
214
216
return txBuilder . build ( ) . toHex ( ) ;
215
217
} ;
216
218
217
- const handleHalfSignEth = function ( recoveryRequest , key , skipConfirm , basecoin ) {
218
- return utils . halfSignEthTransaction ( basecoin , recoveryRequest , key ) ;
219
- } ;
219
+ const handleHalfSignEth = co ( function * ( recoveryRequest , key , skipConfirm , basecoin ) {
220
+ return yield utils . halfSignEthTransaction ( basecoin , recoveryRequest , key ) ;
221
+ } ) ;
220
222
221
223
const handleSignEthereum = function ( recoveryRequest , key , skipConfirm ) {
222
224
return signEthTx ( recoveryRequest , key , skipConfirm , false ) ;
@@ -268,26 +270,28 @@ const signEthTx = function(recoveryRequest, key, skipConfirm, isToken) {
268
270
return transaction . serialize ( ) . toString ( 'hex' ) ;
269
271
} ;
270
272
271
- const handleSignTrx = function ( recoveryRequest , key , skipConfirm ) {
273
+ const handleSignTrx = co ( function * ( recoveryRequest , key , skipConfirm ) {
272
274
const coin = recoveryRequest . coin ;
273
275
274
276
const txHex = getTransactionHexFromRequest ( recoveryRequest ) ;
275
- const builder = new accountLib . TransactionBuilder ( { coinName : coin } ) ;
277
+ const builder = new accountLib . getBuilder ( coin ) ;
276
278
builder . from ( txHex ) ;
279
+ const builtTransaction = yield builder . build ( ) ;
277
280
278
- const outputs = builder . build ( ) . destinations . map ( d => {
281
+ const outputs = builtTransaction . outputs . map ( d => {
279
282
return {
280
283
address : d . address ,
281
- amount : d . value . toString ( 10 )
284
+ amount : d . value
282
285
} ;
283
286
} ) ;
284
287
285
288
key = promptForConfirmationAndKey ( recoveryRequest , outputs , skipConfirm , key ) ;
286
289
const signingKey = getBackupSigningKey ( key , recoveryRequest . backupKey ) ;
287
290
288
- builder . sign ( { key : signingKey } ) ;
289
- return JSON . stringify ( builder . build ( ) . toJson ( ) ) ;
290
- } ;
291
+ builder . sign ( { key : signingKey . toString ( 'hex' ) } ) ;
292
+ const signedTransaction = yield builder . build ( ) ;
293
+ return JSON . stringify ( signedTransaction . toJson ( ) ) ;
294
+ } ) ;
291
295
292
296
const handleSignEos = function ( recoveryRequest , key , skipConfirm ) {
293
297
const EosJs = require ( 'eosjs' ) ;
@@ -402,7 +406,7 @@ const handleSignErc20 = function(recoveryRequest, key, skipConfirm) {
402
406
Takes in either an xprv, xlmsecret, or 24 words.
403
407
Returns an xprv or xlmsecret
404
408
*/
405
- const parseKey = function ( rawkey , coin , path ) {
409
+ const parseKey = co ( function * ( rawkey , coin , path ) {
406
410
407
411
if ( rawkey . includes ( ',' ) && rawkey . split ( ',' ) . length === 24 ) {
408
412
const mnemonic = rawkey . replace ( / , / g, ' ' ) ; // replace commas with spaces
@@ -416,7 +420,7 @@ const parseKey = function(rawkey, coin, path) {
416
420
if ( ! bip39 . validateMnemonic ( mnemonic ) ) {
417
421
throw new Error ( 'Invalid mnemonic' ) ;
418
422
}
419
- const seed = bip39 . mnemonicToSeed ( mnemonic ) ;
423
+ const seed = yield bip39 . mnemonicToSeed ( mnemonic ) ;
420
424
let node = utxoLib . HDNode . fromSeedBuffer ( seed ) ;
421
425
if ( path ) {
422
426
node = node . derivePath ( path ) ;
@@ -432,7 +436,7 @@ const parseKey = function(rawkey, coin, path) {
432
436
return node . toBase58 ( ) ;
433
437
}
434
438
return rawkey ;
435
- } ;
439
+ } ) ;
436
440
437
441
/**
438
442
Not all recoveryRequest files are formatted the same. Sometimes they have 'tx', 'txHex', or 'transactionHex'
@@ -451,7 +455,7 @@ const getTransactionHexFromRequest = function(recoveryRequest) {
451
455
throw new Error ( 'The recovery request did not provide a transaction hex' ) ;
452
456
} ;
453
457
454
- const handleSign = function ( args ) {
458
+ const handleSign = co ( function * ( args ) {
455
459
const file = args . file ;
456
460
457
461
const recoveryRequest = JSON . parse ( fs . readFileSync ( file , { encoding : 'utf8' } ) ) ;
@@ -469,7 +473,7 @@ const handleSign = function(args) {
469
473
args . key = prompt ( 'Key: ' ) ;
470
474
}
471
475
472
- const key = parseKey ( args . key , coin . name , args . path ) ;
476
+ const key = yield parseKey ( args . key , coin . name , args . path ) ;
473
477
474
478
let txHex , halfSignedInfo ;
475
479
@@ -480,7 +484,7 @@ const handleSign = function(args) {
480
484
switch ( basecoin . getFamily ( ) ) {
481
485
case 'eth' :
482
486
if ( recoveryRequest . txPrebuild ) {
483
- halfSignedInfo = handleHalfSignEth ( recoveryRequest , key , args . confirm , basecoin ) ;
487
+ halfSignedInfo = yield handleHalfSignEth ( recoveryRequest , key , args . confirm , basecoin ) ;
484
488
} else {
485
489
if ( coin . family === 'eth' && ! coin . isToken ) {
486
490
txHex = handleSignEthereum ( recoveryRequest , key , args . confirm ) ;
@@ -493,7 +497,7 @@ const handleSign = function(args) {
493
497
txHex = handleSignEos ( recoveryRequest , key , args . confirm ) ;
494
498
break ;
495
499
case 'trx' :
496
- txHex = handleSignTrx ( recoveryRequest , key , args . confirm ) ;
500
+ txHex = yield handleSignTrx ( recoveryRequest , key , args . confirm ) ;
497
501
break ;
498
502
case 'xrp' :
499
503
txHex = handleSignXrp ( recoveryRequest , key , args . confirm ) ;
@@ -528,7 +532,7 @@ const handleSign = function(args) {
528
532
console . log ( 'Done' ) ;
529
533
}
530
534
return finalRecovery ;
531
- } ;
535
+ } ) ;
532
536
533
537
module . exports = { handleSign, handleSignUtxo, handleSignEthereum,
534
538
handleSignXrp, handleSignXlm, handleSignErc20, handleSignEos, handleSignTrx, parseKey } ;
0 commit comments