mirror of
				https://github.com/Xahau/xahau.js.git
				synced 2025-11-04 04:55:48 +00:00 
			
		
		
		
	fix: fix escrow OfferSequence validation (#2474)
				
					
				
			* Fix escrow validation * update .nvmrc * fix tests * fix EscrowFinish too * fix test * update HISTORY * fix validation * fix linter issues * forgot to save * change test string
This commit is contained in:
		
							
								
								
									
										1
									
								
								.prettierignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.prettierignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					*.md
 | 
				
			||||||
@@ -128,6 +128,12 @@ module.exports = {
 | 
				
			|||||||
        '@typescript-eslint/no-explicit-any': 'off',
 | 
					        '@typescript-eslint/no-explicit-any': 'off',
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      files: ['src/models/**/*.ts'],
 | 
				
			||||||
 | 
					      rules: {
 | 
				
			||||||
 | 
					        complexity: ['off'],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      files: ['.eslintrc.js', 'jest.config.js'],
 | 
					      files: ['.eslintrc.js', 'jest.config.js'],
 | 
				
			||||||
      rules: {
 | 
					      rules: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,12 @@
 | 
				
			|||||||
# xrpl.js (ripple-lib) Release History
 | 
					# xrpl.js (ripple-lib) Release History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Subscribe to [the **xrpl-announce** mailing list](https://groups.google.com/g/xrpl-announce) for release announcements. We recommend that xrpl.js (ripple-lib) users stay up-to-date with the latest stable release.
 | 
					Subscribe to [the **xrpl-announce** mailing list](https://groups.google.com/g/xrpl-announce) for release announcements. We recommend that xrpl.js (ripple-lib) users stay up-to-date with the latest stable release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Unreleased
 | 
					## Unreleased
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Fixed
 | 
					## Fixed
 | 
				
			||||||
* Fix request model fields related to AMM
 | 
					* Fix request model fields related to AMM
 | 
				
			||||||
 | 
					* Fixed `EscrowCancel` and `EscrowFinish` validation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 2.11.0 (2023-08-24)
 | 
					## 2.11.0 (2023-08-24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- required for validateAMMBid */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
import { AuthAccount, Currency, IssuedCurrencyAmount } from '../common'
 | 
					import { AuthAccount, Currency, IssuedCurrencyAmount } from '../common'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- required for validateAMMDeposit */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
import { Amount, Currency, IssuedCurrencyAmount } from '../common'
 | 
					import { Amount, Currency, IssuedCurrencyAmount } from '../common'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- required for validateAMMWithdraw */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
import { Amount, Currency, IssuedCurrencyAmount } from '../common'
 | 
					import { Amount, Currency, IssuedCurrencyAmount } from '../common'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validateAccountSet */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import { isValidClassicAddress } from 'ripple-address-codec'
 | 
					import { isValidClassicAddress } from 'ripple-address-codec'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validateCheckCash */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
import { Amount } from '../common'
 | 
					import { Amount } from '../common'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validateCheckCreate */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
import { Amount } from '../common'
 | 
					import { Amount } from '../common'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
/* eslint-disable max-lines-per-function -- Necessary for validateBaseTransaction */
 | 
					/* eslint-disable max-lines-per-function -- Necessary for validateBaseTransaction */
 | 
				
			||||||
/* eslint-disable complexity -- Necessary for validateBaseTransaction */
 | 
					 | 
				
			||||||
/* eslint-disable max-statements -- Necessary for validateBaseTransaction */
 | 
					/* eslint-disable max-statements -- Necessary for validateBaseTransaction */
 | 
				
			||||||
import { TRANSACTION_TYPES } from 'ripple-binary-codec'
 | 
					import { TRANSACTION_TYPES } from 'ripple-binary-codec'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validateDepositPreauth */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { BaseTransaction, validateBaseTransaction } from './common'
 | 
					import { BaseTransaction, validateBaseTransaction } from './common'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ export interface EscrowCancel extends BaseTransaction {
 | 
				
			|||||||
   * Transaction sequence (or Ticket  number) of EscrowCreate transaction that.
 | 
					   * Transaction sequence (or Ticket  number) of EscrowCreate transaction that.
 | 
				
			||||||
   * created the escrow to cancel.
 | 
					   * created the escrow to cancel.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  OfferSequence: number
 | 
					  OfferSequence: number | string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -27,7 +27,7 @@ export interface EscrowCancel extends BaseTransaction {
 | 
				
			|||||||
export function validateEscrowCancel(tx: Record<string, unknown>): void {
 | 
					export function validateEscrowCancel(tx: Record<string, unknown>): void {
 | 
				
			||||||
  validateBaseTransaction(tx)
 | 
					  validateBaseTransaction(tx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (tx.Owner === undefined) {
 | 
					  if (tx.Owner == null) {
 | 
				
			||||||
    throw new ValidationError('EscrowCancel: missing Owner')
 | 
					    throw new ValidationError('EscrowCancel: missing Owner')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,11 +35,15 @@ export function validateEscrowCancel(tx: Record<string, unknown>): void {
 | 
				
			|||||||
    throw new ValidationError('EscrowCancel: Owner must be a string')
 | 
					    throw new ValidationError('EscrowCancel: Owner must be a string')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (tx.OfferSequence === undefined) {
 | 
					  if (tx.OfferSequence == null) {
 | 
				
			||||||
    throw new ValidationError('EscrowCancel: missing OfferSequence')
 | 
					    throw new ValidationError('EscrowCancel: missing OfferSequence')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (typeof tx.OfferSequence !== 'number') {
 | 
					  if (
 | 
				
			||||||
 | 
					    (typeof tx.OfferSequence !== 'number' &&
 | 
				
			||||||
 | 
					      typeof tx.OfferSequence !== 'string') ||
 | 
				
			||||||
 | 
					    Number.isNaN(Number(tx.OfferSequence))
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
    throw new ValidationError('EscrowCancel: OfferSequence must be a number')
 | 
					    throw new ValidationError('EscrowCancel: OfferSequence must be a number')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validateEscrowCreate */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { BaseTransaction, validateBaseTransaction } from './common'
 | 
					import { BaseTransaction, validateBaseTransaction } from './common'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ export interface EscrowFinish extends BaseTransaction {
 | 
				
			|||||||
   * Transaction sequence of EscrowCreate transaction that created the held.
 | 
					   * Transaction sequence of EscrowCreate transaction that created the held.
 | 
				
			||||||
   * payment to finish.
 | 
					   * payment to finish.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  OfferSequence: number
 | 
					  OfferSequence: number | string
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Hex value matching the previously-supplied PREIMAGE-SHA-256.
 | 
					   * Hex value matching the previously-supplied PREIMAGE-SHA-256.
 | 
				
			||||||
   * crypto-condition of the held payment.
 | 
					   * crypto-condition of the held payment.
 | 
				
			||||||
@@ -37,7 +37,7 @@ export interface EscrowFinish extends BaseTransaction {
 | 
				
			|||||||
export function validateEscrowFinish(tx: Record<string, unknown>): void {
 | 
					export function validateEscrowFinish(tx: Record<string, unknown>): void {
 | 
				
			||||||
  validateBaseTransaction(tx)
 | 
					  validateBaseTransaction(tx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (tx.Owner === undefined) {
 | 
					  if (tx.Owner == null) {
 | 
				
			||||||
    throw new ValidationError('EscrowFinish: missing field Owner')
 | 
					    throw new ValidationError('EscrowFinish: missing field Owner')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,11 +45,15 @@ export function validateEscrowFinish(tx: Record<string, unknown>): void {
 | 
				
			|||||||
    throw new ValidationError('EscrowFinish: Owner must be a string')
 | 
					    throw new ValidationError('EscrowFinish: Owner must be a string')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (tx.OfferSequence === undefined) {
 | 
					  if (tx.OfferSequence == null) {
 | 
				
			||||||
    throw new ValidationError('EscrowFinish: missing field OfferSequence')
 | 
					    throw new ValidationError('EscrowFinish: missing field OfferSequence')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (typeof tx.OfferSequence !== 'number') {
 | 
					  if (
 | 
				
			||||||
 | 
					    (typeof tx.OfferSequence !== 'number' &&
 | 
				
			||||||
 | 
					      typeof tx.OfferSequence !== 'string') ||
 | 
				
			||||||
 | 
					    Number.isNaN(Number(tx.OfferSequence))
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
    throw new ValidationError('EscrowFinish: OfferSequence must be a number')
 | 
					    throw new ValidationError('EscrowFinish: OfferSequence must be a number')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validateOfferCreate */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
import { Amount } from '../common'
 | 
					import { Amount } from '../common'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validatePayment */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
import { Amount, Path } from '../common'
 | 
					import { Amount, Path } from '../common'
 | 
				
			||||||
import { isFlagEnabled } from '../utils'
 | 
					import { isFlagEnabled } from '../utils'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validatePaymentChannelClaim */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { BaseTransaction, GlobalFlags, validateBaseTransaction } from './common'
 | 
					import { BaseTransaction, GlobalFlags, validateBaseTransaction } from './common'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- Necessary for validatePaymentChannelCreate */
 | 
					 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { BaseTransaction, validateBaseTransaction } from './common'
 | 
					import { BaseTransaction, validateBaseTransaction } from './common'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,6 @@ const HEX_WALLET_LOCATOR_REGEX = /^[0-9A-Fa-f]{64}$/u
 | 
				
			|||||||
 * @param tx - An SignerListSet Transaction.
 | 
					 * @param tx - An SignerListSet Transaction.
 | 
				
			||||||
 * @throws When the SignerListSet is Malformed.
 | 
					 * @throws When the SignerListSet is Malformed.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
// eslint-disable-next-line complexity -- validation can be complex
 | 
					 | 
				
			||||||
export function validateSignerListSet(tx: Record<string, unknown>): void {
 | 
					export function validateSignerListSet(tx: Record<string, unknown>): void {
 | 
				
			||||||
  validateBaseTransaction(tx)
 | 
					  validateBaseTransaction(tx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
/* eslint-disable complexity -- verifies 19 tx types hence a lot of checks needed */
 | 
					 | 
				
			||||||
/* eslint-disable max-lines-per-function -- need to work with a lot of Tx verifications */
 | 
					/* eslint-disable max-lines-per-function -- need to work with a lot of Tx verifications */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { ValidationError } from '../../errors'
 | 
					import { ValidationError } from '../../errors'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,13 @@ describe('EscrowCancel', function () {
 | 
				
			|||||||
    assert.doesNotThrow(() => validate(cancel))
 | 
					    assert.doesNotThrow(() => validate(cancel))
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it(`Valid EscrowCancel with string OfferSequence`, function () {
 | 
				
			||||||
 | 
					    cancel.OfferSequence = '7'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert.doesNotThrow(() => validateEscrowCancel(cancel))
 | 
				
			||||||
 | 
					    assert.doesNotThrow(() => validate(cancel))
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it(`Invalid EscrowCancel missing owner`, function () {
 | 
					  it(`Invalid EscrowCancel missing owner`, function () {
 | 
				
			||||||
    delete cancel.Owner
 | 
					    delete cancel.Owner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -55,7 +62,7 @@ describe('EscrowCancel', function () {
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it(`Invalid OfferSequence`, function () {
 | 
					  it(`Invalid Owner`, function () {
 | 
				
			||||||
    cancel.Owner = 10
 | 
					    cancel.Owner = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert.throws(
 | 
					    assert.throws(
 | 
				
			||||||
@@ -70,8 +77,8 @@ describe('EscrowCancel', function () {
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it(`Invalid owner`, function () {
 | 
					  it(`Invalid OfferSequence`, function () {
 | 
				
			||||||
    cancel.OfferSequence = '10'
 | 
					    cancel.OfferSequence = 'random'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert.throws(
 | 
					    assert.throws(
 | 
				
			||||||
      () => validateEscrowCancel(cancel),
 | 
					      () => validateEscrowCancel(cancel),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,13 @@ describe('EscrowFinish', function () {
 | 
				
			|||||||
    assert.doesNotThrow(() => validate(escrow))
 | 
					    assert.doesNotThrow(() => validate(escrow))
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it(`verifies valid EscrowFinish w/string OfferSequence`, function () {
 | 
				
			||||||
 | 
					    escrow.OfferSequence = '7'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert.doesNotThrow(() => validateEscrowFinish(escrow))
 | 
				
			||||||
 | 
					    assert.doesNotThrow(() => validate(escrow))
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it(`throws w/ invalid Owner`, function () {
 | 
					  it(`throws w/ invalid Owner`, function () {
 | 
				
			||||||
    escrow.Owner = 0x15415253
 | 
					    escrow.Owner = 0x15415253
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -51,7 +58,7 @@ describe('EscrowFinish', function () {
 | 
				
			|||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it(`throws w/ invalid OfferSequence`, function () {
 | 
					  it(`throws w/ invalid OfferSequence`, function () {
 | 
				
			||||||
    escrow.OfferSequence = '10'
 | 
					    escrow.OfferSequence = 'random'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert.throws(
 | 
					    assert.throws(
 | 
				
			||||||
      () => validateEscrowFinish(escrow),
 | 
					      () => validateEscrowFinish(escrow),
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user