refactor: define DepositPreauth transaction model (#1545)

- Defines a TypeScript type for DepositPreauth
- Provides an optional function to users for verifying a DepositPreauth instance at runtime: verifyDepositPreauth()
- Adds tests for verifyDepositPreauth()
This commit is contained in:
Omar Khan
2021-08-18 17:34:36 -04:00
committed by Mayukha Vadari
parent 1010183d2e
commit f7b93c54ff
4 changed files with 132 additions and 1 deletions

View File

@@ -0,0 +1,46 @@
import { ValidationError } from '../../common/errors'
import { BaseTransaction, verifyBaseTransaction } from './common'
export interface DepositPreauth extends BaseTransaction {
TransactionType: 'DepositPreauth'
Authorize?: string
Unauthorize?: string
}
/**
*
* @param {DepositPreauth} tx A DepositPreauth Transaction.
* @returns {void}
* @throws {ValidationError} When the DepositPreauth is malformed.
*/
export function verifyDepositPreauth(tx: DepositPreauth): void {
verifyBaseTransaction(tx)
if (tx.Authorize !== undefined && tx.Unauthorize !== undefined) {
throw new ValidationError("DepositPreauth: can't provide both Authorize and Unauthorize fields")
}
if (tx.Authorize === undefined && tx.Unauthorize === undefined) {
throw new ValidationError('DepositPreauth: must provide either Authorize or Unauthorize field')
}
if (tx.Authorize !== undefined) {
if (typeof tx.Authorize !== 'string') {
throw new ValidationError('DepositPreauth: Authorize must be a string')
}
if (tx.Account === tx.Authorize) {
throw new ValidationError("DepositPreauth: Account can't preauthorize its own address")
}
}
if (tx.Unauthorize !== undefined) {
if (typeof tx.Unauthorize !== 'string') {
throw new ValidationError("DepositPreauth: Unauthorize must be a string")
}
if (tx.Account === tx.Unauthorize) {
throw new ValidationError("DepositPreauth: Account can't unauthorize its own address")
}
}
}

View File

@@ -7,4 +7,5 @@ export * from './checkCash'
export * from './checkCancel'
export * from './accountDelete'
export * from './signerListSet'
export * from './depositPreauth'
export * from './paymentTransaction'

View File

@@ -4,6 +4,7 @@ import { AccountSet } from "./accountSet"
import { CheckCancel } from "./checkCancel"
import { CheckCash } from "./checkCash"
import { CheckCreate } from "./checkCreate"
import { DepositPreauth } from "./depositPreauth"
import { OfferCancel } from "./offerCancel"
import { OfferCreate } from "./offerCreate"
import { PaymentTransaction } from "./paymentTransaction"
@@ -15,7 +16,7 @@ export type Transaction =
| CheckCancel
| CheckCash
| CheckCreate
// | DepositPreauth
| DepositPreauth
// | EscrowCancel
// | EscrowCreate
// | EscrowFinish

View File

@@ -0,0 +1,83 @@
import { ValidationError } from 'xrpl-local/common/errors'
import { verifyDepositPreauth } from './../../src/models/transactions/depositPreauth'
import { assert } from 'chai'
/**
* DepositPreauth Transaction Verification Testing
*
* Providing runtime verification testing for each specific transaction type
*/
describe('DepositPreauth Transaction Verification', () => {
let depositPreauth
beforeEach(() => {
depositPreauth = {
TransactionType: 'DepositPreauth',
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
} as any
})
it ('verifies valid DepositPreauth when only Authorize is provided', () => {
depositPreauth.Authorize = 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW'
assert.doesNotThrow(() => verifyDepositPreauth(depositPreauth))
})
it ('verifies valid DepositPreauth when only Unauthorize is provided', () => {
depositPreauth.Unauthorize = 'raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n'
assert.doesNotThrow(() => verifyDepositPreauth(depositPreauth))
})
it ('throws when both Authorize and Unauthorize are provided', () => {
depositPreauth.Authorize = 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW'
depositPreauth.Unauthorize = 'raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n'
assert.throws(
() => verifyDepositPreauth(depositPreauth),
ValidationError,
"DepositPreauth: can't provide both Authorize and Unauthorize fields"
)
})
it ('throws when neither Authorize nor Unauthorize are provided', () => {
assert.throws(
() => verifyDepositPreauth(depositPreauth),
ValidationError,
'DepositPreauth: must provide either Authorize or Unauthorize field'
)
})
it ('throws when Authorize is not a string', () => {
depositPreauth.Authorize = 1234
assert.throws(
() => verifyDepositPreauth(depositPreauth),
ValidationError,
'DepositPreauth: Authorize must be a string'
)
})
it ('throws when an Account attempts to preauthorize its own address', () => {
depositPreauth.Authorize = depositPreauth.Account
assert.throws(
() => verifyDepositPreauth(depositPreauth),
ValidationError,
"DepositPreauth: Account can't preauthorize its own address"
)
})
it ('throws when Unauthorize is not a string', () => {
depositPreauth.Unauthorize = 1234
assert.throws(
() => verifyDepositPreauth(depositPreauth),
ValidationError,
'DepositPreauth: Unauthorize must be a string'
)
})
it ('throws when an Account attempts to unauthorize its own address', () => {
depositPreauth.Unauthorize = depositPreauth.Account
assert.throws(
() => verifyDepositPreauth(depositPreauth),
ValidationError,
"DepositPreauth: Account can't unauthorize its own address"
)
})
})