Ir al contenido principal
Volver a las aplicaciones de ejemplo

dApp que cumple con la normativa sobre la lucha contra el blanqueo de capitales y la financiación del terrorismo

Esta dApp, que cumple con la normativa contra el blanqueo de capitales y la financiación del terrorismo (AML y CFT), permite realizar staking de ETH de forma segura gracias a sus funciones de cumplimiento normativo integradas. Desarrollada sobre Base compatible con cualquier red Ethereum, utiliza Chainlink Functions y la API de evaluación de riesgos Quicknodepara garantizar que solo las carteras de bajo riesgo puedan participar en el pool de staking.

Marco de trabajo/biblioteca de front-end:
Reaccionar
Idioma:
TypeScript
Herramienta de compilación/servidor de desarrollo:
Next.js
Vista previa de la aplicación de ejemplo

Introducción

The AML and CFT Compliant dApp enables secure ETH staking with a compliance layer powered by Chainlink Functions and the Risk Assessment API from the Quicknode Add-ons. Built on Base and compatible with any Ethereum-based network, this project demonstrates a practical integration of off-chain data into smart contracts, ensuring only low-risk wallets can participate in the staking pool.

Este proyecto está implementado en Base Mainnet de forma predeterminada. Si decides utilizar una red diferente, asegúrate de actualizar las variables de entorno pertinentes en consecuencia.

Tenemos una guía detallada paso a paso que te guía a lo largo de todo el proceso de configuración, incluyendo la implementación del contrato inteligente, la configuración de Chainlink Functions y la integración de la API de evaluación de riesgos. Si eres nuevo en Chainlink Functions o en Quicknode , esta guía te ayudará a comprender la integración con mayor profundidad.


Resumen del proyecto

El objetivo principal de la dApp, que cumple con la normativa sobre la lucha contra el blanqueo de capitales (AML) y la financiación del terrorismo (CFT), es ofrecer una experiencia de staking segura mediante la incorporación de una verificación de cumplimiento en cadena. La aplicación:


  • Solo acepta depósitos en ETH procedentes de carteras que superen una evaluación de riesgos.
  • Facilita las retiradas tras verificar el cumplimiento de los requisitos de la cartera mediante una puntuación de riesgo proporcionada por un oráculo.
  • Integra datos de riesgo fuera de la cadena procedentes de una API dedicada a la evaluación de riesgos mediante Chainlink Functions.

Arquitectura técnica


  • Risk Assessment API: A Quicknode add-on that provides a numeric risk score (0-100, where higher scores indicate lower risk) based on off-chain analysis (e.g., transaction patterns, known associations).
  • Funciones de Chainlink: una solución de oráculo descentralizada que obtiene datos de la API, los procesa y actualiza el contrato inteligente. Utiliza claves secretas alojadas en DON o por el usuario para la gestión de claves API y un mecanismo de devolución de llamada para entregar los resultados.
  • Contrato inteligente: un contrato en Solidity que aplica las normas de staking en función de las puntuaciones de riesgo. Se integra con Chainlink Functions para solicitar y recibir datos de riesgo.
  • Frontend de Next.js: una aplicación React basada en TypeScript que utiliza Next.js, Wagmi y Viem para las interacciones con la cadena de bloques.

Este proyecto implementa controles de seguridad tanto a nivel del contrato inteligente como del front-end para garantizar que la dApp cumpla plenamente con la normativa. Si se opta por un control de seguridad exclusivo del front-end (por ejemplo, consultando la API directamente), se pueden eludir las funciones de Chainlink, pero esto desactivará la aplicación de la normativa en la cadena.

Flow de datos:


  1. El usuario inicia una comprobación de riesgo si aún no tiene una puntuación de riesgo.
  2. La API de Next.js (/api/check-risk) activa una solicitud de Chainlink Functions con la dirección del monedero.
  3. Las funciones de Chainlink llaman a la API de evaluación de riesgos, procesan la respuesta y devuelven la puntuación de riesgo.
  4. El contrato inteligente actualiza el perfil de riesgo del usuario y garantiza el cumplimiento de las normas.
  5. La interfaz de usuario refleja los cambios mediante una nueva carga tras la acción y muestra la puntuación de riesgo del usuario y la barra de progreso, además de permitirle realizar apuestas o retirar fondos en función de su puntuación de riesgo.

Componentes clave

1. Contrato inteligente: RiskBasedStaking.sol

