Skip to content

taigfs/crypto-onramp-server

Repository files navigation

Refuconnect - ETH Latam Hackaton 2025

Status Node.js Express License: ISC

Refuconnect transforma Pix em cripto em segundos, oferecendo depósitos instantâneos, custódia segura e suporte a múltiplas redes para que refugiados e migrantes possam gerenciar seus ativos digitais com a mesma agilidade de uma conta tradicional.

🔗 Quick Links

Visão Geral

Refuconnect é um backend Express focado em on/off ramp para comunidades que dependem de Pix no Brasil. O serviço integra Woovi/OpenPix para gerar cobranças, interage com um contrato ERC-20 (BRLR) em redes de teste Base/Arbitrum Sepolia e prepara o terreno para adoção de FHE (Fhenix) em fluxos sensíveis.

Stack

  • Node.js + Express
  • Ethers v6 para interações on-chain
  • Jest + Supertest
  • Integração Woovi/OpenPix para Pix automático

Features & Motivação

Deposite com Pix e receba criptomoedas instantaneamente, com uma experiência simples, rápida e segura que conecta sua wallet a múltiplas redes e mantém seus ativos protegidos pelas melhores práticas de infraestrutura cripto.

  • Depósitos instantâneos: converte Pix em BRLR em segundos mediante webhooks da Woovi.
  • Seguro & confiável: validações de payload, logs estruturados e possibilidade de rodar com chaves isoladas.
  • Multichain-ready: suporte atual a Base/Arbitrum Sepolia com planos para Coinbase, Ethereum Sepolia e Fhenix FHERC20.
  • Fluxos claros: endpoints de mint, burn, consulta de saldo e geração de QR Code Pix.
  • Pronto para dashboard: expõe status de contrato, saldos e transações para integrar com UI/analytics.

Arquitetura

crypto-onramp-server/
├─ src/
│  ├─ index.js               # Servidor Express principal (rotas HTTP)
│  ├─ contracts/
│  │  ├─ BRLRRefuconnect.sol # Contrato ERC-20 custom BRLR
│  │  └─ ERC20.json          # ABI utilizada para interagir com o contrato
│  └─ services/
│     ├─ blockchain.js       # Conexão com provider e informações do contrato
│     ├─ burn.js             # Regras de validação/execução de burn (placeholder)
│     ├─ mint.js             # Validações e mint on-chain
│     ├─ transactions.js     # Consulta de transações via API externa
│     └─ woovi.js            # Integração com API Woovi (PIX)
├─ test/
│  └─ server.test.js         # Testes com Jest e Supertest
├─ test-dummy/
│  └─ webhook-payload.json   # Payload de exemplo para testes do webhook
├─ jest.config.js            # Configuração de testes
├─ Makefile                  # Atalhos para testar endpoints com curl
└─ ...

Fluxo principal

  1. UI/usuário cria um pedido Pix (POST /get_qrcode).
  2. Woovi dispara webhook OPENPIX:CHARGE_COMPLETED com metadados da wallet.
  3. Backend valida o evento, executa mint via Ethers e retorna detalhes da transação.

Getting Started

Prerequisites

  • Node.js >= 18
  • npm (instalado com Node)
  • Endpoint RPC Base/Arbitrum ou Ethereum Sepolia
  • Conta Woovi/OpenPix ativa e chave de API

Instalação

npm install

Configuração de Ambiente

Crie um .env com base na configuração simplificada:

# .env
PORT=3000

# Escolha a rede: 'base-sepolia' ou 'ethereum-sepolia'
NETWORK=base-sepolia

# Credenciais on-chain
PRIVATE_KEY=sua_chave_privada_aqui
CONTRACT_ADDRESS=0x...

# Integração Woovi
WOOVI_API_KEY=your_woovi_api_key_here
WOOVI_API_URL=https://api.woovi.com

# CORS
CORS_ORIGINS=*

Sobrescritas Opcionais

# RPC customizado
RPC_URL=https://seu-rpc-customizado.com

# Chain ID customizado
CHAIN_ID=84532

Redes Suportadas

Network Chain ID RPC Padrão Explorer
base-sepolia 84532 https://sepolia.base.org https://sepolia.basescan.org
ethereum-sepolia 11155111 https://sepolia.infura.io/v3/… https://sepolia.etherscan.io

Para ethereum-sepolia, forneça seu próprio RPC_URL com chave Infura/Alchemy.

Desenvolvimento

# Rodar servidor
npm start

# Hot reload
npm run dev

Testes

npm test

Use o Makefile para cURLs de exemplo:

make list               # Lista comandos disponíveis
make ping               # Verifica disponibilidade da API
make webhook SAMPLE=1   # Dispara payload de webhook de exemplo

API Reference

Método Endpoint Descrição
GET / Status do serviço e metadados da blockchain configurada
POST /webhook/charge_completed Recebe webhook Woovi e executa mint de BRLR
POST /burn Placeholder para fluxo de burn (log + resposta mock)
GET /balance/:address Consulta saldo do token para um endereço
POST /get_qrcode Cria cobrança Pix e retorna QR Code + link de pagamento

GET /

Retorna estado atual da aplicação, rede e informações do contrato (wallet, saldo, token).

POST /webhook/charge_completed

  • Evento esperado: OPENPIX:CHARGE_COMPLETED.
  • charge.comment precisa conter o endereço Ethereum do beneficiário.
  • valueWithDiscount (fallback para value) em centavos vira o montante BRLR.
  • Resposta traz hash da transação, block number, gas usado, amount e explorer.

