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.

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:
- El usuario inicia una comprobación de riesgo si aún no tiene una puntuación de riesgo.
- La API de Next.js (
/api/check-risk) activa una solicitud de Chainlink Functions con la dirección del monedero. - Las funciones de Chainlink llaman a la API de evaluación de riesgos, procesan la respuesta y devuelven la puntuación de riesgo.
- El contrato inteligente actualiza el perfil de riesgo del usuario y garantiza el cumplimiento de las normas.
- 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.
2. Integración de las funciones de Chainlink
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
fulfillRequestLa 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

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 | bashentoncesfoundryup) - 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:
-
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).
-
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
-
Instala Foundry
Si aún no has instalado Foundry, hazlo con:curl -L https://foundry.paradigm.xyz | bash
foundryup -
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 -
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
- 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.
- Configurar las variables de entorno
- Copia el ejemplo
.envAbre el archivo y actualízalo con tu configuración:cp .env.sample .env
- Abrir
.envy actualiza lo siguiente:BASE_RPC_URL=<your-base-rpc-url>
BASESCAN_API_KEY=<your-basescan-api-key>
- Carga las variables:
fuente .env
-
Actualizar el script de implementación
- Modificar el
routerCambia 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.
- Modificar el
-
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-monederocon el nombre de tu monedero. - Eliminar
--verificarsi 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.
4. Configurar la suscripción a las funciones de Chainlink
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:
-
Crear una suscripción a Chainlink Functions
- Accede a la interfaz de usuario de Chainlink Functions correspondiente a la red que desees.
- Sigue las instrucciones para crear una nueva suscripción.
- Recarga la suscripción con tokens LINK (puedes transferir LINK si es necesario; consulta la documentación del token LINK).
-
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.
-
Consultar los detalles específicos de la red
- Cada red tiene su propia dirección de enrutador de Functions y su propio ID de DON (Red de Oráculos Descentralizada).
- Consulta la página «Redes compatibles con las funciones de Chainlink » para encontrar los valores correctos para tu red.
Para obtener una guía detallada de configuración, consulta la documentación de Chainlink Functions.
5. Implementar el proyecto
- 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
- 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.
- 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/",
];
- Ejecuta la aplicación front-end
Inicia el servidor de desarrollo:
npm ejecutar dev
- Abre http://localhost:3000 en tu navegador.
Capturas de pantalla

Uso
-
Conecta tu monedero:
Utiliza un monedero Web3 compatible (por ejemplo, MetaMask o Rabby) para conectarte. -
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. -
Apostar ETH:
Una vez superada la verificación de riesgos, utiliza la función de apuesta para depositar ETH. -
Retirar ETH:
Retira tu ETH apostado en cualquier momento, siempre que tu monedero cumpla con los requisitos.
- Hacer un fork del repositorio
- Crear una rama de características:git checkout -b feature/amazing-feature
- Guarda los cambios:git commit -m "Añadir una función increíble"
- Envía tu rama:git push origin feature/amazing-feature
- Abre una solicitud de incorporación de cambios.
