UNPKG

@nextrope/xrpl

Version:

A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser

139 lines (118 loc) 4.01 kB
import BigNumber from 'bignumber.js' import { ValidationError } from '../../errors' import { BaseTransaction, validateHexMetadata, isLedgerEntryId, isNumber, isXRPLNumber, validateBaseTransaction, validateOptionalField, isString, validateRequiredField, XRPLNumber, } from './common' const MAX_DATA_LENGTH = 512 const MAX_MANAGEMENT_FEE_RATE = 10000 const MAX_COVER_RATE_MINIMUM = 100000 const MAX_COVER_RATE_LIQUIDATION = 100000 /** * The transaction creates a new LoanBroker object or updates an existing one. * * @category Transaction Models */ export interface LoanBrokerSet extends BaseTransaction { TransactionType: 'LoanBrokerSet' /** * The Vault ID that the Lending Protocol will use to access liquidity. */ VaultID: string /** * The Loan Broker ID that the transaction is modifying. */ LoanBrokerID?: string /** * Arbitrary metadata in hex format. The field is limited to 256 bytes. */ Data?: string /** * The 1/10th basis point fee charged by the Lending Protocol Owner. Valid values are between 0 and 10000 inclusive. */ ManagementFeeRate?: number /** * The maximum amount the protocol can owe the Vault. * The default value of 0 means there is no limit to the debt. Must not be negative. */ DebtMaximum?: XRPLNumber /** * The 1/10th basis point DebtTotal that the first loss capital must cover. Valid values are between 0 and 100000 inclusive. */ CoverRateMinimum?: number /** * The 1/10th basis point of minimum required first loss capital liquidated to cover a Loan default. * Valid values are between 0 and 100000 inclusive. */ CoverRateLiquidation?: number } /** * Verify the form and type of an LoanBrokerSet at runtime. * * @param tx - LoanBrokerSet Transaction. * @throws When LoanBrokerSet is Malformed. */ // eslint-disable-next-line max-lines-per-function -- due to exhaustive validations export function validateLoanBrokerSet(tx: Record<string, unknown>): void { validateBaseTransaction(tx) validateRequiredField(tx, 'VaultID', isString) validateOptionalField(tx, 'LoanBrokerID', isString) validateOptionalField(tx, 'Data', isString) validateOptionalField(tx, 'ManagementFeeRate', isNumber) validateOptionalField(tx, 'DebtMaximum', isXRPLNumber) validateOptionalField(tx, 'CoverRateMinimum', isNumber) validateOptionalField(tx, 'CoverRateLiquidation', isNumber) if (!isLedgerEntryId(tx.VaultID)) { throw new ValidationError( `LoanBrokerSet: VaultID must be 64 characters hexadecimal string`, ) } if (tx.LoanBrokerID != null && !isLedgerEntryId(tx.LoanBrokerID)) { throw new ValidationError( `LoanBrokerSet: LoanBrokerID must be 64 characters hexadecimal string`, ) } if (tx.Data != null && !validateHexMetadata(tx.Data, MAX_DATA_LENGTH)) { throw new ValidationError( `LoanBrokerSet: Data must be a valid non-empty hex string up to ${MAX_DATA_LENGTH} characters`, ) } if ( tx.ManagementFeeRate != null && (tx.ManagementFeeRate < 0 || tx.ManagementFeeRate > MAX_MANAGEMENT_FEE_RATE) ) { throw new ValidationError( `LoanBrokerSet: ManagementFeeRate must be between 0 and ${MAX_MANAGEMENT_FEE_RATE} inclusive`, ) } if (tx.DebtMaximum != null && new BigNumber(tx.DebtMaximum).isLessThan(0)) { throw new ValidationError( 'LoanBrokerSet: DebtMaximum must be a non-negative value', ) } if ( tx.CoverRateMinimum != null && (tx.CoverRateMinimum < 0 || tx.CoverRateMinimum > MAX_COVER_RATE_MINIMUM) ) { throw new ValidationError( `LoanBrokerSet: CoverRateMinimum must be between 0 and ${MAX_COVER_RATE_MINIMUM} inclusive`, ) } if ( tx.CoverRateLiquidation != null && (tx.CoverRateLiquidation < 0 || tx.CoverRateLiquidation > MAX_COVER_RATE_LIQUIDATION) ) { throw new ValidationError( `LoanBrokerSet: CoverRateLiquidation must be between 0 and ${MAX_COVER_RATE_LIQUIDATION} inclusive`, ) } }