POST /burn

Apenas registra a intenção de burn no log enquanto o fluxo on-chain completa é desenvolvido.

GET /balance/:address

Consulta saldo formatado (balance) e valor bruto (balanceRaw) diretamente do contrato ERC-20.

POST /get_qrcode

Gera cobrança Pix via Woovi, retornando QR Code, BR Code, link de pagamento, taxas e expiração.

Payloads de exemplo estão em test-dummy/webhook-payload.json e no Makefile.

Exemplos de Payloads e Respostas

GET /

curl http://localhost:3000/
{
  "status": "OK",
  "message": "Refuconnect API ativa",
  "blockchain": {
    "network": "Base Sepolia",
    "contract": "0x...",
    "wallet": "0x...",
    "walletBalance": "0.10 ETH",
    "token": {
      "name": "BRLR Token",
      "symbol": "BRLR",
      "decimals": 18,
      "totalSupply": "1234.56"
    }
  }
}

POST /webhook/charge_completed

curl -X POST http://localhost:3000/webhook/charge_completed \
  -H "Content-Type: application/json" \
  -d '{
        "event": "OPENPIX:CHARGE_COMPLETED",
        "charge": {
          "comment": "0x846489b48bf8a7e2ef602bdcbc6beeefd6c9082b",
          "valueWithDiscount": 250,
          "transactionID": "a98a3ab821b0468ca5ad450f8745bfb3",
          "status": "COMPLETED"
        }
      }'
{
  "success": true,
  "message": "Mint executado a partir do charge_completed",
  "data": {
    "txHash": "0x123...",
    "blockNumber": 123456,
    "gasUsed": "55000",
    "walletAddress": "0x846489b48bf8a7e2ef602bdcbc6beeefd6c9082b",
    "amount": "2.50",
    "wooviTransactionID": "a98a3ab821b0468ca5ad450f8745bfb3",
    "wooviCorrelationID": "correlation-id",
    "explorer": "https://sepolia.basescan.org/tx/0x123..."
  }
}

POST /burn

curl -X POST http://localhost:3000/burn \
  -H "Content-Type: application/json" \
  -d '{
        "from": "0x846489b48bf8a7e2ef602bdcbc6beeefd6c9082b",
        "amount": "50"
      }'
{
  "success": true,
  "message": "Burn executado com sucesso!",
  "data": {
    "txHash": "0x456...",
    "blockNumber": 123789,
    "gasUsed": "60000",
    "from": "0x846489b48bf8a7e2ef602bdcbc6beeefd6c9082b",
    "amount": "50",
    "method": "burn",
    "explorer": "https://sepolia.basescan.org/tx/0x456..."
  }
}

GET /balance/:address

curl http://localhost:3000/balance/0x846489b48bf8a7e2ef602bdcbc6beeefd6c9082b
{
  "success": true,
  "data": {
    "address": "0x846489b48bf8a7e2ef602bdcbc6beeefd6c9082b",
    "balance": "150.00",
    "balanceRaw": "150000000000000000000"
  }
}

POST /get_qrcode

curl -X POST http://localhost:3000/get_qrcode \
  -H "Content-Type: application/json" \
  -d '{
        "wallet_address": "0x846489b48bf8a7e2ef602bdcbc6beeefd6c9082b",
        "value": 250
      }'
{
  "success": true,
  "message": "PIX charge criado com sucesso via Woovi!",
  "data": {
    "qrCodeImage": "https://woovi.com/qrcode/...",
    "brCode": "0002012658...",
    "transactionId": "transaction-id",
    "value": 250,
    "fee": 0,
    "status": "ACTIVE",
    "paymentLinkUrl": "https://checkout.woovi.com/...",
    "expiresDate": "2025-11-08T12:00:00.000Z"
  }
}

Operação & Observabilidade

  • Logs estruturados com timestamp, payload recebido e resultado das transações.
  • Redirecione stdout/stderr para sua stack de observabilidade (Datadog, Loki, Splunk, etc.).
  • Monitore falhas na Woovi, transações revertidas e saldo insuficiente do deployer.

Troubleshooting Rápido

  • Webhook não chega: valide URL pública e WOOVI_API_KEY.
  • Mint falhou: confira saldo da carteira (GET /) e permissões do PRIVATE_KEY.
  • CORS bloqueando: ajuste CORS_ORIGINS para incluir domínios do dashboard.

Roadmap

  1. Construir API Express com endpoints de mint e burn. ✅
  2. Integrar com contrato ERC-20 em testnet Base/Arbitrum Sepolia. ✅
  3. Validar fluxo completo de on/off ramp com usuários reais. 🚧
  4. Migrar para FHERC20 da Fhenix quando disponível. 🗓️
  5. Expandir suporte multi-chain (Coinbase, Optimism) e dashboards analíticos. 🗓️

Contribuindo

  1. Faça fork do repositório.
  2. Crie uma branch (feature/refactor-mint-service).
  3. Rode testes e linter antes do PR.
  4. Abra PR descrevendo problema, solução e resultados dos testes.

Sugestões do ETH Latam ou feedbacks de campo são super bem-vindos via Issues.

Créditos

  • Hackathon ETH Latam 2025 — Equipe Refuconnect.
  • Comunidade Fhenix e Woovi pelo suporte técnico.

License

ISC

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors