diff --git a/packages/xrpl/src/models/transactions/oracleSet.ts b/packages/xrpl/src/models/transactions/oracleSet.ts index 0ba214ae..6b3f395d 100644 --- a/packages/xrpl/src/models/transactions/oracleSet.ts +++ b/packages/xrpl/src/models/transactions/oracleSet.ts @@ -130,6 +130,18 @@ export function validateOracleSet(tx: Record): void { ) } + // Either AssetPrice and Scale are both present or both excluded + if ( + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- we are validating the type + (priceData.PriceData.AssetPrice == null) !== + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- we are validating the type + (priceData.PriceData.Scale == null) + ) { + throw new ValidationError( + 'OracleSet: PriceDataSeries must have both `AssetPrice` and `Scale` if any are present', + ) + } + if ( // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- we are validating the type 'AssetPrice' in priceData.PriceData && diff --git a/packages/xrpl/test/models/oracleSet.test.ts b/packages/xrpl/test/models/oracleSet.test.ts index c9e1de81..18ce5d87 100644 --- a/packages/xrpl/test/models/oracleSet.test.ts +++ b/packages/xrpl/test/models/oracleSet.test.ts @@ -150,6 +150,22 @@ describe('OracleSet', function () { assert.throws(() => validate(tx), ValidationError, errorMessage) }) + it(`throws w/ missing AssetPrice with Scale present of PriceDataSeries`, function () { + delete tx.PriceDataSeries[0].PriceData.AssetPrice + const errorMessage = + 'OracleSet: PriceDataSeries must have both `AssetPrice` and `Scale` if any are present' + assert.throws(() => validateOracleSet(tx), ValidationError, errorMessage) + assert.throws(() => validate(tx), ValidationError, errorMessage) + }) + + it(`throws w/ missing Scale with AssetPrice present of PriceDataSeries`, function () { + delete tx.PriceDataSeries[0].PriceData.Scale + const errorMessage = + 'OracleSet: PriceDataSeries must have both `AssetPrice` and `Scale` if any are present' + assert.throws(() => validateOracleSet(tx), ValidationError, errorMessage) + assert.throws(() => validate(tx), ValidationError, errorMessage) + }) + it(`throws w/ invalid AssetPrice of PriceDataSeries`, function () { tx.PriceDataSeries[0].PriceData.AssetPrice = '1234' const errorMessage = 'OracleSet: invalid field AssetPrice'