Este contrato de Solidity gestiona las operaciones de staking y retirada mediante una evaluación de riesgos integrada:


  • Función de depósito: Acepta depósitos de ETH si la puntuación de riesgo del monedero está por debajo de un umbral establecido.
  • Función de retirada: permite a los usuarios retirar el ETH que tienen en staking, previa verificación del cumplimiento de los requisitos.
  • Almacenamiento de la puntuación de riesgo: registra la última puntuación de riesgo de cada monedero (actualizada mediante una llamada de retorno de Chainlink Functions).
  • Umbral configurable: Solo se permite participar en el staking a las carteras cuya puntuación de riesgo sea inferior a un umbral predeterminado (por ejemplo, 50 sobre 100).

Detalles técnicos:


  • Idioma: Solidity (v0.8.18)
  • Variables de estado:
    • mapping(address => uint256) public stakedBalances – Ingresos de ETH de los usuarios.
    • mapping(address => uint256) public riskScores – Últimas puntuaciones de riesgo de las carteras.
    • uint256 público riskThreshold – Puntuación máxima de riesgo aceptable.
    • mapping(dirección => bool) public pendingRequests – Realiza un seguimiento de las solicitudes de verificación de riesgos en curso.
  • Funciones principales:
    • stake(): Deposita ETH si la puntuación de riesgo es aceptable.
    • withdraw(uint256 amount): Retira el ETH apostado tras validar los saldos.
    • sendRequest(...): Función exclusiva para el propietario destinada a activar una solicitud de Chainlink Functions para la evaluación de riesgos.
    • fulfillRequest(bytes32, bytes, bytes): Llamada interna para actualizar la puntuación de riesgo.
    • setRiskThreshold(uint256): Función exclusiva para el propietario que permite modificar el umbral de riesgo.

Chainlink Functions actúa como puente entre los datos de riesgo fuera de la cadena y el contrato de staking en la cadena:


  • Fuente de datos: Recupera la puntuación de riesgo de una cartera a través de la API de evaluación de riesgos.
  • Ejecución de la tarea: Ejecuta una tarea de JavaScript (a través de Chainlink Functions) para llamar a la API y devolver una puntuación numérica de riesgo.
  • Mecanismo de devolución de llamada: El contrato inteligente fulfillRequest La función actualiza el perfil de riesgo de la cartera en función de la puntuación obtenida.

3. API de evaluación de riesgos

La API de evaluación de riesgos ofrece evaluaciones de riesgo en tiempo real para direcciones de monedero:


  • Puntuación de riesgo: Devuelve una puntuación numérica (0-100) basada en un análisis fuera de la cadena (por ejemplo, historial de transacciones, asociaciones conocidas).
  • Compatibilidad con múltiples cadenas: Funciona con Ethereum otras redes basadas en EVM.

Ejemplo de respuesta de la API:

{
"jsonrpc": "2.0",
"result": {
"score": 1,
"severity": "CRITICAL_RISK",
"entityType": "Sanction list",
"entityName": "Sinbad.io"
},
"id": 1
}

4. Frontend de Next.js

El frontend de Next.js ofrece una interfaz intuitiva para que los usuarios interactúen con el contrato de staking:


  • Visualización de la puntuación de riesgo: muestra la puntuación de riesgo evaluada de la cartera conectada.
  • Sección de depósitos: Permite a los usuarios realizar staking con ETH siempre que cumplan los criterios de cumplimiento.
  • Sección de retiradas: Permite retirar el ETH apostado.
  • Interacción con la cadena de bloques: Desarrollada con Next.js, TypeScript, Wagmi, Viem y Mantine UI para ofrecer una experiencia de usuario moderna.

Descripción general de la arquitectura

Gráfico de la sirena


Estructura del proyecto

Proyecto Foundry

El contrato inteligente se ha desarrollado e implementado mediante Foundry. La estructura de directorios es la siguiente:

├── README.md
├── foundry.toml
├── lib
│ ├── forge-std
│ └── foundry-chainlink-toolkit
├── remappings.txt
├── script
│ └── RiskBasedStaking.s.sol
├── src
│ └── RiskBasedStaking.sol
└── test

  • foundry.toml: Archivo de configuración de Foundry.
  • lib/: Contiene las dependencias necesarias para las pruebas y la integración con Chainlink.
  • remappings.txt: Reasignaciones para las dependencias de Foundry.
  • script/RiskBasedStaking.s.sol: Script de implementación de Foundry.
  • src/RiskBasedStaking.sol: El contrato inteligente que gestiona las operaciones de staking y retirada con una evaluación de riesgos integrada.

Directorio de Next.js

La interfaz de usuario está desarrollada con Next.js, aprovechando los patrones modernos de React y las bibliotecas de blockchain. La estructura es la siguiente:

