Skip to content

Commit 421ade1

Browse files
authored
Merge pull request #43 from BitGo/fix-xrp-signing
[BG-9549] handle different types of inputs to xrp
2 parents 4ae0a53 + 3f64235 commit 421ade1

File tree

4 files changed

+44
-8
lines changed

4 files changed

+44
-8
lines changed

app/admin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,4 +466,4 @@ const run = co(function *(testArgs) {
466466
});
467467

468468
// For admin script and unit testing of functions
469-
module.exports = { run, validateKey, saveKeys, db };
469+
module.exports = { run, validateKey, saveKeys, db , requireDB };

app/sign.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ const handleSignUtxo = function(recoveryRequest, key, skipConfirm) {
9090
throw new Error(`Unsupported coin: ${recoveryRequest.coin}`);
9191
}
9292

93-
const transaction = utxoLib.Transaction.fromHex(recoveryRequest.transactionHex, network);
93+
const txHex = getTransactionHexFromRequest(recoveryRequest);
94+
const transaction = utxoLib.Transaction.fromHex(txHex, network);
9495

9596
const outputs = transaction.outs.map(out => ({
9697
address: utxoLib.address.fromOutputScript(out.script, network),
@@ -160,7 +161,8 @@ const handleSignUtxo = function(recoveryRequest, key, skipConfirm) {
160161
const handleSignEthereum = function(recoveryRequest, key, skipConfirm) {
161162
const EthTx = require('ethereumjs-tx');
162163

163-
const transaction = new EthTx(recoveryRequest.tx);
164+
const txHex = getTransactionHexFromRequest(recoveryRequest);
165+
const transaction = new EthTx(txHex);
164166
const decimals = coinDecimals[recoveryRequest.coin];
165167

166168
const customMessage = recoveryRequest.custom ? recoveryRequest.custom.message : 'None';
@@ -192,8 +194,10 @@ const handleSignXrp = function(recoveryRequest, key, skipConfirm) {
192194
const rippleKeypairs = require('ripple-keypairs');
193195
const rippleParse = require('ripple-binary-codec');
194196

197+
const txHex = getTransactionHexFromRequest(recoveryRequest);
198+
195199
const decimals = coinDecimals[recoveryRequest.coin];
196-
const transaction = rippleParse.decode(recoveryRequest.tx);
200+
const transaction = rippleParse.decode(txHex);
197201
const customMessage = recoveryRequest.custom ? recoveryRequest.custom.message : 'None';
198202

199203
const outputs = [{
@@ -212,9 +216,9 @@ const handleSignXrp = function(recoveryRequest, key, skipConfirm) {
212216

213217
const backupAddress = rippleKeypairs.deriveAddress(backupKeyNode.keyPair.getPublicKeyBuffer().toString('hex'));
214218
const privateKeyHex = backupKeyNode.keyPair.getPrivateKeyBuffer().toString('hex');
215-
const cosignedTx = utils.signXrpWithPrivateKey(recoveryRequest.txHex, privateKeyHex, { signAs: backupAddress });
219+
const cosignedTx = utils.signXrpWithPrivateKey(txHex, privateKeyHex, { signAs: backupAddress });
216220

217-
return rippleApi.combine([ recoveryRequest.txHex, cosignedTx.signedTransaction ]).signedTransaction;
221+
return rippleApi.combine([ txHex, cosignedTx.signedTransaction ]).signedTransaction;
218222
};
219223

220224
const handleSignXlm = function(recoveryRequest, key, skipConfirm) {
@@ -228,7 +232,8 @@ const handleSignXlm = function(recoveryRequest, key, skipConfirm) {
228232

229233
const decimals = coinDecimals[recoveryRequest.coin];
230234

231-
const transaction = new stellar.Transaction(recoveryRequest.tx);
235+
const txHex = getTransactionHexFromRequest(recoveryRequest);
236+
const transaction = new stellar.Transaction(txHex);
232237
const customMessage = recoveryRequest.custom ? recoveryRequest.custom.message : 'None';
233238

234239
if (transaction.operations.length !== 1) {
@@ -271,7 +276,8 @@ const handleSignXlm = function(recoveryRequest, key, skipConfirm) {
271276
const handleSignErc20 = function(recoveryRequest, key, skipConfirm) {
272277
const EthTx = require('ethereumjs-tx');
273278

274-
const transaction = new EthTx(recoveryRequest.tx);
279+
const txHex = getTransactionHexFromRequest(recoveryRequest);
280+
const transaction = new EthTx(txHex);
275281

276282
const customMessage = recoveryRequest.custom ? recoveryRequest.custom.message : 'None';
277283
const txData = transaction.data;
@@ -327,6 +333,23 @@ const parseKey = function(rawkey, coin, path) {
327333
return rawkey;
328334
}
329335

336+
/**
337+
Not all recoveryRequest files are formatted the same. Sometimes they have 'tx', 'txHex', or 'transactionHex'
338+
This function gets and gets and returns the transaction hex in all of these cases
339+
*/
340+
const getTransactionHexFromRequest = function(recoveryRequest) {
341+
if (recoveryRequest.txHex){
342+
return recoveryRequest.txHex
343+
}
344+
if (recoveryRequest.transactionHex){
345+
return recoveryRequest.transactionHex
346+
}
347+
if (recoveryRequest.tx){
348+
return recoveryRequest.tx
349+
}
350+
throw new Error("The recovery request did not provide a transaction hex");
351+
}
352+
330353
const handleSign = function(args) {
331354
const file = args.file;
332355

test/admin.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ describe('Offline Admin Tool', function() {
206206
path: '0'
207207
};
208208
const keyList = [key];
209+
admin.requireDB();
209210
yield admin.saveKeys(keyList, 'xpub');
210211
const foundKey = yield MasterKey.findOne({ pub: xpub });
211212
foundKey.should.have.property('signature');

test/sign.js

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)