export class DomainError extends Error {
  constructor(message: string) {
    super(message);
    this.name = 'DomainError';
  }
}

export class InsufficientBalanceError extends DomainError {
  constructor(assetType: string, required: string, available: string) {
    super(`Insufficient ${assetType} balance: required ${required}, available ${available}`);
    this.name = 'InsufficientBalanceError';
  }
}

export class WalletFrozenError extends DomainError {
  constructor(walletId: string) {
    super(`Wallet ${walletId} is frozen`);
    this.name = 'WalletFrozenError';
  }
}

export class WalletNotFoundError extends DomainError {
  constructor(identifier: string) {
    super(`Wallet not found: ${identifier}`);
    this.name = 'WalletNotFoundError';
  }
}

export class DuplicateTransactionError extends DomainError {
  constructor(txHash: string) {
    super(`Duplicate transaction: ${txHash}`);
    this.name = 'DuplicateTransactionError';
  }
}

export class InvalidOperationError extends DomainError {
  constructor(message: string) {
    super(message);
    this.name = 'InvalidOperationError';
  }
}

export class OptimisticLockError extends DomainError {
  constructor(message: string) {
    super(message);
    this.name = 'OptimisticLockError';
  }
}
