diff --git a/src/common/schemas/objects/settings-plus-memos.json b/src/common/schemas/objects/settings-plus-memos.json index c3553a1d..032d478c 100644 --- a/src/common/schemas/objects/settings-plus-memos.json +++ b/src/common/schemas/objects/settings-plus-memos.json @@ -94,7 +94,7 @@ "maxItems": 8 } }, - "required": ["threshold", "weights"], + "required": ["threshold"], "additionalProperties": false }, "transferRate": { diff --git a/src/transaction/settings.ts b/src/transaction/settings.ts index f49d7fae..9e17da86 100644 --- a/src/transaction/settings.ts +++ b/src/transaction/settings.ts @@ -89,12 +89,17 @@ function createSettingsTransactionWithoutMemos( } if (settings.signers !== undefined) { - return { + const setSignerList = { TransactionType: 'SignerListSet', Account: account, - SignerQuorum: settings.signers.threshold, - SignerEntries: settings.signers.weights.map(formatSignerEntry) + SignerEntries: [], + SignerQuorum: settings.signers.threshold + }; + + if (settings.signers.weights !== undefined) { + setSignerList.SignerEntries = settings.signers.weights.map(formatSignerEntry); } + return setSignerList; } const txJSON: SettingsTransaction = { diff --git a/src/transaction/utils.ts b/src/transaction/utils.ts index 19bc21b0..242dea88 100644 --- a/src/transaction/utils.ts +++ b/src/transaction/utils.ts @@ -58,6 +58,11 @@ function prepareTransaction(txJSON: TransactionJSON, api: RippleAPI, '" exists in instance when not allowed')) } + // To remove the signer list, SignerEntries field should be omitted. + if (txJSON['SignerQuorum'] === 0) { + delete txJSON.SignerEntries; + } + const account = txJSON.Account setCanonicalFlag(txJSON) diff --git a/test/api-test.js b/test/api-test.js index 15e55039..b59f8fe3 100644 --- a/test/api-test.js +++ b/test/api-test.js @@ -1767,19 +1767,15 @@ describe('RippleAPI', function () { }; }); - it('prepareSettings - signers no weights', function (done) { + it('prepareSettings - signers no weights', function () { const settings = requests.prepareSettings.signers.noWeights; - try { - this.api.prepareSettings(address, settings, instructionsWithMaxLedgerVersionOffset).then(prepared => { - done(new Error('Expected method to reject. Prepared transaction: ' + JSON.stringify(prepared))); - }).catch(err => { - assert.strictEqual(err.name, 'ValidationError'); - assert.strictEqual(err.message, 'instance.settings.signers requires property "weights"'); - done(); - }).catch(done); // Finish test with assertion failure immediately instead of waiting for timeout. - } catch (err) { - done(new Error('Expected method to reject, but method threw. Thrown: ' + err)); - }; + const localInstructions = _.defaults({ + signersCount: 1 + }, instructionsWithMaxLedgerVersionOffset); + return this.api.prepareSettings( + address, settings, localInstructions).then( + _.partial(checkResult, responses.prepareSettings.noWeights, + 'prepare')); }); it('prepareSettings - fee for multisign', function () { @@ -1792,6 +1788,17 @@ describe('RippleAPI', function () { 'prepare')); }); + it('prepareSettings - no signer list', function () { + const settings = requests.prepareSettings.noSignerEntries; + const localInstructions = _.defaults({ + signersCount: 1 + }, instructionsWithMaxLedgerVersionOffset); + return this.api.prepareSettings( + address, settings, localInstructions).then( + _.partial(checkResult, responses.prepareSettings.noSignerList, + 'prepare')); + }); + it('prepareSettings - invalid', function (done) { // domain must be a string const settings = Object.assign({}, diff --git a/test/fixtures/requests/index.js b/test/fixtures/requests/index.js index 91aa3ac1..fae44fbd 100644 --- a/test/fixtures/requests/index.js +++ b/test/fixtures/requests/index.js @@ -22,6 +22,7 @@ module.exports = { }, prepareSettings: { domain: require('./prepare-settings'), + noSignerEntries: require('./prepare-settings-no-signer-entries'), signers: { normal: require('./prepare-settings-signers'), noThreshold: require('./prepare-settings-signers-no-threshold'), diff --git a/test/fixtures/requests/prepare-settings-no-signer-entries.json b/test/fixtures/requests/prepare-settings-no-signer-entries.json new file mode 100644 index 00000000..c8a16acb --- /dev/null +++ b/test/fixtures/requests/prepare-settings-no-signer-entries.json @@ -0,0 +1,5 @@ +{ + "signers": { + "threshold": 0 + } +} diff --git a/test/fixtures/responses/index.js b/test/fixtures/responses/index.js index f75f634f..0a7ebc8b 100644 --- a/test/fixtures/responses/index.js +++ b/test/fixtures/responses/index.js @@ -122,7 +122,9 @@ module.exports = { noInstructions: require('./prepare-settings-no-instructions.json'), signed: require('./prepare-settings-signed.json'), noMaxLedgerVersion: require('./prepare-settings-no-maxledgerversion.json'), - signers: require('./prepare-settings-signers.json') + signers: require('./prepare-settings-signers.json'), + noSignerList: require('./prepare-settings-no-signer-list.json'), + noWeights: require('./prepare-settings-no-weight.json') }, prepareCheckCreate: { normal: require('./prepare-check-create'), diff --git a/test/fixtures/responses/prepare-settings-no-signer-list.json b/test/fixtures/responses/prepare-settings-no-signer-list.json new file mode 100644 index 00000000..b2d2963c --- /dev/null +++ b/test/fixtures/responses/prepare-settings-no-signer-list.json @@ -0,0 +1,8 @@ +{ + "txJSON": "{\"TransactionType\":\"SignerListSet\",\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"SignerQuorum\":0,\"Flags\":2147483648,\"LastLedgerSequence\":8820051,\"Fee\":\"24\",\"Sequence\":23}", + "instructions": { + "fee": "0.000024", + "sequence": 23, + "maxLedgerVersion": 8820051 + } +} \ No newline at end of file diff --git a/test/fixtures/responses/prepare-settings-no-weight.json b/test/fixtures/responses/prepare-settings-no-weight.json new file mode 100644 index 00000000..56a065e3 --- /dev/null +++ b/test/fixtures/responses/prepare-settings-no-weight.json @@ -0,0 +1,8 @@ +{ + "txJSON": "{\"TransactionType\":\"SignerListSet\",\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"SignerQuorum\":2,\"SignerEntries\":[],\"Flags\":2147483648,\"LastLedgerSequence\":8820051,\"Fee\":\"24\",\"Sequence\":23}", + "instructions": { + "fee": "0.000024", + "sequence": 23, + "maxLedgerVersion": 8820051 + } +} \ No newline at end of file