Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 63 additions & 2 deletions src/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -309,8 +309,12 @@ export class UnauthorizedError extends StellarSplitError {

/** Thrown when validation fails for input data (e.g., template deserialization). */
export class ValidationError extends StellarSplitError {
constructor(message: string, context?: Record<string, unknown>) {
super(message, "VALIDATION_ERROR", context, message);
constructor(
message: string,
context?: Record<string, unknown>,
code: string = "VALIDATION_ERROR"
) {
super(message, code, context, message);
this.name = "ValidationError";
Object.setPrototypeOf(this, new.target.prototype);
}
Expand Down Expand Up @@ -2356,3 +2360,60 @@ export function isBatchTooLargeError(err: unknown): err is BatchTooLargeError {
return err instanceof BatchTooLargeError;
}

// ---------------------------------------------------------------------------
// Validation errors (issues #1061, #1062, #1063, #1064)
// ---------------------------------------------------------------------------

/** Thrown when deadline validation fails. */
export class DeadlineValidationError extends ValidationError {
constructor(message: string, context?: Record<string, unknown>) {
super(message, context, "DEADLINE_VALIDATION_ERROR");
this.name = "DeadlineValidationError";
Object.setPrototypeOf(this, new.target.prototype);
}
}

export function isDeadlineValidationError(err: unknown): err is DeadlineValidationError {
return err instanceof DeadlineValidationError;
}

/** Thrown when token or payment amount validation fails. */
export class AmountValidationError extends ValidationError {
constructor(message: string, context?: Record<string, unknown>) {
super(message, context, "AMOUNT_VALIDATION_ERROR");
this.name = "AmountValidationError";
Object.setPrototypeOf(this, new.target.prototype);
}
}

export function isAmountValidationError(err: unknown): err is AmountValidationError {
return err instanceof AmountValidationError;
}

/** Thrown when Stellar address format or checksum validation fails. */
export class AddressValidationError extends ValidationError {
constructor(message: string, context?: Record<string, unknown>) {
super(message, context, "ADDRESS_VALIDATION_ERROR");
this.name = "AddressValidationError";
Object.setPrototypeOf(this, new.target.prototype);
}
}

export function isAddressValidationError(err: unknown): err is AddressValidationError {
return err instanceof AddressValidationError;
}

/** Thrown when cryptographic or webhook signature validation fails. */
export class SignatureValidationError extends ValidationError {
constructor(message: string, context?: Record<string, unknown>) {
super(message, context, "SIGNATURE_VALIDATION_ERROR");
this.name = "SignatureValidationError";
Object.setPrototypeOf(this, new.target.prototype);
}
}

export function isSignatureValidationError(err: unknown): err is SignatureValidationError {
return err instanceof SignatureValidationError;
}


84 changes: 84 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -237,13 +237,97 @@ export {
// Batch operations errors (issue #855)
BatchTooLargeError,
isBatchTooLargeError,
// Validation errors (issues #1061, #1062, #1063, #1064)
DeadlineValidationError,
isDeadlineValidationError,
AmountValidationError,
isAmountValidationError,
AddressValidationError,
isAddressValidationError,
SignatureValidationError,
isSignatureValidationError,
} from "./errors.js";

// Invoice metadata JSON Schema validator (issue #533)
export { InvoiceMetadataValidator } from "./validators/invoiceMetadataValidator.js";
export type { MetadataValidationResult } from "./validators/invoiceMetadataValidator.js";
export { validateMetadataKeys, MAX_METADATA_KEY_LENGTH } from "./validators/invoiceMetadataValidator.js";

// Deadline validator (issue #1064)
export {
validateDeadline,
validateDeadlineOrThrow,
isFutureDeadline,
parseDeadline,
DeadlineValidator,
MAX_U64 as MAX_DEADLINE_U64,
MS_TIMESTAMP_THRESHOLD as DEADLINE_MS_TIMESTAMP_THRESHOLD,
} from "./validators/deadlineValidator.js";
export type {
DeadlineValidationResult,
DeadlineValidationOptions,
} from "./validators/deadlineValidator.js";

// Amount validator (issue #1063)
export {
validateAmount,
validateAmountOrThrow,
isValidAmount,
parseToStroops,
AmountValidator,
STELLAR_MAX_INT64,
STELLAR_MIN_AMOUNT,
STELLAR_MAX_DECIMALS,
STROOPS_PER_UNIT as AMOUNT_STROOPS_PER_UNIT,
} from "./validators/amountValidator.js";
export type {
AmountValidationResult,
AmountValidationOptions,
AmountUnit,
} from "./validators/amountValidator.js";

// Address validator (issue #1062)
export {
validateAddress,
validateAddressOrThrow,
isStellarAddress,
detectAddressType,
verifyAddressChecksum,
AddressValidator,
STELLAR_ADDRESS_LENGTHS,
} from "./validators/addressValidator.js";
export type {
StellarAddressType,
AddressValidationResult,
AddressValidationOptions,
} from "./validators/addressValidator.js";

// Signature validator (issue #1061)
export {
validateEd25519Signature,
validateEd25519SignatureOrThrow,
validateMultiSig,
validateMultiSigOrThrow,
validateWebhookSignature as validateWebhookSignaturePayload,
isValidSignatureFormat,
normalizeSignature,
normalizePublicKey,
normalizeMessage,
SignatureValidator,
ED25519_SIGNATURE_BYTE_LENGTH,
ED25519_PUBLIC_KEY_BYTE_LENGTH,
} from "./validators/signatureValidator.js";
export type {
SignatureValidationResult,
Ed25519ValidationParams,
MultiSigEntry,
SignerWeightConfig,
MultiSigValidationParams,
MultiSigValidationResult,
WebhookValidationParams,
} from "./validators/signatureValidator.js";


// ---------------------------------------------------------------------------
// Lifecycle management (graceful shutdown)
// ---------------------------------------------------------------------------
Expand Down
Loading
Loading