Этот сайт использует файлы cookies. Продолжая просмотр страниц сайта, вы соглашаетесь с использованием файлов cookies. Если вам нужна дополнительная информация, пожалуйста, посетите страницу Политика файлов Cookie
Subscribe
Прямой эфир
Cryptocurrencies: 8585 / Markets: 116273
Market Cap: $ 2 407 835 017 672 / 24h Vol: $ 116 956 152 622 / BTC Dominance: 58.088697778934%

Н Новости

Исследуем возможности ИИ писать код. Часть 1

Оглавление

ИИ — одна из самых обсуждаемых тем последних лет. Многие считают, что он заменит разработчиков, сделав их ненужными. Я решил проверить, насколько это утверждение правдиво, и провести исследование возможностей ИИ в написании кода.

Эта статья — первая из цикла. В рамках исследования я ставлю перед собой несколько задач:

  1. Проверить, насколько качественный и жизнеспособный код генерирует ИИ.

  2. Разобраться, действительно ли ИИ способен заменить разработчиков и можно ли без технических знаний создать работающее приложение.

  3. Сравнить выдачу нескольких LLM (Anthropic Claude 3.5, OpenAI ChatGPT-4o, OpenAI ChatGPT o1-preview, Deepseek R1) и удобство работы с ними.

  4. Поделиться опытом работы с ИИ, используя различные техники промптинга для получения качественных результатов выдачи.

Методология

В качестве отправной точки будет подготовлен шаблон проекта Spring Boot.

Стек:

  • Java 17

  • Spring Boot с JPA

  • Liquibase, Hibernate, Lombok

Потребуется реализовать приложение, в котором доступны CRUD-операции:

  • Создание операции (Operation)

  • Обновление операции (Operation)

  • Поиск всех операций (Operation)

  • Поиск операции по ID (Operation)

  • Удаление операции (Operation) Также необходимо будет написать unit и MVC тесты на небольшой кусок логики.

Каждой модели ИИ будет дан одинаковый начальный промпт. Затем я буду запрашивать реализацию различных частей функционала. Я не буду бесконечно улучшать код: если он нерабочий, я попрошу исправить ошибки, а если рабочий — отмечу возможные улучшения.

Общение с ИИ будет происходить на английском. Когда я работал с Anthropic Claude впервые, он плохо понимал русский язык, из-за чего качество ответов значительно ухудшалось. Поэтому, чтобы условия были одинаковыми, я буду использовать английский для всех моделей.

Итак, первым испытуемым будет Anthropic Claude 3.5 — или просто Клод.

Клод: начало пути

Весь исходный код доступен на GitHub. Как я уже писал ранее, я создал заготовку проекта с помощью Spring Initializr. Именно её я буду наполнять кодом.

Сначала нужно создать промпт для Клода. Он задаст тон общению и повлияет на качество выдачи.

Что важно указать в промпте?

  • Роль модели и перечень технологий, с которыми она должна работать.

  • Цель общения — что я хочу от ИИ.

  • Правила взаимодействия — например, как он должен отвечать и уточнять вопросы.

Первоначальный промпт

You will be acting as a backend developer. 
You are have an expertise in the following technologies: 
Java 21+, Spring boot, Spring JPA, Hibernate, Lombok, Spring Web, REST API, SQL.
Your goal is to create a production-ready solution for the user and answer 
their questions. You should clarify questions to provide the best possible answer. 
If you have any questions, ask them first without providing a solution. 
Only after all questions have been clarified, you provide a solution for the user.

You should maintain a friendly and professional tone.

Here are some important rules of conduct:
 - If you're not sure how to respond, say: "Sorry, I didn't understand you. 
    Could you please rephrase your question, please?"
 - If you don't know the answer to a question, say: 
    "I am sorry, but I don't know that answer. 
    Can you please clarify your question for me?"

Here is the user question:
 I have already created an application using Spring Initializr with the following dependencies:
Lombok, Spring Web, Spring Data JPA, PostgreSQL Driver, Liquibase Migration. 

Write a Liquibase migration for the tables.
<table1>
Category table with columns: 
  - category_id (bigint), 
  - category_name (varchar), 
  - category_description (varchar)
<table1>
<table2>
Operation table with columns: 
  - operation_id (bigint), 
  - operation_public_id (varchar), 
  - operation_name (varchar), 
  - operation_amount(bigdecimal), 
  - operation_type (enum), 
  - category_id (FK to category table)
<table2>

Suggest how to store the operation_type. 
In the code, the operation type will be an Enum with the values (DEPOSIT, WITHDRAW).

Think about the answer first before responding. Think step-by-step.

Ключевые фразы, улучшающие выдачу

  1. "If you have any questions, ask them first without providing a solution." Эта фраза значительно улучшает ответы модели. Вместо того чтобы сразу выдавать решение, она сначала задаст уточняющие вопросы. Это позволяет добавить детали, которые могли быть упущены.

  2. "Think step-by-step." Фраза заставляет модель лучше продумывать ответ и уменьшает количество ошибок и домыслов.

Помимо базовых инструкций, я также попросил Клода написать миграцию таблиц с использованием Liquibase. Я указал, какие колонки мне нужны, и попросил предложить вариант хранения типов операций.

Промпт готов, первый вопрос задан. Отправляем его Клоду и ждём ответа.

Ответ Клода

Let me analyze your requirements:

  1. Database Structure:

    • Two tables: Category and Operation

    • Category is the parent table with a primary key referenced by Operation

    • Operation has an enum field operation_type

  2. Questions for clarification:

    1. Should category_id in both tables be auto-incrementing?

    2. What should be the maximum lengths for varchar fields (category_name, category_description, operation_public_id, operation_name)?

    3. Should any of these fields be nullable?

    4. For operation_amount, how many digits before and after decimal point do you need?

    5. Should operation_public_id be unique?

Before I provide the Liquibase migration script, please answer these questions so I can create the most appropriate solution for your needs.

Regarding the operation_type storage, I suggest two approaches:

  1. As a VARCHAR field with a check constraint limiting values to 'DEPOSIT' and 'WITHDRAW'

  2. As a custom ENUM type in PostgreSQL

The first approach is generally more flexible for future modifications and better portable across different databases. Would you like me to proceed with this approach, or would you prefer the PostgreSQL ENUM type?

Please provide your preferences so I can create a complete migration script.

Именно поэтому важно давать правильные инструкции. Клод не стал сразу выдавать решение, а уточнил детали. Он проговорил, что ему требуется сделать, и задал вопросы по структуре таблиц (некоторые детали я специально не указывал). Это хороший знак: теперь я могу рассчитывать на корректную миграцию.

Кроме того, Клод предложил несколько вариантов хранения operation_type и объяснил, какой из них предпочитает и почему.

Отвечаем на вопросы Клода и ждём финальный вариант миграции.

1. Correct
2. Questions for clarification:
	1. Yes, category_id and operation_id should be auto-incremented
	2. For category_name, operation_public_id and operation_name - varchar(255), and for category_description (varchar 1000)
	3. Nullable fields: category_name
	4. 20 digits before decimal point and 2 after
	5. Yes

Regarding the operation_type, let's take the first approach.

Ошибки, исправления и первый Pull Request

Ответ Клода

Thank you for the clarification. I'll create a Liquibase migration script that meets all these requirements.

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.20.xsd">

    <changeSet id="001_create_category_table" author="developer">
        <createTable tableName="category">
            <column name="category_id" type="bigint">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="category_name" type="varchar(255)">
                <constraints nullable="true"/>
            </column>
            <column name="category_description" type="varchar(1000)">
                <constraints nullable="false"/>
            </column>
        </createTable>

        <addAutoIncrement tableName="category" columnName="category_id" columnDataType="bigint" startWith="1" incrementBy="1"/>
    </changeSet>

    <changeSet id="002_create_operation_table" author="developer">
        <createTable tableName="operation">
            <column name="operation_id" type="bigint">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="operation_public_id" type="varchar(255)">
                <constraints nullable="false" unique="true"/>
            </column>
            <column name="operation_name" type="varchar(255)">
                <constraints nullable="false"/>
            </column>
            <column name="operation_amount" type="decimal(22,2)">
                <constraints nullable="false"/>
            </column>
            <column name="operation_type" type="varchar(255)">
                <constraints nullable="false"/>
            </column>
            <column name="category_id" type="bigint">
                <constraints nullable="false"
                           foreignKeyName="fk_operation_category"
                           referencedTableName="category"
                           referencedColumnNames="category_id"/>
            </column>
        </createTable>

        <addAutoIncrement tableName="operation" columnName="operation_id" columnDataType="bigint" startWith="1" incrementBy="1"/>
    </changeSet>

    <changeSet id="003_add_operation_type_constraint" author="developer">
        <sql>
            ALTER TABLE operation ADD CONSTRAINT check_operation_type 
            CHECK (operation_type IN ('DEPOSIT', 'WITHDRAW'));
        </sql>
    </changeSet>

</databaseChangeLog>

После уточнения деталей он выдал код миграции, но в формате XML. Ни я, ни он не уточнили, в каком формате нужен результат, поэтому я попросил его переделать миграцию используя YAML.

Could you re-write the migration using YAML instead of XML?
Ответ Клода

Here's the equivalent Liquibase migration using YAML format:

databaseChangeLog:
  - changeSet:
      id: 001_create_category_table
      author: developer
      changes:
        - createTable:
            tableName: category
            columns:
              - column:
                  name: category_id
                  type: bigint
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: category_name
                  type: varchar(255)
                  constraints:
                    nullable: true
              - column:
                  name: category_description
                  type: varchar(1000)
                  constraints:
                    nullable: false
        - addAutoIncrement:
            tableName: category
            columnName: category_id
            columnDataType: bigint
            startWith: 1
            incrementBy: 1

  - changeSet:
      id: 002_create_operation_table
      author: developer
      changes:
        - createTable:
            tableName: operation
            columns:
              - column:
                  name: operation_id
                  type: bigint
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: operation_public_id
                  type: varchar(255)
                  constraints:
                    nullable: false
                    unique: true
              - column:
                  name: operation_name
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: operation_amount
                  type: decimal(22,2)
                  constraints:
                    nullable: false
              - column:
                  name: operation_type
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: category_id
                  type: bigint
                  constraints:
                    nullable: false
                    foreignKeyName: fk_operation_category
                    references: category(category_id)
        - addAutoIncrement:
            tableName: operation
            columnName: operation_id
            columnDataType: bigint
            startWith: 1
            incrementBy: 1

  - changeSet:
      id: 003_add_operation_type_constraint
      author: developer
      changes:
        - sql:
            sql: ALTER TABLE operation ADD CONSTRAINT check_operation_type CHECK (operation_type IN ('DEPOSIT', 'WITHDRAW'));

Как и ожидалось, не всё прошло гладко. Клод не добавил миграцию в databaseChangelogMaster (и даже не создал этот файл). Ну, с кем не бывает. Я тоже допустил ошибку в промпте: Клод сделал category_name nullable, а надо было category_description. Исправлять это я буду вручную.

Я хвалил Клода за уточняющие вопросы перед генерацией миграции, но, кажется, он мог запросить уточняющую информацию о планируемой работе с данными, что могло бы позволить заранее настроить индексы. Однако он этого не сделал, а я, в рамках эксперимента, решил "не знать" об индексах и игнорировать этот момент.

Настраиваем соединение с БД

Миграция готова, но прежде чем её запустить, нужно настроить соединение с базой данных. Просим Клода помочь.

Write the configuration to connect the application to the PostgreSQL database.
Ответ Клода

I'll help you configure the database connection. Let me write the configuration for both development and production environments using YAML format.

# src/main/resources/application.yml

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/your_database_name
    username: your_username
    password: your_password
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: validate  # validates the schema, makes no changes to the database
    show-sql: false       # set to true if you want to see SQL queries in logs
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format_sql: true  # formats SQL queries in logs if show-sql is true
  liquibase:
    change-log: classpath:db/changelog/db.changelog-master.yaml
    enabled: true        # enables Liquibase auto-deployment of changes

# Connection pool properties (using HikariCP - Spring Boot default)
    hikari:
      minimum-idle: 5
      maximum-pool-size: 20
      idle-timeout: 300000   # 5 minutes
      pool-name: HikariPool
      max-lifetime: 1200000  # 20 minutes
      connection-timeout: 20000 # 20 seconds

For different environments, you can create separate configuration files:

# src/main/resources/application-dev.yml
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/dev_database
    username: dev_user
    password: dev_password
  jpa:
    show-sql: true

# src/main/resources/application-prod.yml
spring:
  datasource:
    url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
  jpa:
    show-sql: false

Клод предложил настроить несколько профилей, что, возможно, избыточно на старте, но полезно для production-ready кода. Также он добавил базовый connection-pool и дал рекомендации по настройке продового окружения.

Но не обошлось без проблем: Клод неправильно объявил connection-pool в application.yaml, из-за чего Hikari не заработает. Ошибка не критическая, но и неочевидная — Spring просто выдаст предупреждение в логе при запуске. Такие баги самые неприятные, потому что они не приводят к явному падению, но могут сказаться на работе приложения позже.

Вывод: Всегда проверяйте настройки, предложенные ИИ. Он не гарантирует работоспособность кода.

Правильный вариант:

spring:  
  datasource:  
    url: jdbc:postgresql://localhost:5432/anthropic_claude?currentSchema=anthropic_claude  
    username: anthropic_claude_app  
    password: strongPassword  
    driver-class-name: org.postgresql.Driver  
    # Connection pool properties (using HikariCP - Spring Boot default)  
    hikari:  
      minimum-idle: 5  
      maximum-pool-size: 20  
      idle-timeout: 300000   # 5 minutes  
      pool-name: HikariPool  
      max-lifetime: 1200000  # 20 minutes  
      connection-timeout: 20000 # 20 seconds

Создаём init.sql и поднимаем БД в Docker

Следующий шаг — создание init.sql для удобства локальной разработки. Я попросил Клода создать файл с настройкой прав доступа.

Write init.sql with the following information:
  - Create an "app" role with a login password of 'strongPassword'.
  - Create a schema "my_app_schema" and authorize the "app" role to use it.
  - Grant all privileges to the "app" role on the "my_app_schema"
Ответ Клода

Here's the init.sql script that sets up the database role, schema, and permissions:

-- Create role with login capability
CREATE ROLE app WITH 
    LOGIN
    PASSWORD 'strongPassword'
    NOSUPERUSER
    INHERIT
    NOCREATEDB
    NOCREATEROLE
    NOREPLICATION;

-- Create schema
CREATE SCHEMA my_app_schema;

-- Grant usage on schema to app role
GRANT USAGE ON SCHEMA my_app_schema TO app;

-- Grant all privileges on all tables in schema to app role
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA my_app_schema TO app;

-- Grant all privileges on all sequences in schema to app role
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA my_app_schema TO app;

-- Make sure new tables and sequences will be accessible by app role
ALTER DEFAULT PRIVILEGES IN SCHEMA my_app_schema 
    GRANT ALL PRIVILEGES ON TABLES TO app;
ALTER DEFAULT PRIVILEGES IN SCHEMA my_app_schema 
    GRANT ALL PRIVILEGES ON SEQUENCES TO app;

-- Set search path for the app role
ALTER ROLE app SET search_path TO my_app_schema;

Now you should update your application.yml to use this schema:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/your_database_name?currentSchema=my_app_schema
    username: app
    password: strongPassword

Клод сделал всё правильно: создал ограниченную роль для приложения и напомнил, что нужно обновить application.yaml. Это приятно.

Теперь нужно поднять PostgreSQL в Docker. Я решил не тратить время и написал docker-compose.yaml вручную:

version: '3.1'

services:
  anthropic-claude-db:
    container_name: anthropic-claude-postgres
    image: postgres:15
    restart: always
    environment:
      POSTGRES_USER: anthropic_claude_user
      POSTGRES_PASSWORD: strongUserPassword
      POSTGRES_DB: anthropic_claude
    volumes:
      - ./db-volume:/var/lib/postgresql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"

Попробуем запустить.

Первая серьёзная ошибка

Ожидаемо, Liquibase не смог найти db.changelog-master.yaml (Liquibase failed to start because no changelog could be found at 'classpath:/db/changelog/db.changelog-master.yaml). Почему? Потому что Клод забыл его создать. Пишу ему об этом и прошу исправить.

When I start the application, I get an error. 
Liquibase failed to start because no changelog could be found at
'classpath:/db/changelog/db.changelog-master.yaml'.
Ответ Клода

You need to create the changelog directory structure and the master changelog file. Here's what you need to do:

Create the following directory structure in your project:

src/
└── main/
    └── resources/
        └── db/
            └── changelog/
                ├── db.changelog-master.yaml
                └── changes/
                    └── 001-initial-schema.yaml

Create the master changelog file (db.changelog-master.yaml):

databaseChangeLog:
  - include:
      file: changes/001-initial-schema.yaml
      relativeToChangelogFile: true

Move the migration we created earlier into 001-initial-schema.yaml under the changes directory.

Here's the full command sequence if you're using a Unix-like system:

mkdir -p src/main/resources/db/changelog/changes
touch src/main/resources/db/changelog/db.changelog-master.yaml
touch src/main/resources/db/changelog/changes/001-initial-schema.yaml

After creating these files and directories:

  1. Put the master changelog content into db.changelog-master.yaml

  2. Put the table creation changelog we created earlier into 001-initial-schema.yaml

Now when you start the application, Liquibase should be able to find and execute your changelog files.

Клод добавил db.changelog-master.yaml файл и даже предложил структуру хранения миграций. Однако теперь возникла новая проблема — ошибка доступа к схеме.

Клод начинает "мудрить"

Пытаемся вместе с Клодом решить эту проблему.

I've added a changelog to the master file, but when I run the application, a new error occurs: permission denied for schema anthropic_claude

Ответ Клода

This error means the 'app' role doesn't have sufficient permissions on the schema. Let's fix the permissions by running additional SQL commands as a superuser (postgres):

-- Connect as superuser (postgres) and run these commands:

-- Make sure the role and schema exist
CREATE ROLE app WITH LOGIN PASSWORD 'strongPassword' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
CREATE SCHEMA IF NOT EXISTS my_app_schema;

-- Grant all necessary permissions
GRANT ALL ON SCHEMA my_app_schema TO app;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA my_app_schema TO app;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA my_app_schema TO app;

-- This is important for Liquibase to be able to create new tables
ALTER DEFAULT PRIVILEGES IN SCHEMA my_app_schema GRANT ALL ON TABLES TO app;
ALTER DEFAULT PRIVILEGES IN SCHEMA my_app_schema GRANT ALL ON SEQUENCES TO app;

-- Make app the owner of the schema (optional, but can help avoid permission issues)
ALTER SCHEMA my_app_schema OWNER TO app;

-- Set the search path
SET search_path TO my_app_schema;
ALTER ROLE app SET search_path TO my_app_schema;

You can run these commands using psql or your preferred PostgreSQL client tool:

psql -U postgres -d your_database_name -f permissions.sql

After running these commands, restart your application and the permission error should be resolved.

Я уже не раз встречался с таким поведением: если LLM сталкивается с несколькими ошибками подряд, он начинает "фантазировать" и предлагать плохие решения. Причём каждое следующее исправление бывает хуже предыдущего. Это типичная проблема всех LLM — они не анализируют историю взаимодействия глобально, а просто пытаются найти ближайшее возможное исправление. Иногда каждое следующее исправление хуже предыдущего. В таких случаях лучше остановиться, пересмотреть ситуацию вручную и задать более конкретные инструкции.

Его предложенное исправление оказалось неверным. Я не стал его мучить и просто добавил фикс вручную:

CREATE SCHEMA my_schema_app AUTHORIZATION app;

После этого приложение запустилось без проблем.

Какие можно сделать выводы?

  • Чем больше ошибок, тем хуже становится выдача. LLM не анализирует всю историю взаимодействий, а просто пытается угадать следующее исправление.

  • Проверяйте настройки инфраструктуры. Ошибки могут быть незаметными, но критичными.

Первый ПР готов
https://github.com/nzinovev/anthropic-claude/pull/1

Создаём сущности

Приложение успешно запускается, таблицы созданы, миграции накатываются. Следующий шаг — создать сущности.

Кроме того, я попросил Клода предложить структуру пакетов, чтобы понимать, где хранить код.

Write entities for operation and category tables.
Provide a path to the package where I should create the entities.
Ответ Клода

Create these entities in the src/main/java/com/yourcompany/domain/entity package. Here are the entities:

// src/main/java/com/yourcompany/domain/entity/Category.java

package com.yourcompany.domain.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.Set;

@Entity
@Table(name = "category", schema = "my_app_schema")
@Getter
@Setter
public class Category {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @OneToMany(mappedBy = "category")
    private Set operations;
}
// src/main/java/com/yourcompany/domain/entity/Operation.java

package com.yourcompany.domain.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Entity
@Table(name = "operation", schema = "my_app_schema")
@Getter
@Setter
public class Operation {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "operation_type", nullable = false)
    @Enumerated(EnumType.STRING)
    private OperationType operationType;

    @Column(name = "amount", nullable = false)
    private BigDecimal amount;

    @Column(name = "description")
    private String description;

    @Column(name = "operation_date", nullable = false)
    private LocalDateTime operationDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id", nullable = false)
    private Category category;
}
// src/main/java/com/yourcompany/domain/entity/OperationType.java

package com.yourcompany.domain.entity;

public enum OperationType {
    DEPOSIT,
    WITHDRAW
}

Make sure you have the following dependencies in your pom.xml:


    
        org.projectlombok
        lombok
        true
    
    
        org.springframework.boot
        spring-boot-starter-data-jpa
    

Directory structure should look like this:

src/
└── main/
    └── java/
        └── com/
            └── yourcompany/
                └── domain/
                    └── entity/
                        ├── Category.java
                        ├── Operation.java
                        └── OperationType.java

Ошибки в генерации сущностей

Первое, что заметил — Клод начал терять контекст:

  • В Category пропало поле description.

  • В Operation неожиданно появилось operationDate.

  • Он изменил названия колонок, из-за чего приложение перестало запускаться.

Пришлось вручную исправлять названия колонок. Далее буду добавлять недостающую информацию в контекст, чтобы избежать таких ошибок.

Проблема с equals() & hashCode()

Ещё одна ошибка — не переопределены equals() и hashCode().

Клод использует Set для Operation, что без корректного equals() может привести к дублированию одинаковых объектов с разными ссылками.

Я попросил его переопределить equals() и hashCode(), чтобы проверить, не добавит ли он в эти методы объекты OneToMany / ManyToOne и не создаст ли циклическую зависимость (что может привести к OutOfMemory).

Почему важно переопределять equals() и hashCode()?

  • Если этого не делать, объекты сравниваются по ссылке, что может привести к багам.

  • Lombok-аннотации @EqualsAndHashCode и @Data неявно переопределяют эти методы используя все имеющиеся свойства класса (например, могут учитывать связанные сущности, что приведёт к рекурсии).

  • Лучший вариант — переопределять вручную.

Прошу переопределить equals() & hashCode()

Override equals and hashCode for Category and Operation entites.
Ответ Клода

Here are the updated entities with equals and hashCode methods:

// src/main/java/com/yourcompany/domain/entity/Category.java

package com.yourcompany.domain.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.Set;
import java.util.Objects;

@Entity
@Table(name = "category", schema = "my_app_schema")
@Getter
@Setter
public class Category {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @OneToMany(mappedBy = "category")
    private Set operations;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Category category = (Category) o;
        if (id == null || category.id == null) return false;
        return Objects.equals(id, category.id);
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}
// src/main/java/com/yourcompany/domain/entity/Operation.java

package com.yourcompany.domain.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;

@Entity
@Table(name = "operation", schema = "my_app_schema")
@Getter
@Setter
public class Operation {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "operation_type", nullable = false)
    @Enumerated(EnumType.STRING)
    private OperationType operationType;

    @Column(name = "amount", nullable = false)
    private BigDecimal amount;

    @Column(name = "description")
    private String description;

    @Column(name = "operation_date", nullable = false)
    private LocalDateTime operationDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id", nullable = false)
    private Category category;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Operation operation = (Operation) o;
        if (id == null || operation.id == null) return false;
        return Objects.equals(id, operation.id);
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}

I've implemented equals and hashCode methods using the database identifier (id) field only. This is a common practice for JPA entities because:

  1. It provides consistent behavior with database identity

  2. It avoids issues with lazy loading

  3. It works well with collections and hibernate's first-level cache

  4. It prevents infinite recursion with bidirectional relationships

