From 2112d4c0b35cd6c3c1cd93b2675c68cc9fbd088e Mon Sep 17 00:00:00 2001 From: Elliot Lee Date: Thu, 28 Jun 2018 17:59:00 -0700 Subject: [PATCH] Round XRP fee to 6 decimal places (#912) * Round XRP fee to 6 decimal places Fix #911 --- src/common/serverinfo.ts | 6 ++++-- test/api-test.js | 20 ++++++++++++++++++++ test/mock-rippled.js | 4 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/common/serverinfo.ts b/src/common/serverinfo.ts index 5c8b8de0..165c2d00 100644 --- a/src/common/serverinfo.ts +++ b/src/common/serverinfo.ts @@ -74,10 +74,12 @@ async function getFee( const serverInfo = (await this.request('server_info')).info const baseFeeXrp = new BigNumber(serverInfo.validated_ledger.base_fee_xrp) - const fee = baseFeeXrp.times(serverInfo.load_factor).times(cushion) + let fee = baseFeeXrp.times(serverInfo.load_factor).times(cushion) // Cap fee to `this._maxFeeXRP` - return BigNumber.min(fee, this._maxFeeXRP).toString(10) + fee = BigNumber.min(fee, this._maxFeeXRP) + // Round fee to 6 decimal places + return (new BigNumber(fee.toFormat(6))).toString(10) } export { diff --git a/test/api-test.js b/test/api-test.js index cb6765b8..2cf68e42 100644 --- a/test/api-test.js +++ b/test/api-test.js @@ -1820,6 +1820,26 @@ describe('RippleAPI', function () { _.partial(checkResult, expectedResponse, 'prepare')); }); + it('fee - calculated fee does not use more than 6 decimal places', function () { + this.api.connection._send(JSON.stringify({ + command: 'config', + data: { loadFactor: 5407.96875 } + })); + + const expectedResponse = { + "txJSON": "{\"Flags\":2147483648,\"TransactionType\":\"Payment\",\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"Destination\":\"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo\",\"Amount\":{\"value\":\"0.01\",\"currency\":\"USD\",\"issuer\":\"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM\"},\"SendMax\":{\"value\":\"0.01\",\"currency\":\"USD\",\"issuer\":\"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM\"},\"LastLedgerSequence\":8820051,\"Fee\":\"64896\",\"Sequence\":23}", + "instructions": { + "fee": "0.064896", + "sequence": 23, + "maxLedgerVersion": 8820051 + } + } + + return this.api.preparePayment( + address, requests.preparePayment.normal, instructions).then( + _.partial(checkResult, expectedResponse, 'prepare')); + }); + it('disconnect & isConnected', function () { assert.strictEqual(this.api.isConnected(), true); return this.api.disconnect().then(() => { diff --git a/test/mock-rippled.js b/test/mock-rippled.js index 0680eb3e..3afa0e59 100644 --- a/test/mock-rippled.js +++ b/test/mock-rippled.js @@ -152,7 +152,7 @@ module.exports = function createMockRippled(port) { mock.on('request_server_info', function (request, conn) { assert.strictEqual(request.command, 'server_info'); - if (conn.config.highLoadFactor) { + if (conn.config.highLoadFactor || conn.config.loadFactor) { const response = { "id": 0, "status": "success", @@ -167,7 +167,7 @@ module.exports = function createMockRippled(port) { "converge_time_s": 2.007, "proposers": 4 }, - "load_factor": 4294967296, + "load_factor": conn.config.loadFactor || 4294967296, "peers": 53, "pubkey_node": "n94wWvFUmaKGYrKUGgpv1DyYgDeXRGdACkNQaSe7zJiy5Znio7UC", "server_state": "full",