├── README.md
├── next.config.ts
├── package.json
├── public
├── src
│ ├── app
│ │ ├── api # Rutas de la API, incluida la integración con Chainlink Functions
│ │ ├── favicon.ico
│ │ ├── globals.css
│ │ ├── layout.tsx
│ │ ├── page.module.css
│ │ └── page.tsx
│ ├── componentes # Componentes de interfaz de usuario reutilizables (p. ej., encabezado, formularios, banners)
│ │ ├── Header.tsx
│ │ ├── InfoBanner.tsx
│ │ ├── Providers.tsx
│ │ └── StakingForm.tsx
│ ├── config # Configuración de Wagmi/Viem para las interacciones con el monedero y los contratos
│ │ └── wagmiConfig.ts
│ ├── hooks # Hooks personalizados para interacciones con contratos y evaluación de riesgos
│ │ ├── useRiskCheck.ts
│ │ └── useStakingContract.ts
│ ├── lib # Funciones auxiliares de contratos inteligentes y ABI
│ │ └── RiskBasedStaking.ts
│ └── pages # Estructura de la página principal y enrutamiento
│ └── HomePage.tsx
└── tsconfig.json

  • Ruta de la API: Situado en src/app/api, esta ruta de la API aprovecha el Kit de herramientas de funciones de Chainlink para llamar a las funciones de Chainlink.
  • Componentes y hooks: Gestiona la interfaz de usuario y las interacciones con la cadena de bloques mediante Mantine y Wagmi/Viem.
  • Configuración: Centraliza la conectividad de los monederos y las direcciones de los contratos.

Primeros pasos