Note that the implementation:

  • Returns false if either object's ID is null

  • Only compares IDs when both objects are non-null and of the same class

  • Uses the ID field for hashCode calculation

Ошибки в реализации equals() и hashCode()

Клод почти справился, но есть нюансы:

  • Он избежал циклической зависимости и учёл ленивые загрузки. Однако есть две проблемы:

  • Использование hashCode = 0 для id = null, что может снизить производительность HashSet и HashMap, если там будет множество объектов с hashCode = 0.

  • Проверка классов через getClass(), т.к. в проекте используется Hibernate, сущности будут использоваться в прокси-объектах, следовательно, данный вызов может некорректно отрабатывать. Лучше использовать instanceof.

Исправленный вариант equals() и hashCode()

@Override  
public boolean equals(Object o) {  
    if (this == o) return true;  
    if (!(o instanceof Category category)) return false; // Лучше, чем getClass() для прокси объектов
    return id != null && id.equals(category.id); // Без дополнительной проверки id == null  
}  
  
@Override  
public int hashCode() {  
    return id != null ? id.hashCode() : super.hashCode(); // Использование super.hashCode() для уникальности несохранённых объектов
}

Ошибка с EAGER-загрузкой

Клод также по умолчанию сделал EAGER-связь между Category и Operation. На данном этапе это избыточно. Лучше следовать правилу: "Всегда LAZY, если нет необходимости в EAGER".

PR с исправлениями
https://github.com/nzinovev/anthropic-claude/pull/2
https://github.com/nzinovev/anthropic-claude/pull/3

Сущности готовы, следующий этап — создание CRUD-операций.

Пробуем CRUD. Часть 1 (неудачно)

Я рискнул и попросил Клода сразу создать полный цикл для операции CREATEконтроллер → сервис → DAO. Если всё пройдёт гладко, таким же способом реализую и остальные операции (READ, UPDATE, DELETE).

Я не уточнял, какую DTO использовать на вход и выход, чтобы проверить, поймёт ли это Клод самостоятельно или будет работать с сущностями в контроллере.

Чтобы избежать усложнения задачи, я сразу уточнил, что валидация полей не нужна – иначе Клод может потерять фокус и ухудшить качество выдачи.

Ошибка в промпте: мы с Клодом не поняли друг друга

Write a logic for the Operation entity (Controller - Service - DAO). 
In the first iteration, skip validation of all fields.

Что пошло не так? Практически всё.

Я не добавил слово CREATE, а Клод не стал уточнять детали.
В результате он сгенерировал весь CRUD (включая READ, UPDATE, DELETE) – с ошибками.

Исправлять этот код дальше будет неудобно. Легче делать всё шаг за шагом. Именно поэтому я просил Клода не добавлять валидацию – чтобы не перегружать контекст.

Придётся очистить контекст и перезапустить задачу. Покажу, как это сделать без потери истории.

Но сначала разберём ошибки в коде.

Разбор кода Клода

Ответ Клода

I'll create a complete operation management logic layer by layer. Here's the implementation:

// src/main/java/com/yourcompany/dao/OperationRepository.java

package com.yourcompany.dao;

import com.yourcompany.domain.entity.Operation;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface OperationRepository extends JpaRepository {
}
// src/main/java/com/yourcompany/service/OperationService.java

package com.yourcompany.service;

import com.yourcompany.domain.entity.Operation;
import java.util.List;

public interface OperationService {
    Operation createOperation(Operation operation);
    Operation getOperation(Long id);
    List getAllOperations();
    Operation updateOperation(Long id, Operation operation);
    void deleteOperation(Long id);
}
// src/main/java/com/yourcompany/service/impl/OperationServiceImpl.java

package com.yourcompany.service.impl;

import com.yourcompany.dao.OperationRepository;
import com.yourcompany.domain.entity.Operation;
import com.yourcompany.service.OperationService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class OperationServiceImpl implements OperationService {

    private final OperationRepository operationRepository;

    @Override
    @Transactional
    public Operation createOperation(Operation operation) {
        return operationRepository.save(operation);
    }

    @Override
    @Transactional(readOnly = true)
    public Operation getOperation(Long id) {
        return operationRepository.findById(id)
                .orElseThrow(() -&gt; new RuntimeException("Operation not found"));
    }

    @Override
    @Transactional(readOnly = true)
    public List getAllOperations() {
        return operationRepository.findAll();
    }

    @Override
    @Transactional
    public Operation updateOperation(Long id, Operation operation) {
        Operation existingOperation = getOperation(id);
        
        existingOperation.setOperationType(operation.getOperationType());
        existingOperation.setAmount(operation.getAmount());
        existingOperation.setDescription(operation.getDescription());
        existingOperation.setOperationDate(operation.getOperationDate());
        existingOperation.setCategory(operation.getCategory());

        return operationRepository.save(existingOperation);
    }

    @Override
    @Transactional
    public void deleteOperation(Long id) {
        operationRepository.deleteById(id);
    }
}
// src/main/java/com/yourcompany/dto/OperationDto.java

package com.yourcompany.dto;

import com.yourcompany.domain.entity.OperationType;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Data
public class OperationDto {
    private Long id;
    private OperationType operationType;
    private BigDecimal amount;
    private String description;
    private LocalDateTime operationDate;
    private Long categoryId;
}
// src/main/java/com/yourcompany/mapper/OperationMapper.java

package com.yourcompany.mapper;

import com.yourcompany.domain.entity.Operation;
import com.yourcompany.dto.OperationDto;
import org.springframework.stereotype.Component;

@Component
public class OperationMapper {
    
    public OperationDto toDto(Operation operation) {
        OperationDto dto = new OperationDto();
        dto.setId(operation.getId());
        dto.setOperationType(operation.getOperationType());
        dto.setAmount(operation.getAmount());
        dto.setDescription(operation.getDescription());
        dto.setOperationDate(operation.getOperationDate());
        dto.setCategoryId(operation.getCategory().getId());
        return dto;
    }

    public Operation toEntity(OperationDto dto) {
        Operation operation = new Operation();
        operation.setOperationType(dto.getOperationType());
        operation.setAmount(dto.getAmount());
        operation.setDescription(dto.getDescription());
        operation.setOperationDate(dto.getOperationDate());
        return operation;
    }
}
// src/main/java/com/yourcompany/controller/OperationController.java

package com.yourcompany.controller;

import com.yourcompany.domain.entity.Operation;
import com.yourcompany.dto.OperationDto;
import com.yourcompany.mapper.OperationMapper;
import com.yourcompany.service.CategoryService;
import com.yourcompany.service.OperationService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/api/operations")
@RequiredArgsConstructor
public class OperationController {

    private final OperationService operationService;
    private final CategoryService categoryService;
    private final OperationMapper operationMapper;

    @PostMapping
    public ResponseEntity createOperation(@RequestBody OperationDto operationDto) {
        Operation operation = operationMapper.toEntity(operationDto);
        operation.setCategory(categoryService.getCategory(operationDto.getCategoryId()));
        
        Operation savedOperation = operationService.createOperation(operation);
        return ResponseEntity.ok(operationMapper.toDto(savedOperation));
    }

    @GetMapping("/{id}")
    public ResponseEntity getOperation(@PathVariable Long id) {
        Operation operation = operationService.getOperation(id);
        return ResponseEntity.ok(operationMapper.toDto(operation));
    }

    @GetMapping
    public ResponseEntity&gt; getAllOperations() {
        List operations = operationService.getAllOperations()
                .stream()
                .map(operationMapper::toDto)
                .collect(Collectors.toList());
        return ResponseEntity.ok(operations);
    }

    @PutMapping("/{id}")
    public ResponseEntity updateOperation(
            @PathVariable Long id,
            @RequestBody OperationDto operationDto) {
        Operation operation = operationMapper.toEntity(operationDto);
        operation.setCategory(categoryService.getCategory(operationDto.getCategoryId()));
        
        Operation updatedOperation = operationService.updateOperation(id, operation);
        return ResponseEntity.ok(operationMapper.toDto(updatedOperation));
    }

    @DeleteMapping("/{id}")
    public ResponseEntity deleteOperation(@PathVariable Long id) {
        operationService.deleteOperation(id);
        return ResponseEntity.noContent().build();
    }
}

Note that this implementation assumes you have a CategoryService with a getCategory(Long id) method. You'll need to implement that as well.

The directory structure should look like this:

src/
└── main/
    └── java/
        └── com/
            └── yourcompany/
                ├── controller/
                │   └── OperationController.java
                ├── dao/
                │   └── OperationRepository.java
                ├── dto/
                │   └── OperationDto.java
                ├── mapper/
                │   └── OperationMapper.java
                └── service/
                    ├── OperationService.java
                    └── impl/
                        └── OperationServiceImpl.java

Что Клод сделал хорошо:

  • Корректно расставил @Transactional – разделил readOnly-транзакции и полноценные.

  • Добавил DTO – не вернул наружу сущность.

  • Указал структуру проекта – значит, часть контекста сохранилась.

  • Предложил дальнейшие шаги.

Что Клод сделал плохо:

  • Сущность "просочилась" в контроллер – маппинг в DTO происходит на уровне контроллера (вне транзакции), что может вызвать LazyInitializationException.

    • Сейчас ошибки не будет (мы берём только id категории), но это ещё хуже – создаётся ложное ощущение, что всё работает правильно.

  • Не уточнил, какие поля должны быть в DTO.

    • Из-за этого он вытянул categoryId наружу, хотя это не критично.

  • Ошибся с @Transactional.

    • Я явно указал DAO-слой, но Клод повесил @Transactional на сервис.

    • Это проблема, потому что бизнес-логика (сервис) может вызывать сторонние API – и в таком варианте всё это будет выполняться внутри транзакции, что неэффективно.

Можно ли исправить эти ошибки позднее? Конечно. Но если сделать сразу правильно, это сэкономит много времени в будущем.

Почему я очищаю контекст

Когда LLM изменяет большой кусок кода, он часто редактирует даже те части, которые не нужно трогать.

Это приводит к:

  • "Захламлению" контекста

  • Порче логики даже в тех местах, где её не нужно менять

  • Ухудшению качества последующих ответов

Поэтому проще очистить контекст и задать задачу заново. Я задам новый промпт и поправлю выдачу Клода, чтобы избежать ошибок.

Этот подход показывает, что важно разбивать сложные задачи на этапы.
Очистка контекста – полезный инструмент, если модель начала терять логику.

Дальше попробую создать CREATE-операцию по шагам, чтобы минимизировать ошибки.

Пробуем CRUD. Часть 2

Отчищаем контекст и задаём промпт с историей

Подготавливаю новый промпт с историей взаимодействия:

Скрытый текст

You will be acting as a backend developer. You are have an expertise in the following technologies: Java 21+, Spring boot, Spring JPA, Hibernate, Lombok, Spring Web, REST API, SQL. Your goal is to create a production-ready solution for the user and answer their questions. You should clarify questions to provide the best possible answer. If you have any questions, ask them first without providing a solution. Only after all questions have been clarified, you provide a solution for the user.

You should maintain a friendly and professional tone.

Here are some important rules of conduct:
- If you're not sure how to respond, say: "Sorry, I didn't understand you. Could you please rephrase your question, please?"
- If you don't know the answer to a question, say: "I am sorry, but I don't know that answer. Can you please clarify your question for me?"

Here is the history (between you and user) before the question:

<history>
user: "I have already created an application using Spring Initializr with the following dependencies: Lombok, Spring Web, Spring Data JPA, PostgreSQL Driver, Liquibase Migration. Write a Liquibase migration for the tables.
<table1>
Category table with columns: category_id (bigint), category_name (varchar), category_description (varchar)
</table1>
<table2>
Operation table with columns: operation_id (bigint), operation_public_id (varchar), operation_name (varchar), operation_amount(bigdecimal), operation_type (enum), category_id (FK to category table)
</table2>

Suggest how to store the operation_type. In the code, the operation type will be an Enum with the values (DEPOSIT, WITHDRAW)."

You: "Let me analyze your requirements:

  1. Database Structure:

    • Two tables: Category and Operation

    • Category is the parent table with a primary key referenced by Operation

    • Operation has an enum field operation_type

  2. Questions for clarification:

    1. Should category_id in both tables be auto-incrementing?

    2. What should be the maximum lengths for varchar fields (category_name, category_description, operation_public_id, operation_name)?

    3. Should any of these fields be nullable?

    4. For operation_amount, how many digits before and after decimal point do you need?

    5. Should operation_public_id be unique?

Before I provide the Liquibase migration script, please answer these questions so I can create the most appropriate solution for your needs.

Regarding the operation_type storage, I suggest two approaches:

  1. As a VARCHAR field with a check constraint limiting values to 'DEPOSIT' and 'WITHDRAW'

  2. As a custom ENUM type in PostgreSQL

The first approach is generally more flexible for future modifications and better portable across different databases. Would you like me to proceed with this approach, or would you prefer the PostgreSQL ENUM type?

Please provide your preferences so I can create a complete migration script."

user: "1. Correct

  1. Questions for clarification:

    1. Yes, category_id and operation_id should be auto-incremented

    2. For category_name, operation_public_id and operation_name - varchar(255), and for category_description (varchar 1000)

    3. Nullable fields: category_description

    4. 20 digits before decimal point and 2 after

    5. Yes

Regarding the operation_type, let's take the first approach."

you: "Thank you for the clarification. I'll create a Liquibase migration script that meets all these requirements.

databaseChangeLog:
  - changeSet:
      id: 001_create_category_table
      author: developer
      changes:
        - createTable:
            tableName: category
            columns:
              - column:
                  name: category_id
                  type: bigint
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: category_name
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: category_description
                  type: varchar(1000)
                  constraints:
                    nullable: true
        - addAutoIncrement:
            tableName: category
            columnName: category_id
            columnDataType: bigint
            startWith: 1
            incrementBy: 1

  - changeSet:
      id: 002_create_operation_table
      author: developer
      changes:
        - createTable:
            tableName: operation
            columns:
              - column:
                  name: operation_id
                  type: bigint
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: operation_public_id
                  type: varchar(255)
                  constraints:
                    nullable: false
                    unique: true
              - column:
                  name: operation_name
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: operation_amount
                  type: decimal(22,2)
                  constraints:
                    nullable: false
              - column:
                  name: operation_type
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: category_id
                  type: bigint
                  constraints:
                    nullable: false
                    foreignKeyName: fk_operation_category
                    references: category(category_id)
        - addAutoIncrement:
            tableName: operation
            columnName: operation_id
            columnDataType: bigint
            startWith: 1
            incrementBy: 1

  - changeSet:
      id: 003_add_operation_type_constraint
      author: developer
      changes:
        - sql:
            sql: ALTER TABLE operation ADD CONSTRAINT check_operation_type CHECK (operation_type IN ('DEPOSIT', 'WITHDRAW'));

Would you like me to explain the different parts of this migration script?"
user: "Write the configuration to connect the application to the PostgreSQL database."

you: "I'll help you configure the database connection. Let me write the configuration for both development and production environments using YAML format.

# src/main/resources/application.yml

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/your_database_name
    username: your_username
    password: your_password
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: validate  # validates the schema, makes no changes to the database
    show-sql: false       # set to true if you want to see SQL queries in logs
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format_sql: true  # formats SQL queries in logs if show-sql is true
  liquibase:
    change-log: classpath:db/changelog/db.changelog-master.yaml
    enabled: true        # enables Liquibase auto-deployment of changes

# Connection pool properties (using HikariCP - Spring Boot default)
    hikari:
      minimum-idle: 5
      maximum-pool-size: 20
      idle-timeout: 300000   # 5 minutes
      pool-name: HikariPool
      max-lifetime: 1200000  # 20 minutes
      connection-timeout: 20000 # 20 seconds

For different environments, you can create separate configuration files:

# src/main/resources/application-dev.yml
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/dev_database
    username: dev_user
    password: dev_password
  jpa:
    show-sql: true

# src/main/resources/application-prod.yml
spring:
  datasource:
    url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
  jpa:
    show-sql: false

To use these profiles, you can:

  1. Add in your main application.yml:

spring:
  profiles:
    active: dev  # or prod
  1. Or set it via command line:

java -jar your-app.jar --spring.profiles.active=dev
  1. Or set it via environment variable:

export SPRING_PROFILES_ACTIVE=dev

For production environment, it's recommended to:

  1. Use environment variables for sensitive data

  2. Never commit real credentials to version control

  3. Use strong passwords

  4. Consider using connection encryption (SSL)

Would you like me to explain any part of this configuration in more detail?"

user: "Write entities for operation and category tables. Provide a path to the package where I should create the entities."

you: "Create these entities in the src/main/java/com/yourcompany/domain/entity package. Here are the entities:

// src/main/java/com/yourcompany/domain/entity/Category.java

package com.yourcompany.domain.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.Set;

@Entity
@Table(name = "category", schema = "my_app_schema")
@Getter
@Setter
public class Category {  
  
    @Id  
    @Column(name = "category_id")  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @Column(name = "category_name", nullable = false)  
    private String name;  
  
    @Column(name = "category_description")  
    private String description;  
  
    @OneToMany(mappedBy = "category", fetch = FetchType.LAZY)  
    private Set operations;  
  
    @Override  
    public boolean equals(Object o) {  
        if (this == o) return true;  
        if (!(o instanceof Category category)) return false;
        return id != null &amp;&amp; id.equals(category.id); 
    }  
  
    @Override  
    public int hashCode() {  
        return id != null ? id.hashCode() : super.hashCode();
    }  
}
// src/main/java/com/yourcompany/domain/entity/Operation.java

package com.yourcompany.domain.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Entity
@Table(name = "operation", schema = "my_app_schema")
@Getter
@Setter
public class Operation {  
  
    @Id  
    @Column(name = "operation_id")  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @Column(name = "operation_public_id", nullable = false, unique = true)  
    private String publicId;  
  
    @Column(name = "operation_name", nullable = false)  
    private String name;  
  
    @Column(name = "operation_type", nullable = false)  
    @Enumerated(EnumType.STRING)  
    private OperationType type;  
  
    @Column(name = "operation_amount", nullable = false)  
    private BigDecimal amount;  
  
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "category_id", nullable = false)  
    private Category category;  
  
    @Override  
    public boolean equals(Object o) {  
        if (this == o) return true;  
        if (!(o instanceof Operation operation)) return false;  
        return id != null &amp;&amp; id.equals(operation.id);  
    }  
  
    @Override  
    public int hashCode() {  
        return id != null ? id.hashCode() : super.hashCode();  
    }  
}
// src/main/java/com/yourcompany/domain/entity/OperationType.java

package com.yourcompany.domain.entity;

public enum OperationType {
    DEPOSIT,
    WITHDRAW
}

Make sure you have the following dependencies in your pom.xml:

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

Directory structure should look like this:

src/
└── main/
    └── java/
        └── com/
            └── yourcompany/
                └── domain/
                    └── entity/
                        ├── Category.java
                        ├── Operation.java
                        └── OperationType.java

Would you like me to explain any part of these entities or their relationships?"
</history>
Here is the user question:

<question>
Write a CREATE logic for the Operation entity (Controller - Service - DAO). In the first iteration, skip validation of all fields.
</question>

Think about the answer first before responding. Think step-by-step.

Пришлось два раза переписывать промпт — из-за ошибок в формулировке.

В первый раз Клод уточнял детали, и код получился чуть качественнее, но здесь я разберу второй вариант, так как именно он был отправлен в работу.

Сброс контекста и обновление промпта помогают ИИ вспомнить начальные установки.

Это один из способов повысить точность ответа, но у него есть минус — такой подход требует больше времени, так как приходится собирать историю общения с моделью (тег <history> в промпте).

Я советую использовать теги <history></history> только в двух случаях:

  1. ИИ зашёл в тупик и выдаёт некорректные решения.

  2. Были ошибки в промпте и хочется избавиться от ошибок.

Преимущество этого метода — возможность редактировать историю общения, а также восстановление изначальных требований по взаимодействию модели с пользователем, что в конечном счёте улучшает итоговый результат.

Ответ Клода

Thank you for the clarification. I'll create a complete solution for the operation creation logic.

// src/main/java/com/yourcompany/dto/request/CreateOperationRequest.java
package com.yourcompany.dto.request;

import lombok.Data;
import java.math.BigDecimal;

@Data
public class CreateOperationRequest {
    private String operationName;
    private String operationType;
    private BigDecimal amount;
    private String categoryName;
}
// src/main/java/com/yourcompany/dto/response/OperationDto.java
package com.yourcompany.dto.response;

import lombok.Data;
import java.math.BigDecimal;

@Data
public class OperationDto {
    private String operationPublicId;
    private String operationName;
    private String operationType;
    private BigDecimal amount;
    private String categoryName;
}
// src/main/java/com/yourcompany/mapper/OperationMapper.java
package com.yourcompany.mapper;

import com.yourcompany.domain.entity.Operation;
import com.yourcompany.dto.response.OperationDto;
import org.springframework.stereotype.Component;

@Component
public class OperationMapper {
    
    public OperationDto toDto(Operation operation) {
        OperationDto dto = new OperationDto();
        dto.setOperationPublicId(operation.getOperationPublicId());
        dto.setOperationName(operation.getOperationName());
        dto.setOperationType(operation.getOperationType().name());
        dto.setAmount(operation.getAmount());
        dto.setCategoryName(operation.getCategory().getName());
        return dto;
    }
}
// src/main/java/com/yourcompany/repository/OperationRepository.java
package com.yourcompany.repository;

import com.yourcompany.domain.entity.Operation;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface OperationRepository extends JpaRepository {
}
// src/main/java/com/yourcompany/repository/CategoryRepository.java
package com.yourcompany.repository;

import com.yourcompany.domain.entity.Category;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;

@Repository
public interface CategoryRepository extends JpaRepository {
    Optional findByName(String name);
}
// src/main/java/com/yourcompany/service/OperationService.java
package com.yourcompany.service;

import com.yourcompany.domain.entity.Category;
import com.yourcompany.domain.entity.Operation;
import com.yourcompany.domain.entity.OperationType;
import com.yourcompany.dto.request.CreateOperationRequest;
import com.yourcompany.dto.response.OperationDto;
import com.yourcompany.mapper.OperationMapper;
import com.yourcompany.repository.CategoryRepository;
import com.yourcompany.repository.OperationRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;
import java.util.UUID;

@Service
@RequiredArgsConstructor
public class OperationService {

    private final OperationRepository operationRepository;
    private final CategoryRepository categoryRepository;
    private final OperationMapper operationMapper;

    @Transactional
    public OperationDto createOperation(CreateOperationRequest request) {
        Category category = categoryRepository.findByName(request.getCategoryName())
            .orElseThrow(() -&gt; new ResponseStatusException(HttpStatus.NOT_FOUND, 
                "Category not found: " + request.getCategoryName()));

        Operation operation = new Operation();
        operation.setOperationPublicId(UUID.randomUUID().toString());
        operation.setOperationName(request.getOperationName());
        operation.setOperationType(OperationType.valueOf(request.getOperationType()));
        operation.setAmount(request.getAmount());
        operation.setCategory(category);

        Operation savedOperation = operationRepository.save(operation);
        return operationMapper.toDto(savedOperation);
    }
}
// src/main/java/com/yourcompany/controller/OperationController.java
package com.yourcompany.controller;

import com.yourcompany.dto.request.CreateOperationRequest;
import com.yourcompany.dto.response.OperationDto;
import com.yourcompany.service.OperationService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/operations")
@RequiredArgsConstructor
public class OperationController {

    private final OperationService operationService;

    @PostMapping
    public ResponseEntity createOperation(@RequestBody CreateOperationRequest request) {
        OperationDto response = operationService.createOperation(request);
        return ResponseEntity.ok(response);
    }
}

Что получилось лучше по сравнению с первой попыткой

Ограничение задачи позволило Клоду улучшить качество кода:

  • Теперь сервис не возвращает сущность в контроллер.

  • Код стал чище, а выдача качественнее.

  • Добавлены простейшие бизнес-обработки.

Но не обошлось без недостатков - Нет @JsonProperty в DTO. Наличие этой аннотации делает безопасным изменения полей DTO в коде без влияния на API-контракт.

Тестируем работоспособность

Отправляем запрос:

