From 728595dc9624276b3ac6343bafe3313e0968bc3a Mon Sep 17 00:00:00 2001 From: Chris Clark Date: Wed, 12 Aug 2015 17:11:32 -0700 Subject: [PATCH] Add getLedgerHeader method --- src/api/common/schemas/get-ledger-header.json | 34 +++++++++++++++ src/api/common/validate.js | 1 + src/api/index.js | 2 + src/api/ledger/ledger-header.js | 42 +++++++++++++++++++ test/api-test.js | 5 +++ .../api/responses/get-ledger-header.json | 14 +++++++ test/fixtures/api/responses/index.js | 1 + test/fixtures/api/rippled/ledger.json | 2 + 8 files changed, 101 insertions(+) create mode 100644 src/api/common/schemas/get-ledger-header.json create mode 100644 src/api/ledger/ledger-header.js create mode 100644 test/fixtures/api/responses/get-ledger-header.json diff --git a/src/api/common/schemas/get-ledger-header.json b/src/api/common/schemas/get-ledger-header.json new file mode 100644 index 00000000..74086563 --- /dev/null +++ b/src/api/common/schemas/get-ledger-header.json @@ -0,0 +1,34 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "getLedgerHeader", + "type": "object", + "properties": { + "accepted": {"type": "boolean"}, + "closed": {"type": "boolean"}, + "accountHash": {"$ref": "hash256"}, + "closeTime": {"type": "integer", "minimum": 0}, + "closeTimeResolution": {"type": "integer", "minimum": 1}, + "closeFlags": {"type": "integer", "minimum": 0}, + "ledgerHash": {"$ref": "hash256"}, + "ledgerVersion": {"$ref": "ledgerVersion"}, + "parentLedgerHash": {"$ref": "hash256"}, + "parentCloseTime": {"type": "integer", "minimum": 0}, + "totalDrops": {"$ref": "value"}, + "transactionHash": {"$ref": "hash256"} + }, + "required": [ + "accepted", + "closed", + "accountHash", + "closeTime", + "closeTimeResolution", + "closeFlags", + "ledgerHash", + "ledgerVersion", + "parentLedgerHash", + "parentCloseTime", + "totalDrops", + "transactionHash" + ], + "additionalProperties": false +} diff --git a/src/api/common/validate.js b/src/api/common/validate.js index 3e16d78b..e36d673c 100644 --- a/src/api/common/validate.js +++ b/src/api/common/validate.js @@ -55,6 +55,7 @@ module.exports = { secret: validateSecret, currency: _.partial(schemaValidate, 'currency'), identifier: _.partial(schemaValidate, 'hash256'), + ledgerVersion: _.partial(schemaValidate, 'ledgerVersion'), sequence: _.partial(schemaValidate, 'sequence'), order: _.partial(schemaValidate, 'order'), orderbook: _.partial(schemaValidate, 'orderbook'), diff --git a/src/api/index.js b/src/api/index.js index 3ae625a1..4f4e99ba 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -29,6 +29,7 @@ const submit = require('./transaction/submit'); const errors = require('./common').errors; const convertExceptions = require('./common').convertExceptions; const generateWallet = convertExceptions(common.core.Wallet.generate); +const getLedgerHeader = require('./ledger/ledger-header'); function RippleAPI(options: {}) { const _options = _.assign({}, options, {automatic_resubmission: false}); @@ -52,6 +53,7 @@ RippleAPI.prototype = { getOrderbook, getSettings, getAccountInfo, + getLedgerHeader, preparePayment, prepareTrustline, diff --git a/src/api/ledger/ledger-header.js b/src/api/ledger/ledger-header.js new file mode 100644 index 00000000..5f2c60fa --- /dev/null +++ b/src/api/ledger/ledger-header.js @@ -0,0 +1,42 @@ +/* @flow */ +'use strict'; +const utils = require('./utils'); +const validate = utils.common.validate; +const composeAsync = utils.common.composeAsync; + +function formatLedgerHeader(response) { + const header = response.ledger; + return { + accepted: header.accepted, + closed: header.closed, + accountHash: header.account_hash, + closeTime: header.close_time, + closeTimeResolution: header.close_time_resolution, + closeFlags: header.close_flags, + ledgerHash: header.hash || header.ledger_hash, + ledgerVersion: parseInt(header.ledger_index || header.seqNum, 10), + parentLedgerHash: header.parent_hash, + parentCloseTime: header.parent_close_time, + totalDrops: header.total_coins || header.totalCoins, + transactionHash: header.transaction_hash + }; +} + +function getLedgerHeaderAsync(ledgerVersion, callback) { + if (ledgerVersion) { + validate.ledgerVersion(ledgerVersion); + } + + const request = { + ledger: ledgerVersion || 'validated' + }; + + this.remote.requestLedger(request, + composeAsync(formatLedgerHeader, callback)); +} + +function getLedgerHeader(ledgerVersion?: number) { + return utils.promisify(getLedgerHeaderAsync.bind(this))(ledgerVersion); +} + +module.exports = getLedgerHeader; diff --git a/test/api-test.js b/test/api-test.js index 6343123d..ced042bd 100644 --- a/test/api-test.js +++ b/test/api-test.js @@ -554,6 +554,11 @@ describe('RippleAPI', function() { assert.strictEqual(this.api.getLedgerVersion(), 8819951); }); + it('getLedgerHeader', function() { + return this.api.getLedgerHeader().then( + _.partial(checkResult, responses.getLedgerHeader, 'getLedgerHeader')); + }); + it('ledger utils - compareTransactions', function() { let first = {outcome: {ledgerVersion: 1, indexInLedger: 100}}; let second = {outcome: {ledgerVersion: 1, indexInLedger: 200}}; diff --git a/test/fixtures/api/responses/get-ledger-header.json b/test/fixtures/api/responses/get-ledger-header.json new file mode 100644 index 00000000..3b41491d --- /dev/null +++ b/test/fixtures/api/responses/get-ledger-header.json @@ -0,0 +1,14 @@ +{ + "accepted": true, + "closed": true, + "accountHash": "EC028EC32896D537ECCA18D18BEBE6AE99709FEFF9EF72DBD3A7819E918D8B96", + "closeTime": 464908910, + "closeTimeResolution": 10, + "closeFlags": 0, + "ledgerHash": "0F7ED9F40742D8A513AE86029462B7A6768325583DF8EE21B7EC663019DD6A0F", + "ledgerVersion": "9038214", + "parentLedgerHash": "4BB9CBE44C39DC67A1BE849C7467FE1A6D1F73949EA163C38A0121A15E04FFDE", + "parentCloseTime": 464908900, + "totalDrops": "99999973964317514", + "transactionHash": "ECB730839EB55B1B114D5D1AD2CD9A932C35BA9AB6D3A8C2F08935EAC2BAC239" +} diff --git a/test/fixtures/api/responses/index.js b/test/fixtures/api/responses/index.js index cb0a17e4..4f20c6b0 100644 --- a/test/fixtures/api/responses/index.js +++ b/test/fixtures/api/responses/index.js @@ -27,6 +27,7 @@ module.exports = { }, getTransactions: require('./get-transactions.json'), getTrustlines: require('./get-trustlines.json'), + getLedgerHeader: require('./get-ledger-header'), prepareOrderCancellation: require('./prepare-order-cancellation.json'), prepareOrder: require('./prepare-order.json'), prepareOrderSell: require('./prepare-order-sell.json'), diff --git a/test/fixtures/api/rippled/ledger.json b/test/fixtures/api/rippled/ledger.json index 3d25ed33..d66fb845 100644 --- a/test/fixtures/api/rippled/ledger.json +++ b/test/fixtures/api/rippled/ledger.json @@ -7,9 +7,11 @@ "accepted": true, "account_hash": "EC028EC32896D537ECCA18D18BEBE6AE99709FEFF9EF72DBD3A7819E918D8B96", "close_time": 464908910, + "parent_close_time": 464908900, "close_time_human": "2014-Sep-24 21:21:50", "close_time_resolution": 10, "closed": true, + "close_flags": 0, "hash": "0F7ED9F40742D8A513AE86029462B7A6768325583DF8EE21B7EC663019DD6A0F", "ledger_hash": "0F7ED9F40742D8A513AE86029462B7A6768325583DF8EE21B7EC663019DD6A0F", "ledger_index": "9038214",