Proyecto Next.js + Supabase + Solana Wallet Adapter con flujo de check-in/attestation on-chain usando programa Anchor en Devnet.
- Cliente crea attestation pendiente en DB (
/api/attestations/prepare). - Cliente envía
check_inal programa Anchor (tx #1). - Cliente envía
commit_attestational programa Anchor (tx #2, contiene firma de check-in). - Backend valida transacciones en RPC, valida ownership de PDAs y persiste
tx_signaturereal (/api/attestations/commit). - Backend cierra check-in de ticket (
/api/tickets/[id]/check-in) solo si attestation committed coincide.
No hay hash fake ni fallback silencioso cuando está habilitado on-chain.
Anchor.tomlCargo.toml(workspace)programs/ranti_checkin/src/lib.rstests/ranti-checkin.tsmigrations/deploy.ts
initialize_config(opcional)check_incommit_attestation
checkin_record: seeds["checkin", user, ticket_ref_32]attestation_record: seeds["attestation", user, ticket_ref_32]
Crear .env.local:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=...
NEXT_PUBLIC_SUPABASE_ANON_KEY=...
# Solana Devnet
NEXT_PUBLIC_SOLANA_NETWORK=devnet
NEXT_PUBLIC_SOLANA_RPC_URL=https://api.devnet.solana.com
# Program ID (debe coincidir con deploy real)
NEXT_PUBLIC_PROGRAM_ID=6L9fJY4qf2nB4V9YwVh3E2wQ5s7Y3K1mN8pR2tU4xZcQ
# Entorno/feature flags
NEXT_PUBLIC_APP_ENV=dev
RANTI_APP_ENV=dev
NEXT_PUBLIC_RANTI_ENABLE_ONCHAIN_CHECKIN=true
RANTI_ENABLE_ONCHAIN_CHECKIN=truenpm run dev
npm run typecheck
npm run lintnpm run anchor:build
npm run anchor:test
npm run anchor:deploy
./scripts/deploy-devnet.shTambién:
anchor keys list
anchor build
anchor deploy --provider.cluster devnetsolana config set --url devnetanchor keys list(obténranti_checkinprogram keypair)anchor deploy --provider.cluster devnet- Actualiza
declare_id!enprograms/ranti_checkin/src/lib.rsyAnchor.tomlcon el Program ID final. - Actualiza
NEXT_PUBLIC_PROGRAM_IDcon ese Program ID.
- Cada PDA inicializada consume rent-exemption (depende de bytes de cuenta).
- Cuentas actuales:
CheckInRecord:8 + INIT_SPACE(pubkey + refs + timestamp + bump)AttestationRecord:8 + INIT_SPACE(pubkey + refs + firma + timestamp + flags)
- Fee por tx: estándar de devnet según congestión + compute.
Para ver renta exacta en runtime:
solana rent <ACCOUNT_DATA_BYTES>- Conecta wallet y autentica sesión.
- Abre un ticket en
/tickets/[id]y ejecuta check-in. - Firma tx de
check_iny luego tx decommit_attestation. - Verifica
txSignatureen/check-in/success. - Abre Solscan devnet desde la UI.
- Confirma en DB que
attestations.tx_signaturequedó persistida y estadocommitted_devnet.
Si falta algo de infraestructura externa:
- Sin
profiles.wallet_addressenlazada -> API responde412. - Sin tabla/policies de
attestations-> API responde503en prepare. - Si tx no existe/no coincide con programa/ownership -> API responde
409.
Flujo marketplace se mantiene sin cambios funcionales; integración nueva está acotada a check-in/attestation.