{
    "name": "Заправка",
    "amount": 125.23,
    "type": "WITHDRAW",
    "categoryId": 1
}

Получаем ответ:

{
	"publicId":"31cf0666-38b6-4aa3-9c6d-2547fe15e237",
	 "name":"Заправка",
	 "amount":125.23,
	 "type":"WITHDRAW",
	 "categoryId":1
}

Выбираем стратегию для остальных CRUD-операций

Я попробовал два подхода:

  1. Создание всех CRUD-операций сразу.

  2. Создание каждой операции по отдельности.

Второй вариант оказался качественнее, поэтому по нему будут реализованы READ, UPDATE, DELETE.

PR на создание операции
https://github.com/nzinovev/anthropic-claude/pull/5/files

Реализуем UPDATE-логику для операций

Write an UPDATE logic for the Operation entity (Controller - Service - DAO). 
In the first iteration, skip validation of all fields.
Ответ Клода

Let me design the UPDATE logic step by step:

  1. Components needed:

    • Controller endpoint for PUT/PATCH request

    • Service method for update logic

    • DTO for update request

    • Mapper update method

  2. Flow:

    • Find operation by publicId (more secure than using internal ID)

    • Update only provided fields

    • Return updated operation

Here's the implementation:

// src/main/java/com/yourcompany/dto/OperationUpdateRequest.java

package com.yourcompany.dto;

import com.yourcompany.domain.entity.OperationType;
import lombok.Data;
import java.math.BigDecimal;

@Data
public class OperationUpdateRequest {
    private String name;
    private BigDecimal amount;
    private OperationType type;
    private Long categoryId;
}
// src/main/java/com/yourcompany/mapper/OperationMapper.java
// Add this method to the existing OperationMapper class

package com.yourcompany.mapper;

public class OperationMapper {
    // ... existing methods ...

    public void updateEntityFromDto(OperationUpdateRequest request, Operation operation) {
        if (request.getName() != null) {
            operation.setName(request.getName());
        }
        if (request.getAmount() != null) {
            operation.setAmount(request.getAmount());
        }
        if (request.getType() != null) {
            operation.setType(request.getType());
        }
    }
}
// src/main/java/com/yourcompany/repository/OperationRepository.java
// Add this method to the existing OperationRepository interface

package com.yourcompany.repository;

public interface OperationRepository extends JpaRepository {
    Optional findByPublicId(String publicId);
}
// src/main/java/com/yourcompany/service/OperationService.java
// Add these methods to the existing OperationService class

package com.yourcompany.service;

@Service
@RequiredArgsConstructor
public class OperationService {
    // ... existing methods ...

    @Transactional
    public OperationResponse updateOperation(String publicId, OperationUpdateRequest request) {
        Operation operation = operationRepository.findByPublicId(publicId)
            .orElseThrow(() -&gt; new RuntimeException("Operation not found"));

        operationMapper.updateEntityFromDto(request, operation);

        if (request.getCategoryId() != null) {
            Category category = categoryRepository.getReferenceById(request.getCategoryId());
            operation.setCategory(category);
        }

        Operation updatedOperation = operationRepository.save(operation);
        return operationMapper.toDto(updatedOperation);
    }
}
// src/main/java/com/yourcompany/controller/OperationController.java
// Add this method to the existing OperationController class

package com.yourcompany.controller;

@RestController
@RequestMapping("/api/v1/operations")
@RequiredArgsConstructor
public class OperationController {
    // ... existing methods ...

    @PutMapping("/{publicId}")
    public OperationResponse updateOperation(
            @PathVariable String publicId,
            @RequestBody OperationUpdateRequest request) {
        return operationService.updateOperation(publicId, request);
    }
}
// src/main/java/com/yourcompany/exception/OperationNotFoundException.java

package com.yourcompany.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class OperationNotFoundException extends RuntimeException {
    public OperationNotFoundException(String message) {
        super(message);
    }
}

Now you can update an operation by making a PUT request to /api/v1/operations/{publicId} with a JSON body containing the fields you want to update. For example:

{
    "name": "Updated Operation Name",
    "amount": 150.00,
    "type": "DEPOSIT",
    "categoryId": 2
}

OperationMapper.updateEntityFromDto — что это вообще?

Клод добавил какую-то странную конструкцию:

operationMapper.updateEntityFromDto(operation, dto);

Звучит логично, но есть несколько проблем:

  • Вынес в маппер логику, которая к нему не относится.

  • Разделил её по разным слоям: три параметра проставляются в маппере, а один — в сервисе.

Это плохой дизайн, потому что маппер должен просто преобразовывать DTO в сущность и обратно, а не вносить изменения в объект.

OperationNotFoundException, но... не совсем

Клод добавил кастомное исключение:

public class OperationNotFoundException extends RuntimeException { ... }

На первый взгляд, всё правильно, но есть один нюанс — он его нигде не использует!

Там, где должно было бросаться OperationNotFoundException, Клод выбрасывает обычный RuntimeException. В итоге, хорошая идея, но не реализованная до конца.

Проблема с обработкой NotFound ошибок

Далее будут появятся другие исключения в том же стиле (например CategoryNotFoundException). В итоге каждое исключение будет уникальным — это усложнит поддержку. Лучше сделать одно NotFoundException, а при необходимости — наследовать от него:

public class NotFoundException extends RuntimeException {
    public NotFoundException(String message) {
        super(message);
    }
}

А затем:

public class OperationNotFoundException extends NotFoundException {
    public OperationNotFoundException() {
        super("Operation not found");
    }
}

Такой подход даёт два преимущества:

  1. Единый ExceptionHandler – можно обрабатывать NotFoundException, а не кучу отдельных классов.

  2. Чище код – если появится новый тип NotFound, его не нужно будет добавлять в обработчик.

Несмотря на эти проблемы, Клод справился с задачей. Код рабочий, даже был предложен тестовый JSON для проверки.

Теперь переходим к поиску операций (READ).

PR на обновление операции
https://github.com/nzinovev/anthropic-claude/pull/6

Реализуем READ-логику для операций

Попросил Клода создать два эндпоинта:

  1. Получение всех операций с пагинацией.

  2. Поиск операции по publicId.

Write a FIND logic for the Operation entity (Controller - Service - DAO). 
In the first iteration, skip validation of all fields. 
You need to add two endpoints, the first one that finds all operations with pagination, 
and the second one that finds an operation by publicId.
Ответ Клода

Let me design the FIND logic step by step:

  1. Components needed:

    • Controller endpoints for GET requests (findAll with pagination and findByPublicId)

    • Service methods for both operations

    • Repository method for finding by publicId (already exists)

    • DTO for pagination criteria (optional parameters like page, size, sort)

  2. Flow:

    • Accept pagination parameters

    • Convert Page to Page

    • Return paginated response or single operation

Here's the implementation:

// src/main/java/com/yourcompany/dto/PageResponse.java

package com.yourcompany.dto;

import lombok.Data;
import org.springframework.data.domain.Page;
import java.util.List;

@Data
public class PageResponse {
    private List content;
    private int pageNumber;
    private int pageSize;
    private long totalElements;
    private int totalPages;
    private boolean last;
    
    public static  PageResponse from(Page page) {
        PageResponse response = new PageResponse&lt;&gt;();
        response.setContent(page.getContent());
        response.setPageNumber(page.getNumber());
        response.setPageSize(page.getSize());
        response.setTotalElements(page.getTotalElements());
        response.setTotalPages(page.getTotalPages());
        response.setLast(page.isLast());
        return response;
    }
}
// src/main/java/com/yourcompany/service/OperationService.java
// Add these methods to the existing OperationService class

package com.yourcompany.service;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

@Service
@RequiredArgsConstructor
public class OperationService {
    // ... existing methods ...

    @Transactional(readOnly = true)
    public PageResponse findAll(Pageable pageable) {
        Page operationPage = operationRepository.findAll(pageable);
        Page responsePage = operationPage.map(operationMapper::toDto);
        return PageResponse.from(responsePage);
    }

    @Transactional(readOnly = true)
    public OperationResponse findByPublicId(String publicId) {
        Operation operation = operationRepository.findByPublicId(publicId)
            .orElseThrow(() -&gt; new OperationNotFoundException(
                String.format("Operation with publicId %s not found", publicId)));
        return operationMapper.toDto(operation);
    }
}
// src/main/java/com/yourcompany/controller/OperationController.java
// Add these methods to the existing OperationController class

package com.yourcompany.controller;

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

@RestController
@RequestMapping("/api/v1/operations")
@RequiredArgsConstructor
public class OperationController {
    // ... existing methods ...

    @GetMapping
    public PageResponse findAll(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "20") int size,
            @RequestParam(defaultValue = "operation_id") String sortBy,
            @RequestParam(defaultValue = "DESC") Sort.Direction direction) {
        
        PageRequest pageRequest = PageRequest.of(
            page,
            size,
            Sort.by(direction, sortBy)
        );
        
        return operationService.findAll(pageRequest);
    }

    @GetMapping("/{publicId}")
    public OperationResponse findByPublicId(@PathVariable String publicId) {
        return operationService.findByPublicId(publicId);
    }
}

Now you can:

  1. Get a paginated list of operations:

GET /api/v1/operations?page=0&amp;size=20&amp;sortBy=operation_id&amp;direction=DESC

Response example:

{
    "content": [
        {
            "publicId": "550e8400-e29b-41d4-a716-446655440000",
            "name": "Operation 1",
            "amount": 100.00,
            "type": "DEPOSIT",
            "categoryId": 1
        },
        // ... more operations
    ],
    "pageNumber": 0,
    "pageSize": 20,
    "totalElements": 100,
    "totalPages": 5,
    "last": false
}
  1. Get a single operation by publicId:

GET /api/v1/operations/550e8400-e29b-41d4-a716-446655440000

Response example:

{
    "publicId": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Operation 1",
    "amount": 100.00,
    "type": "DEPOSIT",
    "categoryId": 1
}

Как Клод реализовал задачу?

Клод использовал пагинацию Spring JPA, что логично, так как мы работаем с Hibernate.

Код получился почти идеальным:

  • PageResponse сделан дженериком – можно переиспользовать для любых ответов.

  • Контекст сохраняется – Клод не дублирует уже написанный код.

Минусы реализации

Проблема с sortBy — Клод ссылается на колонку в БД, а не на поле сущности. В таком виде сортировка не будет работать, т.к. JPA для сортировки использует именно название полей сущности.

Spring Data JPA использует рефлексию для работы с сущностями. Когда мы передаем параметр сортировки sortBy, Spring Data JPA пытается найти соответствующее поле по имени внутри класса сущности. JPA ищет свойство (field) внутри Java-класса Operation, а не колонку в базе данных.

Исправляем и переходим к DELETE.

PR на поиск операций
https://github.com/nzinovev/anthropic-claude/pull/7

DELETE – логика для операций

Финальная часть CRUD-операций – удаление. Прошу Клода написать эндпоинт, который удаляет операцию по publicId.

Write a DELETE logic for the Operation entity (Controller - Service - DAO). 
In the first iteration, skip validation of all fields.
Ответ Клода

Let me design the DELETE logic step by step:

  1. Components needed:

    • Controller endpoint for DELETE request

    • Service method for delete operation

    • Repository method (will use existing findByPublicId)

  2. Flow:

    • Find operation by publicId

    • Delete operation if exists

    • Return appropriate response status

Here's the implementation:

// src/main/java/com/yourcompany/service/OperationService.java
// Add this method to the existing OperationService class

package com.yourcompany.service;

@Service
@RequiredArgsConstructor
public class OperationService {
    // ... existing methods ...

    @Transactional
    public void deleteOperation(String publicId) {
        Operation operation = operationRepository.findByPublicId(publicId)
            .orElseThrow(() -> new OperationNotFoundException(
                String.format("Operation with publicId %s not found", publicId)));
            
        operationRepository.delete(operation);
    }
}
// src/main/java/com/yourcompany/controller/OperationController.java
// Add this method to the existing OperationController class

package com.yourcompany.controller;

@RestController
@RequestMapping("/api/v1/operations")
@RequiredArgsConstructor
public class OperationController {
    // ... existing methods ...

    @DeleteMapping("/{publicId}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteOperation(@PathVariable String publicId) {
        operationService.deleteOperation(publicId);
    }
}

Now you can delete an operation by making a DELETE request to:

DELETE /api/v1/operations/{publicId}

Результат

Клод справился без проблем – здесь всё очевидно, комментировать особо нечего.

PR на удаление операции
https://github.com/nzinovev/anthropic-claude/pull/8

Добавляем валидацию

CRUD для operation готов, но пока он довольно примитивен. Кроме того, у нас вообще нет тестов – а это важная часть качественной разработки. Чтобы не растягивать статью, я не буду покрывать тестами и валидацией все эндпоинты.

Я выберу один – CREATE Operation – и попрошу Клода добавить:

  • Валидацию запроса

  • Unit-тесты для сервисного слоя

  • MVC-тест для контроллера

Погнали!

Добавляем валидацию для CREATE-операции

Напоминаю Клоду, как выглядит логика, связанная с созданием операции и прошу добавить валидацию для CREATE-операции.

Запрос Клоду

This is how the "create operation" is implemented at the moment.
<example>

@Data  
public class OperationCreateRequest {  
    private String name;  
    private BigDecimal amount;  
    private OperationType type;  
    private Long categoryId;  
}
@RestController  
@RequestMapping("/api/v1/operations")  
@RequiredArgsConstructor  
public class OperationController {
	private final OperationService operationService;  
  
	@PostMapping  
	@ResponseStatus(HttpStatus.CREATED)  
	public OperationResponse createOperation(@RequestBody OperationCreateRequest request) {  
	    return operationService.createOperation(request);  
	}
}
@Service  
@RequiredArgsConstructor  
public class OperationService {
	private final OperationRepository operationRepository;  
	private final CategoryRepository categoryRepository;  
	private final OperationMapper operationMapper;  
  
	@Transactional  
	public OperationResponse createOperation(OperationCreateRequest request) {  
	    Category category = categoryRepository.getReferenceById(request.getCategoryId());  
  
	    Operation operation = operationMapper.toEntity(request);  
	    operation.setCategory(category);  
  
	    Operation savedOperation = operationRepository.save(operation);  
	    return operationMapper.toDto(savedOperation);  
	}
}
@Entity  
@Table(name = "operation", schema = "anthropic_claude")  
@Getter  
@Setter  
public class Operation {  
  
    @Id  
    @Column(name = "operation_id")  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @Column(name = "operation_public_id", nullable = false, unique = true)  
    private String publicId;  
  
    @Column(name = "operation_name", nullable = false)  
    private String name;  
  
    @Column(name = "operation_type", nullable = false)  
    @Enumerated(EnumType.STRING)  
    private OperationType type;  
  
    @Column(name = "operation_amount", nullable = false)  
    private BigDecimal amount;  
  
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "category_id", nullable = false)  
    private Category category;  
  
    @Override  
    public boolean equals(Object o) {  
        if (this == o) return true;  
        if (!(o instanceof Operation operation)) return false;  
        return id != null &amp;&amp; id.equals(operation.id);  
    }  
  
    @Override  
    public int hashCode() {  
        return id != null ? id.hashCode() : super.hashCode();  
    }  
}

</example>

Add validation for "create operation" logic.

Ответ Клода

I'll add validation for the create operation logic. Let's implement it step by step:

  1. Field validations needed:

    • name: not blank, max length 255

    • amount: not null, positive

    • type: not null, valid enum value

    • categoryId: not null, must exist in database

    • business rule: category must exist

  2. Changes needed:

    • Add validation annotations to DTO

    • Add custom exception classes

    • Add validation in service layer

    • Add global exception handler

Here's the implementation:

// src/main/java/com/yourcompany/exception/CategoryNotFoundException.java

package com.yourcompany.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class CategoryNotFoundException extends RuntimeException {
    public CategoryNotFoundException(String message) {
        super(message);
    }
}
// src/main/java/com/yourcompany/exception/ValidationErrorResponse.java

package com.yourcompany.exception;

import lombok.Data;
import java.util.ArrayList;
import java.util.List;

@Data
public class ValidationErrorResponse {
    private List errors = new ArrayList&lt;&gt;();

    @Data
    public static class ValidationError {
        private final String field;
        private final String message;
    }
}
// src/main/java/com/yourcompany/exception/GlobalExceptionHandler.java

package com.yourcompany.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ValidationErrorResponse handleValidationException(MethodArgumentNotValidException ex) {
        ValidationErrorResponse response = new ValidationErrorResponse();
        
        ex.getBindingResult().getFieldErrors().forEach(error -&gt; 
            response.getErrors().add(new ValidationErrorResponse.ValidationError(
                error.getField(), 
                error.getDefaultMessage()
            ))
        );
        
        return response;
    }

    @ExceptionHandler(CategoryNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ValidationErrorResponse handleCategoryNotFoundException(CategoryNotFoundException ex) {
        ValidationErrorResponse response = new ValidationErrorResponse();
        response.getErrors().add(new ValidationErrorResponse.ValidationError(
            "categoryId", 
            ex.getMessage()
        ));
        return response;
    }
}
// src/main/java/com/yourcompany/dto/OperationCreateRequest.java

package com.yourcompany.dto;

import com.yourcompany.domain.entity.OperationType;
import jakarta.validation.constraints.*;
import lombok.Data;
import java.math.BigDecimal;

@Data
public class OperationCreateRequest {
    @NotBlank(message = "Operation name is required")
    @Size(max = 255, message = "Operation name must not exceed 255 characters")
    private String name;

    @NotNull(message = "Amount is required")
    @Positive(message = "Amount must be positive")
    @Digits(integer = 20, fraction = 2, message = "Amount must have at most 20 digits and 2 decimal places")
    private BigDecimal amount;

    @NotNull(message = "Operation type is required")
    private OperationType type;

    @NotNull(message = "Category ID is required")
    @Positive(message = "Category ID must be positive")
    private Long categoryId;
}
// src/main/java/com/yourcompany/service/OperationService.java

@Service
@RequiredArgsConstructor
public class OperationService {
    private final OperationRepository operationRepository;
    private final CategoryRepository categoryRepository;
    private final OperationMapper operationMapper;

    @Transactional
    public OperationResponse createOperation(OperationCreateRequest request) {
        // Check if category exists
        Category category = categoryRepository.findById(request.getCategoryId())
            .orElseThrow(() -&gt; new CategoryNotFoundException(
                String.format("Category with id %d not found", request.getCategoryId())));

        Operation operation = operationMapper.toEntity(request);
        operation.setCategory(category);

        Operation savedOperation = operationRepository.save(operation);
        return operationMapper.toDto(savedOperation);
    }
}
// src/main/java/com/yourcompany/controller/OperationController.java

@RestController
@RequestMapping("/api/v1/operations")
@RequiredArgsConstructor
public class OperationController {
    private final OperationService operationService;

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public OperationResponse createOperation(@Valid @RequestBody OperationCreateRequest request) {
        return operationService.createOperation(request);
    }
}

Now when creating an operation:

  1. If validation fails, you'll get a 400 Bad Request with details about what went wrong:

{
    "errors": [
        {
            "field": "name",
            "message": "Operation name is required"
        },
        {
            "field": "amount",
            "message": "Amount must be positive"
        }
    ]
}
  1. If category is not found, you'll get a 404 Not Found:

{
    "errors": [
        {
            "field": "categoryId",
            "message": "Category with id 123 not found"
        }
    ]
}

Результат: плюсы и минусы

Клод реализовал грамотную обработку ошибок:

  • Все ошибки возвращаются сразу – пользователю не нужно отправлять несколько запросов.

  • Добавлен ExceptionHandler – обработка ошибок централизована.

Но валидация не работает.

Проблема: отсутствуют зависимости

Клод не добавил нужные зависимости:

<!-- Чтобы заработала аннотация Valid и Spring начал валидацию -->
<dependency>  
   <groupId>org.springframework.boot</groupId>  
   <artifactId>spring-boot-starter-validation</artifactId>  
</dependency>
<!-- Для аннотаций NotBlank, NotNull, etc. -->
<dependency>  
   <groupId>jakarta.validation</groupId>  
   <artifactId>jakarta.validation-api</artifactId>  
   <version>3.1.0</version>  
</dependency>

Если необходимость jakarta.validation ещё можно догадаться по импорту аннотаций в DTO, то spring-boot-starter-validation менее очевиден.

А я ведь имитирую разработчика с минимальным опытом, и без документации мне сложно понять, почему валидация не работает.

Ошибка с обработкой NotFound-исключений

Как и в CRUD-логике, Клод добавил специфичное исключение:

public class CategoryNotFoundException extends RuntimeException { ... }

Такой подход требует:

  • Создавать отдельное исключение для каждой сущности.

  • Добавлять его обработку в ExceptionHandler.

Лучше использовать единое NotFoundException и наследоваться от него (это уже обсуждалось ранее).

Кроме того, добавлена лишняя аннотация:

@ResponseStatus(HttpStatus.NOT_FOUND)

Это избыточно, потому что исключение уже обрабатывается глобальным ExceptionHandler.

Попытка исправить – новая проблема

Попросил Клода исправить ошибки:

I've added annotations to OperationCreateRequest. 
However, when I send a request with incorrect data, 
the application does not respond with a validation error. 
The app ignores all annotations relating to validation and passes the request on.
Ответ Клода

The issue is likely because the validation dependencies and configuration are missing. Let's fix this:

  1. First, add the validation dependency to your pom.xml:


    org.springframework.boot
    spring-boot-starter-validation

  1. Make sure your application configuration enables validation. Create or update the configuration class:

// src/main/java/com/yourcompany/config/WebConfig.java

package com.yourcompany.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // Additional web configuration can be added here if needed
}
  1. Double-check that your controller has the @Valid annotation on the request parameter:

@RestController
@RequestMapping("/api/v1/operations")
@RequiredArgsConstructor
public class OperationController {
    private final OperationService operationService;

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public OperationResponse createOperation(@Valid @RequestBody OperationCreateRequest request) {
        return operationService.createOperation(request);
    }
}
  1. Verify that your DTO has all the necessary validation annotations:

@Data
public class OperationCreateRequest {
    @NotBlank(message = "Operation name is required")
    @Size(max = 255, message = "Operation name must not exceed 255 characters")
    private String name;

    @NotNull(message = "Amount is required")
    @Positive(message = "Amount must be positive")
    @Digits(integer = 20, fraction = 2, message = "Amount must have at most 20 digits and 2 decimal places")
    private BigDecimal amount;

    @NotNull(message = "Operation type is required")
    private OperationType type;

    @NotNull(message = "Category ID is required")
    @Positive(message = "Category ID must be positive")
    private Long categoryId;
}
  1. Make sure you have the exception handler properly configured:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ValidationErrorResponse handleValidationException(MethodArgumentNotValidException ex) {
        ValidationErrorResponse response = new ValidationErrorResponse();
        
        ex.getBindingResult().getFieldErrors().forEach(error -&gt; 
            response.getErrors().add(new ValidationErrorResponse.ValidationError(
                error.getField(), 
                error.getDefaultMessage()
            ))
        );
        
        return response;
    }

    // Add logging to help with debugging
    public GlobalExceptionHandler() {
        log.info("GlobalExceptionHandler initialized");
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ValidationErrorResponse handleAllUncaughtException(Exception ex) {
        log.error("Uncaught exception", ex);
        ValidationErrorResponse response = new ValidationErrorResponse();
        response.getErrors().add(new ValidationErrorResponse.ValidationError(
            "global", 
            "An unexpected error occurred"
        ));
        return response;
    }
}
  1. Test the validation with an invalid request:

curl -X POST http://localhost:8080/api/v1/operations \
-H "Content-Type: application/json" \
-d '{
    "name": "",
    "amount": -100,
    "type": null,
    "categoryId": null
}'

You should receive a response like:

{
    "errors": [
        {
            "field": "name",
            "message": "Operation name is required"
        },
        {
            "field": "amount",
            "message": "Amount must be positive"
        },
        {
            "field": "type",
            "message": "Operation type is required"
        },
        {
            "field": "categoryId",
            "message": "Category ID is required"
        }
    ]
}

If you're still not seeing validation errors, you can add debug logging to verify the validation is being triggered:

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public OperationResponse createOperation(@Valid @RequestBody OperationCreateRequest request) {
    log.debug("Received operation create request: {}", request);
    return operationService.createOperation(request);
}

Also, you can enable debug logging for Spring validation in application.yml:

logging:
  level:
    org.springframework.web: DEBUG
    org.springframework.validation: DEBUG
    com.yourcompany: DEBUG

Would you like me to help you debug this further or explain any part of the validation setup in more detail?

Ответ дан, но слишком избыточен. Модель начала добавлять ненужный код, в том числе:

// src/main/java/com/yourcompany/config/WebConfig.java

package com.yourcompany.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // Additional web configuration can be added here if needed
}

Этот класс вообще не нужен – валидация работает без него. Это конфигурация для MVC приложения, а у нас REST API.

Проблема знакомая – при сложных запросах LLM начинает генерировать лишний код.

Можно было очистить контекст и пересоздать промпт, но я решил продолжить с текущим вариантом. Валидация готова, переходим к тестам.

PR с валидацией
https://github.com/nzinovev/anthropic-claude/pull/9

Юнит-тесты для OperationService

Попросил Клода написать позитивные и негативные тесты для OperationService

Запрос к Клоду

This is a reminder of what code is contained in the OperationService class:

@Service
@RequiredArgsConstructor
public class OperationService {

    private final OperationRepository operationRepository;
    private final CategoryRepository categoryRepository;
    private final OperationMapper operationMapper;

    @Transactional
    public OperationResponse createOperation(OperationCreateRequest request) {
        final var category = categoryRepository.findById(request.getCategoryId())
                .orElseThrow(() -&gt; new CategoryNotFoundException(
                        String.format("Category with id %d not found", request.getCategoryId())));

        final var operation = operationMapper.toEntity(request);
        operation.setCategory(category);

        final var savedOperation = operationRepository.save(operation);
        return operationMapper.toDto(savedOperation);
    }

    @Transactional
    public OperationResponse updateOperation(String publicId, OperationUpdateRequest request) {
        return operationRepository.findByPublicId(publicId)
                .map(operation -&gt; updateOperation(operation, request))
                .orElseThrow(() -&gt; new RuntimeException("Operation not found"));
    }

    @Transactional(readOnly = true)
    public PageResponse findAll(Pageable pageable) {
        final var operationPage = operationRepository.findAll(pageable);
        final var responsePage = operationPage.map(operationMapper::toDto);
        return PageResponse.from(responsePage);
    }

    @Transactional(readOnly = true)
    public OperationResponse findByPublicId(String publicId) {
        final var operation = operationRepository.findByPublicId(publicId)
                .orElseThrow(() -&gt; new RuntimeException("Operation not found"));
        return operationMapper.toDto(operation);
    }

    @Transactional
    public void deleteOperation(String publicId) {
        final var operation = operationRepository.findByPublicId(publicId)
                .orElseThrow(() -&gt; new RuntimeException(
                        String.format("Operation with publicId %s not found", publicId)));

        operationRepository.delete(operation);
    }

    private OperationResponse updateOperation(Operation operation, OperationUpdateRequest request) {
        if (request.getName() != null) {
            operation.setName(request.getName());
        }
        if (request.getAmount() != null) {
            operation.setAmount(request.getAmount());
        }
        if (request.getType() != null) {
            operation.setType(request.getType());
        }
        if (request.getCategoryId() != null) {
            final var category = categoryRepository.getReferenceById(request.getCategoryId());
            operation.setCategory(category);
        }

        final var updatedOperation = operationRepository.save(operation);

        return operationMapper.toDto(updatedOperation);
    }
}

Write unit-tests for OperationService. You should write positive and negative tests where it's needed (for example: check that an exception will be thrown)

Ответ Клода

I'll write comprehensive unit tests for the OperationService class. We'll use JUnit 5 and Mockito for testing.

// src/test/java/com/yourcompany/service/OperationServiceTest.java

package com.yourcompany.service;

import com.yourcompany.domain.entity.Category;
import com.yourcompany.domain.entity.Operation;
import com.yourcompany.domain.entity.OperationType;
import com.yourcompany.dto.OperationCreateRequest;
import com.yourcompany.dto.OperationResponse;
import com.yourcompany.dto.OperationUpdateRequest;
import com.yourcompany.dto.PageResponse;
import com.yourcompany.exception.CategoryNotFoundException;
import com.yourcompany.mapper.OperationMapper;
import com.yourcompany.repository.CategoryRepository;
import com.yourcompany.repository.OperationRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class OperationServiceTest {

    @Mock
    private OperationRepository operationRepository;

    @Mock
    private CategoryRepository categoryRepository;

    @Mock
    private OperationMapper operationMapper;

    @InjectMocks
    private OperationService operationService;

    private Operation operation;
    private Category category;
    private OperationResponse operationResponse;
    private OperationCreateRequest createRequest;
    private OperationUpdateRequest updateRequest;

    @BeforeEach
    void setUp() {
        category = new Category();
        category.setId(1L);

        operation = new Operation();
        operation.setId(1L);
        operation.setPublicId("test-public-id");
        operation.setName("Test Operation");
        operation.setAmount(BigDecimal.valueOf(100));
        operation.setType(OperationType.DEPOSIT);
        operation.setCategory(category);

        operationResponse = new OperationResponse();
        operationResponse.setPublicId("test-public-id");
        operationResponse.setName("Test Operation");
        operationResponse.setAmount(BigDecimal.valueOf(100));
        operationResponse.setType(OperationType.DEPOSIT);
        operationResponse.setCategoryId(1L);

        createRequest = new OperationCreateRequest();
        createRequest.setName("Test Operation");
        createRequest.setAmount(BigDecimal.valueOf(100));
        createRequest.setType(OperationType.DEPOSIT);
        createRequest.setCategoryId(1L);

        updateRequest = new OperationUpdateRequest();
        updateRequest.setName("Updated Operation");
        updateRequest.setAmount(BigDecimal.valueOf(200));
        updateRequest.setType(OperationType.WITHDRAWAL);
        updateRequest.setCategoryId(1L);
    }

    @Test
    void createOperation_Success() {
        // Arrange
        when(categoryRepository.findById(1L)).thenReturn(Optional.of(category));
        when(operationMapper.toEntity(createRequest)).thenReturn(operation);
        when(operationRepository.save(any(Operation.class))).thenReturn(operation);
        when(operationMapper.toDto(operation)).thenReturn(operationResponse);

        // Act
        OperationResponse result = operationService.createOperation(createRequest);

        // Assert
        assertThat(result).isNotNull();
        assertThat(result.getPublicId()).isEqualTo("test-public-id");
        verify(categoryRepository).findById(1L);
        verify(operationRepository).save(any(Operation.class));
    }

    @Test
    void createOperation_CategoryNotFound() {
        // Arrange
        when(categoryRepository.findById(1L)).thenReturn(Optional.empty());

        // Act &amp; Assert
        assertThrows(CategoryNotFoundException.class,
                () -&gt; operationService.createOperation(createRequest));
        verify(operationRepository, never()).save(any(Operation.class));
    }

    @Test
    void updateOperation_Success() {
        // Arrange
        when(operationRepository.findByPublicId("test-public-id")).thenReturn(Optional.of(operation));
        when(categoryRepository.getReferenceById(1L)).thenReturn(category);
        when(operationRepository.save(any(Operation.class))).thenReturn(operation);
        when(operationMapper.toDto(operation)).thenReturn(operationResponse);

        // Act
        OperationResponse result = operationService.updateOperation("test-public-id", updateRequest);

        // Assert
        assertThat(result).isNotNull();
        verify(operationRepository).save(any(Operation.class));
    }

    @Test
    void updateOperation_NotFound() {
        // Arrange
        when(operationRepository.findByPublicId("test-public-id")).thenReturn(Optional.empty());

        // Act &amp; Assert
        assertThrows(RuntimeException.class,
                () -&gt; operationService.updateOperation("test-public-id", updateRequest));
        verify(operationRepository, never()).save(any(Operation.class));
    }

    @Test
    void findAll_Success() {
        // Arrange
        PageRequest pageRequest = PageRequest.of(0, 10);
        List operations = List.of(operation);
        Page operationPage = new PageImpl&lt;&gt;(operations, pageRequest, 1);
        
        when(operationRepository.findAll(pageRequest)).thenReturn(operationPage);
        when(operationMapper.toDto(operation)).thenReturn(operationResponse);

        // Act
        PageResponse result = operationService.findAll(pageRequest);

        // Assert
        assertThat(result).isNotNull();
        assertThat(result.getContent()).hasSize(1);
        assertThat(result.getTotalElements()).isEqualTo(1);
    }

    @Test
    void findByPublicId_Success() {
        // Arrange
        when(operationRepository.findByPublicId("test-public-id")).thenReturn(Optional.of(operation));
        when(operationMapper.toDto(operation)).thenReturn(operationResponse);

        // Act
        OperationResponse result = operationService.findByPublicId("test-public-id");

        // Assert
        assertThat(result).isNotNull();
        assertThat(result.getPublicId()).isEqualTo("test-public-id");
    }

    @Test
    void findByPublicId_NotFound() {
        // Arrange
        when(operationRepository.findByPublicId("test-public-id")).thenReturn(Optional.empty());

        // Act &amp; Assert
        assertThrows(RuntimeException.class,
                () -&gt; operationService.findByPublicId("test-public-id"));
    }

    @Test
    void deleteOperation_Success() {
        // Arrange
        when(operationRepository.findByPublicId("test-public-id")).thenReturn(Optional.of(operation));

        // Act
        operationService.deleteOperation("test-public-id");

        // Assert
        verify(operationRepository).delete(operation);
    }

    @Test
    void deleteOperation_NotFound() {
        // Arrange
        when(operationRepository.findByPublicId("test-public-id")).thenReturn(Optional.empty());

        // Act &amp; Assert
        assertThrows(RuntimeException.class,
                () -&gt; operationService.deleteOperation("test-public-id"));
        verify(operationRepository, never()).delete(any(Operation.class));
    }

    @Test
    void updateOperation_PartialUpdate() {
        // Arrange
        OperationUpdateRequest partialRequest = new OperationUpdateRequest();
        partialRequest.setName("Updated Name");  // Only update name

        when(operationRepository.findByPublicId("test-public-id")).thenReturn(Optional.of(operation));
        when(operationRepository.save(any(Operation.class))).thenReturn(operation);
        when(operationMapper.toDto(operation)).thenReturn(operationResponse);

        // Act
        OperationResponse result = operationService.updateOperation("test-public-id", partialRequest);

        // Assert
        assertThat(result).isNotNull();
        verify(operationRepository).save(any(Operation.class));
        verify(categoryRepository, never()).getReferenceById(any());  // Category should not be updated
    }
}

Тесты проходят успешно, но есть нюансы.

Дублирование verify & when

В тесте createOperation_Success дублируются verify и when.

Почему это плохо?

  • when(...) уже проверяет вызов метода.

  • verify(...) имеет смысл только если проверяются все вызовы в createOperation.

Как лучше?

  • Либо использовать verify только на void методах.

  • Либо проверять все вызовы, а не только часть.

Проблема с any(Operation.class)

Тест не проверяет содержимое объекта, только его тип.

when(operationRepository.save(any(Operation.class))).thenReturn(operation);

Это значит, что если внутри createOperation объект Operation изменится, тест этого не заметит.

Пример ошибки:

  • В коде забыли проставить категорию перед сохранением.

  • Тест всё равно проходит.

    @Transactional  
    public OperationResponse createOperation(OperationCreateRequest request) {  
        final var category = categoryRepository.findById(request.getCategoryId())  
                .orElseThrow(() -> new CategoryNotFoundException(  
                        String.format("Category with id %d not found", request.getCategoryId())));  
  
        final var operation = operationMapper.toEntity(request);  
//        operation.setCategory(category);  // ОШИБКА!  

        final var savedOperation = operationRepository.save(operation);  
        return operationMapper.toDto(savedOperation);  
    }

Тест не обнаружит эту ошибку! Как исправить? Использовать ArgumentCaptor, чтобы перехватить объект, переданный в save().

Исправленный вариант теста с ArgumentCaptor

@Captor  
ArgumentCaptor operationArgumentCaptor;

@Test  
void createOperation_Success() {  
    // Arrange  
    when(categoryRepository.findById(1L)).thenReturn(Optional.of(category));  
    when(operationMapper.toEntity(createRequest)).thenReturn(operation);  
    when(operationRepository.save(any(Operation.class))).thenReturn(operation);  
    when(operationMapper.toDto(operation)).thenReturn(operationResponse);  
  
    // Act  
    OperationResponse result = operationService.createOperation(createRequest);  
  
    // Assert  
    assertThat(result).isNotNull();  
    assertThat(result.getPublicId()).isEqualTo("test-public-id");  

    // Перехватываем переданный в save объект
    //captor можно вставить в verify блоке или в when блоке и там и там он отработает корректно
    verify(operationRepository).save(operationArgumentCaptor.capture());  
    assertEquals(1, operationArgumentCaptor.getAllValues().size());  

    // Проверяем, что категория была установлена  
    var savedOperation = operationArgumentCaptor.getValue();  
    assertEquals(category, savedOperation.getCategory());  
}

Теперь тест проверяет корректность объекта, а не просто его тип.

Избыточные данные в setUp методе

Рассмотрим всё тот же тест createOperation_Success(). Как createOperation() работает в коде:

  1. Ищет категорию в БД

  2. Маппит OperationCreateRequest в Operation

  3. Устанавливает категорию в объект Operation

  4. Сохраняет объект Operaion

В тесте объект Operation создаётся один раз в setUp()но уже с установленной категорией. Затем этот объект возвращается в моке

when(operationMapper.toEntity(createRequest)).thenReturn(operation);

Данная реализация снижает качество теста: часть логики createOperation() не проверяется. В будущем это может привести к багам, которые останутся незамеченными.

Кодстайл и "вкусовщина"

  • Тестируемый класс назван operationService вместо sut (System Under Test), по второму варианту сразу видно, какой сервис тестируется

  • Генерация тестовых данных вынесена в @BeforeEach, но не все данные нужны в каждом тесте. Лучше вынести в приватный метод и вызывать в нужных местах.

private OperationCreateRequest buildCreateRequest() {
    return new OperationCreateRequest("Тест", 100.0, "WITHDRAW", 1L);
}

Так тесты будут чище и понятнее.

PR с unit тестами
https://github.com/nzinovev/anthropic-claude/pull/10

MVC-тесты

Юнит-тесты готовы, теперь попросил Клода написать MVC-тесты для контроллера.

Запрос к Клоду

Write a MVC-tests for OperationController. This is a reminder of what code is contained in the OperationController

@RestController  
@RequestMapping("/api/v1/operations")  
@RequiredArgsConstructor  
public class OperationController {  
  
    private final OperationService operationService;  
  
    @PostMapping  
    @ResponseStatus(HttpStatus.CREATED)  
    public OperationResponse createOperation(@Valid @RequestBody OperationCreateRequest request) {  
        return operationService.createOperation(request);  
    }  
  
    @PutMapping("/{publicId}")  
    public OperationResponse updateOperation(  
            @PathVariable String publicId,  
            @RequestBody OperationUpdateRequest request) {  
        return operationService.updateOperation(publicId, request);  
    }  
  
    @GetMapping  
    public PageResponse<OperationResponse> findAll(  
            @RequestParam(defaultValue = "0") int page,  
            @RequestParam(defaultValue = "20") int size,  
            @RequestParam(defaultValue = "publicId") String sortBy,  
            @RequestParam(defaultValue = "DESC") Sort.Direction direction) {  
        final var pageRequest = PageRequest.of(  
                page,  
                size,  
                Sort.by(direction, sortBy)  
        );  
  
        return operationService.findAll(pageRequest);  
    }  
  
    @GetMapping("/{publicId}")  
    public OperationResponse findByPublicId(@PathVariable String publicId) {  
        return operationService.findByPublicId(publicId);  
    }  
  
    @DeleteMapping("/{publicId}")  
    @ResponseStatus(HttpStatus.NO_CONTENT)  
    public void deleteOperation(@PathVariable String publicId) {  
        operationService.deleteOperation(publicId);  
    }  
}

@Data  
public class OperationResponse {  
    private String publicId;  
    private String name;  
    private BigDecimal amount;  
    private OperationType type;  
    private Long categoryId;  
}

@Data  
public class OperationCreateRequest {  
    @NotBlank(message = "Operation name is required")  
    @Size(max = 255, message = "Operation name must not exceed 255 characters")  
    private String name;  
    @NotNull(message = "Amount is required")  
    @Positive(message = "Amount must be positive")  
    @Digits(integer = 20, fraction = 2, message = "Amount must have at most 20 digits and 2 decimal places")  
    private BigDecimal amount;  
    @NotNull(message = "Operation type is required")  
    private OperationType type;  
    @NotNull(message = "Category ID is required")  
    @Positive(message = "Category ID must be positive")  
    private Long categoryId;  
}

@Data  
public class OperationUpdateRequest {  
    private String name;  
    private BigDecimal amount;  
    private OperationType type;  
    private Long categoryId;  
}
Ответ Клода

I'll write comprehensive MVC tests for the OperationController using Spring's MockMvc:

// src/test/java/com/yourcompany/controller/OperationControllerTest.java

package com.yourcompany.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.yourcompany.domain.entity.OperationType;
import com.yourcompany.dto.*;
import com.yourcompany.exception.CategoryNotFoundException;
import com.yourcompany.service.OperationService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

