From 1cc23c6ba99a332b2e7898902eda09b0d627b730 Mon Sep 17 00:00:00 2001 From: Mukul Jangid <49061120+mukulljangid@users.noreply.github.com> Date: Tue, 17 Aug 2021 14:18:38 -0400 Subject: [PATCH] refactor: define SignerListSet model and tests (#1538) * define typescript type for SignerListSet transaction --- src/models/common/index.ts | 5 ++ src/models/transactions/index.ts | 1 + src/models/transactions/signerListSet.ts | 38 ++++++++ src/models/transactions/transaction.ts | 3 +- test/models/signerListSet.ts | 110 +++++++++++++++++++++++ 5 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 src/models/transactions/signerListSet.ts create mode 100644 test/models/signerListSet.ts diff --git a/src/models/common/index.ts b/src/models/common/index.ts index 0ac3fb1a..158910b2 100644 --- a/src/models/common/index.ts +++ b/src/models/common/index.ts @@ -40,3 +40,8 @@ interface PathStep { } export type Path = PathStep[] + +export interface SignerEntry { + Account: string; + SignerWeight: number; +} \ No newline at end of file diff --git a/src/models/transactions/index.ts b/src/models/transactions/index.ts index 099840a8..a9781903 100644 --- a/src/models/transactions/index.ts +++ b/src/models/transactions/index.ts @@ -3,3 +3,4 @@ export * from './offerCreate' export * from './checkCreate' export * from './checkCash' export * from './checkCancel' +export * from './signerListSet' \ No newline at end of file diff --git a/src/models/transactions/signerListSet.ts b/src/models/transactions/signerListSet.ts new file mode 100644 index 00000000..a93bc2b4 --- /dev/null +++ b/src/models/transactions/signerListSet.ts @@ -0,0 +1,38 @@ +import { ValidationError } from "../../common/errors" +import { SignerEntry } from "../common" +import { BaseTransaction, verifyBaseTransaction } from "./common" + +export interface SignerListSet extends BaseTransaction { + TransactionType: "SignerListSet" + SignerQuorum: number + SignerEntries: SignerEntry[] +} + +/** + * Verify the form and type of an SignerListSet at runtime. + * + * @param tx - An SignerListSet Transaction + * @returns - Void. + * @throws - When the SignerListSet is Malformed. + */ + export function verifySignerListSet(tx: SignerListSet): void { + verifyBaseTransaction(tx) + + if (tx.SignerQuorum === undefined) + throw new ValidationError("SignerListSet: missing field SignerQuorum") + + if (typeof tx.SignerQuorum !== 'number') + throw new ValidationError("SignerListSet: invalid SignerQuorum") + + if (tx.SignerEntries === undefined) + throw new ValidationError("SignerListSet: missing field SignerEntries") + + if (!Array.isArray(tx.SignerEntries)) + throw new ValidationError("SignerListSet: invalid SignerEntries") + + if (tx.SignerEntries.length === 0) + throw new ValidationError("SignerListSet: need atleast 1 member in SignerEntries") + + if (tx.SignerEntries.length > 8) + throw new ValidationError("SignerListSet: maximum of 8 members allowed in SignerEntries") +} \ No newline at end of file diff --git a/src/models/transactions/transaction.ts b/src/models/transactions/transaction.ts index 1f152481..2dd346c0 100644 --- a/src/models/transactions/transaction.ts +++ b/src/models/transactions/transaction.ts @@ -3,6 +3,7 @@ import { OfferCreate } from "./offerCreate"; import { CheckCash } from "./checkCash"; import { CheckCancel } from "./checkCancel"; import { CheckCreate } from "./checkCreate"; +import { SignerListSet } from "./signerListSet"; export type Transaction = // AccountSet @@ -21,7 +22,7 @@ export type Transaction = // | PaymentChannelCreate // | PaymentChannelFund // | SetRegularKey -// | SignerListSet + | SignerListSet // | TicketCreate // | TrustSet diff --git a/test/models/signerListSet.ts b/test/models/signerListSet.ts new file mode 100644 index 00000000..ed4c537e --- /dev/null +++ b/test/models/signerListSet.ts @@ -0,0 +1,110 @@ +import { ValidationError } from 'ripple-api/common/errors' +import { verifySignerListSet } from './../../src/models/transactions/signerListSet' +import { assert } from 'chai' + +/** + * SignerListSet Transaction Verification Testing + * + * Providing runtime verification testing for each specific transaction type + */ +describe('SignerListSet Transaction Verification', function () { + + it (`verifies valid SignerListSet`, () => { + const validSignerListSet = { + Flags: 0, + TransactionType: "SignerListSet", + Account: "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + Fee: "12", + SignerQuorum: 3, + SignerEntries: [ + { + SignerEntry: { + Account: "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", + SignerWeight: 2 + } + }, + { + SignerEntry: { + Account: "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v", + SignerWeight: 1 + } + }, + { + SignerEntry: { + Account: "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n", + SignerWeight: 1 + } + } + ] + } as any + + assert.doesNotThrow(() => verifySignerListSet(validSignerListSet)) + }) + + + it (`throws w/ missing SignerQuorum`, () => { + const invalidSignerQuorum = { + Flags: 0, + TransactionType: "SignerListSet", + Account: "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + SignerEntries: [ + { + SignerEntry: { + Account: "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", + SignerWeight: 2 + } + }, + { + SignerEntry: { + Account: "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v", + SignerWeight: 1 + } + }, + { + SignerEntry: { + Account: "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n", + SignerWeight: 1 + } + } + ] + } as any + + assert.throws( + () => verifySignerListSet(invalidSignerQuorum), + ValidationError, + "SignerListSet: missing field SignerQuorum" + ) + }) + + it (`throws w/ empty SignerEntries`, () => { + const emptySignerEntries = { + Flags: 0, + TransactionType: "SignerListSet", + Account: "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + SignerQuorum: 3, + SignerEntries: [] + } as any + + assert.throws( + () => verifySignerListSet(emptySignerEntries), + ValidationError, + "SignerListSet: need atleast 1 member in SignerEntries" + ) + }) + + it (`throws w/ invalid SignerEntries`, () => { + const invalidSignerEntries = { + Flags: 0, + TransactionType: "SignerListSet", + Account: "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + SignerQuorum: 3, + SignerEntries: "khgfgyhujk" + } as any + + assert.throws( + () => verifySignerListSet(invalidSignerEntries), + ValidationError, + "SignerListSet: invalid SignerEntries" + ) + }) +}) \ No newline at end of file