Requisitos previos


  • Node.js (v18+)
  • Fundición (instalar con curl -L https://foundry.paradigm.xyz | bash entonces foundryup)
  • Una cartera Web3: por ejemplo, Rabby, MetaMask
  • URLMainnet de Mainnet Base : facilitada por Quicknode con la API de evaluación de riesgos activada
  • Suscripción a las funciones de Chainlink

Instalación

Sigue estos pasos para configurar e implementar el proyecto de dApp conforme a las normas AML y CFT.


1. Clonar el repositorio

Empieza por clonar el repositorio y acceder al directorio del proyecto:

git clone https://github.com/quiknode-labs/qn-guide-examples.git
cd qn-guide-examples/sample-dapps/aml-and-cft-compliant-dapp

2. Configura tuEndpoint Quicknode

Antes de continuar, asegúrate de que dispones de un Quicknode endpoint con la API de evaluación de riesgos habilitada:

  1. Crear unEndpoint Quicknode

    • Visita Quicknode y configura un endpoint la red que prefieras.
    • Asegúrate de que la red seleccionada sea compatible con la API de evaluación de riesgos (consulta las redes compatibles).
  2. Habilitar el complemento de la API de evaluación de riesgos

    • Accede a tu Quicknode .
    • Accede a endpoint de tu endpoint y activa el complemento de la API de evaluación de riesgos.
    • Sigue las instrucciones de configuración, si es necesario.

3. Configuración de Foundry y despliegue de contratos inteligentes

  1. Instala Foundry
    Si aún no has instalado Foundry, hazlo con:

    curl -L https://foundry.paradigm.xyz | bash
    foundryup
  2. Instalar dependencias
    Accede al directorio de Foundry e instala las dependencias necesarias:

    cd fundición
    forja instalar smartcontractkit/foundry-chainlink-toolkit
    forge instalar foundry-rs/forge-std
  3. Crear el archivo de reasignaciones Ejecuta el siguiente comando para añadir reasignaciones para las dependencias de Chainlink Toolkit y Foundry:

reasignaciones de Forge > remappings.txt

  1. Importa tu monedero
    Importa tu monedero de forma segura a Foundry utilizando:
    monedero de fundición importar nombre-de-tu-monedero --interactivo

Actualiza el nombre-de-tu-monedero con el nombre de tu monedero. Se te pedirá que introduzcas tu clave privada y establecer una contraseña para el cifrado.

-interactivo La opción «flag» te permite introducir la clave privada sin que quede registrada en el historial del shell.


  1. Configurar las variables de entorno
  • Copia el ejemplo .env Abre el archivo y actualízalo con tu configuración:
    cp .env.sample .env

  • Abrir .env y actualiza lo siguiente:
    BASE_RPC_URL=<your-base-rpc-url>
    BASESCAN_API_KEY=<your-basescan-api-key>

  • Carga las variables:
    fuente .env
  1. Actualizar el script de implementación

    • Modificar el router Cambia la dirección que aparece en el script de implementación (script/RiskBasedStaking.s.sol) por la dirección del enrutador de la cadena y la red que estés utilizando.
    • Consulta la sección «Redes compatibles con las funciones de Chainlink» para conocer la dirección correcta del enrutador.
  2. Implementar el contrato inteligente «
    » Implementar el contrato mediante Foundry:

    forge script script/RiskBasedStaking.s.sol:RiskBasedStakingScript --rpc-url $BASE_RPC_URL --account nombre-de-tu-monedero --broadcast --verify -vvv

  • Actualiza el nombre-de-tu-monedero con el nombre de tu monedero.
  • Eliminar --verificar si no quieres verificar el contrato.
  • Guarda la dirección del contrato, ya que la necesitarás para las funciones de Chainlink y las configuraciones del frontend.

Tras implementar el contrato inteligente, debes configurar una suscripción a Chainlink Functions para que el contrato pueda solicitar evaluaciones de riesgo. Sigue estos pasos:

  1. Crear una suscripción a Chainlink Functions

  2. Añade tu contrato inteligente como consumidor

    • Una vez configurada la suscripción, añade la dirección de tu contrato desplegado como consumidor.
    • Esto permite que el contrato realice solicitudes a través de Chainlink Functions.
  3. Consultar los detalles específicos de la red

Para obtener una guía detallada de configuración, consulta la documentación de Chainlink Functions.

5. Implementar el proyecto


  1. Instalar las dependencias

Vuelve al directorio raíz de tu proyecto (es decir, Dapp compatible con AML y CFT), a continuación, ejecuta el siguiente comando:

cd next-app
npm instalar

  1. Configurar las variables de entorno

Antes de ejecutar la interfaz de usuario, configura las variables de entorno necesarias en un .env archivo que se encuentra dentro del siguiente aplicación directorio:

WALLETCONNECT_PROJECT_ID=<your-walletconnect-project-id>
PRIVATE_KEY=<your-private-key>
QUICKNODE_ENDPOINT=<your-quicknode-endpoint>
CONTRACT_ADDRESS=<deployed-contract-address>
SUBSCRIPTION_ID=<chainlink-subscription-id>

  • WALLETCONNECT_PROJECT_ID – Tu ID de proyecto de WalletConnect, necesario para habilitar las conexiones con carteras.
  • CLAVE_PRIVADA – La clave privada de un monedero designado que se utiliza para firmar las solicitudes de verificación de riesgos.
    • De este modo se garantiza que solo los usuarios autorizados puedan iniciar solicitudes de Chainlink Functions.
    • Sin ello, la suscripción a Chainlink podría ser objeto de uso indebido por parte de usuarios no autorizados.
  • QUICKNODE – endpoint de tu endpoint Quicknode con el API de evaluación de riesgos activado.
  • DIRECCIÓN_DEL_CONTRATO – Los desplegados Staking basado en el riesgo dirección del contrato inteligente.
  • ID_DE_SUSCRIPCIÓN – El ID de suscripción a Chainlink Functions vinculado a tu contrato para las evaluaciones de riesgo fuera de la cadena.

  1. Actualizar la configuración de las funciones de Chainlink

Actualiza el src/app/api/check-risk/route.ts Archivo con la dirección correcta del enrutador y el ID DON de tu cadena y red.

  // Configuración de las funciones de Chainlink
const routerAddress = "0xf9B8fc078197181C841c296C876945aaa425B278";
const donId = "mainnet";
const gatewayUrls = [
"https://01.functions-gateway.chain.link/",
"https://02.functions-gateway.chain.link/",
];

  1. Ejecuta la aplicación front-end

Inicia el servidor de desarrollo:

npm ejecutar dev


Capturas de pantalla

Captura de pantalla de una dApp que cumple con la normativa sobre la lucha contra el blanqueo de capitales y la financiación del terrorismo (AML y CFT)


Uso

  1. Conecta tu monedero:
    Utiliza un monedero Web3 compatible (por ejemplo, MetaMask o Rabby) para conectarte.

  2. Comprueba tu puntuación de riesgo:
    Si tu monedero aún no ha sido evaluado, haz clic en el botón «Comprobar riesgo» para iniciar una evaluación de riesgo a través de Chainlink Functions.

  3. Apostar ETH:
    Una vez superada la verificación de riesgos, utiliza la función de apuesta para depositar ETH.

  4. Retirar ETH:
    Retira tu ETH apostado en cualquier momento, siempre que tu monedero cumpla con los requisitos.

Aportaciones y comentarios
¡Nos encantaría conocer tu opinión y agradecemos cualquier aportación a esta aplicación de ejemplo!
Para informar de problemas o enviar comentarios, abre una incidencia en GitHub en el qn-guide-ejemplos repositorio.
Para colaborar, sigue estos pasos:
  1. Hacer un fork del repositorio
  2. Crear una rama de características:
    git checkout -b feature/amazing-feature
  3. Guarda los cambios:
    git commit -m "Añadir una función increíble"
  4. Envía tu rama:
    git push origin feature/amazing-feature
  5. Abre una solicitud de incorporación de cambios.