https://github.com/italoag/blockchain-transaction-tracker
Blockchain Wallet Transaction Tracker
https://github.com/italoag/blockchain-transaction-tracker
blockchain spring-boot spring-webflux tracking transaction web3j
Last synced: 5 months ago
JSON representation
Blockchain Wallet Transaction Tracker
- Host: GitHub
- URL: https://github.com/italoag/blockchain-transaction-tracker
- Owner: italoag
- Created: 2025-07-04T19:25:09.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2025-09-19T02:31:33.000Z (9 months ago)
- Last Synced: 2025-09-19T04:25:48.848Z (9 months ago)
- Topics: blockchain, spring-boot, spring-webflux, tracking, transaction, web3j
- Language: Java
- Homepage:
- Size: 174 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Blockchain Transaction Tracking Service
Este projeto demonstra um microserviço simples em Spring Boot WebFlux para acompanhamento de transações em diferentes redes blockchain.
O serviço utiliza a biblioteca **web3j 4.12** para se conectar as redes e monitorar novos blocos e transações.
## Desenvolvimento
```bash
./mvnw spring-boot:run
```
### Docker
```bash
docker-compose up --build
```
### Code Structure
```text
blockchain-connector/
│
├── src/
│ └── main/
└── java/
└── com/
└── project/
└── blockchain/
└── connector/
│
├── domain/ # CAMADA DE DOMÍNIO (núcleo da aplicação)
│ │
│ ├── model/ # Entidades e Agregados
│ │ ├── transaction/
│ │ ├── signature/
│ │ ├── blockchain/
│ │ └── retry/
│ │
│ ├── event/ # Domain Events
│ │
│ ├── exception/ # Domain Exceptions
│ │
│ ├── port/ # Portas (interfaces)
│ │ ├── inbound/ # Casos de uso (entradas)
│ │ └── outbound/ # Portas de saída
│ │
│ └── service/ # Domain Services
│
├── application/ # CAMADA DE APLICAÇÃO
│ │
│ ├── usecase/ # Implementação dos casos de uso
│ │
│ ├── service/ # Application Services (orquestração)
│ │
│ ├── statemachine/ # State Machine
│ │ ├── config/
│ │ ├── state/
│ │ ├── event/
│ │ ├── action/
│ │ └── guard/
│ │
│ ├── mapper/ # Application DTOs e Mappers
│ └── dto/ # DTOs da camada de aplicação
│
└── infrastructure/ # CAMADA DE INFRAESTRUTURA
│
├── adapter/ # Adaptadores
│ │
│ ├── inbound/ # Adaptadores de entrada
│ │ ├── messaging/
│ │ │ ├── kafka/
│ │ │ │ ├── consumer/
│ │ │ │ ├── config/
│ │ │ │ └── dto/
│ │ │ └── mapper/
│ │ └── rest/
│ │ ├── controller/
│ │ ├── dto/
│ │ └── mapper/
│ │
│ └── outbound/ # Adaptadores de saída
│ ├── persistence/
│ │ ├── mongodb/
│ │ │ ├── repository/
│ │ │ ├── entity/
│ │ │ ├── mapper/
│ │ │ └── config/
│ ├── blockchain/
│ │ ├── web3j/
│ │ │ ├── config/
│ │ │ ├── mapper/
│ │ │ └── util/
│ │ │
│ │ └── dto/
│ ├── signer/
│ │ ├── kafka/
│ │ ├── rest/
│ │ ├── strategy/
│ │ └── dto/
│ ├── messaging/
│ │ ├── kafka/
│ │ │ ├── producer/
│ │ │ └── mapper/
│ └── cache/
│ └── config/
├── config/ # Configurações gerais
│ └── properties/
├── scheduler/ # Tarefas agendadas
├── resilience/ # Resiliência
├── observability/ # Observabilidade
│ ├── metrics/
│ ├── tracing/
│ └── logging/
└── exception/ # Exception Handlers
```
### Propose 2
```text
blockchain-connector/
└── src/
├── main/
│ ├── java/
│ │ └── com/example/blockchainconnector/
│ │ ├── boot/
│ │ │ ├── BlockchainConnectorApplication.java
│ │ │ └── StartupRunner.java
│ │ │
│ │ ├── domain/
│ │ │ ├── model/
│ │ │ │ ├── transaction/
│ │ │ │ │ ├── BlockchainTransaction.java
│ │ │ │ │ ├── TransactionStatus.java
│ │ │ │ │ ├── GasEstimation.java
│ │ │ │ │ └── Nonce.java
│ │ │ │ ├── wallet/
│ │ │ │ │ └── Wallet.java
│ │ │ │ └── event/
│ │ │ │ └── ChainEvent.java
│ │ │ │
│ │ │ ├── exception/
│ │ │ │ ├── TransactionNotFoundException.java
│ │ │ │ └── SignatureException.java
│ │ │ │
│ │ │ ├── port/
│ │ │ │ ├── inbound/
│ │ │ │ │ ├── KafkaEventListenerPort.java
│ │ │ │ │ └── ApiInboundPort.java
│ │ │ │ ├── outbound/
│ │ │ │ │ ├── SignerRestClientPort.java
│ │ │ │ │ ├── SignerEventProducerPort.java
│ │ │ │ │ ├── BlockchainClientPort.java
│ │ │ │ │ ├── TransactionRepositoryPort.java
│ │ │ │ │ ├── GasEstimatorPort.java
│ │ │ │ │ ├── NonceManagerPort.java
│ │ │ │ │ └── ConfirmationListenerPort.java
│ │ │ │ └── state/
│ │ │ │ ├── StateMachinePort.java
│ │ │ │ └── StateTransitionCallbackPort.java
│ │ │ │
│ │ │ └── service/
│ │ │ ├── TransactionService.java
│ │ │ ├── GasService.java
│ │ │ ├── NonceService.java
│ │ │ └── ConfirmationService.java
│ │ │
│ │ ├── application/
│ │ │ ├── dto/
│ │ │ │ ├── request/
│ │ │ │ │ ├── CreateTransactionRequest.java
│ │ │ │ │ └── SignerCallbackRequest.java
│ │ │ │ ├── response/
│ │ │ │ │ └── TransactionStatusResponse.java
│ │ │ │ └── event/
│ │ │ │ ├── OutboundTransactionEvent.java
│ │ │ │ └── ConfirmationEventPayload.java
│ │ │ │
│ │ │ ├── mapper/
│ │ │ │ ├── TransactionMapper.java
│ │ │ │ ├── SignerMapper.java
│ │ │ │ └── EventMapper.java
│ │ │ │
│ │ │ ├── usecase/
│ │ │ │ ├── CreateTransactionUseCase.java
│ │ │ │ ├── HandleSignatureCallbackUseCase.java
│ │ │ │ ├── BroadcastTransactionUseCase.java
│ │ │ │ ├── WaitForConfirmationUseCase.java
│ │ │ │ └── CompleteFlowUseCase.java
│ │ │ │
│ │ │ ├── statemachine/
│ │ │ │ ├── config/
│ │ │ │ │ └── BlockchainStateMachineConfig.java
│ │ │ │ ├── state/
│ │ │ │ │ ├── BlockchainStates.java
│ │ │ │ │ └── BlockchainEvents.java
│ │ │ │ └── handler/
│ │ │ │ ├── StartupStateHandler.java
│ │ │ │ └── StateTransitionListener.java
│ │ │ │
│ │ │ └── orchestrator/
│ │ │ │ └── TransactionOrchestrator.java
│ │ │
│ │ ├── infrastructure/
│ │ │ ├── config/
│ │ │ │ ├── KafkaConfig.java
│ │ │ │ ├── MongoConfig.java
│ │ │ │ ├── Web3jConfig.java
│ │ │ │ ├── WebClientConfig.java
│ │ │ │ └── StateMachineConfig.java
│ │ │ │
│ │ │ ├── adapter/
│ │ │ │ ├── inbound/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ └── TransactionController.java
│ │ │ │ │ └── kafka/
│ │ │ │ │ └── TransactionEventConsumer.java
│ │ │ │ ├── outbound/
│ │ │ │ │ ├── kafka/
│ │ │ │ │ │ └── ConfirmationEventProducer.java
│ │ │ │ │ ├── rest/
│ │ │ │ │ │ ├── SignerRestClient.java
│ │ │ │ │ │ └── ExternalApiClient.java
│ │ │ │ │ ├── blockchain/
│ │ │ │ │ │ ├── Web3jBlockchainClient.java
│ │ │ │ │ │ ├── GasEstimatorWeb3j.java
│ │ │ │ │ │ └── NonceManagerWeb3j.java
│ │ │ │ │ └── repository/
│ │ │ │ │ └── MongoTransactionRepository.java
│ │ │ │
│ │ │ └── security/
│ │ │ └── HttpSecurityConfig.java
│ │ │
│ │ └── shared/
│ │ ├── annotation/
│ │ │ └── DomainService.java
│ │ ├── util/
│ │ │ ├── JsonUtils.java
│ │ │ └── RetryUtils.java
│ │ └── events/
│ │ └── KafkaHeadersConstants.java
│ │
│ └── resources/
│ ├── application.yml
│ ├── state-machine/
│ │ └── blockchain-state-machine.sm
│ └── mappings/
│ └── transaction-mapper.xml
│
└── test/
└── java/
└── com/example/blockchainconnector/
├── domain/
├── application/
├── infrastructure/
└── integration/
```
### Propose 3
```text
blockchain-connector/
└── src/
├── main/
│ ├── java/
│ │ └── com/example/blockchainconnector/
│ │ ├── boot/
│ │ │ ├── BlockchainConnectorApplication.java
│ │ │ └── StartupRunner.java
│ │ │
│ │ ├── domain/
│ │ │ ├── model/
│ │ │ │ ├── transaction/
│ │ │ │ │ ├── BlockchainTransaction.java
│ │ │ │ │ ├── TransactionStatus.java
│ │ │ │ │ ├── GasEstimation.java
│ │ │ │ │ └── Nonce.java
│ │ │ │ ├── wallet/
│ │ │ │ │ └── Wallet.java
│ │ │ │ └── event/
│ │ │ │ └── ChainEvent.java
│ │ │ │
│ │ │ ├── exception/
│ │ │ │ ├── TransactionNotFoundException.java
│ │ │ │ └── SignatureException.java
│ │ │ │
│ │ │ ├── port/
│ │ │ │ ├── inbound/
│ │ │ │ │ ├── KafkaEventListenerPort.java
│ │ │ │ │ └── ApiInboundPort.java
│ │ │ │ ├── outbound/
│ │ │ │ │ ├── SignerRestClientPort.java
│ │ │ │ │ ├── SignerEventProducerPort.java
│ │ │ │ │ ├── BlockchainClientPort.java
│ │ │ │ │ ├── TransactionRepositoryPort.java
│ │ │ │ │ ├── GasEstimatorPort.java
│ │ │ │ │ ├── NonceManagerPort.java
│ │ │ │ │ └── ConfirmationListenerPort.java
│ │ │ │ └── state/
│ │ │ │ ├── StateMachinePort.java
│ │ │ │ └── StateTransitionCallbackPort.java
│ │ │ │
│ │ │ └── service/
│ │ │ ├── TransactionService.java
│ │ │ ├── GasService.java
│ │ │ ├── NonceService.java
│ │ │ └── ConfirmationService.java
│ │ │
│ │ ├── application/
│ │ │ ├── dto/
│ │ │ │ ├── request/
│ │ │ │ │ ├── CreateTransactionRequest.java
│ │ │ │ │ └── SignerCallbackRequest.java
│ │ │ │ ├── response/
│ │ │ │ │ └── TransactionStatusResponse.java
│ │ │ │ └── event/
│ │ │ │ ├── OutboundTransactionEvent.java
│ │ │ │ └── ConfirmationEventPayload.java
│ │ │ │
│ │ │ ├── mapper/
│ │ │ │ ├── TransactionMapper.java
│ │ │ │ ├── SignerMapper.java
│ │ │ │ └── EventMapper.java
│ │ │ │
│ │ │ ├── usecase/
│ │ │ │ ├── CreateTransactionUseCase.java
│ │ │ │ ├── HandleSignatureCallbackUseCase.java
│ │ │ │ ├── BroadcastTransactionUseCase.java
│ │ │ │ ├── WaitForConfirmationUseCase.java
│ │ │ │ └── CompleteFlowUseCase.java
│ │ │ │
│ │ │ ├── statemachine/
│ │ │ │ ├── config/
│ │ │ │ │ └── BlockchainStateMachineConfig.java
│ │ │ │ ├── state/
│ │ │ │ │ ├── BlockchainStates.java
│ │ │ │ │ └── BlockchainEvents.java
│ │ │ │ └── handler/
│ │ │ │ ├── StartupStateHandler.java
│ │ │ │ └── StateTransitionListener.java
│ │ │ │
│ │ │ └── orchestrator/
│ │ │ │ └── TransactionOrchestrator.java
│ │ │
│ │ ├── infrastructure/
│ │ │ ├── config/
│ │ │ │ ├── KafkaConfig.java
│ │ │ │ ├── MongoConfig.java
│ │ │ │ ├── Web3jConfig.java
│ │ │ │ ├── WebClientConfig.java
│ │ │ │ └── StateMachineConfig.java
│ │ │ │
│ │ │ ├── adapter/
│ │ │ │ ├── inbound/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ └── TransactionController.java
│ │ │ │ │ └── kafka/
│ │ │ │ │ └── TransactionEventConsumer.java
│ │ │ │ ├── outbound/
│ │ │ │ │ ├── kafka/
│ │ │ │ │ │ └── ConfirmationEventProducer.java
│ │ │ │ │ ├── rest/
│ │ │ │ │ │ ├── SignerRestClient.java
│ │ │ │ │ │ └── ExternalApiClient.java
│ │ │ │ │ ├── blockchain/
│ │ │ │ │ │ ├── Web3jBlockchainClient.java
│ │ │ │ │ │ ├── GasEstimatorWeb3j.java
│ │ │ │ │ │ └── NonceManagerWeb3j.java
│ │ │ │ │ └── repository/
│ │ │ │ │ └── MongoTransactionRepository.java
│ │ │ │
│ │ │ └── security/
│ │ │ └── HttpSecurityConfig.java
│ │ │
│ │ └── shared/
│ │ ├── annotation/
│ │ │ └── DomainService.java
│ │ ├── util/
│ │ │ ├── JsonUtils.java
│ │ │ └── RetryUtils.java
│ │ └── events/
│ │ └── KafkaHeadersConstants.java
│ │
│ └── resources/
│ ├── application.yml
│ ├── state-machine/
│ │ └── blockchain-state-machine.sm
│ └── mappings/
│ └── transaction-mapper.xml
│
└── test/
└── java/
└── com/example/blockchainconnector/
├── domain/
├── application/
├── infrastructure/
└── integration/
```
### Propose 4
```
src/
└── main/
├── java/
│ └── com/
│ └── tech/
│ └── blockchainconnector/
│ ├── BlockchainConnectorApplication.java
│ │
│ ├── domain/ # O NÚCLEO (Sem dependências de Frameworks pesados)
│ │ ├── model/ # Entidades e Value Objects
│ │ │ ├── Transaction.java # Aggregate Root (State, hash, payload)
│ │ │ ├── TransactionId.java
│ │ │ ├── NetworkConfig.java # Configuração da Chain (RPC, ChainId)
│ │ │ └── GasInfo.java
│ │ ├── event/ # Eventos de Domínio (Internos)
│ │ │ ├── TransactionSignedEvent.java
│ │ │ └── TransactionConfirmedEvent.java
│ │ ├── exception/ # Exceções de Domínio
│ │ │ └── InsufficientFundsException.java
│ │ └── port/ # Portas (Interfaces)
│ │ ├── inbound/ # Portas de Entrada (Use Cases interfaces)
│ │ │ └── ProcessTransactionUseCase.java
│ │ └── outbound/ # Portas de Saída (Interfaces para Infra)
│ │ ├── TransactionRepository.java
│ │ ├── BlockchainClientPort.java # Web3j Abstraction
│ │ ├── SignerClientPort.java # Hybrid (Kafka/Rest)
│ │ └── EventPublisherPort.java # Publicação no Kafka (Notification)
│ │
│ ├── application/ # CAMADA DE APLICAÇÃO
│ │ ├── dto/ # DTOs de Entrada/Saída
│ │ │ ├── TransactionRequestDTO.java
│ │ │ └── TransactionResponseDTO.java
│ │ ├── mapper/ # MapStruct Interfaces
│ │ │ └── TransactionMapper.java
│ │ └── service/ # Implementação dos Use Cases
│ │ ├── TransactionOrchestrator.java
│ │ └── RecoveryService.java # Lógica de reprocessamento em restart
│ │
│ └── infrastructure/ # ADAPTADORES (Tecnologia real)
│ ├── config/ # Configurações do Spring
│ │ ├── KafkaConfig.java
│ │ ├── Web3jConfig.java
│ │ ├── OpenTelemetryConfig.java
│ │ ├── MongoConfig.java
│ │ └── StateMachineConfig.java # Definição dos Estados e Transições
│ │
│ ├── adapter/
│ │ ├── inbound/ # Quem chama a aplicação
│ │ │ ├── kafka/ # Listeners do Kafka
│ │ │ │ └── TransactionRequestConsumer.java
│ │ │ └── scheduler/ # Jobs recorrentes
│ │ │ └── StuckTransactionRecoveryJob.java
│ │ │
│ │ └── outbound/ # Quem a aplicação chama
│ │ ├── persistence/ # MongoDB
│ │ │ ├── MongoTransactionRepository.java # Impl do Port
│ │ │ └── entity/ # Entidades JPA/Mongo (separadas do Domain)
│ │ │ └── TransactionDocument.java
│ │ ├── blockchain/ # Web3j
│ │ │ ├── Web3jClientAdapter.java
│ │ │ └── NonceManager.java
│ │ ├── signer/ # Comunicação com Signer
│ │ │ ├── HybridSignerAdapter.java # Lógica Kafka c/ fallback REST
│ │ │ └── rest/ # WebClient impl
│ │ └── messaging/ # Kafka Producer
│ │ └── KafkaEventPublisher.java
│ │
│ └── statemachine/ # Lógica específica do Spring State Machine
│ ├── TransactionStateMachineInterceptor.java
│ ├── actions/ # Ações disparadas nas trocas de estado
│ │ ├── EstimateGasAction.java
│ │ ├── RequestSignatureAction.java
│ │ └── BroadcastToChainAction.java
│ └── guards/ # Validações antes das transições
│ └── BalanceGuard.java
│
└── resources/
├── application.yml
├── application-prod.yml
└── statemachine-diagram.puml # Documentação visual da SM
```