diff --git a/src/transaction.js b/src/transaction.js index e6891a66fd..390ae41dac 100644 --- a/src/transaction.js +++ b/src/transaction.js @@ -1211,8 +1211,9 @@ Transaction.prototype.abort = function() { * @return {Object} transaction summary */ +Transaction.prototype.getSummary = Transaction.prototype.summary = function() { - var result = { + var txSummary = { tx_json: this.tx_json, clientID: this._clientID, submittedIDs: this.submittedIDs, @@ -1221,21 +1222,24 @@ Transaction.prototype.summary = function() { initialSubmitIndex: this.initialSubmitIndex, lastLedgerSequence: this.lastLedgerSequence, state: this.state, - server: this._server ? this._server._opts.url : undefined, finalized: this.finalized }; if (this.result) { - result.result = { + txSummary.result = { engine_result: this.result.engine_result, engine_result_message: this.result.engine_result_message, ledger_hash: this.result.ledger_hash, ledger_index: this.result.ledger_index, - transaction_hash: this.result.tx_json.hash + transaction_hash: undefined }; + + if (this.result.tx_json) { + txSummary.result.transaction_hash = this.result.tx_json.hash; + } } - return result; + return txSummary; }; exports.Transaction = Transaction; diff --git a/test/fixtures/transactionmanager.json b/test/fixtures/transactionmanager.json index 7e620eb270..1808b3340b 100644 --- a/test/fixtures/transactionmanager.json +++ b/test/fixtures/transactionmanager.json @@ -56,24 +56,24 @@ "meta": { "AffectedNodes": [ { - "ModifiedNode": { - "FinalFields": { - "Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d", - "Balance": "1000", - "Flags": 4849664, - "OwnerCount": 1, - "Sequence": 1 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30", - "PreviousFields": { - "Balance": "1000", - "Sequence": 3864 - }, - "PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF", - "PreviousTxnLgrSeq": 11693103 - } + "ModifiedNode": { + "FinalFields": { + "Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d", + "Balance": "1000", + "Flags": 4849664, + "OwnerCount": 1, + "Sequence": 1 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30", + "PreviousFields": { + "Balance": "1000", + "Sequence": 3864 + }, + "PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF", + "PreviousTxnLgrSeq": 11693103 } + } ], "TransactionIndex": 9, "TransactionResult": "tesSUCCESS" @@ -101,24 +101,24 @@ "TransactionIndex": 3, "AffectedNodes": [ { - "ModifiedNode": { - "LedgerEntryType": "AccountRoot", - "PreviousTxnLgrSeq": 11693103, - "PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF", - "LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30", - "PreviousFields": { - "Sequence": 3864, - "Balance": "1000" - }, - "FinalFields": { - "Flags": 4849664, - "Sequence": 3865, - "OwnerCount": 1, - "Balance": "1000", - "Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d" - } + "ModifiedNode": { + "LedgerEntryType": "AccountRoot", + "PreviousTxnLgrSeq": 11693103, + "PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF", + "LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30", + "PreviousFields": { + "Sequence": 3864, + "Balance": "1000" + }, + "FinalFields": { + "Flags": 4849664, + "Sequence": 3865, + "OwnerCount": 1, + "Balance": "1000", + "Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d" } } + } ], "TransactionResult": "tesSUCCESS" }, @@ -290,5 +290,17 @@ }, "status": "success", "type": "response" + }, + "SUBMIT_REMOTE_ERROR": { + "error": "invalidTransaction", + "error_exception": "fails local checks: The MemoType and MemoFormat fields may only contain characters that are allowed in URLs under RFC 3986.", + "id": 1, + "request": { + "command": "submit", + "id": 1, + "tx_blob": "12000022800000002400000001201B00CCEAD0614000000000000001684000000000002EE0732102999FB4BC17144F83CDC2F17EA642519FF115EE7B0CC8C78DE9061F1A473F7BAC7447304502210098DC7E9ED1CE860FB6B0904E6E8140D5463D288BA633F36E69A68ACB3D6FCA06022014E76E22F5173B37239F9F56F904839B462F5019169C56A324D3F074FBA39A2A811492DECA2DC92352BE97C1F6347F7E6CCB9A8241C883143108B9AC27BF036EFE5CBE787921F54D622B7A5BF9EA7C0B6D79206D656D6F747970657E0C6D79206D656D6F5F64617461E1F1" + }, + "status": "error", + "type": "response" } } diff --git a/test/transaction-manager-test.js b/test/transaction-manager-test.js index 2c92c7a4dd..78684c5fe4 100644 --- a/test/transaction-manager-test.js +++ b/test/transaction-manager-test.js @@ -1,3 +1,6 @@ +/* eslint-disable max-len */ +/* eslint-disable comma-spacing */ + 'use strict'; var ws = require('ws'); @@ -34,6 +37,8 @@ var SUBMIT_TEF_RESPONSE = require('./fixtures/transactionmanager') .SUBMIT_TEF_RESPONSE; var SUBMIT_TEL_RESPONSE = require('./fixtures/transactionmanager') .SUBMIT_TEL_RESPONSE; +var SUBMIT_REMOTE_ERROR = require('./fixtures/transactionmanager') +.SUBMIT_REMOTE_ERROR; describe('TransactionManager', function() { var rippled; @@ -491,7 +496,7 @@ describe('TransactionManager', function() { assert(false, 'Should not receive proposed event'); }); transaction.once('submitted', function(m) { - assert.strictEqual(m.engine_result, 'terNO_ACCOUNT'); + assert.strictEqual(m.engine_result, SUBMIT_TER_RESPONSE.result.engine_result); receivedSubmitted = true; }); @@ -523,6 +528,20 @@ describe('TransactionManager', function() { assert.strictEqual(err.engine_result, 'tejMaxLedger'); assert(receivedSubmitted); assert.strictEqual(transactionManager.getPending().length(), 0); + assert.strictEqual(transactionManager.getPending().length(), 0); + assert.strictEqual(transaction.summary().submissionAttempts, 1); + assert.strictEqual(transaction.summary().submitIndex, 2); + assert.strictEqual(transaction.summary().initialSubmitIndex, 2); + assert.strictEqual(transaction.summary().lastLedgerSequence, 5); + assert.strictEqual(transaction.summary().state, 'failed'); + assert.strictEqual(transaction.summary().finalized, true); + assert.deepEqual(transaction.summary().result, { + engine_result: SUBMIT_TER_RESPONSE.result.engine_result, + engine_result_message: SUBMIT_TER_RESPONSE.result.engine_result_message, + ledger_hash: undefined, + ledger_index: undefined, + transaction_hash: SUBMIT_TER_RESPONSE.result.tx_json.hash + }); transactionManager.once('sequence_filled', done); }); }); @@ -569,6 +588,19 @@ describe('TransactionManager', function() { assert(receivedResubmitted); assert.strictEqual(err.engine_result, 'tejMaxLedger'); assert.strictEqual(transactionManager.getPending().length(), 0); + assert.strictEqual(transaction.summary().submissionAttempts, 2); + assert.strictEqual(transaction.summary().submitIndex, 3); + assert.strictEqual(transaction.summary().initialSubmitIndex, 2); + assert.strictEqual(transaction.summary().lastLedgerSequence, 5); + assert.strictEqual(transaction.summary().state, 'failed'); + assert.strictEqual(transaction.summary().finalized, true); + assert.deepEqual(transaction.summary().result, { + engine_result: SUBMIT_TEF_RESPONSE.result.engine_result, + engine_result_message: SUBMIT_TEF_RESPONSE.result.engine_result_message, + ledger_hash: undefined, + ledger_index: undefined, + transaction_hash: SUBMIT_TEF_RESPONSE.result.tx_json.hash + }); done(); }); }); @@ -612,6 +644,19 @@ describe('TransactionManager', function() { assert(receivedResubmitted); assert.strictEqual(err.engine_result, 'tejMaxLedger'); assert.strictEqual(transactionManager.getPending().length(), 0); + assert.strictEqual(transaction.summary().submissionAttempts, 2); + assert.strictEqual(transaction.summary().submitIndex, 3); + assert.strictEqual(transaction.summary().initialSubmitIndex, 2); + assert.strictEqual(transaction.summary().lastLedgerSequence, 5); + assert.strictEqual(transaction.summary().state, 'failed'); + assert.strictEqual(transaction.summary().finalized, true); + assert.deepEqual(transaction.summary().result, { + engine_result: SUBMIT_TEL_RESPONSE.result.engine_result, + engine_result_message: SUBMIT_TEL_RESPONSE.result.engine_result_message, + ledger_hash: undefined, + ledger_index: undefined, + transaction_hash: SUBMIT_TEL_RESPONSE.result.tx_json.hash + }); done(); }); }); @@ -630,6 +675,68 @@ describe('TransactionManager', function() { transaction.submit(function(err) { assert.strictEqual(err.engine_result, 'tejSecretInvalid'); assert.strictEqual(transactionManager.getPending().length(), 0); + assert.deepEqual(transaction.summary().tx_json, transaction.tx_json); + assert.strictEqual(transaction.summary().submissionAttempts, 0); + assert.strictEqual(transaction.summary().submitIndex, undefined); + assert.strictEqual(transaction.summary().initialSubmitIndex, undefined); + assert.strictEqual(transaction.summary().lastLedgerSequence, undefined); + assert.strictEqual(transaction.summary().state, 'failed'); + assert.strictEqual(transaction.summary().finalized, true); + assert.deepEqual(transaction.summary().result, { + engine_result: 'tejSecretInvalid', + engine_result_message: 'Invalid secret', + ledger_hash: undefined, + ledger_index: undefined, + transaction_hash: undefined + }); + done(); + }); + }); + + it('Submit transaction -- remote error', function(done) { + var transaction = remote.createTransaction('Payment', { + account: ACCOUNT.address, + destination: ACCOUNT2.address, + amount: '1' + }); + transaction.addMemo('my memotype','my_memo_data'); + + var receivedSubmitted = false; + transaction.once('proposed', function() { + assert(false, 'Should not receive proposed event'); + }); + transaction.once('submitted', function(m) { + assert.strictEqual(m.error, 'remoteError'); + receivedSubmitted = true; + }); + + rippled.on('request_submit', function(m, req) { + assert.strictEqual(transactionManager.getPending().length(), 1); + assert.strictEqual(m.tx_blob, SerializedObject.from_json( + transaction.tx_json).to_hex()); + req.sendResponse(SUBMIT_REMOTE_ERROR, {id: m.id}); + }); + + transaction.submit(function(err) { + assert(err, 'Transaction submission should not succeed'); + assert(receivedSubmitted); + assert.strictEqual(err.error, 'remoteError'); + assert.strictEqual(err.remote.error, 'invalidTransaction'); + assert.strictEqual(transactionManager.getPending().length(), 0); + assert.deepEqual(transaction.summary().tx_json, transaction.tx_json); + assert.strictEqual(transaction.summary().submissionAttempts, 1); + assert.strictEqual(transaction.summary().submitIndex, 2); + assert.strictEqual(transaction.summary().initialSubmitIndex, 2); + assert.strictEqual(transaction.summary().lastLedgerSequence, 5); + assert.strictEqual(transaction.summary().state, 'failed'); + assert.strictEqual(transaction.summary().finalized, true); + assert.deepEqual(transaction.summary().result, { + engine_result: undefined, + engine_result_message: undefined, + ledger_hash: undefined, + ledger_index: undefined, + transaction_hash: undefined + }); done(); }); });