import java.math.BigDecimal;
import java.util.List;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@WebMvcTest(OperationController.class)
class OperationControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private OperationService operationService;

    private OperationCreateRequest createRequest;
    private OperationUpdateRequest updateRequest;
    private OperationResponse operationResponse;
    private PageResponse pageResponse;

    @BeforeEach
    void setUp() {
        createRequest = new OperationCreateRequest();
        createRequest.setName("Test Operation");
        createRequest.setAmount(BigDecimal.valueOf(100));
        createRequest.setType(OperationType.DEPOSIT);
        createRequest.setCategoryId(1L);

        updateRequest = new OperationUpdateRequest();
        updateRequest.setName("Updated Operation");
        updateRequest.setAmount(BigDecimal.valueOf(200));
        updateRequest.setType(OperationType.WITHDRAWAL);
        updateRequest.setCategoryId(2L);

        operationResponse = new OperationResponse();
        operationResponse.setPublicId("test-public-id");
        operationResponse.setName("Test Operation");
        operationResponse.setAmount(BigDecimal.valueOf(100));
        operationResponse.setType(OperationType.DEPOSIT);
        operationResponse.setCategoryId(1L);

        pageResponse = new PageResponse&lt;&gt;();
        pageResponse.setContent(List.of(operationResponse));
        pageResponse.setPageNumber(0);
        pageResponse.setPageSize(20);
        pageResponse.setTotalElements(1);
        pageResponse.setTotalPages(1);
        pageResponse.setLast(true);
    }

    @Test
    void createOperation_Success() throws Exception {
        when(operationService.createOperation(any(OperationCreateRequest.class)))
                .thenReturn(operationResponse);

        mockMvc.perform(post("/api/v1/operations")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(createRequest)))
                .andExpect(status().isCreated())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath("$.publicId").value("test-public-id"))
                .andExpect(jsonPath("$.name").value("Test Operation"))
                .andExpect(jsonPath("$.amount").value(100))
                .andExpect(jsonPath("$.type").value("DEPOSIT"))
                .andExpect(jsonPath("$.categoryId").value(1));

        verify(operationService).createOperation(any(OperationCreateRequest.class));
    }

    @Test
    void createOperation_ValidationFailure() throws Exception {
        createRequest.setName("");
        createRequest.setAmount(BigDecimal.valueOf(-100));
        createRequest.setType(null);
        createRequest.setCategoryId(null);

        mockMvc.perform(post("/api/v1/operations")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(createRequest)))
                .andExpect(status().isBadRequest())
                .andExpect(jsonPath("$.errors").isArray())
                .andExpect(jsonPath("$.errors.length()").value(4));

        verify(operationService, never()).createOperation(any());
    }

    @Test
    void createOperation_CategoryNotFound() throws Exception {
        when(operationService.createOperation(any()))
                .thenThrow(new CategoryNotFoundException("Category not found"));

        mockMvc.perform(post("/api/v1/operations")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(createRequest)))
                .andExpect(status().isNotFound())
                .andExpect(jsonPath("$.errors[0].message").value("Category not found"));
    }

    @Test
    void updateOperation_Success() throws Exception {
        when(operationService.updateOperation(eq("test-public-id"), any(OperationUpdateRequest.class)))
                .thenReturn(operationResponse);

        mockMvc.perform(put("/api/v1/operations/test-public-id")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(updateRequest)))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath("$.publicId").value("test-public-id"));

        verify(operationService).updateOperation(eq("test-public-id"), any(OperationUpdateRequest.class));
    }

    @Test
    void updateOperation_NotFound() throws Exception {
        when(operationService.updateOperation(eq("non-existent-id"), any()))
                .thenThrow(new RuntimeException("Operation not found"));

        mockMvc.perform(put("/api/v1/operations/non-existent-id")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(updateRequest)))
                .andExpect(status().isInternalServerError());
    }

    @Test
    void findAll_Success() throws Exception {
        PageRequest expectedPageRequest = PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "publicId"));
        when(operationService.findAll(expectedPageRequest)).thenReturn(pageResponse);

        mockMvc.perform(get("/api/v1/operations"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath("$.content").isArray())
                .andExpect(jsonPath("$.content.length()").value(1))
                .andExpect(jsonPath("$.pageNumber").value(0))
                .andExpect(jsonPath("$.pageSize").value(20))
                .andExpect(jsonPath("$.totalElements").value(1));

        verify(operationService).findAll(any(PageRequest.class));
    }

    @Test
    void findAll_WithCustomPagination() throws Exception {
        PageRequest customPageRequest = PageRequest.of(1, 10, Sort.by(Sort.Direction.ASC, "name"));
        when(operationService.findAll(any(PageRequest.class))).thenReturn(pageResponse);

        mockMvc.perform(get("/api/v1/operations")
                        .param("page", "1")
                        .param("size", "10")
                        .param("sortBy", "name")
                        .param("direction", "ASC"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON));

        verify(operationService).findAll(any(PageRequest.class));
    }

    @Test
    void findByPublicId_Success() throws Exception {
        when(operationService.findByPublicId("test-public-id")).thenReturn(operationResponse);

        mockMvc.perform(get("/api/v1/operations/test-public-id"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(jsonPath("$.publicId").value("test-public-id"));

        verify(operationService).findByPublicId("test-public-id");
    }

    @Test
    void findByPublicId_NotFound() throws Exception {
        when(operationService.findByPublicId("non-existent-id"))
                .thenThrow(new RuntimeException("Operation not found"));

        mockMvc.perform(get("/api/v1/operations/non-existent-id"))
                .andExpect(status().isInternalServerError());
    }

    @Test
    void deleteOperation_Success() throws Exception {
        doNothing().when(operationService).deleteOperation("test-public-id");

        mockMvc.perform(delete("/api/v1/operations/test-public-id"))
                .andExpect(status().isNoContent());

        verify(operationService).deleteOperation("test-public-id");
    }

    @Test
    void deleteOperation_NotFound() throws Exception {
        doThrow(new RuntimeException("Operation not found"))
                .when(operationService).deleteOperation("non-existent-id");

        mockMvc.perform(delete("/api/v1/operations/non-existent-id"))
                .andExpect(status().isInternalServerError());
    }
}

Что пошло не так?

Все тесты проходят, кроме трёх:

  • findByPublicId_NotFound

  • deleteOperation_NotFound

  • updateOperation_NotFound

И здесь очень интересны момент, Клод ожидает, что сервис вернёт 500-ю ошибку, но на самом деле он должен отвечать 404-й (и название теста на это намекает). Тест изначально не проходил, потому что Клод никогда не добавлял обработку 500-х ошибок в ExceptionHandler. Если бы тест ожидал 404-ю ошибку, то он всё равно бы падал, т.к. при обработке валидации, была добавлена обработка лишь CategoryNotFoundException, но есть и плюс: тесты падают, а значит, их нельзя игнорировать. Это даёт шанс исправить ошибку вовремя.

Исправляем: добавляем общее исключение NotFoundException и обработку RuntimeException:

@ExceptionHandler(NotFoundException.class)  
@ResponseStatus(HttpStatus.NOT_FOUND)  
public ValidationErrorResponse handleCategoryNotFoundException(NotFoundException ex) {  
    ValidationErrorResponse response = new ValidationErrorResponse();  
    response.getErrors().add(new ValidationErrorResponse.ValidationError(  
            "id",  
            ex.getMessage()  
    ));  
    return response;  
}  
  
@ExceptionHandler(Exception.class)  
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  
public ErrorDto handleException(Exception ex) {  
    return new ErrorDto(ex.getMessage());  
}  
  
private record ErrorDto(String message){}

Теперь сервис корректно возвращает 404 в случае отсутствия объекта.

Разбираем тесты

Клод в целом справился, но есть несколько проблем. Тест createOperation_Success проверяет результат через jsonPath:

.andExpect(jsonPath("$.publicId").value("test-public-id"))  
.andExpect(jsonPath("$.name").value("Test Operation"))  
.andExpect(jsonPath("$.amount").value(100))  

Проверки через jsonPath неудобны, их тяжелее читать, особенно если в модели присутствует вложенность или массив данных. Вариант с хранением json-файла с ожидаемым результатом будет намного проще.

Тест findAll_WithCustomPagination совсем не проверяет возвращаемый результат, он подготовлен, но не добавлен в проверку. findByPublicId_Success проверяет лишь id, хотя в beforeEach подготовлен целый объект.

На первый взгляд может показаться, что Клод справился хорошо но если приглядеться– не хватает проверок, а кое-где они просто отсутствуют.

PR с MVC тестами
https://github.com/nzinovev/anthropic-claude/pull/11

Итоги

Мы прошли по минимальному циклу разработки, используя ИИ:

  • Создали БД, таблицы и сущности.

  • Реализовали взаимодействие с БД через Spring JPA.

  • Написали CRUD-операции и обработку ошибок.

  • Добавили юнит-тесты и MVC-тесты.

Впечатления

Справился ли Клод с поставленной задачей?

Да, он выдал рабочий код, который можно было довести до финального состояния.

Написал ли он код уровня сеньора?

Нет. Код требовал исправлений и доработок. Клод допускал ошибки, которые опытный разработчик избежал бы сразу.

Может ли человек без опыта программирования получить такую же выдачу?

Нет, Клод справился только потому, что получал чёткие требования и правильную настройку. ИИ может писать код, но только если задающий понимает, что именно он хочет получить.

ИИ в разработке: помощник или замена?

Можно ли использовать ИИ в реальной работе?
Не просто можно, а нужно. ИИ существенно ускоряет разработку, но важно понимать его ограничения.

Ключевые принципы работы с ИИ

Чем лучше подготовлен промпт, тем лучше выдача

  • Если промпт размытый – код будет неполным или некорректным.

  • Если задать чёткий запрос – модель выдаст качественный код.

Чем меньше задача, тем выше качество

  • ИИ отлично справляется с небольшими блоками кода.

  • Если же попросить его реализовать большой модуль, он может упустить детали или перегрузить выдачу.

ИИ эффективен как помощник в написании небольших фрагментов кода, но для сложных задач нужен контроль со стороны разработчика.

Риски использования ИИ в разработке

ИИ не гарантирует идеальный код и может нести потенциальные риски.

Не стоит слепо доверять выдаче.

ИИ не анализирует код так, как разработчик. Он может допустить ошибки, которые незаметны сразу, но в будущем приведут к багам.

Конфиденциальность данных.

При работе с большими моделям такими как ChatGPT и Claude нужно быть осторожными с чувствительными и корпоративными данными. Передача кода в публичные LLM-модели несёт риск утечки данных.

Как защитить данные?

Не отправляйте коммерчески важный код в LLM. Если же вы это делаете, обязательно анонимизируйте данные перед отправкой.

Если конфиденциальность критична и анонимизация затруднена, рассмотрите вариант использования локальных LLM. Большой плюс таких моделей, что они локальны, следовательно, ваши данные не покинут просторы вашего ПК.

Нестабильное качество выдачи.

Код от ИИ бывает отличным, средним или откровенно плохим. Качество зависит не от модели, а от того, кто задаёт вопросы. ИИ – мощный инструмент, но бездумное использование может привести к проблемам.

Заменит ли ИИ разработчиков?

Когда-то – возможно. Но точно не сейчас.

ИИ пишет код, но не понимает его так, как человек.
Самая сложная часть разработки – архитектура, бизнес-логика, работа с требованиямиостаются за человеком.

ИИ – не замена, а мощный инструмент. Разработчик, который использует ИИ, будет писать код быстрее, эффективнее и качественнее. Разработчик, который не использует ИИ, будет работать дольше и медленнее.

ИИ – это не враг, а помощник, который ускоряет работу и снимает рутину.

Что дальше?

Мы рассмотрели три из четырёх поставленных вопросов. Осталось ответить на последний, какая модель лучше для программирования? Anthropic Claude? ChatGPT? DeepSeek?

Об этом – в следующей части.

Оставайтесь на связи.

p.s. Если было интересно, заходи https://t.me/nizeEcho

Источник

  • 22.01.26 07:48 Kelvin Alfons

    Hello everyone. I’d like to share my personal experience from one of the most challenging times in my life. I’m based in Sydney, Australia, and on November 13, 2025, I fell victim to a fraudulent cryptocurrency investment platform that promised substantial financial growth.  Believing their claims, I invested a total of $220,000 with the expectation of earning solid returns. However, when I attempted to withdraw my funds, all communication abruptly stopped. My calls were ignored, my emails went unanswered, and I was left feeling completely powerless. Like many others, I had heard that Bitcoin transactions are impossible to trace, so I assumed my money was lost forever.  After some time, I discovered information about GREAT WHIP RECOVERY CYBER SERVICES, a reputable digital asset recovery firm. I decided to reach out to them, and to my astonishment, they were able to help me recover the full amount I had lost.  I’m sharing my story in the hope that it may help someone else who is going through a similar situation and looking for support. Their contact is, Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Email:[email protected] Call: +1(406)2729101

  • 22.01.26 07:50 Kelvin Alfons

    Hello everyone. I’d like to share my personal experience from one of the most challenging times in my life. I’m based in Sydney, Australia, and on November 13, 2025, I fell victim to a fraudulent cryptocurrency investment platform that promised substantial financial growth.  Believing their claims, I invested a total of $220,000 with the expectation of earning solid returns. However, when I attempted to withdraw my funds, all communication abruptly stopped. My calls were ignored, my emails went unanswered, and I was left feeling completely powerless. Like many others, I had heard that Bitcoin transactions are impossible to trace, so I assumed my money was lost forever.  After some time, I discovered information about GREAT WHIP RECOVERY CYBER SERVICES, a reputable digital asset recovery firm. I decided to reach out to them, and to my astonishment, they were able to help me recover the full amount I had lost.  I’m sharing my story in the hope that it may help someone else who is going through a similar situation and looking for support. Their contact is, Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Email:[email protected] Call: +1(406)2729101

  • 22.01.26 10:42 Tonerdomark

    I got my money back from the Elon Musk scam. It cost me over 1 BTC and $55,000 in Dogecoin. Scammers vowed to double investments. Their sites seemed real. Fraud was tough to catch early. They hooked me with fast doubles in weeks or months. Videos showed Musk promising giveaways and gains. I bought in. I sent Bitcoin and Dogecoin in bits at first. Small sends worked. Then I wired my full savings. It vanished quick. No answers came. Bank account empty. Bills piled up. Loans covered rent and food. Sleep fled. Stress hit hard. Life crumbled. A friend spotted my trouble. He told of his scam loss last year. Same old plays. He pointed me to Sylvester Bryant, a recovery expert. Email Yt7cracker@gmail. com. WhatsApp +1 512 577 7957 or +44 7428 662701. Sylvester acted fast. He tracked blockchain trails. Dealt with exchanges. Outsmarted the scammers. In weeks, my Bitcoin came back. Even their phony profits too. Debts gone. Life back on track. Got hit? Contact him now.

  • 22.01.26 19:25 Angela_Moore

    Help to recover money from elon musk giveaway scam I got my money back from the Elon Musk scam. It cost me over 1 BTC and $55,000 in Dogecoin. Scammers vowed to double investments. Their sites seemed real. Fraud was tough to catch early. They hooked me with fast doubles in weeks or months. Videos showed Musk promising giveaways and gains. I bought in. I sent Bitcoin and Dogecoin in bits at first. Small sends worked. Then I wired my full savings. It vanished quick. No answers came. Bank account empty. Bills piled up. Loans covered rent and food. Sleep fled. Stress hit hard. Life crumbled. A friend spotted my trouble. He told of his scam loss last year. Same old plays. He pointed me to Sylvester Bryant, a recovery expert. Email Yt7cracker@gmail. com. WhatsApp +1 512 577 7957 or +44 7428 662701. Sylvester acted fast. He tracked blockchain trails. Dealt with exchanges. Outsmarted the scammers. In weeks, my Bitcoin came back. Even their phony profits too. Debts gone. Life back on track. Got hit? Contact him now.

  • 23.01.26 07:35 Kelvin Alfons

    Hello everyone. I’d like to share my personal experience from one of the most challenging times in my life. I’m based in Sydney, Australia, and on November 13, 2025, I fell victim to a fraudulent cryptocurrency investment platform that promised substantial financial growth.  Believing their claims, I invested a total of $220,000 with the expectation of earning solid returns. However, when I attempted to withdraw my funds, all communication abruptly stopped. My calls were ignored, my emails went unanswered, and I was left feeling completely powerless. Like many others, I had heard that Bitcoin transactions are impossible to trace, so I assumed my money was lost forever.  After some time, I discovered information about GREAT WHIP RECOVERY CYBER SERVICES, a reputable digital asset recovery firm. I decided to reach out to them, and to my astonishment, they were able to help me recover the full amount I had lost.  I’m sharing my story in the hope that it may help someone else who is going through a similar situation and looking for support. Their contact is, Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Email:[email protected] Call: +1(406)2729101

  • 23.01.26 07:35 Kelvin Alfons

    Hello everyone. I’d like to share my personal experience from one of the most challenging times in my life. I’m based in Sydney, Australia, and on November 13, 2025, I fell victim to a fraudulent cryptocurrency investment platform that promised substantial financial growth.  Believing their claims, I invested a total of $220,000 with the expectation of earning solid returns. However, when I attempted to withdraw my funds, all communication abruptly stopped. My calls were ignored, my emails went unanswered, and I was left feeling completely powerless. Like many others, I had heard that Bitcoin transactions are impossible to trace, so I assumed my money was lost forever.  After some time, I discovered information about GREAT WHIP RECOVERY CYBER SERVICES, a reputable digital asset recovery firm. I decided to reach out to them, and to my astonishment, they were able to help me recover the full amount I had lost.  I’m sharing my story in the hope that it may help someone else who is going through a similar situation and looking for support. Their contact is, Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Email:[email protected] Call: +1(406)2729101

  • 26.01.26 10:36 alksnismareks

    It all started when I decided to explore online trading as a way to grow my savings. Like many, I trusted what appeared to be a legitimate platform, only to find myself trapped in a nightmare. After making consistent trades and finally deciding to withdraw my profits, I was met with silence. My account was suddenly restricted—no warning, no explanation. Every attempt to contact the broker went unanswered or was met with vague, dismissive replies. For three long, agonizing months, I lived in uncertainty. I couldn’t sleep at night. I replayed every email, every transaction, wondering if I’d made a mistake. But deep down, I knew the truth: I hadn’t done anything wrong. The broker had simply decided to lock me out and keep my money. During that time, I felt completely powerless—like I was shouting into a void. The stress affected my health, my relationships, and my ability to focus on anything else. There were days I truly believed that $167,000 was gone forever, lost to the shadows of the unregulated online trading world. I even began to accept it as a painful lesson—one that would cost me dearly but might teach me to be more cautious in the future. But something inside me refused to surrender completely. That’s when I discovered TechY Force Cyber Retrieval. At first, I was cautious—after being scammed once, I didn’t want to fall victim again. But everything about TechY Force felt different. They were transparent from the start. No grand promises, no pressure tactics. Just clear, professional communication and a deep understanding of how these fraudulent brokers operate. Most importantly, they are a licensed specialist in binary options and forex fund recovery, which gave me the confidence to move forward. From our very first consultation, their team treated my case with urgency and empathy. They walked me through the entire process, explained the legal and technical avenues available, and assured me they would handle every detail. They collected documentation, analyzed transaction trails, and engaged directly with the payment processors and the broker using precise, strategic methods I never could have navigated on my own. What happened next was nothing short of miraculous. Within weeks, the broker—who had ignored me for months—began responding. And then, without any further drama or delays, my full $167,000 USD was returned to me. No deductions. No hidden fees. Just clean, complete recovery. The relief I felt was indescribable. It wasn’t just about the money—it was about reclaiming control, restoring trust, and proving that even in the face of deception, there are still good people who fight for what’s right. If you’ve been locked out of your trading account, scammed by a fake investment platform, or had your funds unjustly withheld, please know this: you are not alone, and your money may not be lost forever. Thanks to TechY Force Cyber Retrieval, I got my life back. Their expertise, integrity, and unwavering commitment turned my despair into deliverance. I cannot recommend them highly enough. To anyone reading this in distress: don’t give up. Reach out. Take that step. Because if someone like me—broken, doubtful, and nearly hopeless—can recover every dollar… so can you. WhatsApp them + 156 172 63 697 With heartfelt thanks and renewed hope, — A Recovered and Grateful Client

  • 26.01.26 23:21 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 26.01.26 23:21 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 26.01.26 23:21 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 27.01.26 01:18 Kelvin Alfons

    Hello everyone. I’d like to share my personal experience from one of the most challenging times in my life. I’m based in Sydney, Australia, and on November 13, 2025, I fell victim to a fraudulent cryptocurrency investment platform that promised substantial financial growth.  Believing their claims, I invested a total of $220,000 with the expectation of earning solid returns. However, when I attempted to withdraw my funds, all communication abruptly stopped. My calls were ignored, my emails went unanswered, and I was left feeling completely powerless. Like many others, I had heard that Bitcoin transactions are impossible to trace, so I assumed my money was lost forever.  After some time, I discovered information about GREAT WHIP RECOVERY CYBER SERVICES, a reputable digital asset recovery firm. I decided to reach out to them, and to my astonishment, they were able to help me recover the full amount I had lost.  I’m sharing my story in the hope that it may help someone else who is going through a similar situation and looking for support. Their contact is, Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Email:[email protected] Call: +1(406)2729101

  • 27.01.26 01:19 Kelvin Alfons

    Hello everyone. I’d like to share my personal experience from one of the most challenging times in my life. I’m based in Sydney, Australia, and on November 13, 2025, I fell victim to a fraudulent cryptocurrency investment platform that promised substantial financial growth.  Believing their claims, I invested a total of $220,000 with the expectation of earning solid returns. However, when I attempted to withdraw my funds, all communication abruptly stopped. My calls were ignored, my emails went unanswered, and I was left feeling completely powerless. Like many others, I had heard that Bitcoin transactions are impossible to trace, so I assumed my money was lost forever.  After some time, I discovered information about GREAT WHIP RECOVERY CYBER SERVICES, a reputable digital asset recovery firm. I decided to reach out to them, and to my astonishment, they were able to help me recover the full amount I had lost.  I’m sharing my story in the hope that it may help someone else who is going through a similar situation and looking for support. Their contact is, Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Email:[email protected] Call: +1(406)2729101

  • 27.01.26 09:29 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 27.01.26 09:29 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 27.01.26 09:32 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 29.01.26 05:03 joyo

    The digital world of cryptocurrency offers big chances, but it also hides tricky scams. Losing your crypto to fraud feels awful. It can leave you feeling lost and violated. This guide tells you what to do right away if a crypto scam has hit you. These steps can help you get funds back or stop more trouble. Knowing what to do fast can change everything,reach marie ([email protected] and whatsapp:+1 7127594675)

  • 30.01.26 08:23 joseph67t

    It's a joy to write this review. Since I began working with Marie at the beginning of 2018, the service has been outstanding. Hackers stole my monies, and I was frightened about how I would get them back. I didn't know where to begin, consequently it was a nightmare for me. But once my friend told me about ([email protected] and whatsap:+1 7127594675), things became simple for me. I'm glad she was able to get my bitcoin back so I could start trading on Binance again!

  • 31.01.26 00:55 harristhomas7376

    "In the crypto world, this is great news I want to share. Last year, I fell victim to a scam disguised as a safe investment option. I have invested in crypto trading platforms for about 10yrs thinking I was ensuring myself a retirement income, only to find that all my assets were either frozen, I believed my assets were secure — until I discovered that my BTC funds had been frozen and withdrawals were impossible. It was a devastating moment when I realized I had been scammed, and I thought my Bitcoin was gone forever, Everything changed when a close friend recommended the Capital Crypto Recover Service. Their professionalism, expertise, and dedication enabled me to recover my lost Bitcoin funds back — more than €560.000 DEM to my BTC wallet. What once felt impossible became a reality thanks to their support. If you have lost Bitcoin through scams, hacking, failed withdrawals, or similar challenges, don’t lose hope. I strongly recommend Capital Crypto Recover Service to anyone seeking a reliable and effective solution for recovering any wallet assets. They have a proven track record of successful reputation in recovering lost password assets for their clients and can help you navigate the process of recovering your funds. Don’t let scammers get away with your hard-earned money – contact Email: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Contact: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 31.01.26 00:55 harristhomas7376

    "In the crypto world, this is great news I want to share. Last year, I fell victim to a scam disguised as a safe investment option. I have invested in crypto trading platforms for about 10yrs thinking I was ensuring myself a retirement income, only to find that all my assets were either frozen, I believed my assets were secure — until I discovered that my BTC funds had been frozen and withdrawals were impossible. It was a devastating moment when I realized I had been scammed, and I thought my Bitcoin was gone forever, Everything changed when a close friend recommended the Capital Crypto Recover Service. Their professionalism, expertise, and dedication enabled me to recover my lost Bitcoin funds back — more than €560.000 DEM to my BTC wallet. What once felt impossible became a reality thanks to their support. If you have lost Bitcoin through scams, hacking, failed withdrawals, or similar challenges, don’t lose hope. I strongly recommend Capital Crypto Recover Service to anyone seeking a reliable and effective solution for recovering any wallet assets. They have a proven track record of successful reputation in recovering lost password assets for their clients and can help you navigate the process of recovering your funds. Don’t let scammers get away with your hard-earned money – contact Email: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Contact: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 02.02.26 18:52 Christopherbelle

    Sylvester Bryant is a top crypto recovery agent! Then I contacted them with my story that i have been scammed. It took time, yet my stolen crypto was recovered . Need help? Reach out to Sylvester on WhatsApp at +1 512 577 7957 or +44 7428 662701. Or email yt7cracker@gmail . com.

  • 03.02.26 08:05 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 03.02.26 08:05 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 04.02.26 16:23 borutaralf

    GREAT WHIP RECOVERY CYBER SERVICES TRUSTED EXPERTS IN ONLINE RECOVERY SOLUTIONS PHONE CALL:+1(406)2729101 I was unfortunately deceived and scammed out of $88,000 by someone I trusted to manage my funds during a transaction we carried out together. The experience left me deeply disappointed and hurt, realizing that someone could betray that level of trust without any remorse. Determined to seek justice and recover what was stolen, I began searching for legal assistance and came across numerous testimonials about GREAT WHIP RECOVERY CYBER SERVICES, a group known for helping victims recover lost funds. From what I learned, they have successfully assisted many people facing similar situations, returning stolen funds to their rightful owners in a remarkably short time. In my case, the GREAT WHIP RECOVERY CYBER SERVICES were able to recover my funds within just 48 hours, which was truly unbelievable. Even more reassuring was the fact that the scammer was identified, located, and eventually arrested by local authorities in his region. That outcome brought a great sense of relief and closure. I hope this information helps others who have lost their hard-earned money due to misplaced trust. If you’re in a similar situation, you can contact them through their info below to seek help in recovering your stolen funds.  Email: [email protected]  Website https://greatwhiprecoveryc.wixsite.com/greatwhip-site  Phone Call:+1(406)2729101

  • 04.02.26 16:24 borutaralf

    GREAT WHIP RECOVERY CYBER SERVICES TRUSTED EXPERTS IN ONLINE RECOVERY SOLUTIONS PHONE CALL:+1(406)2729101 I was unfortunately deceived and scammed out of $88,000 by someone I trusted to manage my funds during a transaction we carried out together. The experience left me deeply disappointed and hurt, realizing that someone could betray that level of trust without any remorse. Determined to seek justice and recover what was stolen, I began searching for legal assistance and came across numerous testimonials about GREAT WHIP RECOVERY CYBER SERVICES, a group known for helping victims recover lost funds. From what I learned, they have successfully assisted many people facing similar situations, returning stolen funds to their rightful owners in a remarkably short time. In my case, the GREAT WHIP RECOVERY CYBER SERVICES were able to recover my funds within just 48 hours, which was truly unbelievable. Even more reassuring was the fact that the scammer was identified, located, and eventually arrested by local authorities in his region. That outcome brought a great sense of relief and closure. I hope this information helps others who have lost their hard-earned money due to misplaced trust. If you’re in a similar situation, you can contact them through their info below to seek help in recovering your stolen funds.  Email: [email protected]  Website https://greatwhiprecoveryc.wixsite.com/greatwhip-site  Phone Call:+1(406)2729101

  • 04.02.26 17:11 wendytaylor015

    My name is Wendy Taylor, I'm from Los Angeles, i want to announce to you Viewer how Capital Crypto Recover help me to restore my Lost Bitcoin, I invested with a Crypto broker without proper research to know what I was hoarding my hard-earned money into scammers, i lost access to my crypto wallet or had your funds stolen? Don’t worry Capital Crypto Recover is here to help you recover your cryptocurrency with cutting-edge technical expertise, With years of experience in the crypto world, Capital Crypto Recover employs the best latest tools and ethical hacking techniques to help you recover lost assets, unlock hacked accounts, Whether it’s a forgotten password, Capital Crypto Recover has the expertise to help you get your crypto back. a security company service that has a 100% success rate in the recovery of crypto assets, i lost wallet and hacked accounts. I provided them the information they requested and they began their investigation. To my surprise, Capital Crypto Recover was able to trace and recover my crypto assets successfully within 24hours. Thank you for your service in helping me recover my $647,734 worth of crypto funds and I highly recommend their recovery services, they are reliable and a trusted company to any individuals looking to recover lost money. Contact email [email protected] OR Telegram @Capitalcryptorecover Call/Text Number +1 (336)390-6684 his contact: [email protected] His website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 05.02.26 12:07 Thomas Muller

    YOU CAN REACH OUT TO GREAT WHIP RECOVERY CYBER SERVICES FOR HELP TO RECOVER YOUR STOLEN BTC OR ETH BACK CALL:+1(406)2729101 I once fell victim to online investment scheme that cost me a devastating €254,000. I’m Thomas Muller from Berlin, Germany. The person I trusted turned out to be a fraud, and the moment I realized I’d been deceived, my entire world stopped. I immediately began searching for legitimate ways to recover my funds and hold the scammer accountable. During my search, I came across several testimonies of how Great Whip Recovery Cyber Services helped some people recover money they lost to cyber fraud, I contacted Great Whip Recovery Cyber Service team and provided all the evidence I had. Within about 36 hours, the experts traced the digital trail left by the fraudster, the individual was eventually tracked down and I recovered all my money back. You can contact them with,  website https://greatwhiprecoveryc.wixsite.com/greatwhip-site  text +1(406)2729101 email [email protected]

  • 05.02.26 15:46 feliciabotezatu

    Losing access to your cryptocurrency can be devastating—whether you’ve been scammed, hacked, or locked out due to a forgotten password. Many assume their digital assets are gone forever. But with the right expertise, recovery is not only possible—it’s our daily reality. At TECHY FORCE CYBER RETRIEVAL (TFCR), we’re a globally recognized, fully legitimate crypto recovery service dedicated to helping victims reclaim lost or stolen digital assets—safely, ethically, and effectively. Who We Are Backed by a team of certified blockchain forensic analysts, cybersecurity specialists, and ethical hackers, TFCR has recovered millions of dollars in Bitcoin, Ethereum, USDT, and other major cryptocurrencies for clients worldwide. We specialize in cases involving: - Investment scams and fake platforms - Wallet hacks and unauthorized transactions - Forgotten passwords, seed phrases, or corrupted backups - Inaccessible hardware or software wallets Our mission is clear: Help you recover what’s rightfully yours—with honesty, transparency, and proven results. How We Work 1. Confidential Case Review Share your situation with us—no cost, no obligation. We assess whether your case is recoverable based on transaction data, wallet details, and loss type. 2. Advanced Blockchain Forensics Using industry-leading tools, we trace your funds across blockchains, identify destination addresses, and determine if assets are held on exchanges or recoverable platforms—even after complex laundering attempts. 3. Custom Recovery Execution Depending on your case, we: - Reconstruct access to locked wallets using secure decryption methods - Engage with exchanges or payment processors to freeze or retrieve funds - Provide forensic reports to support legal or compliance actions - Negotiate with third parties when appropriate and safe 4. Secure Return & Prevention Advice Recovered assets go directly to a wallet you control. We also offer practical guidance to help you avoid future losses—because security starts after recovery. Why Choose TFCR? No Recovery, No Fee – You only pay upon successful retrieval Legitimate & Transparent – No upfront payments, no hidden costs Global Expertise – Proven success across 50+ countries Ethical Standards – All actions comply with cybersecurity and privacy best practices While crypto threats grow daily, so does our resolve. At TECHY FORCE CYBER RETRIEVAL, we don’t just track transactions—we restore trust, hope, and financial peace of mind. Don’t give up on your crypto. Act now—before critical evidence disappears. 📧 Email: [email protected] 🌐 Visit: Official https://techyforcecyberretrieval.com Website] 🕒 Available 24/7 for urgent cases Your crypto may be missing—but with TFCR, it’s never truly lost. ©️ 2026 TECHY FORCE CYBER RETRIEVAL — Trusted. Professional. Results-Driven.

  • 05.02.26 15:52 harryjones5

    How Can I Contact a Cryptocurrency Recovery Company? Visit iFORCE HACKER RECOVERY  I realize how volatile and thrilling cryptocurrency can be. After joining a Telegram-based service, I made consistent profits for six months before unexpected faults deprived me of approximately $343,000. Withdrawal blunders, little help, and rising dread kept me stuck. I then discovered iForce Hacker Recovery from positive reviews. They replied swiftly, handled my issue professionally, and walked me through every step. My valuables were returned within a week, giving me back my confidence. I heartily recommend their dependable, professional aid services. Contact Info: Website address: htt p:// iforcehackers. co m. Email: iforcehk @ consultant .co m WhatsApp: +1 240 803-3706

  • 06.02.26 14:44 feliciabotezatu

    Losing access to your cryptocurrency can be devastating—whether you’ve been scammed, hacked, or locked out due to a forgotten password. Many assume their digital assets are gone forever. But with the right expertise, recovery is not only possible—it’s our daily reality. At TECHY FORCE CYBER RETRIEVAL (TFCR), we’re a globally recognized, fully legitimate crypto recovery service dedicated to helping victims reclaim lost or stolen digital assets—safely, ethically, and effectively. Who We Are   Backed by a team of certified blockchain forensic analysts, cybersecurity specialists, and ethical hackers, TFCR has recovered millions of dollars in Bitcoin, Ethereum, USDT, and other major cryptocurrencies for clients worldwide. We specialize in cases involving: - Investment scams and fake platforms   - Wallet hacks and unauthorized transactions   - Forgotten passwords, seed phrases, or corrupted backups   - Inaccessible hardware or software wallets   Our mission is clear: Help you recover what’s rightfully yours—with honesty, transparency, and proven results. How We Work   1. Confidential Case Review      Share your situation with us—no cost, no obligation. We assess whether your case is recoverable based on transaction data, wallet details, and loss type. 2. Advanced Blockchain Forensics      Using industry-leading tools, we trace your funds across blockchains, identify destination addresses, and determine if assets are held on exchanges or recoverable platforms—even after complex laundering attempts. 3. Custom Recovery Execution      Depending on your case, we:      - Reconstruct access to locked wallets using secure decryption methods      - Engage with exchanges or payment processors to freeze or retrieve funds      - Provide forensic reports to support legal or compliance actions      - Negotiate with third parties when appropriate and safe   4. Secure Return & Prevention Advice      Recovered assets go directly to a wallet you control. We also offer practical guidance to help you avoid future losses—because security starts after recovery. Why Choose TFCR?   No Recovery, No Fee – You only pay upon successful retrieval   Legitimate & Transparent – No upfront payments, no hidden costs   Global Expertise – Proven success across 50+ countries   Ethical Standards – All actions comply with cybersecurity and privacy best practices   While crypto threats grow daily, so does our resolve. At TECHY FORCE CYBER RETRIEVAL, we don’t just track transactions—we restore trust, hope, and financial peace of mind. Don’t give up on your crypto.   Act now—before critical evidence disappears.   Email: [email protected]   Visit: Official https://techyforcecyberretrieval.com  Website]   Available 24/7 for urgent cases   Your crypto may be missing—but with TFCR, it’s never truly lost.     ©️ 2026 TECHY FORCE CYBER RETRIEVAL — Trusted. Professional. Results-Driven.

  • 07.02.26 00:44 marcushenderson624

    Bitcoin Recovery Testimonial After falling victim to a cryptocurrency scam group, I lost $354,000 worth of USDT. I thought all hope was lost from the experience of losing my hard-earned money to scammers. I was devastated and believed there was no way to recover my funds. Fortunately, I started searching for help to recover my stolen funds and I came across a lot of testimonials online about Capital Crypto Recovery, an agent who helps in recovery of lost bitcoin funds, I contacted Capital Crypto Recover Service, and with their expertise, they successfully traced and recovered my stolen assets. Their team was professional, kept me updated throughout the process, and demonstrated a deep understanding of blockchain transactions and recovery protocols. They are trusted and very reliable with a 100% successful rate record Recovery bitcoin, I’m grateful for their help and highly recommend their services to anyone seeking assistance with lost crypto. Contact: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 07.02.26 00:44 marcushenderson624

    Bitcoin Recovery Testimonial After falling victim to a cryptocurrency scam group, I lost $354,000 worth of USDT. I thought all hope was lost from the experience of losing my hard-earned money to scammers. I was devastated and believed there was no way to recover my funds. Fortunately, I started searching for help to recover my stolen funds and I came across a lot of testimonials online about Capital Crypto Recovery, an agent who helps in recovery of lost bitcoin funds, I contacted Capital Crypto Recover Service, and with their expertise, they successfully traced and recovered my stolen assets. Their team was professional, kept me updated throughout the process, and demonstrated a deep understanding of blockchain transactions and recovery protocols. They are trusted and very reliable with a 100% successful rate record Recovery bitcoin, I’m grateful for their help and highly recommend their services to anyone seeking assistance with lost crypto. Contact: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 07.02.26 04:43 Matt Kegan

    Reach out to SolidBlock Forensics if you want to get back your coins from fake crypto investment or your wallet was compromised and all your coins gone. SolidBlock Forensics provide deep ethical analysis and investigation that enables them to trace these schemes, and recover all your funds. Their services are professional and reliable.  http://www.solidblockforensics.com

  • 07.02.26 17:31 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 10.02.26 23:52 frankqq

    It is a pleasure to write this review. Since I began working with Marie in early 2018, the service has been outstanding. My coins were stolen by hackers, and I was afraid I wouldn't be able to recover them. It was a nightmare for me because I didn't know where to start. But after my friend told me about [email protected] and whatsapp:+1 7127594675, things became simple for me. I'm glad she was able to get my bitcoin back so I could start trading again.

  • 11.02.26 05:50 patricialovick86

    How To Recover Your Bitcoin Without Falling Victim To Scams: A Testimony Experience With Capital Crypto Recover Services, Contact Telegram: @Capitalcryptorecover Dear Everyone, I would like to take a moment to share my positive experience with Capital Crypto Recover Services. Initially, I was unsure if it would be possible to recover my stolen bitcoins. However, with their expertise and professionalism, I was able to fully recover my funds. Unfortunately, many individuals fall victim to scams in the cryptocurrency space, especially those involving fraudulent investment platforms. However, I advise caution, as not all recovery services are legitimate. I personally lost $273,000 worth of Bitcoin from my Binance account due to a deceptive platform. If you have suffered a similar loss, you may be considering crypto recovery, The Capital Crypto Recover is the most knowledgeable and effective Capital Crypto Recovery Services assisted me in recovering my stolen funds within 24 hours, after getting access to my wallet. Their service was not only prompt but also highly professional and effective, and many recovery services may not be trustworthy. Therefore, I highly recommend Capital Crypto Recover to you. i do always research and see reviews about their service, For assistance finding your misplaced cryptocurrency, get in touch with them, They do their jobs quickly and excellently, Stay safe and vigilant in the crypto world. Contact: [email protected] You can reach them via email at [email protected] OR Call/Text Number +1 (336)390-6684 his contact website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 11.02.26 05:50 patricialovick86

    How To Recover Your Bitcoin Without Falling Victim To Scams: A Testimony Experience With Capital Crypto Recover Services, Contact Telegram: @Capitalcryptorecover Dear Everyone, I would like to take a moment to share my positive experience with Capital Crypto Recover Services. Initially, I was unsure if it would be possible to recover my stolen bitcoins. However, with their expertise and professionalism, I was able to fully recover my funds. Unfortunately, many individuals fall victim to scams in the cryptocurrency space, especially those involving fraudulent investment platforms. However, I advise caution, as not all recovery services are legitimate. I personally lost $273,000 worth of Bitcoin from my Binance account due to a deceptive platform. If you have suffered a similar loss, you may be considering crypto recovery, The Capital Crypto Recover is the most knowledgeable and effective Capital Crypto Recovery Services assisted me in recovering my stolen funds within 24 hours, after getting access to my wallet. Their service was not only prompt but also highly professional and effective, and many recovery services may not be trustworthy. Therefore, I highly recommend Capital Crypto Recover to you. i do always research and see reviews about their service, For assistance finding your misplaced cryptocurrency, get in touch with them, They do their jobs quickly and excellently, Stay safe and vigilant in the crypto world. Contact: [email protected] You can reach them via email at [email protected] OR Call/Text Number +1 (336)390-6684 his contact website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 12.02.26 23:55 brouwerspatrick8

    I’ve always believed that sustainability begins at home—not just in how we recycle or conserve energy, but in the very structures we live in. For years, I dreamed of building a zero-waste neighborhood where every house functions like a living ecosystem: solar-powered, water-wise, and crowned with rooftop greenhouses that feed families and filter air. It wasn’t just architecture—it was my vision for a quieter, cleaner future. To make it real, I turned to Bitcoin. Not as a speculative bet, but as a long-term store of value aligned with my values—decentralized, transparent, and independent of broken systems. Over seven years, I poured savings, side income, and relentless discipline into building a $680,000 crypto portfolio. Every coin had a purpose: permits, materials, and community partnerships. My dream had a balance sheet. Then, in one exhausted, distracted moment, it all collapsed. It was November 2025. I was juggling contractor delays, city inspections, and endless design revisions. My nerves were frayed, my coffee pot never empty. When a “Ledger Live Update” notification popped up, I didn’t think twice. The interface looked identical—same logo, same layout. I entered my credentials… and within seconds, the app disappeared. My wallet balance dropped to zero. I sat frozen. My stomach dropped. All that work—years of sacrifice—gone in a blink. The days that followed were dark. I scoured forums, filed reports, and replayed my mistake on loop. Guilt ate at me. How could I have been so careless? My greenhouse renderings sat untouched. My dream felt like a cruel joke. Just when I was ready to walk away, I stumbled upon a newsletter about green innovation. Tucked between articles on carbon-neutral cities and next-gen solar panels was a short feature on *Digital Light Solution*—a specialized team that helps victims of crypto theft recover stolen assets. Skeptical but desperate, I reached out. What followed wasn’t magic—but it was close to it. Their team treated my case with urgency and compassion. They traced the transaction trail, identified the laundering path, and worked with exchanges to freeze what they could. Within weeks, they’d recovered a significant portion of my funds—enough to restart. Today, I’m not just rebuilding my portfolio—I’m breaking ground on my prototype greenhouse. And every beam, every pane of glass, carries the lesson I learned: that even in our most vulnerable moments, there’s still light to be found. [email protected] Telegram ——digitallightsolution website https://digitallightsolution.com/ WHAT'S  APP  https://wa.link/989vlf 

  • 12.02.26 23:56 brouwerspatrick8

    I’ve always believed that sustainability begins at home—not just in how we recycle or conserve energy, but in the very structures we live in. For years, I dreamed of building a zero-waste neighborhood where every house functions like a living ecosystem: solar-powered, water-wise, and crowned with rooftop greenhouses that feed families and filter air. It wasn’t just architecture—it was my vision for a quieter, cleaner future. To make it real, I turned to Bitcoin. Not as a speculative bet, but as a long-term store of value aligned with my values—decentralized, transparent, and independent of broken systems. Over seven years, I poured savings, side income, and relentless discipline into building a $680,000 crypto portfolio. Every coin had a purpose: permits, materials, and community partnerships. My dream had a balance sheet. Then, in one exhausted, distracted moment, it all collapsed. It was November 2025. I was juggling contractor delays, city inspections, and endless design revisions. My nerves were frayed, my coffee pot never empty. When a “Ledger Live Update” notification popped up, I didn’t think twice. The interface looked identical—same logo, same layout. I entered my credentials… and within seconds, the app disappeared. My wallet balance dropped to zero. I sat frozen. My stomach dropped. All that work—years of sacrifice—gone in a blink. The days that followed were dark. I scoured forums, filed reports, and replayed my mistake on loop. Guilt ate at me. How could I have been so careless? My greenhouse renderings sat untouched. My dream felt like a cruel joke. Just when I was ready to walk away, I stumbled upon a newsletter about green innovation. Tucked between articles on carbon-neutral cities and next-gen solar panels was a short feature on *Digital Light Solution*—a specialized team that helps victims of crypto theft recover stolen assets. Skeptical but desperate, I reached out. What followed wasn’t magic—but it was close to it. Their team treated my case with urgency and compassion. They traced the transaction trail, identified the laundering path, and worked with exchanges to freeze what they could. Within weeks, they’d recovered a significant portion of my funds—enough to restart. Today, I’m not just rebuilding my portfolio—I’m breaking ground on my prototype greenhouse. And every beam, every pane of glass, carries the lesson I learned: that even in our most vulnerable moments, there’s still light to be found. [email protected] Telegram ——digitallightsolution website https://digitallightsolution.com/ WHAT'S  APP  https://wa.link/989vlf 

  • 13.02.26 00:17 marcushenderson624

    Bitcoin Recovery Testimonial After falling victim to a cryptocurrency scam group, I lost $354,000 worth of USDT. I thought all hope was lost from the experience of losing my hard-earned money to scammers. I was devastated and believed there was no way to recover my funds. Fortunately, I started searching for help to recover my stolen funds and I came across a lot of testimonials online about Capital Crypto Recovery, an agent who helps in recovery of lost bitcoin funds, I contacted Capital Crypto Recover Service, and with their expertise, they successfully traced and recovered my stolen assets. Their team was professional, kept me updated throughout the process, and demonstrated a deep understanding of blockchain transactions and recovery protocols. They are trusted and very reliable with a 100% successful rate record Recovery bitcoin, I’m grateful for their help and highly recommend their services to anyone seeking assistance with lost crypto. Contact: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 13.02.26 00:17 marcushenderson624

    Bitcoin Recovery Testimonial After falling victim to a cryptocurrency scam group, I lost $354,000 worth of USDT. I thought all hope was lost from the experience of losing my hard-earned money to scammers. I was devastated and believed there was no way to recover my funds. Fortunately, I started searching for help to recover my stolen funds and I came across a lot of testimonials online about Capital Crypto Recovery, an agent who helps in recovery of lost bitcoin funds, I contacted Capital Crypto Recover Service, and with their expertise, they successfully traced and recovered my stolen assets. Their team was professional, kept me updated throughout the process, and demonstrated a deep understanding of blockchain transactions and recovery protocols. They are trusted and very reliable with a 100% successful rate record Recovery bitcoin, I’m grateful for their help and highly recommend their services to anyone seeking assistance with lost crypto. Contact: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 13.02.26 02:16 Ralf Boruta

    GREAT WHIP RECOVERY CYBER SERVICES TRUSTED EXPERTS IN ONLINE RECOVERY SOLUTIONS PHONE CALL:+1(406)2729101 I was unfortunately deceived and scammed out of $88,000 by someone I trusted to manage my funds during a transaction we carried out together. The experience left me deeply disappointed and hurt, realizing that someone could betray that level of trust without any remorse. Determined to seek justice and recover what was stolen, I began searching for legal assistance and came across numerous testimonials about GREAT WHIP RECOVERY CYBER SERVICES, a group known for helping victims recover lost funds. From what I learned, they have successfully assisted many people facing similar situations, returning stolen funds to their rightful owners in a remarkably short time. In my case, the GREAT WHIP RECOVERY CYBER SERVICES were able to recover my funds within just 48 hours, which was truly unbelievable. Even more reassuring was the fact that the scammer was identified, located, and eventually arrested by local authorities in his region. That outcome brought a great sense of relief and closure. I hope this information helps others who have lost their hard-earned money due to misplaced trust. If you’re in a similar situation, you can contact them through their info below to seek help in recovering your stolen funds.  Email: [email protected]  Website https://greatwhiprecoveryc.wixsite.com/greatwhip-site  Phone Call:+1(406)2729101

  • 13.02.26 02:16 Ralf Boruta

    GREAT WHIP RECOVERY CYBER SERVICES TRUSTED EXPERTS IN ONLINE RECOVERY SOLUTIONS PHONE CALL:+1(406)2729101 I was unfortunately deceived and scammed out of $88,000 by someone I trusted to manage my funds during a transaction we carried out together. The experience left me deeply disappointed and hurt, realizing that someone could betray that level of trust without any remorse. Determined to seek justice and recover what was stolen, I began searching for legal assistance and came across numerous testimonials about GREAT WHIP RECOVERY CYBER SERVICES, a group known for helping victims recover lost funds. From what I learned, they have successfully assisted many people facing similar situations, returning stolen funds to their rightful owners in a remarkably short time. In my case, the GREAT WHIP RECOVERY CYBER SERVICES were able to recover my funds within just 48 hours, which was truly unbelievable. Even more reassuring was the fact that the scammer was identified, located, and eventually arrested by local authorities in his region. That outcome brought a great sense of relief and closure. I hope this information helps others who have lost their hard-earned money due to misplaced trust. If you’re in a similar situation, you can contact them through their info below to seek help in recovering your stolen funds.  Email: [email protected]  Website https://greatwhiprecoveryc.wixsite.com/greatwhip-site  Phone Call:+1(406)2729101

  • 13.02.26 18:29 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 13.02.26 18:29 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: 📧 Email: [email protected] 📱 Telegram: @Capitalcryptorecover Contact: [email protected] 📞 Call/Text: +1 (336) 390-6684 🌐 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 17.02.26 23:59 Lilyfox

    These group of CYBER GURUS below helped my family in ​recovering stolen bitcoin by scammers and they also helped me in securing a university title in one of the best university in the world I'm saying a very big thank you to them contact them now ; [email protected] or WhatsApp +​4​47476606228 -Recovery of funds from fake platform/BINARY TRADING - Retrieval of fraudulent funds - Bank Transfer service - BITCOIN TOP UP - Money, recovery from any country in the world - Change of university degrees - Spying of all social media account within - Sales of Blank ATM and Credit Cards - Sales of university Titles originals. - Clearing of bank debts - University title offer and so many others ... Despite all odds these internet gurus have proven themselves worthy to be called a professional Cyber genius ... once again i beat up my chest to confess that these group of cyber gurus are reliable and satisfactory with 100% reliability.....

  • 18.02.26 00:01 Lilyfox

    GENERAL HACKING AND CRYPTO RECOVERY SERVICES These group of CYBER GURUS below helped my family in ​recovering stolen bitcoin worth of $168,000 USD by scammers and they also helped me in securing a university title in one of the best university in the world I'm saying a very big thank you to them contact them now ; [email protected] or WhatsApp +​4​47476606228 -Recovery of funds from fake platform/BINARY TRADING - Retrieval of fraudulent funds - Bank Transfer service - BITCOIN TOP UP - Money, recovery from any country in the world - Change of university degrees - Spying of all social media account within - Sales of Blank ATM and Credit Cards - Sales of university Titles originals. - Clearing of bank debts - University title offer and so many others ... Despite all odds these internet gurus have proven themselves worthy to be called a professional Cyber genius ... once again i beat up my chest to confess that these group of cyber gurus are reliable and satisfactory with 100% reliability.....

  • 18.02.26 03:23 walterlindahi9

    This past January, my world came crashing down. I lost nearly $42,000 of my hard-earned savings to a sophisticated Solana-based crypto scam. At first, it all seemed legitimate: sleek website, professional whitepaper, even glowing testimonials from “investors.” I’d done my homework, or so I thought. The promise of high returns in a volatile market felt like my ticket to financial freedom. For the first few months, everything appeared to be working. My portfolio showed steady gains. I remember checking my wallet balance daily, feeling a mix of pride and relief. I’ve cracked the code to building real wealth. Then, without warning, the platform vanished. Wallet addresses went dead. Support channels disappeared, and my funds were gone in an instant. The emotional fallout was worse than the financial loss. Sleepless nights became the norm. Anxiety gnawed at me constantly. I replayed every decision in my head, blaming myself for being naive. I vowed never to trust anyone again, not influencers, not experts, not even my own judgment. But giving up wasn’t an option. I owed it to myself and to my future to fight back. So I began digging. I scoured Reddit threads, filed reports with blockchain analytics firms, and even contacted local authorities (though they offered little help). The more I searched, the more overwhelmed I became, lost in a labyrinth of technical jargon, dead ends, and predatory recovery services asking for upfront fees. Then, through a survivor’s forum, I stumbled upon TechY Force Cyber Retrieval. Skeptical but desperate, I reached out. What set them apart wasn’t just their expertise; it was their empathy. They didn’t make wild promises. Instead, they walked me through how crypto tracing works, what success looks like, and what realistic timelines are. No pressure. No false hope. Within weeks, their forensic team identified transaction trails linked to the scam wallet. Using on-chain analysis and coordination with exchanges, they flagged suspicious activity and initiated recovery protocols. It wasn’t magic, but it was methodical, transparent, and grounded in real blockchain intelligence. Today, I’m cautiously optimistic. While not all funds have been recovered yet, TechY Force has already secured a significant portion and, more importantly, restored my sense of agency. I’m sleeping again. I’m healing. If you’ve been scammed, know this: you’re not alone, and you’re not foolish. Crypto fraud preys on hope, but that same hope can fuel your comeback. Don’t suffer in silence. Reach out. Ask questions. And never let a scammer steal your future along with your funds. WhatsApp +1(561) 726 3697 Mail. Techyforcecyberretrieval(@)consultant(.)com Telegram (@)TechCyberforc

  • 22.02.26 03:48 harristhomas7376

    "In the crypto world, this is great news I want to share. Last year, I fell victim to a scam disguised as a safe investment option. I have invested in crypto trading platforms for about 10yrs thinking I was ensuring myself a retirement income, only to find that all my assets were either frozen, I believed my assets were secure — until I discovered that my BTC funds had been frozen and withdrawals were impossible. It was a devastating moment when I realized I had been scammed, and I thought my Bitcoin was gone forever, Everything changed when a close friend recommended the Capital Crypto Recover Service. Their professionalism, expertise, and dedication enabled me to recover my lost Bitcoin funds back — more than €560.000 DEM to my BTC wallet. What once felt impossible became a reality thanks to their support. If you have lost Bitcoin through scams, hacking, failed withdrawals, or similar challenges, don’t lose hope. I strongly recommend Capital Crypto Recover Service to anyone seeking a reliable and effective solution for recovering any wallet assets. They have a proven track record of successful reputation in recovering lost password assets for their clients and can help you navigate the process of recovering your funds. Don’t let scammers get away with your hard-earned money – contact Email: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Contact: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 22.02.26 03:49 harristhomas7376

    "In the crypto world, this is great news I want to share. Last year, I fell victim to a scam disguised as a safe investment option. I have invested in crypto trading platforms for about 10yrs thinking I was ensuring myself a retirement income, only to find that all my assets were either frozen, I believed my assets were secure — until I discovered that my BTC funds had been frozen and withdrawals were impossible. It was a devastating moment when I realized I had been scammed, and I thought my Bitcoin was gone forever, Everything changed when a close friend recommended the Capital Crypto Recover Service. Their professionalism, expertise, and dedication enabled me to recover my lost Bitcoin funds back — more than €560.000 DEM to my BTC wallet. What once felt impossible became a reality thanks to their support. If you have lost Bitcoin through scams, hacking, failed withdrawals, or similar challenges, don’t lose hope. I strongly recommend Capital Crypto Recover Service to anyone seeking a reliable and effective solution for recovering any wallet assets. They have a proven track record of successful reputation in recovering lost password assets for their clients and can help you navigate the process of recovering your funds. Don’t let scammers get away with your hard-earned money – contact Email: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Contact: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 22.02.26 18:58 Natasha Williams

    I am Natasha Williams from Dallas. I want to share my testimony to encourage anyone who has ever fallen victim to a scam or fraud. Some time ago, I was defrauded by some fraudulent cryptocurrency investment organization online, I was a victim and I lost a huge amount of money, $382,000. I felt angry, disappointed and helpless but I refused to give up and stay calm. I came across this agency, GREAT WHIP RECOVERY CYBER SERVICES.. who helped people recover their money from scammers and the testimonies I saw were quite amazing. And I decided to contact them. I gathered every piece of evidence, chats, receipts, account details, and messages and reported the case to the agency, GREAT WHIP RECOVERY CYBER SERVICES. After 73hours of follow up and not losing faith, the fraudster was traced and held accountable and I recovered all my money back. I highly recommend, GREAT WHIP RECOVERY CYBER SERVICES agency if you have ever fallen victim to scammers, you can contact them. Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site email: [email protected] Call Line: +1(406)2729101

  • 22.02.26 19:00 Natasha Williams

    I am Natasha Williams from Dallas. I want to share my testimony to encourage anyone who has ever fallen victim to a scam or fraud. Some time ago, I was defrauded by some fraudulent cryptocurrency investment organization online, I was a victim and I lost a huge amount of money, $382,000. I felt angry, disappointed and helpless but I refused to give up and stay calm. I came across this agency, GREAT WHIP RECOVERY CYBER SERVICES.. who helped people recover their money from scammers and the testimonies I saw were quite amazing. And I decided to contact them. I gathered every piece of evidence, chats, receipts, account details, and messages and reported the case to the agency, GREAT WHIP RECOVERY CYBER SERVICES. After 73hours of follow up and not losing faith, the fraudster was traced and held accountable and I recovered all my money back. I highly recommend, GREAT WHIP RECOVERY CYBER SERVICES agency if you have ever fallen victim to scammers, you can contact them. Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site email: [email protected] Call Line: +1(406)2729101

  • 23.02.26 23:26 chongfook

    As cryptocurrencies continue to reshape global finance in 2026, the risks have never been higher. From sophisticated phishing campaigns to fake wallet apps and investment scams, millions of investors face the devastating reality of lost or stolen digital assets. When your crypto vanishes, panic sets in—and that's when fraudsters strike again, posing as "recovery experts" to exploit your vulnerability.   CONTACTS US   Techyforcecyberretrieval(@)consultant(.)com   https(://)techyforcecyberretrieval(.)com But there's a legitimate path forward. TECHY FORCE CYBER RETRIEVAL stands as the industry's most trusted crypto recovery company, combining advanced blockchain forensics, global partnerships, and a client-centric approach to help victims reclaim what was stolen. ---  Why Recovery Is Possible—With the Right Team Cryptocurrency's decentralized, pseudonymous nature makes asset recovery complex—but not impossible. The blockchain is transparent. Every transaction leaves a trail. The challenge isn't finding the funds—it's having the expertise to follow that trail through mixers, bridges, and exchange deposits before they disappear forever. That's where TECHY FORCE CYBER RETRIEVAL excels. ---  Our Proven Recovery Framework We don't believe in shortcuts, false promises, or upfront fees. Our process is built on transparency, forensic precision, and real results. Here's how we work: 1. Case Intake & Initial Assessment   You begin by submitting a detailed report: compromised wallet addresses, transaction IDs, timestamps, and any communication with scammers. Our intake team reviews your case within hours to determine immediate next steps. 2. Blockchain Forensic Analysis   Our specialists deploy proprietary tracking tools to map the movement of your stolen assets across multiple blockchains. We identify laundering patterns, exchange deposit addresses, and potential freezing points—building a clear investigative roadmap. 3. Global Partner Coordination   Through established relationships with regulated exchanges, DeFi protocols, and compliance teams worldwide, we initiate direct communication to flag suspicious transactions and request asset freezes where legally permissible. 4. Legal & Regulatory Engagement   When necessary, we collaborate with legal partners and law enforcement agencies to strengthen recovery efforts—especially in cases involving large-scale hacks or organized fraud rings. 5. Recovery Execution & Fund Return   Once assets are secured, they're transferred directly to a new, secure wallet of your choice. We never hold your funds. And critically, we operate on a success-only model. You pay nothing unless we recover your assets. 6. Post-Recovery Security Guidance   Recovery is only half the battle. We provide personalized recommendations to secure your remaining holdings—from hardware wallet setup to phishing awareness training—so you can move forward with confidence. ---  What Sets TECHY FORCE CYBER RETRIEVAL Apart While countless "recovery services" flood the internet, few deliver legitimate results. Here's why we're consistently rated the best crypto recovery company in 2026: - Zero Upfront Fees – We only succeed when you do. No hidden charges. No bait-and-switch tactics.   - Advanced Blockchain Intelligence – Our forensic tools track assets across Bitcoin, Ethereum, Solana, and 50+ other networks.   - Global Reach – Partnerships with exchanges and regulatory bodies in North America, Europe, and Asia maximize recovery odds.   - Client-First Communication – Weekly updates. Clear timelines. No ghosting.   - Proven Track Record – Hundreds of successful recoveries in 2025–2026, with millions returned to rightful owners. ---  Emerging Trends in 2026: What Victims Need to Know The threat landscape evolves constantly. This year's biggest risks include: - AI-Powered Phishing: Scammers now use deepfake voice and video to impersonate support staff.   - Cross-Chain Bridge Exploits: Funds moved between networks are increasingly targeted.   - Fake Recovery Services: Fraudsters pose as legitimate firms—always verify credentials before sharing information. TECHY FORCE CYBER RETRIEVAL stays ahead of these threats, continuously updating our tools and strategies to protect and serve our clients. CONTACTS US   Techyforcecyberretrieval(@)consultant(.)com   https(://)techyforcecyberretrieval(.)com ---  Your Next Step If you've lost crypto to a scam, hack, or forgotten credentials, don't let despair—or another fraudster—steal your second chance. TECHY FORCE CYBER RETRIEVAL is accessible, transparent, and ready to help. Reach out today. Let our experts assess your case—and show you that even in 2026, stolen crypto doesn't have to stay lost forever. — TECHY FORCE CYBER RETRIEVAL   Advanced Forensics. Global Reach. Your Recovery.

  • 24.02.26 15:31 [email protected]`

    Like many others, I was drawn in by the allure of cryptocurrency and the promise of financial freedom. When I encountered a self-proclaimed "crypto guru" online, his confidence and flashy lifestyle convinced me that he held the key to success. Eager to learn, I parted with $15,000 for his exclusive course, believing it would grant me access to an elite trading group and lucrative market insights. Initially, my excitement was palpable; I truly thought I was on the verge of a breakthrough. However, that enthusiasm quickly curdled into dread. Once inside the group, the dynamic shifted from education to aggressive exploitation. Instead of genuine mentorship, members were relentlessly upsold on fake trading signals that yielded nothing but losses. The pressure escalated when we were encouraged to invest in a supposed "private pool," which required an additional, staggering access fee of $60,000. It was only as I began to notice glaring inconsistencies and a complete lack of real results among the members that the fog lifted. I realized I hadn't joined a community of traders; I had walked into a sophisticated trap designed specifically to prey on newcomers like myself. The realization that the promises of wealth and insider knowledge were nothing more than a façade left me feeling vulnerable, deceived, and financially devastated. The dream of easy returns had turned into a heavy burden of regret. Desperate for a solution and refusing to let the fraudsters win, I began searching for help. That is when I discovered DIGITAL LIGHT SOLUTION, a firm specializing in online fraud investigations. Reaching out to them was the turning point. Their team approached my case with professionalism and empathy, immediately understanding the complexity of the scam. They guided me through the investigation process, uncovering the layers of deception used by the "guru" and his network. Thanks to their expertise and relentless pursuit of justice, I was able to navigate the aftermath of this ordeal with clarity rather than confusion. While the experience was a harsh lesson, connecting with DIGITAL LIGHT SOLUTION restored my hope and proved that there are still allies ready to fight against online exploitation. If you find yourself in a similar situation, do not lose hope—seek professional help immediately. Contact them directly Website https://digitallightsolution.com/ Email — Digitallightsolution(At)qualityservice(DOT)com What's App — https://wa.link/989vlf

  • 24.02.26 15:32 [email protected]`

    Like many others, I was drawn in by the allure of cryptocurrency and the promise of financial freedom. When I encountered a self-proclaimed "crypto guru" online, his confidence and flashy lifestyle convinced me that he held the key to success. Eager to learn, I parted with $15,000 for his exclusive course, believing it would grant me access to an elite trading group and lucrative market insights. Initially, my excitement was palpable; I truly thought I was on the verge of a breakthrough. However, that enthusiasm quickly curdled into dread. Once inside the group, the dynamic shifted from education to aggressive exploitation. Instead of genuine mentorship, members were relentlessly upsold on fake trading signals that yielded nothing but losses. The pressure escalated when we were encouraged to invest in a supposed "private pool," which required an additional, staggering access fee of $60,000. It was only as I began to notice glaring inconsistencies and a complete lack of real results among the members that the fog lifted. I realized I hadn't joined a community of traders; I had walked into a sophisticated trap designed specifically to prey on newcomers like myself. The realization that the promises of wealth and insider knowledge were nothing more than a façade left me feeling vulnerable, deceived, and financially devastated. The dream of easy returns had turned into a heavy burden of regret. Desperate for a solution and refusing to let the fraudsters win, I began searching for help. That is when I discovered DIGITAL LIGHT SOLUTION, a firm specializing in online fraud investigations. Reaching out to them was the turning point. Their team approached my case with professionalism and empathy, immediately understanding the complexity of the scam. They guided me through the investigation process, uncovering the layers of deception used by the "guru" and his network. Thanks to their expertise and relentless pursuit of justice, I was able to navigate the aftermath of this ordeal with clarity rather than confusion. While the experience was a harsh lesson, connecting with DIGITAL LIGHT SOLUTION restored my hope and proved that there are still allies ready to fight against online exploitation. If you find yourself in a similar situation, do not lose hope—seek professional help immediately. Contact them directly Website https://digitallightsolution.com/ Email — Digitallightsolution(At)qualityservice(DOT)com What's App — https://wa.link/989vlf

  • 26.02.26 16:29 michaeldavenport238

    I was recently scammed out of $53,000 by a fraudulent Bitcoin investment scheme, which added significant stress to my already difficult health issues, as I was also facing cancer surgery expenses. Desperate to recover my funds, I spent hours researching and consulting other victims, which led me to discover the excellent reputation of Capital Crypto Recover, I came across a Google post It was only after spending many hours researching and asking other victims for advice that I discovered Capital Crypto Recovery’s stellar reputation. I decided to contact them because of their successful recovery record and encouraging client testimonials. I had no idea that this would be the pivotal moment in my fight against cryptocurrency theft. Thanks to their expert team, I was able to recover my lost cryptocurrency back. The process was intricate, but Capital Crypto Recovery's commitment to utilizing the latest technology ensured a successful outcome. I highly recommend their services to anyone who has fallen victim to cryptocurrency fraud. For assistance contact [email protected] and on Telegram OR Call Number +1 (336)390-6684 via email: [email protected] you can visit his website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 26.02.26 16:29 michaeldavenport238

    I was recently scammed out of $53,000 by a fraudulent Bitcoin investment scheme, which added significant stress to my already difficult health issues, as I was also facing cancer surgery expenses. Desperate to recover my funds, I spent hours researching and consulting other victims, which led me to discover the excellent reputation of Capital Crypto Recover, I came across a Google post It was only after spending many hours researching and asking other victims for advice that I discovered Capital Crypto Recovery’s stellar reputation. I decided to contact them because of their successful recovery record and encouraging client testimonials. I had no idea that this would be the pivotal moment in my fight against cryptocurrency theft. Thanks to their expert team, I was able to recover my lost cryptocurrency back. The process was intricate, but Capital Crypto Recovery's commitment to utilizing the latest technology ensured a successful outcome. I highly recommend their services to anyone who has fallen victim to cryptocurrency fraud. For assistance contact [email protected] and on Telegram OR Call Number +1 (336)390-6684 via email: [email protected] you can visit his website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 27.02.26 00:08 sanayoliver

    I spend my days studying the mysteries of the universe, delving into black holes, quantum mechanics, and the nature of time itself. But apparently, the real black hole I should have been concerned about was my own memory. I encrypted my Bitcoin wallet to keep it as secure as possible. The problem? I promptly forgot the password. Classic, right? It didn't help that this wasn't just pocket change I was dealing with. No, I had $190,000 in Bitcoin sitting in that wallet, and my mind had decided to take a vacation, leaving me with absolutely no idea what that password was. The panic set in fast. My brain, which could solve some of the most complex physics equations, couldn't remember a 12-character password. It felt like my entire financial future was being sucked into a black hole, one I'd created myself. Desperate, I tried everything. I thought I could outsmart the system, using every trick I could think of. I tried variations of passwords I thought I might have used, analyzing them through the lens of my own behavioral patterns. I even resorted to good ol' brute force, typing random combinations for hours, hoping that maybe, just maybe, my subconscious would strike gold. Spoiler alert: it didn't. Each failed attempt made me feel more and more like a genius who'd locked themselves out of their own universe. In a final act of desperation, admitting that theoretical physics couldn't crack my own encryption, I contacted TechY Force Cyber Retrieval. From the moment I reached out, the difference was night and day. While I had been flailing in the dark, they approached my case with a precision that rivaled the calculations I do daily. They didn't promise miracles; they promised a methodical, advanced recovery process. Within a surprisingly short timeframe, they utilized specialized tools to bypass the mental block I couldn't overcome. When they finally recovered the wallet and confirmed the full $190,000 was intact and accessible, the relief was indescribable. It was as if I had pulled my financial future back from the event horizon just before it was lost forever. To anyone thinking they are too smart to lose their keys, or too logical to make such a mistake: don't wait until you are staring into the abyss. If you find yourself in a situation where your own memory has become your greatest enemy, trust the experts at TechY Force Cyber Retrieval. They turned my personal black hole into a success story, proving that sometimes, even the brightest minds need a little help to find the light. REACH OUT TO THEM ON MAIL [email protected]

  • 27.02.26 02:04 elizabethmadison

    My name is Elizabeth Madison currently living in New York. There was a time I felt completely broken. I had trusted a fraudulent bitcoin investment organization, who turned out to be a fraudster. I sent money, believing their sweet words and promises on the interest rate I will get back in return, only to realize later that I’ve been scammed. On the day of withdrawal there was no money in my account. The pain hit deep. I couldn’t sleep, I kept asking myself how I could have been so careless, meanwhile my mom was battling with a stroke and the expenses were too much. For days, I cried and blamed myself. The betrayal, the disappointment and my mom's health issues all of this stress made me want to give up on life. But one day, I decided that sitting in pain wouldn’t solve anything. I picked myself up and chose to fight for what I lost then I came across GREAT WHIP RECOVERY CYBER SERVICES and saw how he helped people recover their funds from online fraud. I emailed all the transactions and paperwork I had with the fraudulent organization and they helped me recover all my lost money in just five days. If you have ever fallen victim to scammers, contact GREAT WHIP RECOVERY CYBER SERVICES to help you recover every penny you have lost. (Text +1(406)2729101) (Website https://greatwhiprecoveryc.wixsite.com/greatwhip-site) (Email [email protected])

  • 27.02.26 02:04 elizabethmadison

    My name is Elizabeth Madison currently living in New York. There was a time I felt completely broken. I had trusted a fraudulent bitcoin investment organization, who turned out to be a fraudster. I sent money, believing their sweet words and promises on the interest rate I will get back in return, only to realize later that I’ve been scammed. On the day of withdrawal there was no money in my account. The pain hit deep. I couldn’t sleep, I kept asking myself how I could have been so careless, meanwhile my mom was battling with a stroke and the expenses were too much. For days, I cried and blamed myself. The betrayal, the disappointment and my mom's health issues all of this stress made me want to give up on life. But one day, I decided that sitting in pain wouldn’t solve anything. I picked myself up and chose to fight for what I lost then I came across GREAT WHIP RECOVERY CYBER SERVICES and saw how he helped people recover their funds from online fraud. I emailed all the transactions and paperwork I had with the fraudulent organization and they helped me recover all my lost money in just five days. If you have ever fallen victim to scammers, contact GREAT WHIP RECOVERY CYBER SERVICES to help you recover every penny you have lost. (Text +1(406)2729101) (Website https://greatwhiprecoveryc.wixsite.com/greatwhip-site) (Email [email protected])

  • 27.02.26 15:57 luciajessy3

    Don’t be deceived by different testimonies online that is most likely wrong. I have made use of several recovery options that got me disappointed at the end of the day but I must confess that the tech genius I eventually found is the best out here. It’s better you devise your time to find the valid professional that can help you recover your stolen or lost crypto such as bitcoins rather than falling victim of other amateur hackers that cannot get the job done. ADAMWILSON . TRADING @ CONSULTANT COM / is the most reliable and authentic blockchain tech expert you can work with to recover what you lost to scammers. They helped me get back on my feet and I’m very grateful for that. Contact their email today to recover your lost coins ASAP…

  • 27.02.26 15:59 wendytaylor015

    My name is Wendy Taylor, I'm from Los Angeles, i want to announce to you Viewer how Capital Crypto Recover help me to restore my Lost Bitcoin, I invested with a Crypto broker without proper research to know what I was hoarding my hard-earned money into scammers, i lost access to my crypto wallet or had your funds stolen? Don’t worry Capital Crypto Recover is here to help you recover your cryptocurrency with cutting-edge technical expertise, With years of experience in the crypto world, Capital Crypto Recover employs the best latest tools and ethical hacking techniques to help you recover lost assets, unlock hacked accounts, Whether it’s a forgotten password, Capital Crypto Recover has the expertise to help you get your crypto back. a security company service that has a 100% success rate in the recovery of crypto assets, i lost wallet and hacked accounts. I provided them the information they requested and they began their investigation. To my surprise, Capital Crypto Recover was able to trace and recover my crypto assets successfully within 24hours. Thank you for your service in helping me recover my $647,734 worth of crypto funds and I highly recommend their recovery services, they are reliable and a trusted company to any individuals looking to recover lost money. Contact email [email protected] OR Telegram @Capitalcryptorecover Call/Text Number +1 (336)390-6684 his contact: [email protected] His website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 27.02.26 15:59 wendytaylor015

    My name is Wendy Taylor, I'm from Los Angeles, i want to announce to you Viewer how Capital Crypto Recover help me to restore my Lost Bitcoin, I invested with a Crypto broker without proper research to know what I was hoarding my hard-earned money into scammers, i lost access to my crypto wallet or had your funds stolen? Don’t worry Capital Crypto Recover is here to help you recover your cryptocurrency with cutting-edge technical expertise, With years of experience in the crypto world, Capital Crypto Recover employs the best latest tools and ethical hacking techniques to help you recover lost assets, unlock hacked accounts, Whether it’s a forgotten password, Capital Crypto Recover has the expertise to help you get your crypto back. a security company service that has a 100% success rate in the recovery of crypto assets, i lost wallet and hacked accounts. I provided them the information they requested and they began their investigation. To my surprise, Capital Crypto Recover was able to trace and recover my crypto assets successfully within 24hours. Thank you for your service in helping me recover my $647,734 worth of crypto funds and I highly recommend their recovery services, they are reliable and a trusted company to any individuals looking to recover lost money. Contact email [email protected] OR Telegram @Capitalcryptorecover Call/Text Number +1 (336)390-6684 his contact: [email protected] His website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 27.02.26 16:00 wendytaylor015

    My name is Wendy Taylor, I'm from Los Angeles, i want to announce to you Viewer how Capital Crypto Recover help me to restore my Lost Bitcoin, I invested with a Crypto broker without proper research to know what I was hoarding my hard-earned money into scammers, i lost access to my crypto wallet or had your funds stolen? Don’t worry Capital Crypto Recover is here to help you recover your cryptocurrency with cutting-edge technical expertise, With years of experience in the crypto world, Capital Crypto Recover employs the best latest tools and ethical hacking techniques to help you recover lost assets, unlock hacked accounts, Whether it’s a forgotten password, Capital Crypto Recover has the expertise to help you get your crypto back. a security company service that has a 100% success rate in the recovery of crypto assets, i lost wallet and hacked accounts. I provided them the information they requested and they began their investigation. To my surprise, Capital Crypto Recover was able to trace and recover my crypto assets successfully within 24hours. Thank you for your service in helping me recover my $647,734 worth of crypto funds and I highly recommend their recovery services, they are reliable and a trusted company to any individuals looking to recover lost money. Contact email [email protected] OR Telegram @Capitalcryptorecover Call/Text Number +1 (336)390-6684 his contact: [email protected] His website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 27.02.26 16:01 luciajessy3

    Don’t be deceived by different testimonies online that is most likely wrong. I have made use of several recovery options that got me disappointed at the end of the day but I must confess that the tech genius I eventually found is the best out here. It’s better you devise your time to find the valid professional that can help you recover your stolen or lost crypto such as bitcoins rather than falling victim of other amateur hackers that cannot get the job done. ADAMWILSON . TRADING @ CONSULTANT COM / is the most reliable and authentic blockchain tech expert you can work with to recover what you lost to scammers. They helped me get back on my feet and I’m very grateful for that. Contact their email today to recover your lost coins ASAP…

  • 27.02.26 16:01 luciajessy3

    Don’t be deceived by different testimonies online that is most likely wrong. I have made use of several recovery options that got me disappointed at the end of the day but I must confess that the tech genius I eventually found is the best out here. It’s better you devise your time to find the valid professional that can help you recover your stolen or lost crypto such as bitcoins rather than falling victim of other amateur hackers that cannot get the job done. ADAMWILSON . TRADING @ CONSULTANT COM / is the most reliable and authentic blockchain tech expert you can work with to recover what you lost to scammers. They helped me get back on my feet and I’m very grateful for that. Contact their email today to recover your lost coins ASAP…

  • 27.02.26 16:01 luciajessy3

    Don’t be deceived by different testimonies online that is most likely wrong. I have made use of several recovery options that got me disappointed at the end of the day but I must confess that the tech genius I eventually found is the best out here. It’s better you devise your time to find the valid professional that can help you recover your stolen or lost crypto such as bitcoins rather than falling victim of other amateur hackers that cannot get the job done. ADAMWILSON . TRADING @ CONSULTANT COM / is the most reliable and authentic blockchain tech expert you can work with to recover what you lost to scammers. They helped me get back on my feet and I’m very grateful for that. Contact their email today to recover your lost coins ASAP…

  • 01.03.26 10:48 marcushenderson624

    Bitcoin Recovery Testimonial After falling victim to a cryptocurrency scam group, I lost $354,000 worth of USDT. I thought all hope was lost from the experience of losing my hard-earned money to scammers. I was devastated and believed there was no way to recover my funds. Fortunately, I started searching for help to recover my stolen funds and I came across a lot of testimonials online about Capital Crypto Recovery, an agent who helps in recovery of lost bitcoin funds, I contacted Capital Crypto Recover Service, and with their expertise, they successfully traced and recovered my stolen assets. Their team was professional, kept me updated throughout the process, and demonstrated a deep understanding of blockchain transactions and recovery protocols. They are trusted and very reliable with a 100% successful rate record Recovery bitcoin, I’m grateful for their help and highly recommend their services to anyone seeking assistance with lost crypto. Contact: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 01.03.26 10:48 marcushenderson624

    Bitcoin Recovery Testimonial After falling victim to a cryptocurrency scam group, I lost $354,000 worth of USDT. I thought all hope was lost from the experience of losing my hard-earned money to scammers. I was devastated and believed there was no way to recover my funds. Fortunately, I started searching for help to recover my stolen funds and I came across a lot of testimonials online about Capital Crypto Recovery, an agent who helps in recovery of lost bitcoin funds, I contacted Capital Crypto Recover Service, and with their expertise, they successfully traced and recovered my stolen assets. Their team was professional, kept me updated throughout the process, and demonstrated a deep understanding of blockchain transactions and recovery protocols. They are trusted and very reliable with a 100% successful rate record Recovery bitcoin, I’m grateful for their help and highly recommend their services to anyone seeking assistance with lost crypto. Contact: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 03.03.26 14:09 Thomas Muller

    YOU CAN REACH OUT TO GREAT WHIP RECOVERY CYBER SERVICES FOR HELP TO RECOVER YOUR STOLEN BTC OR ETH BACK CALL:+1(406)2729101 I once fell victim to online investment scheme that cost me a devastating €254,000. I’m Thomas Muller from Berlin, Germany. The person I trusted turned out to be a fraud, and the moment I realized I’d been deceived, my entire world stopped. I immediately began searching for legitimate ways to recover my funds and hold the scammer accountable. During my search, I came across several testimonies of how Great Whip Recovery Cyber Services helped some people recover money they lost to cyber fraud, I contacted Great Whip Recovery Cyber Service team and provided all the evidence I had. Within about 36 hours, the experts traced the digital trail left by the fraudster, the individual was eventually tracked down and I recovered all my money back. You can contact them with,  website https://greatwhiprecoveryc.wixsite.com/greatwhip-site  text +1(406)2729101 email [email protected]

  • 03.03.26 14:09 Thomas Muller

    YOU CAN REACH OUT TO GREAT WHIP RECOVERY CYBER SERVICES FOR HELP TO RECOVER YOUR STOLEN BTC OR ETH BACK CALL:+1(406)2729101 I once fell victim to online investment scheme that cost me a devastating €254,000. I’m Thomas Muller from Berlin, Germany. The person I trusted turned out to be a fraud, and the moment I realized I’d been deceived, my entire world stopped. I immediately began searching for legitimate ways to recover my funds and hold the scammer accountable. During my search, I came across several testimonies of how Great Whip Recovery Cyber Services helped some people recover money they lost to cyber fraud, I contacted Great Whip Recovery Cyber Service team and provided all the evidence I had. Within about 36 hours, the experts traced the digital trail left by the fraudster, the individual was eventually tracked down and I recovered all my money back. You can contact them with,  website https://greatwhiprecoveryc.wixsite.com/greatwhip-site  text +1(406)2729101 email [email protected]

  • 04.03.26 07:21 Jane4

    I lost about $600k Bitcoin last year, I searched around and tried to work with some recovery firm unfortunately I was scammed as well. This happened for months until I came across [email protected] They came to my rescue and all my funds were recovered within few days I'm so happy right now .

  • 04.03.26 07:22 Jane4

    I lost about $600k Bitcoin last year, I searched around and tried to work with some recovery firm unfortunately I was scammed as well. This happened for months until I came across [email protected] They came to my rescue and all my funds were recovered within few days I'm so happy right now .

  • 04.03.26 12:25 patricialovick86

    How To Recover Your Bitcoin Without Falling Victim To Scams: A  Testimony Experience With Capital Crypto Recover Services, Contact Telegram: @Capitalcryptorecover Dear Everyone, I would like to take a moment to share my positive experience with Capital Crypto Recover Services. Initially, I was unsure if it would be possible to recover my stolen bitcoins. However, with their expertise and professionalism, I was able to fully recover my funds. Unfortunately, many individuals fall victim to scams in the cryptocurrency space, especially those involving fraudulent investment platforms. However, I advise caution, as not all recovery services are legitimate. I personally lost $273,000 worth of Bitcoin from my Binance account due to a deceptive platform. If you have suffered a similar loss, you may be considering crypto recovery, The Capital Crypto Recover is the most knowledgeable and effective Capital Crypto Recovery Services assisted me in recovering my stolen funds within 24 hours, after getting access to my wallet. Their service was not only prompt but also highly professional and effective, and many recovery services may not be trustworthy. Therefore, I highly recommend Capital Crypto Recover to you. i do always research and see reviews about their service, For assistance finding your misplaced cryptocurrency, get in touch with them, They do their jobs quickly and excellently, Stay safe and vigilant in the crypto world. Contact: [email protected]  You can reach them via email at [email protected] OR Call/Text Number +1 (336)390-6684 his contact website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 04.03.26 12:25 patricialovick86

    How To Recover Your Bitcoin Without Falling Victim To Scams: A  Testimony Experience With Capital Crypto Recover Services, Contact Telegram: @Capitalcryptorecover Dear Everyone, I would like to take a moment to share my positive experience with Capital Crypto Recover Services. Initially, I was unsure if it would be possible to recover my stolen bitcoins. However, with their expertise and professionalism, I was able to fully recover my funds. Unfortunately, many individuals fall victim to scams in the cryptocurrency space, especially those involving fraudulent investment platforms. However, I advise caution, as not all recovery services are legitimate. I personally lost $273,000 worth of Bitcoin from my Binance account due to a deceptive platform. If you have suffered a similar loss, you may be considering crypto recovery, The Capital Crypto Recover is the most knowledgeable and effective Capital Crypto Recovery Services assisted me in recovering my stolen funds within 24 hours, after getting access to my wallet. Their service was not only prompt but also highly professional and effective, and many recovery services may not be trustworthy. Therefore, I highly recommend Capital Crypto Recover to you. i do always research and see reviews about their service, For assistance finding your misplaced cryptocurrency, get in touch with them, They do their jobs quickly and excellently, Stay safe and vigilant in the crypto world. Contact: [email protected]  You can reach them via email at [email protected] OR Call/Text Number +1 (336)390-6684 his contact website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 06.03.26 13:36 CARL9090

    In January, my life shifted in a way I never expected. I clicked a trading link given to me by someone I found on Telegram, believing it was legitimate. It looked professional. It felt secure. I trusted it. Until I tried to withdraw my money. Within seconds, everything was gone, transferred into a wallet claiming account without a trace. That was the moment the truth hit me: I had been scammed. The emotional fallout was brutal. For weeks, I couldn’t even speak about it. I thought people would judge me. I thought they’d say I should have known better. Then someone stepped in who changed everything Agent Jasmine Lopez ,She listened without judgment. She treated my fear as real and valid. She traced patterns, uncovered off-chain indicators, and identified wallet clusters linked to a larger scam network. She showed me that what happened wasn’t random it was organized and intentional. For the first time, I felt hope. Hearing that students, parents, and hardworking people had been targeted the same way made me realize this wasn’t stupidity. It was predation. We weren’t careless we were deliberately targeted and manipulated I’m still healing. The experience changed me. But it also reminded me that even in your darkest moment, there can be someone willing to shine a light. Contact her at [email protected] WHATSAPP +44 7478077894

  • 07.03.26 07:46 Jane4

    I lost about $600k Bitcoin last year, I searched around and tried to work with some recovery firm unfortunately I was scammed as well. This happened for months until I came across [email protected] They came to my rescue and all my funds were recovered within few days I'm so happy right now .

  • 07.03.26 07:46 Jane4

    I lost about $600k Bitcoin last year, I searched around and tried to work with some recovery firm unfortunately I was scammed as well. This happened for months until I came across [email protected] They came to my rescue and all my funds were recovered within few days I'm so happy right now .

  • 07.03.26 08:39 Jane4

    I lost about $600k Bitcoin last year, I searched around and tried to work with some recovery firm unfortunately I was scammed as well. This happened for months until I came across [email protected] They came to my rescue and all my funds were recovered within few days I'm so happy right now .

  • 07.03.26 08:55 Jane4

    I lost about $600k Bitcoin last year, I searched around and tried to work with some recovery firm unfortunately I was scammed as well. This happened for months until I came across [email protected] They came to my rescue and all my funds were recovered within few days I'm so happy right now .

  • 07.03.26 09:40 Alena76

    Most people have been scammed severally and they give up on their funds I'm saying these because I was a victim too After loosing 745,000 USD I lose my mind until I read about COIN HACK RECOVERY I decided to contact the company on: [email protected] and I'm glad I made the decision not to give up. they helped me to recover all my lost funds within two days.

  • 07.03.26 10:37 Alena76

    Most people have been scammed severally and they give up on their funds I'm saying these because I was a victim too After loosing 745,000 USD I lose my mind until I read about COIN HACK RECOVERY I decided to contact the company on: [email protected] and I'm glad I made the decision not to give up. they helped me to recover all my lost funds within two days.

  • 07.03.26 10:37 Alena76

    Most people have been scammed severally and they give up on their funds I'm saying these because I was a victim too After loosing 745,000 USD I lose my mind until I read about COIN HACK RECOVERY I decided to contact the company on: [email protected] and I'm glad I made the decision not to give up. they helped me to recover all my lost funds within two days.

  • 07.03.26 17:49 Natasha Williams

    I am Natasha Williams from Dallas. I want to share my testimony to encourage anyone who has ever fallen victim to a scam or fraud. Some time ago, I was defrauded by some fraudulent cryptocurrency investment organization online, I was a victim and I lost a huge amount of money, $382,000. I felt angry, disappointed and helpless but I refused to give up and stay calm. I came across this agency, GREAT WHIP RECOVERY CYBER SERVICES.. who helped people recover their money from scammers and the testimonies I saw were quite amazing. And I decided to contact them. I gathered every piece of evidence, chats, receipts, account details, and messages and reported the case to the agency, GREAT WHIP RECOVERY CYBER SERVICES. After 73hours of follow up and not losing faith, the fraudster was traced and held accountable and I recovered all my money back. I highly recommend, GREAT WHIP RECOVERY CYBER SERVICES agency if you have ever fallen victim to scammers, you can contact them. Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site email: [email protected] Call Line: +1(406)2729101

  • 07.03.26 20:10 ericbank61

    I never thought I’d be the one writing one of these stories. You hear about crypto scams, hacks, and lost fortunes, and you think, “That’s for other people. The careless ones.” I was careful. Or so I believed. It started with a sophisticated phishing attack. An email that looked identical to a legitimate exchange notification, a link to “verify my wallet security,” and a moment of distracted panic. I clicked. Within hours, my life savings in Bitcoin—a sum I’d been accumulating for five years—vanished from my private wallet. The transaction hash was a cold, unfeeling tombstone on the blockchain. My stomach dropped into a void. I felt physically ill. The police filed a report, but their knowledge ended at the edge of traditional finance. The exchange offered sympathy but no solutions. I was adrift, utterly hopeless. After weeks of despair, scouring forums in the dead of night, I found a thread mentioning Mighty Hacker Recovery. The name sounded almost too bold, like something from a cheesy movie. But the testimonials were detailed, sober, and from people who sounded just like me: desperate, betrayed, and out of options. With nothing left to lose, I reached out. Their intake process was professional but guarded. They asked for transaction IDs, wallet addresses, and a detailed timeline—no promises, just facts. A consultant named Leo became my point of contact. He had a calm, analytical voice that cut through my panic. “We don’t hack *into* systems,” he explained. “We follow the digital trail. We analyze the attack vector, trace the flow of funds through the blockchain’s transparency, and identify the weak points in the scammer’s own security. Sometimes, it’s about speed and outmaneuvering them before they can launder the assets.” What followed was a tense, silent partnership. I provided every shred of information I had, while Leo’s team worked in the shadows. There were days of silence that felt like years. Then, an update: they’d traced my BTC to a mixing service, a tool scammers use to obfuscate the trail. Mighty Hacker Recovery used advanced blockchain forensic techniques to peel back those layers. They discovered the scammer had made a critical error—a small portion of the funds was sent to a KYC-compliant exchange wallet. That was the chink in the armor. Using the immutable evidence from the blockchain and legal pressure channels they’d established with certain international platforms, they initiated a recovery claim. The process was complex, involving digital affidavits and proof of illicit origin. Three weeks after my first desperate email, Leo called. “We’ve secured a freeze on the destination wallet. The exchange is cooperating. We’re initiating the reversal.” I didn’t dare believe it until I saw it. Two days later, my wallet balance updated. My Bitcoin, minus Mighty Hacker Recovery’s contingency fee, was back. The relief wasn’t euphoric; it was a deep, trembling exhaustion, like waking up from a nightmare. They didn’t perform magic. They applied intense expertise, relentless persistence, and an intricate understanding of both the blockchain’s weaknesses and a scammer’s psychology. They gave me back more than my crypto; they gave me back a sense of agency in a landscape designed to make victims feel powerless. If you’re reading this from your own private hell of loss, know this: the trail never truly disappears. You just need the right team to follow it. For me, that was Mighty Hacker Recovery.

  • 07.03.26 22:44 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: Email: [email protected] Telegram: @Capitalcryptorecover Contact: [email protected] Call/Text: +1 (336) 390-6684 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 07.03.26 22:44 robertalfred175

    CRYPTO SCAM RECOVERY SUCCESSFUL – A TESTIMONIAL OF LOST PASSWORD TO YOUR DIGITAL WALLET BACK. My name is Robert Alfred, Am from Australia. I’m sharing my experience in the hope that it helps others who have been victims of crypto scams. A few months ago, I fell victim to a fraudulent crypto investment scheme linked to a broker company. I had invested heavily during a time when Bitcoin prices were rising, thinking it was a good opportunity. Unfortunately, I was scammed out of $120,000 AUD and the broker denied me access to my digital wallet and assets. It was a devastating experience that caused many sleepless nights. Crypto scams are increasingly common and often involve fake trading platforms, phishing attacks, and misleading investment opportunities. In my desperation, a friend from the crypto community recommended Capital Crypto Recovery Service, known for helping victims recover lost or stolen funds. After doing some research and reading multiple positive reviews, I reached out to Capital Crypto Recovery. I provided all the necessary information—wallet addresses, transaction history, and communication logs. Their expert team responded immediately and began investigating. Using advanced blockchain tracking techniques, they were able to trace the stolen Dogecoin, identify the scammer’s wallet, and coordinate with relevant authorities to freeze the funds before they could be moved. Incredibly, within 24 hours, Capital Crypto Recovery successfully recovered the majority of my stolen crypto assets. I was beyond relieved and truly grateful. Their professionalism, transparency, and constant communication throughout the process gave me hope during a very difficult time. If you’ve been a victim of a crypto scam, I highly recommend them with full confidence contacting: Email: [email protected] Telegram: @Capitalcryptorecover Contact: [email protected] Call/Text: +1 (336) 390-6684 Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 11.03.26 19:43 Michael Jensen

    With the help and expertise of CapitalNode Analytics, i was able to get back my digital tokens from a fake investment platform. They are swift, precise and transparent in their operations.

  • 12.03.26 15:04 Mike Franz

    I recently ran into a serious issue with my cryptocurrency account that left me unable to access my bitcoin wallet. After several failed login attempts and repeated blocks from the system, I began to worry that I might lose access to my $415,000 permanently. Determined to fix the problem, After spending hours reading a review of GREAT WHIP RECOVERY CYBER SERVICES, on how they successfully assisted countless individuals in similar situations as mine. The process was stressful, but eventually the issue was resolved and I was able to regain access to my bitcoin wallet account. I’m immensely grateful to GREAT WHIP RECOVERY CYBER SERVICES for their incredible work, for those who need help, you can contact through the following channels: Phone Call: +1(406)2729101 Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Mail: [email protected]

  • 12.03.26 15:05 Mike Franz

    I recently ran into a serious issue with my cryptocurrency account that left me unable to access my bitcoin wallet. After several failed login attempts and repeated blocks from the system, I began to worry that I might lose access to my $415,000 permanently. Determined to fix the problem, After spending hours reading a review of GREAT WHIP RECOVERY CYBER SERVICES, on how they successfully assisted countless individuals in similar situations as mine. The process was stressful, but eventually the issue was resolved and I was able to regain access to my bitcoin wallet account. I’m immensely grateful to GREAT WHIP RECOVERY CYBER SERVICES for their incredible work, for those who need help, you can contact through the following channels: Phone Call: +1(406)2729101 Website: https://greatwhiprecoveryc.wixsite.com/greatwhip-site Mail: [email protected]

  • 15.03.26 20:22 harristhomas7376

    "In the crypto world, this is great news I want to share. Last year, I fell victim to a scam disguised as a safe investment option. I have invested in crypto trading platforms for about 10yrs thinking I was ensuring myself a retirement income, only to find that all my assets were either frozen, I believed my assets were secure — until I discovered that my BTC funds had been frozen and withdrawals were impossible. It was a devastating moment when I realized I had been scammed, and I thought my Bitcoin was gone forever, Everything changed when a close friend recommended the Capital Crypto Recover Service. Their professionalism, expertise, and dedication enabled me to recover my lost Bitcoin funds back — more than €560.000 DEM to my BTC wallet. What once felt impossible became a reality thanks to their support. If you have lost Bitcoin through scams, hacking, failed withdrawals, or similar challenges, don’t lose hope. I strongly recommend Capital Crypto Recover Service to anyone seeking a reliable and effective solution for recovering any wallet assets. They have a proven track record of successful reputation in recovering lost password assets for their clients and can help you navigate the process of recovering your funds. Don’t let scammers get away with your hard-earned money – contact Email: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Contact: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 15.03.26 20:22 harristhomas7376

    "In the crypto world, this is great news I want to share. Last year, I fell victim to a scam disguised as a safe investment option. I have invested in crypto trading platforms for about 10yrs thinking I was ensuring myself a retirement income, only to find that all my assets were either frozen, I believed my assets were secure — until I discovered that my BTC funds had been frozen and withdrawals were impossible. It was a devastating moment when I realized I had been scammed, and I thought my Bitcoin was gone forever, Everything changed when a close friend recommended the Capital Crypto Recover Service. Their professionalism, expertise, and dedication enabled me to recover my lost Bitcoin funds back — more than €560.000 DEM to my BTC wallet. What once felt impossible became a reality thanks to their support. If you have lost Bitcoin through scams, hacking, failed withdrawals, or similar challenges, don’t lose hope. I strongly recommend Capital Crypto Recover Service to anyone seeking a reliable and effective solution for recovering any wallet assets. They have a proven track record of successful reputation in recovering lost password assets for their clients and can help you navigate the process of recovering your funds. Don’t let scammers get away with your hard-earned money – contact Email: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Contact: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 15.03.26 20:22 harristhomas7376

    "In the crypto world, this is great news I want to share. Last year, I fell victim to a scam disguised as a safe investment option. I have invested in crypto trading platforms for about 10yrs thinking I was ensuring myself a retirement income, only to find that all my assets were either frozen, I believed my assets were secure — until I discovered that my BTC funds had been frozen and withdrawals were impossible. It was a devastating moment when I realized I had been scammed, and I thought my Bitcoin was gone forever, Everything changed when a close friend recommended the Capital Crypto Recover Service. Their professionalism, expertise, and dedication enabled me to recover my lost Bitcoin funds back — more than €560.000 DEM to my BTC wallet. What once felt impossible became a reality thanks to their support. If you have lost Bitcoin through scams, hacking, failed withdrawals, or similar challenges, don’t lose hope. I strongly recommend Capital Crypto Recover Service to anyone seeking a reliable and effective solution for recovering any wallet assets. They have a proven track record of successful reputation in recovering lost password assets for their clients and can help you navigate the process of recovering your funds. Don’t let scammers get away with your hard-earned money – contact Email: [email protected] Phone CALL/Text Number: +1 (336) 390-6684 Contact: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 16.03.26 12:01 [email protected]

    I would like to highly recommend TOP RECOVERY EXPERT, the best in cryptocurrency recovery. I want the world to know how exceptional their services are. For years, I faced a very difficult time after being scammed out of $453,000 in Ethereum. It was devastating to realize that someone could steal from me without remorse after I trusted them. Determined to recover my funds legally, I began searching for reliable help and came across TOP RECOVERY EXPERT, the most professional recovery service I have ever found. With their expertise and support, I was able to recover my entire Ethereum wallet. I now understand that while many investment opportunities can seem too good to be true, professional guidance can make all the difference. Thanks to TOP RECOVERY EXPERT, I have regained not only my assets ETH but also my peace of mind and happiness. Their dedication and professionalism have truly changed my life. I am now the happiest person I have ever been, all because of their help. If you have been a victim of a crypto scam, I strongly advise you to reach out to TOP RECOVERY EXPERT. Contact Information: Text/Call: +1 (346) 980-9102 Email: [email protected] For more information visit his website: https://toprecoveryexpert2.wixsite.com/consultant

  • 16.03.26 13:20 luciajessy3

    There are many recommendations online, but not all of them are trustworthy. Unfortunately, some so-called “recovery services” are scams themselves and may try to take advantage of people who have already lost money. If you’ve been scammed, be extremely cautious about anyone promising guaranteed recovery — especially if they ask for upfront fees. Always do thorough research, verify credentials, and consider reporting the incident to. Cyberrefundexperts {A} Consultant {.} Com , Stay alert and protect yourself.

  • 16.03.26 13:20 luciajessy3

    There are many recommendations online, but not all of them are trustworthy. Unfortunately, some so-called “recovery services” are scams themselves and may try to take advantage of people who have already lost money. If you’ve been scammed, be extremely cautious about anyone promising guaranteed recovery — especially if they ask for upfront fees. Always do thorough research, verify credentials, and consider reporting the incident to. Cyberrefundexperts @ Consultant . Com , Stay alert and protect yourself.

  • 18.03.26 15:27 keithwilson9899

    ETHEREUM RECOVERY ASSISTANCE: CAPITAL CRYPTO RECOVER HELPED ME RECOVER $98,000 WORTH OF LOST ETH In cases of cryptocurrency scams, having accurate information and trusted support is essential. I would like to recommend Capital Crypto Recover Service, a professional team that specializes in assisting individuals with the recovery of lost or stolen Bitcoin and Ethereum (ETH). Their experienced experts are dedicated to helping victims of digital asset fraud by carefully analyzing each case, developing strategic recovery plans, Capital Crypto Recover Service knowledgeable team's primary goals are to satisfy clients and offer significant support and working diligently toward fund retrieval. The team is committed to providing reliable assistance and maintaining a high level of client satisfaction. Based on my assessment, their reputation professionalism and a strong commitment to their clients. If you have experienced a cryptocurrency loss, you can contacting them for further assistance Phone (Call/Text): +1 (336) 390-6684 Email: [email protected] Alternate Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 18.03.26 15:27 keithwilson9899

    ETHEREUM RECOVERY ASSISTANCE: CAPITAL CRYPTO RECOVER HELPED ME RECOVER $98,000 WORTH OF LOST ETH In cases of cryptocurrency scams, having accurate information and trusted support is essential. I would like to recommend Capital Crypto Recover Service, a professional team that specializes in assisting individuals with the recovery of lost or stolen Bitcoin and Ethereum (ETH). Their experienced experts are dedicated to helping victims of digital asset fraud by carefully analyzing each case, developing strategic recovery plans, Capital Crypto Recover Service knowledgeable team's primary goals are to satisfy clients and offer significant support and working diligently toward fund retrieval. The team is committed to providing reliable assistance and maintaining a high level of client satisfaction. Based on my assessment, their reputation professionalism and a strong commitment to their clients. If you have experienced a cryptocurrency loss, you can contacting them for further assistance Phone (Call/Text): +1 (336) 390-6684 Email: [email protected] Alternate Email: [email protected] Website: https://recovercapital.wixsite.com/capital-crypto-rec-1

  • 08:03 Alena76

    Most people have been scammed severally and they give up on their funds I'm saying these because I was a victim too After loosing 745,000 USD I lose my mind until I read about COIN HACK RECOVERY I decided to contact the company on: [email protected] and I'm glad I made the decision not to give up. they helped me to recover all my lost funds within two days.

  • 08:04 Alena76

    Most people have been scammed severally and they give up on their funds I'm saying these because I was a victim too After loosing 745,000 USD I lose my mind until I read about COIN HACK RECOVERY I decided to contact the company on: [email protected] and I'm glad I made the decision not to give up. they helped me to recover all my lost funds within two days.

  • 08:15 Alena76

    Most people have been scammed severally and they give up on their funds I'm saying these because I was a victim too After loosing 745,000 USD I lose my mind until I read about COIN HACK RECOVERY I decided to contact the company on: [email protected] and I'm glad I made the decision not to give up. they helped me to recover all my lost funds within two days.

Для участия в Чате вам необходим бесплатный аккаунт pro-blockchain.com Войти Регистрация
Есть вопросы?
С вами на связи 24/7
Help Icon